【问题标题】:How to deploy multiple Django sites with DRY configuration?如何使用 DRY 配置部署多个 Django 站点?
【发布时间】:2016-04-26 16:01:06
【问题描述】:

目前我正在部署 30 多个网站,这些网站由一个用 Django 编写的应用程序操作。这些站点被组合成更小的组。例如,有一个欧洲组,其中包括网站德国、法国、瑞士等。这些组是 7 个。

部署uwsgi(以Emperior模式运行),使用nginx(uwsgi传递给组socket)和supervisord(用于任务工作者)。应用程序正在为所有网站使用一个数据库。

目前项目中设置文件的结构如下:

  • project.settings.general_settings
  • project.settings.<group_name>

到目前为止,我认为简单地拥有 7 个 uwsgi 和 7 个 nginx 配置文件(每个组)就足够了,直到我意识到一些网站还需要自定义 Django 设置,并且单独的 DJANGO_SETTINGS_MODULE 将不得不为每个网站定义(其中一些网站有不同的语言)。

注意事项:

  • 维护所有这大约 30 种不同的网站设置的策略是什么?他们也应该导入组设置。
  • 目前在 Nginx 和 uwsgi 配置文件中都指定了 DJANGO_SETTINGS_MODULE。有没有办法避免这种重复?
  • 有没有办法减少 uwsgi 应用程序的数量(也许 uwsgi 只有 7 个 uwsgi 组,并且只从 nginx 指定设置模块)?
  • 奖励:除了生产环境之外,还有一个暂存环境。在那里避免重复的最佳方法是什么?

目前的考虑:

  • 将一些网站设置(LANGUAGESLANGUAGE_CODE 等)存储在数据库中,并针对每个请求进行动态修改。这个想法被拒绝了,as it obviously sucks
  • 让 uwsgi 处于虚拟主机模式。它只允许有 7 个 uwsgi 应用程序,并从 Nginx 指定不同的设置。拒绝:insecure, unreliable, scaling issues

【问题讨论】:

  • 你不需要在 nginx 配置中指定DJANGO_SETTINGS_MODULE。请显示你的 nginx 和 uwsgi 配置文件,因为你在这里做错了。
  • Nginx 配置:pastebin.com/1xC79Uir uWSGI 配置:pastebin.com/8S4hmZz1
  • 你可以安全地从 nginx 配置中删除它——它不会改变任何东西。

标签: python django nginx uwsgi


【解决方案1】:

如果您使用帝王模式并且您的 uWSGI 配置仅在套接字和DJANGO_SETTINGS_MODULE 上有所不同,请考虑为所有站点使用一个配置文件。您将基本上通过在 uWSGI Emperor 目录中创建符号链接来启动新站点,并且该配置中的特殊变量将根据符号链接名称构造套接字名称和 DJANGO_SETTINGS_MODULE 变量。

如果您只担心 urlpatterns、语言和其他可以根据要求确定的值,您可以使用django-hosts 代替内置的站点模块。这也将允许您在一个工作人员池上为多个站点提供服务。您还可以为此创建一些中间件。

请注意,您还可以使用环境变量(可以在 uWSGI 配置文件中设置)来设置一些设置。只需在设置文件中使用os.environ 即可提取它们。

最后但同样重要的是 - 设置文件可以根据其他一些变量在 wsgi.py 文件中动态设置。

【讨论】:

  • 我应该使用%nmagic variable 来读取符号链接文件名,正如您在答案中提到的那样吗?
  • 是的。如果您包含一些 ini 文件作为模板,您也可以使用 %N
  • 好的,谢谢。对于 Django 项目中的设置文件,您建议采用什么结构?考虑过群组、网站、登台和制作设置吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 2018-03-26
相关资源
最近更新 更多