Django + gunicorn + virtualenv + Supervisord 问题

Django + gunicorn + virtualenv + Supervisord 问题

我的 virtualenv + gunicorn 设置出现了一个奇怪的问题,只有当 gunicorn 通过 Supervisord 启动时才会出现。我确实意识到这很可能是我的 Supervisord 的问题,如果能提供任何关于更好的求助地点的反馈,我将不胜感激...

简而言之:当我从我的用户 shell 运行 gunicorn 时,在我的虚拟环境中,一切都运行正常。我能够访问我的 Django 项目的所有视图。

当系统启动时通过supervisord启动gunicorn时,一切正常。

但是,如果我必须终止 gunicorn_django 进程,或者执行 Supervisord 重启,一旦 gunicorn_django 重新启动,每个请求都会得到一个奇怪的 Traceback 答复:

(...)
  File "/home/hc/prod/venv/lib/python2.6/site-packages/Django-1.2.5-py2.6.egg/django/db/__init__.py", line 77, in
    connection = connections[DEFAULT_DB_ALIAS]
  File "/home/hc/prod/venv/lib/python2.6/site-packages/Django-1.2.5-py2.6.egg/django/db/utils.py", line 92, in __getitem__
    backend = load_backend(db['ENGINE'])
  File "/home/hc/prod/venv/lib/python2.6/site-packages/Django-1.2.5-py2.6.egg/django/db/utils.py", line 50, in load_backend
    raise ImproperlyConfigured(error_msg)
TemplateSyntaxError: Caught ImproperlyConfigured while rendering: 'django.db.backends.postgresql_psycopg2' isn't an available database backend.
Try using django.db.backends.XXX, where XXX is one of:
    'dummy', 'mysql', 'oracle', 'postgresql', 'postgresql_psycopg2', 'sqlite3'
Error was: cannot import name utils

完整堆栈可在此处获得:http://pastebin.com/BJ5tNQ2N

我在跑...

  • Ubuntu/maverick(最新)
  • Python = 2.6.6
  • 虚拟环境 = 1.5.1
  • gunicorn = 0.12.0
  • Django = 1.2.5
  • psycopg2 = '2.4-beta2 (dt dec pq3 ext)'

gunicorn配置:

backlog = 2048
bind = "127.0.0.1:8000"
pidfile = "/tmp/gunicorn-hc.pid"
daemon = True
debug = True
workers = 3
logfile = "/home/hc/prod/log/gunicorn.log"
loglevel = "info"

Supervisord 配置:

[program:gunicorn]
directory=/home/hc/prod/hc
command=/home/hc/prod/venv/bin/gunicorn_django -c /home/hc/prod/hc/gunicorn.conf.py
user=hc
umask=022
autostart=True
autorestart=True
redirect_stderr=True

有什么建议吗?我在这个问题上已经困惑了好久了。

这看起来像是一些奇怪的内存限制,因为我没有强制执行任何特殊的东西:

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 20
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

答案1

我在 gunicorn 开发人员 davisp 的帮助下找到了这个问题。谢谢!

这是一个环境问题,由主管 gunicorn 子进程的环境中无效的 HOME 设置引起。

直到我在 settings.py 文件中放入“import psycopg2”后,我才在 stderr 上得到任何东西,这会在 gunicorn 的主管的 stderr 文件上生成以下消息。

Error: Can't extract file(s) to egg cache

The following error occurred while trying to extract file(s) to the Python egg cache:

  [Errno 13] Permission denied: '/root/.python-eggs'"

我在 gunicorn 的主管配置文件中添加了以下行,现在 Python 找到了 u+可写的 egg 缓存。一切正常。

environment=HOME='/home/hc'

相关内容