У меня есть сервер, обслуживающий несколько сайтов Django с использованием nginx (1.1.19) и uWSGI (0.9.8). uWSGI работает в режиме VirtualHosting и динамически загружает приложения, как описано здесь: http://projects.unbit.it/uwsgi/wiki/VirtualHosting
В настоящее время на сервере работает 5 сайтов Django с такими конфигурациями nginx:
# /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 сайта настроены точно так же, с example.com вместо реальных доменов.
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"
Эта установка отлично работает уже 2 года (вот почему версия os uWSGI настолько старая).
Однако вчера я попытался добавить к этому серверу 5-й сайт, настроенный следующим образом:
# /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 Bad Gateway, а в журналах написано:
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 игнорирует UWSGI_CHDIR
и UWSGI_SCRIPT
параметры в конфигурации nginx и случайным образом пытается загрузить другое приложение WSGI.
Кроме того, похоже, что UWSGI_SCRIPT
файл никогда не загружается, поскольку файл test.pyc не создается в /var/www/test.domain.com/wsgi
. Для дальнейшего тестирования я поместил assert False, 'test'
в начале файла, который никогда не отображается в файле журнала uWSGI.
Есть ли у кого-нибудь идеи относительно того, почему это происходит, когда все существующие сайты по-прежнему работают правильно?
Не уверен, почему существующие сайты работают, но вам нужно называть файлы wsgi уникальными именами. По какой-то причине, если у вас есть куча файлов wsgi с одинаковыми именами, uwsgi загружает любой из них.