如何以非根用户运行gunicorn/python应用服务器?
我正在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 指向我的应用服务器(如果需要,我也可以分享这个)。
编辑:澄清文件名