如何使用 DRY 配置部署多个 Django 站点?
How to deploy multiple Django sites with DRY configuration?
目前我正在部署 30 多个网站,这些网站由单个应用程序运行,用 Django 编写。这些站点被组合成更小的组。比如有一个组Europe,包括德国、法国、瑞士等网站,这些组是7.
为了部署 uwsgi(在 Emperio 模式下运行),使用了 nginx(uwsgi 传递到组套接字)和 supervisord(用于任务工作者)。应用程序正在为所有网站使用一个数据库。
目前项目中设置文件的结构如下:
project.settings.general_settings
project.settings.<group_name>
到目前为止,我认为只需拥有 7 个 uwsgi 和 7 个 nginx 配置文件(对于每个组)就足够了,直到我意识到一些网站还需要自定义 Django 设置,并且分开 DJANGO_SETTINGS_MODULE
必须为每个网站定义(其中一些网站有不同的语言)。
注意事项:
- 您维护所有这 30 种不同网站设置的策略是什么?他们也应该导入组设置。
- 目前
DJANGO_SETTINGS_MODULE
在 Nginx 和 uwsgi 配置文件中指定。有没有办法避免这种重复?
- 有没有办法减少 uwsgi 应用程序的数量(也许 uwsgi 只有 7 个 uwsgi 组,并且只从 nginx 指定设置模块)?
- 奖励:除了生产环境之外,还有一个暂存环境。避免重复的最佳方法是什么?
到目前为止考虑了什么:
- 将一些网站设置(
LANGUAGES
、LANGUAGE_CODE
等)存储在数据库中,并针对每个请求动态修改。这个想法被否决了,as it obviously sucks。
- 让 uwsgi 处于虚拟主机模式。它只允许有 7 个 uwsgi 应用程序,并指定与 Nginx 不同的设置。拒绝:insecure, unreliable, scaling issues.
如果您使用的是皇帝模式,并且您的 uWSGI 配置仅在套接字和 DJANGO_SETTINGS_MODULE
上有所不同,请考虑对所有站点使用一个配置文件。您将基本上通过在 uWSGI emperor 目录中创建符号链接来启动新站点,并且该配置中的特殊变量将构造套接字名称和基于符号链接名称的 DJANGO_SETTINGS_MODULE
变量。
如果您只担心 urlpatterns、语言和其他可按要求确定的值,您可以使用 django-hosts
而不是内置站点模块。这也将允许您在一个工作人员池中为多个站点提供服务。您还可以为此创建一些中间件。
请注意,您还可以使用环境变量(可以在 uWSGI 配置文件中设置)来设置一些设置。只需在您的设置文件中使用 os.environ
来提取它们。
最后但并非最不重要的一点 - 可以根据其他一些变量在 wsgi.py 文件中动态设置设置文件。
目前我正在部署 30 多个网站,这些网站由单个应用程序运行,用 Django 编写。这些站点被组合成更小的组。比如有一个组Europe,包括德国、法国、瑞士等网站,这些组是7.
为了部署 uwsgi(在 Emperio 模式下运行),使用了 nginx(uwsgi 传递到组套接字)和 supervisord(用于任务工作者)。应用程序正在为所有网站使用一个数据库。
目前项目中设置文件的结构如下:
project.settings.general_settings
project.settings.<group_name>
到目前为止,我认为只需拥有 7 个 uwsgi 和 7 个 nginx 配置文件(对于每个组)就足够了,直到我意识到一些网站还需要自定义 Django 设置,并且分开 DJANGO_SETTINGS_MODULE
必须为每个网站定义(其中一些网站有不同的语言)。
注意事项:
- 您维护所有这 30 种不同网站设置的策略是什么?他们也应该导入组设置。
- 目前
DJANGO_SETTINGS_MODULE
在 Nginx 和 uwsgi 配置文件中指定。有没有办法避免这种重复? - 有没有办法减少 uwsgi 应用程序的数量(也许 uwsgi 只有 7 个 uwsgi 组,并且只从 nginx 指定设置模块)?
- 奖励:除了生产环境之外,还有一个暂存环境。避免重复的最佳方法是什么?
到目前为止考虑了什么:
- 将一些网站设置(
LANGUAGES
、LANGUAGE_CODE
等)存储在数据库中,并针对每个请求动态修改。这个想法被否决了,as it obviously sucks。 - 让 uwsgi 处于虚拟主机模式。它只允许有 7 个 uwsgi 应用程序,并指定与 Nginx 不同的设置。拒绝:insecure, unreliable, scaling issues.
如果您使用的是皇帝模式,并且您的 uWSGI 配置仅在套接字和 DJANGO_SETTINGS_MODULE
上有所不同,请考虑对所有站点使用一个配置文件。您将基本上通过在 uWSGI emperor 目录中创建符号链接来启动新站点,并且该配置中的特殊变量将构造套接字名称和基于符号链接名称的 DJANGO_SETTINGS_MODULE
变量。
如果您只担心 urlpatterns、语言和其他可按要求确定的值,您可以使用 django-hosts
而不是内置站点模块。这也将允许您在一个工作人员池中为多个站点提供服务。您还可以为此创建一些中间件。
请注意,您还可以使用环境变量(可以在 uWSGI 配置文件中设置)来设置一些设置。只需在您的设置文件中使用 os.environ
来提取它们。
最后但并非最不重要的一点 - 可以根据其他一些变量在 wsgi.py 文件中动态设置设置文件。