迁移到nginx/uWSGI时未找到django设置
我一直在和Apache / Mod_wsgi这个组合斗争,最后决定放弃,重新从服务器的部分开始。
我已经设置好了Nginx,让它把请求转发到uwsgi。使用uwsgi协议其实挺简单的。
不过uwsgi一直很顽固,我试着看文档、教程,还在IRC上问过问题……
结果总是出现同样的错误,Django的wsgi模块找不到设置文件,但当我在控制台运行同样的代码时却没有任何错误。
我把所有相关的脚本都贴在下面——我觉得我可能漏掉了什么明显的东西,但我不知道是什么。
我在Ubuntu 11.10上运行,使用Upstart脚本来启动。
Upstart脚本
description "uWSGI starter"
start on (local-filesystems
and runlevel [2345])
stop on runlevel [016]
respawn
exec /usr/local/sbin/uwsgi \
--uid www-data \
--socket 127.0.0.1:5050 \
--master \
--logto /var/log/uwsgi_main.log \
--logdate \
--optimize 2 \
--processes 4 \
--harakiri 120 \
--vhost \
--no-site
Nginx服务器配置
server {
listen 80;
server_name .DOMAIN.com;
access_log /home/USER/virtualenv/logs/nginx/access.log;
error_log /home/USER/virtualenv/logs/nginx/error.log;
client_max_body_size 10m;
keepalive_timeout 120;
location /media/ {
root /home/USER/virtualenv/PROJECT;
}
location /static/ {
root /home/USER/virtualenv/PROJECT;
}
location / {
uwsgi_pass uwsgi_main;
include uwsgi_params;
uwsgi_param UWSGI_PYHOME /home/USER/virtualenv;
uwsgi_param UWSGI_SCRIPT deploy.deploy;
uwsgi_param UWSGI_CHDIR /home/USER/virtualenv/PROJECT;
root /home/USER/virtualenv;
}
}
deploy.py
import os, site, sys
prev_sys_path = list(sys.path)
site.addsitedir('/home/USER/virtualenv/lib/python2.7/site-packages')
sys.path.append('/home/USER/virtualenv/PROJECT')
sys.path.append('/home/USER/virtualenv/')
new_sys_path = [p for p in sys.path if p not in prev_sys_path]
for item in new_sys_path:
sys.path.remove(item)
sys.path[:0] = new_sys_path
os.environ['DJANGO_SETTINGS_MODULE'] = 'PROJECT.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
错误信息
Fri Nov 25 22:24:25 2011 - WSGI application 0 (mountpoint=DOMAIN.com|) ready on interpreter 0x679920 pid: 9552
Traceback (most recent call last):
File "/home/USER/virtualenv/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 250, in __call__
self.load_middleware()
File "/home/USER/virtualenv/lib/python2.7/site-packages/django/core/handlers/base.py", line 39, in load_middleware
for middleware_path in settings.MIDDLEWARE_CLASSES:
File "/home/USER/virtualenv/lib/python2.7/site-packages/django/utils/functional.py", line 276, in __getattr__
self._setup()
File "/home/USER/virtualenv/lib/python2.7/site-packages/django/conf/__init__.py", line 42, in _setup
self._wrapped = Settings(settings_module)
File "/home/USER/virtualenv/lib/python2.7/site-packages/django/conf/__init__.py", line 89, in __init__
raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e))
ImportError: Could not import settings 'settings' (Is it on sys.path?): No module named settings
DOMAIN.com [pid: 9552|app: 0|req: 1/1] 184.96.159.248 () {48 vars in 1083 bytes} [Fri Nov 25 22:24:25 2011] GET / => generated 0 bytes in 284 ms$
Fri Nov 25 22:24:26 2011 - WSGI application 0 (mountpoint=DOMAIN.com|) ready on interpreter 0x679920 pid: 9553
Traceback (most recent call last):
File "/home/USER/virtualenv/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 250, in __call__
self.load_middleware()
File "/home/USER/virtualenv/lib/python2.7/site-packages/django/core/handlers/base.py", line 39, in load_middleware
for middleware_path in settings.MIDDLEWARE_CLASSES:
File "/home/USER/virtualenv/lib/python2.7/site-packages/django/utils/functional.py", line 276, in __getattr__
self._setup()
File "/home/USER/virtualenv/lib/python2.7/site-packages/django/conf/__init__.py", line 42, in _setup
self._wrapped = Settings(settings_module)
File "/home/USER/virtualenv/lib/python2.7/site-packages/django/conf/__init__.py", line 89, in __init__
raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e))
2 个回答
1
我猜你的Django应用是在Python的虚拟环境中运行的。如果是这样的话,你还需要在启动脚本中激活这个虚拟环境。可以这样写:
exect /path/to/virtualenv/activate && /usr/local/sbin/uwsgi
1
首先,你不需要那些复杂的 sys.path 设置,因为你的 nginx 变量已经为你设置好了虚拟环境。
我建议你使用静态模式,因为动态虚拟主机模式非常复杂,调试起来也常常很困难。只需修改你的命令行,去掉 nginx 中的三个 uwsgi_param 条目:
/usr/local/sbin/uwsgi
--uid www-data
--socket 127.0.0.1:5050
--master
--logto /var/log/uwsgi_main.log
--logdate
--optimize 2
--processes 4
--harakiri 120
--virtualenv /home/USER/virtualenv/
--pythonpath /home/USER/virtualenv/
--chdir /home/USER/virtualenv/PROJECT
--env DJANGO_SETTINGS_MODULE=PROJECT.settings
--module "django.core.handlers.wsgi:WSGIHandler()"
这样就足够了(显然你也可以把 wsgi 脚本扔掉)