迁移到找不到的nginx / uWSGI / django设置

时间:2011-11-26 16:47:35

标签: python django nginx uwsgi

一直存在Apache / Mod_wsgi堆栈的问题,并最终决定减少损失并在服务器端重新开始

已经获得Nginx设置来代理对uwsgi的请求。使用uwsgi协议相当容易。

然而uwsgi一直很顽固,试过在IRC中阅读docs / tutorials / ask ... 继续得到wsgi模块的相同错误,让Django找不到设置, 然而,当我通过控制台运行相同的代码时,我没有收到任何错误。

粘贴下面的所有相关脚本 - 假设我遗漏了一些明显但我不知道的东西。

在Ubuntu 11.10 w / Upstart脚本上运行

Upstart Script

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 个答案:

答案 0 :(得分:1)

我的猜测是你在python virtualenv中运行django应用程序。如果是这样,您还需要在upstart脚本中激活virtualenv: exect / path / to / virtualenv / activate&&的/ usr / local / sbin中/ uwsgi

答案 1 :(得分:1)

首先,你不需要所有这些sys.path混乱,你的nginx vars已经为你设置了virtualenv。

我建议你进入静态模式,因为动态虚拟主机模式非常复杂,而且通常很难调试。只需更改命令行并从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脚本)