Flask应用部署后运行一段时间POST请求失效,请求排查方案
Flask应用POST请求失效排查方案
问题背景
在Linode上通过Nginx、Gunicorn和Supervisor部署Flask应用,初始运行状态正常,但一段时间后页面可正常加载,登录、「联系我们」等POST请求却停止工作。std.err.log无错误记录,但Nginx日志显示failed(111: connection refused) while connecting to upstream。
现有配置
Nginx配置
server { server_name www.datiance.org; location /static/css/ { alias /home/ier/flask_blog/static/css/; } location /static/images/ { alias /home/ier/flask_blog/static/images/; } location / { proxy_pass http://localhost:8000; include /etc/nginx/proxy_params; proxy_redirect off; } listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/www.datiance.org/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/www.daiance.org/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot }
Supervisor配置
[program:flaskblog] directory=/home/ier/flask_blog command=/home/ier/flask_app/venv/bin/gunicorn -w 3 blog:app user=ier autostart=true autorestart=true stopasgroup=true killasgroup=true stderr_logfile=/var/log/flaskblog/flask_blog.err.log stdout_logfile=/var/log/flaskblog/flask_blog.out.log
排查方案
- 检查Gunicorn进程状态:执行
ps aux | grep gunicorn查看进程是否存活。若进程全部消失,检查Supervisor日志(/var/log/supervisor/supervisord.log)确认自动重启失败原因;若进程存在但无响应,手动执行supervisorctl restart flaskblog后测试POST请求。 - 验证8000端口可用性:用
netstat -tulpn | grep 8000或ss -tulpn | grep 8000查看端口是否被监听。若无进程监听,说明Gunicorn未正常启动或崩溃;若有监听,本地执行curl -X POST http://localhost:8000/login -d "username=test&password=test"模拟POST请求,判断问题出在Gunicorn内部还是Nginx代理环节。 - 查看Gunicorn标准输出日志:
std.err.log无错误不代表没有问题,检查/var/log/flaskblog/flask_blog.out.log,里面可能记录了POST请求处理时的内存耗尽、数据库连接超时、死锁等细节。 - 排查服务器资源占用:用
top或htop查看CPU、内存使用率,若资源耗尽,系统OOM Killer可能杀掉Gunicorn进程,可执行dmesg | grep OOM确认是否存在内存溢出导致的进程被杀情况。 - 修正Nginx配置错误:注意到Nginx配置中
ssl_certificate_key的域名拼写为www.daiance.org,与实际域名www.datiance.org不一致,先修正该拼写错误;同时检查/etc/nginx/proxy_params是否包含proxy_set_header Host $host;等必要请求头,缺失这类配置可能导致Flask无法正确处理POST请求。 - 检查数据库连接状态:POST请求通常涉及数据库操作,执行
systemctl status mysql(或对应数据库服务命令)查看数据库是否正常运行,同时检查数据库连接数是否耗尽、是否存在连接超时情况——若Flask未正确关闭数据库连接,可能导致连接池耗尽,无法处理新请求。 - 调整Gunicorn Worker数量:当前配置3个Worker,若请求量较大可能导致Worker被占满,可根据服务器CPU核心数调整为
2*核心数+1,观察问题是否复现。 - 排查防火墙与SELinux限制:执行
ufw status(或firewall-cmd --list-all)查看防火墙是否拦截8000端口;用sestatus检查SELinux是否开启,若开启则查看/var/log/audit/audit.log,确认是否存在阻止Nginx连接8000端口的策略。
内容的提问来源于stack exchange,提问作者LoveCode
相关产品推荐
相关产品推荐

