为什么uWSGI不加载在nginxconfiguration中指定的应用程序?

我有一台服务器使用nginx(1.1.19)和uWSGI(0.9.8)服务多个Django站点。 uWSGI在VirtualHosting模式下运行,并按照文档中的说明dynamic加载应用程序: http ://projects.unbit.it/uwsgi/wiki/VirtualHosting

目前有5个Django站点在服务器上运行,像这样的nginxconfiguration:

# /etc/nginx/sites-enabled/www.example.com server { listen xxx.xxx.xxx.xxx:80; server_name www.example.com example.com; if ($host != 'www.example.com' ) { rewrite ^/(.*)$ http://www.example.com/$1 permanent; } location / { uwsgi_pass 127.0.0.1:8000; include uwsgi_params; uwsgi_param UWSGI_CHDIR /var/www/www.example.com/wsgi; uwsgi_param UWSGI_SCRIPT production; uwsgi_param UWSGI_PYHOME /var/envs/www.example.com; } } 

其他4个站点的configuration方式完全相同,用example.comreplace了真实域。

uWSGI使用以下选项运行:

 /usr/local/bin/uwsgi --socket $SOCKET --chmod-socket --master --harakiri $HARAKIRI --sharedarea $SHAREDAREA --processes $PROCESSES --daemonize $LOG --max-requests $MAX_REQUESTS --vhost --no-site" 

这个设置已经运行了两年了(这就是为什么os uWSGI的版本太旧了)。

但是昨天我试图添加第五个站点到这个服务器,configuration如下:

 # /etc/nginx/sites-enabled/test.domain.com server { listen xxx.xxx.xxx.xxx:80; server_name test.domain.com; location / { uwsgi_pass 127.0.0.1:8000; include uwsgi_params; uwsgi_param UWSGI_CHDIR /var/www/test.domain.com/wsgi; uwsgi_param UWSGI_SCRIPT test; uwsgi_param UWSGI_PYHOME /var/envs/test.domain.com; } } 

当我试图在浏览器中加载这个网站时,nginx给了我一个502错误的网关错误,并且日志说:

 2013/08/22 12:17:03 [error] 26397#0: *9171 upstream prematurely closed connection while reading response header from upstream, client: 77.98.87.69, server: test.domain.com, request: "GET / HTTP/1.1", upstream: "uwsgi://127.0.0.1:8000", host: "test.domain.com" 

