如何以非root用户身份运行gunicorn/Python应用服务器?

8

我正在使用CentOS 5系统,通过Nginx反向代理部署Django应用程序,并使用Gunicorn作为应用程序服务器。我该如何以非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

你确定这是正确的命令吗?你确定可以在gunicorn_django命令的开头添加“-u nobody”吗?对我来说似乎不起作用。 - Mark
@Mark 他们是在sudo命令的末尾添加了-u nobody,而不是在gunicorn_django命令的开头添加。sudo -u让你选择一个除root以外的用户来运行接下来的命令。 - BHSPitMonkey
1个回答

5
我建议您使用 Supervisor。Supervisor会在启动时按照您指定的用户账户启动您的应用程序。
以下是我的 my_app.conf 文件,您可以将其放置在 /etc/supervisor/conf.d/ 目录下:
[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指向我的应用程序服务器(如果需要,也可以共享)。

编辑:澄清文件名


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接