django - 在 virtualenv 中的 chrooted nginx 后面运行 Gunicorn

标签 django nginx permissions gunicorn

如果我手动启动 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 问题。我应该在应用程序目录中有 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 中运行?

最佳答案

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

尝试添加 Type=forking :

[Unit]
Description=gunicorn-app

[Service]
Type=forking

关于django - 在 virtualenv 中的 chrooted nginx 后面运行 Gunicorn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16632848/

相关文章:

symfony - 无法写入缓存

python - Django 在 Oracle 中的计数失败

python - djangorest框架中的序列化错误

python - 用于从字符串开头开始的 substr 匹配的 Django Queryset

docker - 将简单的docker compose连接到nginx?

php - 如何从主文件夹使用 Apache 运行 PHP 项目

python - 检查用户是否具有 Django 中列出的权限之一

python - django nginx静态文件404

ssl - 如何配置 NGINX SSL (SNI)

javascript - "right way"在一台服务器上托管多个 NodeJS 域?