这告诉了我两件事。 首先是加载正确的nginx虚拟主机,其次是uWSGI在可以服务请求之前死亡。 接下来我检查uWSGI日志:

 Traceback (most recent call last): File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 236, in __call__ self.load_middleware() File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/core/handlers/base.py", line 45, in load_middleware for middleware_path in settings.MIDDLEWARE_CLASSES: File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/conf/__init__.py", line 53, in __getattr__ self._setup(name) File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/conf/__init__.py", line 48, in _setup self._wrapped = Settings(settings_module) File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/conf/__init__.py", line 134, in __init__ raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e)) ImportError: Could not import settings 'site3.settings.production' (Is it on sys.path?): No module named site3.settings.production test.domain.com [pid: 23255|app: 4|req: 93/22584] 77.98.87.69 () {52 vars in 1112 bytes} [Thu Aug 22 12:42:01 2013] GET / => generated 0 bytes in 1 msecs (HTTP/1.1 500) 0 headers in 0 bytes (0 switches on core 0) Traceback (most recent call last): File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 236, in __call__ self.load_middleware() File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/core/handlers/base.py", line 45, in load_middleware for middleware_path in settings.MIDDLEWARE_CLASSES: File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/conf/__init__.py", line 53, in __getattr__ self._setup(name) File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/conf/__init__.py", line 48, in _setup self._wrapped = Settings(settings_module) File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/conf/__init__.py", line 134, in __init__ raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e)) ImportError: Could not import settings 'site3.settings.production' (Is it on sys.path?): No module named site3.settings.production test.domain.com [pid: 23255|app: 4|req: 94/22585] 77.98.87.69 () {52 vars in 1112 bytes} [Thu Aug 22 12:42:02 2013] GET / => generated 0 bytes in 1 msecs (HTTP/1.1 500) 0 headers in 0 bytes (0 switches on core 0) Traceback (most recent call last): File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 236, in __call__ self.load_middleware() File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/core/handlers/base.py", line 45, in load_middleware for middleware_path in settings.MIDDLEWARE_CLASSES: File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/conf/__init__.py", line 53, in __getattr__ self._setup(name) File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/conf/__init__.py", line 48, in _setup self._wrapped = Settings(settings_module) File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/conf/__init__.py", line 134, in __init__ raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e)) ImportError: Could not import settings 'site3.settings.production' (Is it on sys.path?): No module named site3.settings.production test.domain.com [pid: 23255|app: 4|req: 95/22586] 77.98.87.69 () {52 vars in 1112 bytes} [Thu Aug 22 12:42:02 2013] GET / => generated 0 bytes in 1 msecs (HTTP/1.1 500) 0 headers in 0 bytes (0 switches on core 0) Traceback (most recent call last): File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 236, in __call__ self.load_middleware() File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/core/handlers/base.py", line 45, in load_middleware for middleware_path in settings.MIDDLEWARE_CLASSES: File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/conf/__init__.py", line 53, in __getattr__ self._setup(name) File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/conf/__init__.py", line 48, in _setup self._wrapped = Settings(settings_module) File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/conf/__init__.py", line 134, in __init__ raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e)) ImportError: Could not import settings 'site4.settings.production' (Is it on sys.path?): No module named site4.settings.production test.domain.com [pid: 14025|app: 5|req: 80/22587] 77.98.87.69 () {52 vars in 1112 bytes} [Thu Aug 22 12:42:03 2013] GET / => generated 0 bytes in 1 msecs (HTTP/1.1 500) 0 headers in 0 bytes (0 switches on core 0) Traceback (most recent call last): File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 236, in __call__ self.load_middleware() File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/core/handlers/base.py", line 45, in load_middleware for middleware_path in settings.MIDDLEWARE_CLASSES: File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/conf/__init__.py", line 53, in __getattr__ self._setup(name) File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/conf/__init__.py", line 48, in _setup self._wrapped = Settings(settings_module) File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/conf/__init__.py", line 134, in __init__ raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e)) ImportError: Could not import settings 'site3.settings.production' (Is it on sys.path?): No module named site3.settings.production test.domain.com [pid: 23255|app: 4|req: 96/22589] 77.98.87.69 () {52 vars in 1112 bytes} [Thu Aug 22 12:42:03 2013] GET / => generated 0 bytes in 1 msecs (HTTP/1.1 500) 0 headers in 0 bytes (0 switches on core 0) Traceback (most recent call last): File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 236, in __call__ self.load_middleware() File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/core/handlers/base.py", line 45, in load_middleware for middleware_path in settings.MIDDLEWARE_CLASSES: File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/conf/__init__.py", line 53, in __getattr__ self._setup(name) File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/conf/__init__.py", line 48, in _setup self._wrapped = Settings(settings_module) File "/var/envs/test.domain.com/lib/python2.7/site-packages/django/conf/__init__.py", line 134, in __init__ raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e)) ImportError: Could not import settings 'site2.settings.test' (Is it on sys.path?): No module named site2.settings.test test.domain.com [pid: 11217|app: 4|req: 46/23046] 77.98.87.69 () {52 vars in 1112 bytes} [Thu Aug 22 12:47:56 2013] GET / => generated 0 bytes in 1 msecs (HTTP/1.1 500) 0 headers in 0 bytes (0 switches on core 0) 

这些错误是由于uWSGi尝试加载其他项目的Django设置文件(看似随意)造成的,这表明uWSGI忽略了nginxconfiguration中的UWSGI_CHDIRUWSGI_SCRIPT参数,并且随机尝试加载另一个WSGI应用程序。

此外, UWSGI_SCRIPT文件似乎从不加载,因为在/var/www/test.domain.com/wsgi没有创buildtest.pyc文件。 为了进一步testing这个问题,我已经在文件的开始部分assert False, 'test' ,这在uWSGI日志文件中从不显示。

有没有人有任何想法,为什么现在的网站都仍然正常工作时发生这种情况?

不知道为什么现有的网站正在工作,但你需要命名你的wsgi文件的唯一名称。 出于某种原因,如果你有一堆相同名称的wsgi文件,uwsgi会加载它们中的任何一个。