在virtualenv内的chrooted nginx背后运行Gunicorn

时间:2013-05-19 08:43:30

标签: django nginx permissions gunicorn

如果我手动启动gunicorn或者如果我在我的django安装的应用程序中添加gunicorn,我可以使用此设置。但是当我尝试使用systemd启动gunicorn时,gunicorn套接字和服务开始很好,但它们并没有为Nginx提供任何服务;我得到了一个502坏网关。

Nginx正在“http”用户/组chroot jail下运行。我使用pythonbrew来设置virtualenvs,因此gunicorn安装在我的主目录下.pythonbrew下。 vitualenv目录由我的用户和adm组拥有。

我很确定在某个地方存在权限问题,因为如果我开始使用gunicorn,一切都会正常工作,但如果systemd启动它则不行。我已经尝试更改gunicorn.service文件中的用户和组指令,但没有任何效果;如果root启动服务器然后我没有错误和502,如果我的用户启动它我没有错误和504。

我已经检查了Nginx日志并且没有错误,所以我确定这是一个枪支问题。我应该在app目录中使用virtualenv吗?谁应该是app目录的所有者?我该如何缩小问题范围?

/usr/lib/systemd/system/gunicorn-app.service

#!/bin/sh

[Unit]
Description=gunicorn-app

[Service]
ExecStart=/home/noel/.pythonbrew/venvs/Python-3.3.0/nlp/bin/gunicorn_django
User=http
Group=http
Restart=always
WorkingDirectory = /home/noel/.pythonbrew/venvs/Python-3.3.0/nlp/bin

[Install]
WantedBy=multi-user.target

/usr/lib/systemd/system/gunicorn-app.socket

[Unit] 
Description=gunicorn-app socket 

[Socket] 
ListenStream=/run/unicorn.sock 
ListenStream=0.0.0.0:9000 
ListenStream=[::]:8000 

[Install] 
WantedBy=sockets.target

我意识到这是一个庞大的问题,但我确信我可以用一些指针来指出这个问题。感谢。

更新

我开始缩小范围。当我手动运行gunicorn然后运行ps aux|grep gunicorn时,我看到两个启动的进程:master和worker。但是当我用systemd启动gunicorn时,只有一个进程启动。我尝试将Type=forking添加到我的gunicorn.services文件中,但在加载服务时出现错误。我认为也许gunicorn不是在virtualenv下运行或者venv没有被激活?

有谁知道我在这里做错了什么?也许gunicorn没有在venv中运行?

2 个答案:

答案 0 :(得分:0)

我在使用launchd的OSX上遇到了类似的问题。 问题是我需要允许进程生成子进程。

尝试添加Type=forking

[Unit]
Description=gunicorn-app

[Service]
Type=forking

答案 1 :(得分:0)

我知道这不是最好的方法,但是我能够通过将gunicorn添加到django INSTALLED_APPS列表中来实现它。然后我刚刚创建了一个新的systemd服务:

[Unit]
Description=hack way to start gunicorn and django

[Service]
User=http
Group=http
ExecStart=/srv/http/www/nlp.com/nlp/bin/python /srv/http/www/nlp.com/nlp/nlp/manage.py run_gunicorn
Restart=always
[Install]
WantedBy=multi-user.target

必须有更好的方法,但从缺乏回应来判断,没有多少人知道更好的方法。