4

如果我手动启动 gunicorn 或者将 gunicorn 添加到 django 安装的应用程序中,我可以使用此设置。但是当我尝试使用 systemd 启动 gunicorn 时, gunicorn 套接字和服务启动正常,但它们对 Nginx 没有任何服务;我得到一个 502 错误网关。

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

我很确定某处存在权限问题,因为如果我启动 gunicorn 一切正常,但如果 systemd 启动它就不行。我尝试更改 gunicorn.service 文件中的用户和组指令,但没有任何效果;如果root启动服务器,那么我没有错误和502,如果我的用户启动它,我没有错误和504。

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

/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 中运行?

4

2 回答 2

0

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

尝试添加Type=forking

[Unit]
Description=gunicorn-app

[Service]
Type=forking
于 2013-05-19T10:16:19.200 回答
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

肯定有更好的方法,但从缺乏回应来看,没有多少人知道更好的方法是什么。

于 2013-05-20T01:05:22.893 回答