如何以非根用户运行gunicorn/python应用服务器?

8 投票
1 回答
11592 浏览
提问于 2025-04-17 12:57

我正在CentOS 5上部署一个使用gunicorn的django应用,并且是放在nginx后面的。我想知道怎么才能以非root用户的身份运行gunicorn?文档里似乎没有提到这个问题。这可能也适用于任何在nginx后面的python应用服务器……

我还要补充一下,下面这个方法是行不通的:

sudo -u nobody gunicorn_django --workers=4

它失败了,错误信息是:

raise HaltServer(reason, self.WORKER_BOOT_ERROR)
    gunicorn.errors.HaltServer: <HaltServer 'Worker failed to boot.' 3>

回答:

我犯了个错误。我有一个自定义的settings.py文件,所以应该用以下方式来启动gunicorn:

sudo -u nobody gunicorn_django --workers=4 production_settings.py

1 个回答

5

我推荐使用supervisord。Supervisor会在你指定的用户账户下启动你的应用程序。

这是我放在 /etc/supervisor/conf.d/ 目录下的 my_app.conf 文件:

[program:my_app]
command=/home/some_user/my_app/run_gunicorn
directory=/home/some_user/my_app
user=some_user                  
redirect_stderr=true            
stdout_logfile=/home/some_user/supervisord_stdout.txt
stdout_logfile_maxbytes=20MB
stdout_logfile_backups=10

我的 run_gunicorn 脚本如下:

#!/bin/bash
source /home/some_user/virtualenvs/my_app_virtualenv/bin/activate
exec /home/some_user/virtualenvs/my_app_virtualenv/bin/gunicorn -c gunicorn.conf   wsgi:application

我可以直接在 my_app.conf 文件中引用 gunicorn,但我没有这样做,因为这样我可以运行 activate。我把我的 DJANGO_SECRET 放在 activate 脚本的最后作为环境变量。这样处理 API 密钥和其他敏感信息也很好,因为这些东西不应该放在 Git 或 Mercurial 上。

我的 gunicorn.conf 文件是:

backlog = 2048
bind = "127.0.0.1:9000"
pidfile = "/home/some_user/gunicorn-my_app.pid"
daemon = False
debug = False
workers = 3
logfile = "/home/some_user/gunicorn-my_app.log"
loglevel = "info"
timeout = 90

其实我相信还有改进的空间,但这些配置可以让我在不使用 root 权限的情况下运行我的应用。Supervisord 确保应用服务器保持运行。然后我通过 proxy_pass 将 nginx 指向我的应用服务器(如果需要,我也可以分享这个)。

编辑:澄清文件名

撰写回答