EC2(Amazon-Linux-2)部署Flask应用:Gunicorn服务运行但POST请求失败
问题排查与解决
1. NGINX代理目标不匹配(核心问题)
手动执行gunicorn --bind 127.0.0.1:5000 wsgi:app时,Gunicorn绑定的是TCP端口5000,NGINX配置里的proxy_pass http://127.0.0.1:5000刚好匹配,请求能正常转发。但通过systemd服务启动时,Gunicorn绑定的是Unix套接字文件myproject.sock,NGINX仍在尝试转发到TCP端口5000,自然无法连通。
修改NGINX配置文件/etc/nginx/sites-enabled/reverse-proxy.conf中的location /块,将proxy_pass指向套接字文件:
location / { error_page 405 =200 $uri; proxy_pass http://unix:/home/ec2-user/myproject/myproject.sock; }
修改后重启NGINX服务:
sudo systemctl restart nginx
2. 检查WSGI模块导入路径
你的wsgi.py中使用from myproject import app,但提供的Flask应用文件名为flaskapp.py,这会导致Gunicorn启动时找不到myproject模块(除非你将flaskapp.py重命名为myproject.py,或在项目目录下创建__init__.py并导入flaskapp中的app)。
如果未重命名文件,需修改wsgi.py为:
from flaskapp import app if __name__ == "__main__": app.run(host='127.0.0.1')
3. 验证套接字文件权限
虽然你提到权限配置正确,但仍需确认myproject.sock的权限允许NGINX进程访问:
- 查看套接字权限:
ls -l /home/ec2-user/myproject/myproject.sock
- 你的Gunicorn启动参数中
-m 007设置的权限是---rwxrwx(用户和组无权限,其他用户全权限),更安全的做法是设置为0770,并将ec2-user加入NGINX用户组(Amazon Linux 2中NGINX用户组为nginx):
sudo usermod -aG nginx ec2-user
然后修改myproject.service中的ExecStart参数,将-m 007改为-m 0770,重启服务:
sudo systemctl daemon-reload sudo systemctl restart myproject
4. 排查日志定位问题
如果以上修改后仍无法解决,查看以下日志获取更多信息:
- NGINX错误日志:
cat /var/log/nginx/reverse-error.log
- Gunicorn服务日志:
journalctl -u myproject.service
内容的提问来源于stack exchange,提问作者Mahesh Manjunath
相关产品推荐
相关产品推荐

