如何通过Supervisord以非root用户启动Python Flask应用
让Supervisord以非root用户运行Flask应用的解决方案
嘿,我来帮你搞定这个问题——让Supervisord用非root用户跑你的Flask应用其实很简单,跟着下面的步骤来就行:
1. 先搞定运行用户(如果还没的话)
首先得有个专门的非root用户来跑应用,比如我们创建一个叫flaskuser的用户:
sudo useradd -m flaskuser
然后把你的Flask应用目录的权限给到这个用户,不然它读不到代码:
sudo chown -R flaskuser:flaskuser /path/to/your/flask/app
2. 修改Supervisord的进程配置文件
找到你的Flask应用对应的Supervisord配置文件(一般在/etc/supervisor/conf.d/下面,比如叫flask_app.conf),在[program:flask_app]段里加上user参数,指定刚才创建的用户:
[program:flask_app] command=/path/to/your/venv/bin/gunicorn -w 4 -b 0.0.0.0:5000 app:app # 替换成你的实际启动命令 directory=/path/to/your/flask/app # 你的应用根目录 user=flaskuser # 核心配置:指定用这个用户运行进程 autostart=true autorestart=true stdout_logfile=/var/log/flask_app/stdout.log stderr_logfile=/var/log/flask_app/stderr.log
3. 给日志目录设置正确权限
如果日志目录是root所有,flaskuser没权限写日志会报错,所以得调整:
sudo mkdir -p /var/log/flask_app sudo chown -R flaskuser:flaskuser /var/log/flask_app
4. 重启Supervisord让配置生效
执行下面的命令更新配置并重启应用:
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl restart flask_app
验证一下是否生效
你可以用这个命令检查进程的运行用户:
ps aux | grep flask_app
输出里应该能看到flaskuser作为进程的所属用户,就说明配置成功了。
额外小提示:如果需要绑定特权端口(比如80/443)
非root用户默认不能绑定1024以下的端口,要是你的应用需要用这些端口,不用切回root,可以给Python或者Gunicorn加个权限:
# 给虚拟环境里的Python加权限 sudo setcap 'cap_net_bind_service=+ep' /path/to/your/venv/bin/python # 或者给Gunicorn加权限 sudo setcap 'cap_net_bind_service=+ep' /path/to/your/venv/bin/gunicorn
这样就能保证你的Flask应用始终以非root权限运行,同时保留Supervisord自动重启的功能啦。
内容的提问来源于stack exchange,提问作者Priyanka Makhija
相关产品推荐
相关产品推荐

