如何使用DRY配置部署多个Django站点?

时间:2016-04-26 16:01:07

标签: python django nginx uwsgi

目前,我正在部署30多个由Django编写的单一应用程序运营的网站。这些网站组合成较小的组。例如,有一个欧洲集团,其中包括德国,法国,瑞士等网站。这些集团是7个。

对于部署uwsgi(在Emperior模式下运行),使用nginx(uwsgi传递给组套接字)和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

1 个答案:

答案 0 :(得分:1)

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

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

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

最后,但并非最不重要 - 可以根据其他一些变量在wsgi.py文件中动态设置设置文件。