【问题标题】:nginx uwsgi settings for app with different settingsnam具有不同设置的应用程序的 nginx uwsgi 设置nam
【发布时间】:2013-10-29 13:36:14
【问题描述】:

我正在尝试使用 nginx 和 uwsgi 设置 django 应用程序。设置是这样的,有一个代码库,但我运行不同的实例,每个实例都指向不同的数据库。目前我为每个应用程序定义了一个 uwsgi 进程,但对我来说这似乎是一种浪费,因为相同的代码占用了大量内存,而只有 db 连接字符串不同。

我希望有一个设置,我只创建一个 uwsgi 进程,但将一个字符串传递到 django 可以用来确定数据库字符串并从那里获取它的 uwsgi 容器。

最初我尝试在设置文件中设置一个条件,例如:

settings.py

import uwsgi
db_name = uwsgi.end['db_name']

然后我将数据库名称传递给 uwsgi 实例。但是,仅使用第一个应用程序的数据。例如,如果我重新启动 uwsgi 服务器并首先访问example1,然后example2,example1 的数据库用于两个请求。如果我再次重新启动 uwsgi 并首先访问 example2,那么即使我之后访问 example1,也会调用该数据库。

然后我改变了策略并尝试设置动态应用程序。我将代码库复制到两个不同的位置,只有设置文件不同。然而,同样的事情发生在上面。

我正在尝试做的事情可能吗?有没有办法在每个请求上(重新)加载设置?

更新

经过多次尝试,我仍然没有做对。我遵循了给出的建议,但没有运气。这是 mu 当前设置

uwsgi.ini

[uwsgi]
master = true
single-interpreter = true
processes = 1
threads = 0
socket = /var/run/uwsgi/lms_gui.sock
logto = /tmp/lms_gui.log
uid = nginx
reload-os-env = true

virtualenv = /var/www/myenv
plugins = python27
chdir = /var/www/squire/sites/lms/gui

nginx

server {
listen 162.13.123.195;
server_name example1;

location / {
    uwsgi_pass unix:///var/run/uwsgi/lms_gui.sock;
    uwsgi_param site_name example1;
    uwsgi_param UWSGI_MODULE example1_wsgi;
    uwsgi_param UWSGI_SETENV DJANGO_SETTINGS_MODULE=example1_settings;
    include uwsgi_params;
}
}
server {
listen 162.13.123.195;
server_name example2;

location / {
    uwsgi_pass unix:///var/run/uwsgi/lms_gui.sock;
    uwsgi_param site_name example2;
    uwsgi_param UWSGI_MODULE example2_wsgi;
    uwsgi_param UWSGI_SETENV DJANGO_SETTINGS_MODULE=example2_settings;
    include uwsgi_params;
}
}

最初,设置仅在第一次请求时加载设置文件,但不再加载。我还更改了 wsgi.py 入口点的名称,但没有运气。

【问题讨论】:

    标签: python django nginx uwsgi


    【解决方案1】:

    虽然有可能进行这样的设置(几年前在 uWSGI 下这很常见),但它会(迟早)引起整个地方的头痛。

    最好(或更好:更明智)的方法是为每个 uWSGI 实例启动一个进程,并在需要时让它扩展到更多工作人员:

    --processes 8 --cheaper 1 --idle 60

    将仅使用一个工作人员启动每个实例,最终(根据需要)将增加到 8 个。除此之外,当实例空闲超过 60 秒时,它将被暂停(只有主服务器运行)直到发出另一个请求。

    您还可以进行其他微调,但一般规则是 django 下的多个解释器(就其工作方式而言)不是一条容易遵循的路径。

    【讨论】:

    • 问题是我必须为每个站点运行 1 个工作人员。所以假设我有 10 个站点(相同的代码库,但由于 dbs 是隔离的,所以有 10 个不同的 dbs),我有 10 个内存占用量大致相同的进程。我希望减少内存占用并节省服务器资源
    • 使用多个 python 解释器,每个应用程序最多只能获得几兆。并且可以在 linux 下使用 KSM 减少/共享该内存(即 uwsgi-only 内存)。顺便说一句,如果您想尝试检查这里:projects.unbit.it/uwsgi/wiki/TipsAndTricks 有一个使用 --reload-os-env 和 UWSGI_SETENV var 的示例(这是 django 的技巧)
    • 感谢您的帮助和提示。我还是没弄好。设置仍然不会加载每个请求。我已经发布了一些代码。如果你能最后看一下,我将不胜感激。在此之后,我会收工并为每个应用程序运行一个 uwsgi 实例
    • single-interpreter 是错误的,因为您肯定需要多个解释器,然后您需要某种形式的“密钥”来指示 uWSGI 应用程序将请求路由到,添加 vhost = true 和 vhost-host = true 到使用 HTTP_HOST 作为键。
    • 好的,我会回到多口译员。感谢您的所有帮助
    猜你喜欢
    • 1970-01-01
    • 2017-01-09
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2019-04-08
    相关资源
    最近更新 更多