0

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

4

1 回答 1

1

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

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

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

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

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

于 2013-10-21T07:19:13.013 回答