项目wsgi在自动启动但未手动启动时找不到

时间:2014-02-15 05:55:28

标签: django gunicorn supervisor

我不明白为什么当主管尝试自动启动应用程序时(例如,当服务器启动时),我收到有关未找到“project.wsgi”模块的错误。

2014-02-15 05:13:05 [1011] [INFO] Using worker: sync
2014-02-15 05:13:05 [1016] [INFO] Booting worker with pid: 1016
2014-02-15 05:13:05 [1016] [ERROR] Exception in worker process:
Traceback (most recent call last):
  File "/var/local/sites/myproject/venv/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 495, in spawn_worker
    worker.init_process()
  File "/var/local/sites/myproject/venv/local/lib/python2.7/site-packages/gunicorn/workers/base.py", line 106, in init_process
    self.wsgi = self.app.wsgi()
  File "/var/local/sites/myproject/venv/local/lib/python2.7/site-packages/gunicorn/app/base.py", line 114, in wsgi
    self.callable = self.load()
  File "/var/local/sites/myproject/venv/local/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 62, in load
    return self.load_wsgiapp()
  File "/var/local/sites/myproject/venv/local/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 49, in load_wsgiapp
    return util.import_app(self.app_uri)
  File "/var/local/sites/myproject/venv/local/lib/python2.7/site-packages/gunicorn/util.py", line 354, in import_app
    __import__(module)
ImportError: No module named myproject.wsgi

虽然我没有收到此错误,但在我手动操作时它可以正常工作:

sudo supervisorctl start myapp

有什么不同?

由于

UPDATE:

主管conf文件:

[program:myproject]
command=/var/local/sites/myproject/run/gunicorn_start                       ; Command to start app
user=myproject                                             ; User to run as
autostart=true
autorestart=true
loglevel=info
redirect_stderr=false
stdout_logfile=/var/local/sites/myproject/logs/supervisor-myproject-stdout.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/var/local/sites/myproject/logs/supervisor-myproject-stderr.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB

的/ var /本地/位点/ myproject的/运行/ gunicorn_start:

#!/bin/bash

NAME="myproject_app"         # Name of the application
USER=myproject          # the user to run as
GROUP=myproject        # the group to run as

NUM_WORKERS=3                       # how many worker processes should Gunicorn spawn

# Logs config
LOG_LEVEL=info
ACCESS_LOGFILE=/var/local/sites/myproject/logs/gunicorn-myproject-access.log
ERROR_LOGFILE=/var/local/sites/myproject/logs/gunicorn-myproject-error.log

echo "Starting $NAME"        

exec envdir /var/local/sites/myproject/env_vars /var/local/sites/myproject/venv/bin/gunicorn myproject.wsgi:application \
  --name $NAME \
  --workers $NUM_WORKERS \
  --user=$USER --group=$GROUP \
  --log-level=$LOG_LEVEL \
  --bind=unix:/tmp/myproject.gunicorn.sock \
  --access-logfile=$ACCESS_LOGFILE \
  --error-logfile=$ERROR_LOGFILE

3 个答案:

答案 0 :(得分:2)

我认为您应该将directory添加到您的超级用户配置文件中。这是我的模板。我在每个项目中使用它并且工作正常:

[program:PROJECT_NAME]
command=/opt/sites/PROJECT_NAME/env/bin/gunicorn -c /opt/sites/etc/gunicorn/GUNICORN_CONF.conf.py PROJECT_NAME.wsgi:application
directory=/opt/sites/PROJECT_NAME
environment=PATH="/opt/sites/PROJECT/env/bin"
autostart=true
autorestart=false
redirect_stderr=True
stdout_logfile=/tmp/PROJECT_NAME.stdout

答案 1 :(得分:0)

我之前遇到过同样的问题。我在gunicorn_start中使用以下行而不是envdir。我在位于/env/nafd/的虚拟环境中运行django应用程序,而我的django应用程序位于/env/nafd/nafd_proj

..
DJANGODIR=/to/path/app_proj
cd $DJANGODIR
source ../bin/activate`

exec ../bin/gunicorn nafd_proj.wsgi:application \
  --name $NAME \
  --workers $NUM_WORKERS \
  --user=$USER --group=$GROUP \
  --log-level=$LOG_LEVEL \
  --bind=unix:/tmp/myproject.gunicorn.sock \
  --access-logfile=$ACCESS_LOGFILE \
  --error-logfile=$ERROR_LOGFILE`

答案 2 :(得分:0)

很明显,但值得一提:

  

检查“supervisord”守护程序是否正在运行(服务主管状态)。

以下是我在这里的设置,使用带有WSGI(Gunicorn)的Flask应用程序,通过Supervisor控制,并且它运行良好。

Flask App

root@ilg40:~# ll /etc/tdm/flask/
total 1120
drwx------ 5 root root   4096 Jan 24 19:47 ./
drwx------ 3 root root   4096 Jan 23 00:20 ../
-r-------- 1 root root   1150 Aug 31 17:54 favicon.ico
drw------- 2 root root   4096 Jan 13 22:51 static/
-rw------- 1 root root 883381 Jan 23 20:09 tdm.log
-rwx------ 1 root root  73577 Jan 23 21:37 tdm.py*
-rw------- 1 root root  56445 Jan 23 21:37 tdm.pyc
drw------- 2 root root   4096 Jan 23 20:08 templates/
-rw-r--r-- 1 root root    493 Jan 23 22:42 wsgi.py
-rw-r--r-- 1 root root    720 Jan 23 22:42 wsgi.pyc
srwxrwxrwx 1 root root      0 Jan 24 19:47 wsgi.sock=

主管配置文件

root@ilg40:~# cat /etc/supervisor/conf.d/wsgi_flask.conf 
[program:wsgi_flask]
command = gunicorn --preload --bind unix:/etc/tdm/flask/wsgi.sock --workers 4 --pythonpath /etc/tdm/flask wsgi 
process_name = wsgi_flask
autostart = true
autorestart = true
stdout_logfile = /var/log/wsgi_flask/wsgi_flask.out.log
stderr_logfile = /var/log/wsgi_flask/wsgi_flask.err.log

更新关于新流程的Supervisord

root@ilg40:~# supervisorctl update
wsgi_flask: added process group

检查流程状态

root@ilg40:~# supervisorctl status wsgi_flask
wsgi_flask                       RUNNING    pid 1129, uptime 0:29:12

注意:在上面的设置中,我没有使用virtualenv,我认为可能需要为进程配置目录变量另外,为命令变量配置环境PATH(添加env PATH =“$ PATH:/ / app / path”gunicorn ...),因为那个gunicorn,flask等等,只位于virtualenv内。