为什么Django项目失败部署? – django + nginx + uwsgi

我正试图通过Nginx和uWSGI部署一个Django项目。 如果我运行该项目手动运行python manage.py runserver :8000它工作正常,所以项目本身不是我猜的问题。

我在一个专用的virtualenv中安装了Django和依赖关系,并把这个项目放在里面。我还在virtualenv的外面安装了nginxuwsgi,并开始创buildconfiguration文件:

/etc/nginx/sites-available/myproject (在启用了网站的系统中进行符号链接):

 upstream uwsgi_myproject { server 127.0.0.1:5678; } server { listen 80; server_name my.url.net; set $home /path/to/myvirtualenv; access_log /path/to/myvirtualenv/log/access_uwsgi.log; error_log /path/to/myvirtualenv/log/error_uwsgi.log; client_max_body_size 10m; keepalive_timeout 120; location / { uwsgi_pass uwsgi_myproject; include uwsgi_params; gzip on; uwsgi_param UWSGI_CHDIR $home/path/to/myproject; uwsgi_param UWSGI_SCRIPT uwsgi; uwsgi_param UWSGI_PYHOME $home; root $home; } location /static/ { alias /path/to/myvirtualenv/path/to/myproject/static/; expires max; autoindex off; } location /media_adm/ { alias /path/to/myvirtualenv/lib/python2.7/site-packages/grappelli/static/; autoindex off; } } 

/etc/init/uwsgi_myproject.conf

 description "uWSGI starter for myproject" start on (local-filesystems and runlevel [2345]) stop on runlevel [016] respawn exec /path/to/myvirtualenv/bin/uwsgi \ --uid venvowner \ --home /path/to/myvirtualenv \ --pythonpath /path/to/myvirtualenv/path/to/myproject/ \ --socket 127.0.0.1:5678 \ --chmod-socket \ --module wsgi \ -b 8192 \ --logdate \ --optimize 2 \ --processes 2 \ --master \ --logto /path/to/myvirtualenv/log/uwsgi.log 

/path/to/myvirtualenv/path/to/myproject/wsgi.py

 import os, sys, site site.addsitedir('/path/to/myvirtualenv/lib/python2.7/site-packages') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings") from django.core.wsgi import get_wsgi_application application = get_wsgi_application() 

然后我重新启动机器,并尝试连接到my.url.net,但没有任何反应(当我在导入myproject之前安装nginx时,它响应“欢迎使用Nginx!”)。 我注意到了lsof | grep LISTEN lsof | grep LISTEN上游套接字尚未创build。 日志不会输出任何相关的信息 ,所以我试着用uwsgi_myproject.conf的相同参数手动执行uwsgi_myproject.conf并获得这个输出:

 current working directory: /etc/init detected binary path: /path/to/myvirtualenv/bin/uwsgi uWSGI running as root, you can use --uid/--gid/--chroot options *** WARNING: you are running uWSGI without its master process manager *** your processes number limit is 6674 your memory page size is 4096 bytes detected max file descriptor number: 1024 lock engine: pthread robust mutexes thunder lock: disabled (you can enable it with --thunder-lock) The -s/--socket option is missing and stdin is not a socket. 

编辑:所以我最后一件事是重新sorting参数。 现在,–socket参数被成功处理了,但是我仍然在输出行中获得这个消息:

 *** no app loaded. going in full dynamic mode *** 

我一直在阅读的一些文件:

  • 通过Upstart运行uWSGI
  • Nginx支持
  • 用uWSGI和nginx设置Django和你的web服务器

关于我错过或忽略什么的任何想法?

继续:我再次查看文档并尝试一种不同的方法:使用.ini文件并手动运行以查看会发生什么情况:

这有点丑,但是这里有:

 [uwsgi] socket = 127.0.0.1:5678 uid = venvowner chdir = /path/to/myvirtualenv home = /path/to/myvirtualenv virtualenv = /path/to/myvirtualenv pythonpath = /path/to/myvirtualenv/path/to/myproject module = wsgi master = true optimize = 2 processes = 2 logto = /path/to/myvirtualenv/log/uwsgi.log 

我获得了一些有用的日志:

 *** Python threads support is disabled. You can enable it with --enable-threads *** *** Operational MODE: preforking *** ImportError: No module named wsgi unable to load app 0 (mountpoint='') (callable not found or import error) *** no app loaded. going in full dynamic mode *** *** uWSGI is running in multiple interpreter mode *** 

工人们产生了,但是堆栈显然失败了。 我将在另一天采取这一点。

最后,我做了工作。 感谢@DhirajThakur的评论,这有助于我看清楚正确的方向。

/etc/init/uwsgi_myproject.conf

 description "uWSGI starter for myproject" start on (local-filesystems and runlevel [2345]) stop on runlevel [016] respawn exec /usr/local/bin/uwsgi /etc/init/myproject.ini 

/etc/init/myproject.ini

 [uwsgi] master = true socket = 127.0.0.1:5678 uid = venvowner chdir = /path/to/myvirtualenv home = /path/to/myvirtualenv virtualenv = /path/to/myvirtualenv pythonpath = /path/to/myvirtualenv/path/to/myproject wsgi-file = /path/to/myvirtualenv/path/to/myproject/wsgi.py optimize = 2 processes = 2 logto = /path/to/myvirtualenv/log/uwsgi.log 

不知何故,我有这样的感觉,我解决问题的方式是一个难看的艰难。