具有不同settingsnam的应用程序的nginx uwsgi设置

时间:2013-10-21 07:03:51

标签: python django nginx uwsgi

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

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

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

settings.py

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

然后我将db名称传递给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入口点的名称,但没有运气。

1 个答案:

答案 0 :(得分:1)

虽然可以进行这样的设置(并且在几年前在uWSGI下很常见)但它会导致(很快或更晚)头痛。

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

- 进程8 --cheaper 1 --idle 60

将仅使用一个worker启动每个实例,并最终(根据需要)将最多提升到8.除此之外,当实例空闲超过60秒时,它将被置于保持状态(仅主运行)直到另一个请求发出。

您可以进行其他微调,但一般规则是django下的多个解释器(对于它的工作方式)并不容易理解。