我正在尝试使用 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 入口点的名称,但没有运气。