Fedora37下Flask+Nginx+Gunicorn的Systemd启动权限问题排查
Fedora 37下Flask+Nginx+Gunicorn部署:Systemd启动Gunicorn报权限拒绝(203/EXEC)
问题背景
在Fedora 37上部署Flask应用,搭配Nginx反向代理和Gunicorn。已创建Systemd单元文件和启动脚本,手动执行脚本可正常启动,Nginx反向代理也能工作,但Systemd启动Gunicorn服务时提示权限拒绝(状态码203/EXEC),怀疑是SELinux干扰。
相关配置与日志
Systemd单元文件
[Unit] Description=gunicorn daemon After=network.target [Service] User=pretox Group=pretox WorkingDirectory=/home/pretox/ptox-metadata-manager ExecStart=/home/pretox/ptox-metadata-manager/gunicorn_start [Install] WantedBy=multi-user.target
Gunicorn启动脚本
#!/usr/bin/env bash . /home/pretox/ptox-metadata-manager/virtualenv/bin/activate /home/pretox/ptox-metadata-manager/virtualenv/bin/gunicorn --timeout 120 --name ptox-metdata-manager --user pretox --group pretox --log-level debug --error-logfile /home/pretox/ptox-metadata-manager/error.log --bind unix:/home/pretox/ptox-metadata-manager/ptox-metadata-manager.socket wsgi:app
Systemd启动失败日志
× gunicorn.service - gunicorn daemon Loaded: loaded (/etc/systemd/system/gunicorn.service; enabled; preset: disabled) Active: failed (Result: exit-code) since Wed 2023-01-25 09:51:22 GMT; 3s ago Duration: 4ms Process: 52572 ExecStart=/home/pretox/ptox-metadata-manager/gunicorn_start (code=exited, status=203/EXEC) Main PID: 52572 (code=exited, status=203/EXEC) CPU: 1ms Jan 25 09:51:22 catoblepas systemd[1]: Started gunicorn.service - gunicorn daemon. Jan 25 09:51:22 catoblepas systemd[52572]: gunicorn.service: Failed to locate executable /home/pretox/ptox-metadata-manager/gunicorn_start: Permission denied Jan 25 09:51:22 catoblepas systemd[52572]: gunicorn.service: Failed at step EXEC spawning /home/pretox/ptox-metadata-manager/gunicorn_start: Permission denied Jan 25 09:51:22 catoblepas systemd[1]: gunicorn.service: Main process exited, code=exited, status=203/EXEC Jan 25 09:51:22 catoblepas systemd[1]: gunicorn.service: Failed with result 'exit-code'.
文件安全上下文信息
(virtualenv) [pretox@development ptox-metadata-manager]$ ls -Z gunicorn_start unconfined_u:object_r:user_home_t:s0 gunicorn_start
解决方案
1. 确认脚本执行权限
虽然手动能执行,仍可再次确认脚本的可执行权限:
chmod +x /home/pretox/ptox-metadata-manager/gunicorn_start
2. 调整SELinux安全上下文(核心解决方法)
脚本位于用户主目录,SELinux默认限制系统服务访问user_home_t类型的文件,可通过以下方式处理:
方式一:修改脚本SELinux上下文为bin_t(推荐,永久生效)
先临时修改上下文:
sudo chcon -t bin_t /home/pretox/ptox-metadata-manager/gunicorn_start
添加SELinux规则确保永久生效:
sudo semanage fcontext -a -t bin_t "/home/pretox/ptox-metadata-manager/gunicorn_start" sudo restorecon -v /home/pretox/ptox-metadata-manager/gunicorn_start
方式二:临时关闭SELinux验证(仅用于排查)
如果不想修改上下文,可临时关闭SELinux验证是否为问题根源:
sudo setenforce 0
之后重启服务测试:
sudo systemctl restart gunicorn.service
若服务启动成功,说明确实是SELinux问题,建议用方式一修复,不要长期关闭SELinux。
3. 验证服务状态
修复后重新加载Systemd配置并启动服务:
sudo systemctl daemon-reload sudo systemctl start gunicorn.service sudo systemctl status gunicorn.service
内容的提问来源于stack exchange,提问作者knirirr
相关产品推荐
相关产品推荐

