使用Nginx部署Flask应用遇超时问题求助
Flask + Gunicorn + Nginx 部署超时(502错误)问题解决
问题背景
在DigitalOcean Droplet上部署Flask应用,遵循官方教程操作后出现异常:
- 直接运行
app.py或手动执行gunicorn --bind 0.0.0.0:5000 app:app时,可通过IP正常访问应用 - 通过Nginx访问(域名/IP,且未手动启动应用)时出现超时,Nginx日志显示502错误
当前环境信息
目录结构
root/ └── baseweb/ ├── venv ├── app.py └── app/ ├── routes.py └── templates/ └── index.html
app.py代码
from app import app if __name__ == "__main__": app.run(host='0.0.0.0', debug=True)
Systemd服务配置(/etc/systemd/system/baseweb.service)
Description=Gunicorn instance to serve myproject Requires=project.sock After=network.target [Service] User=root Group=www-data WorkingDirectory=/root/baseweb Environment="PATH=/root/baseweb/venv/bin" ExecStart=/root/baseweb/venv/bin/gunicorn --preload --timeout 120 --bind unix:/baseweb/baseweb.sock -m 007 --work Restart=always RestartSec=3 [Install] WantedBy=multi-user.target
Nginx配置(/etc/nginx/sites-available/baseweb)
server { list 80; server_name baserank.net, www.baserank.net; location / { proxy_pass http://127.0.0.1:5000; } }
Nginx access.log日志
185.16.141.5 - - [17/Feb/2023:14:14:17 +0000] "GET / HTTP/1.1" 502 568 "http://baserank.net/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36" 185.16.141.5 - - [17/Feb/2023:14:14:17 +0000] "GET / HTTP/1.1" 502 568 "http://baserank.net/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36" 185.16.141.5 - - [17/Feb/2023:14:14:20 +0000] "GET / HTTP/1.1" 502 568 "http://baserank.net/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36" 185.16.141.5 - - [17/Feb/2023:14:14:20 +0000] "GET / HTTP/1.1" 502 568 "http://baserank.net/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36" 143.110.222.166 - - [17/Feb/2023:14:22:21 +0000] "GET / HTTP/1.1" 502 166 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 16_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Mobile/15E148 Safari/604.1"
问题分析与修复步骤
1. 修复Systemd服务配置错误
当前服务配置存在两处致命问题:
ExecStart命令未完成:--work应为--workers参数(如--workers 3),且缺少应用入口app:app- Sock路径不一致:
Requires=project.sock与绑定的/baseweb/baseweb.sock不匹配,且该路径可能存在权限问题
修改后的服务配置:
Description=Gunicorn instance to serve baseweb Requires=/root/baseweb/baseweb.sock After=network.target [Service] User=root Group=www-data WorkingDirectory=/root/baseweb Environment="PATH=/root/baseweb/venv/bin" # 修正sock路径到工作目录,补全workers参数和应用入口 ExecStart=/root/baseweb/venv/bin/gunicorn --preload --timeout 120 --bind unix:/root/baseweb/baseweb.sock -m 007 --workers 3 app:app # 设置umask确保sock文件组有读写权限 UMask=0002 Restart=always RestartSec=3 [Install] WantedBy=multi-user.target
执行以下命令生效:
sudo systemctl daemon-reload sudo systemctl restart baseweb # 检查服务状态,确保显示active (running) sudo systemctl status baseweb # 查看服务日志排查启动错误 journalctl -u baseweb -f
2. 修复Nginx配置错误
当前Nginx配置存在两处错误:
list 80拼写错误,应为listen 80server_name中的逗号需删除,多个域名用空格分隔- 代理目标与gunicorn绑定的socket不一致(当前代理到5000端口,但服务绑定的是unix socket)
修改后的Nginx配置:
server { listen 80; server_name baserank.net www.baserank.net; location / { # 代理到gunicorn绑定的unix socket proxy_pass http://unix:/root/baseweb/baseweb.sock; # 添加必要的代理头,保证Flask能获取正确的请求信息 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
执行以下命令生效:
# 检查Nginx配置语法 sudo nginx -t # 重启Nginx sudo systemctl restart nginx
3. 验证权限与连接
- 检查sock文件权限:
ls -l /root/baseweb/baseweb.sock # 正常应为 root:www-data,权限 rw-rw----
- 测试socket连接:
curl --unix-socket /root/baseweb/baseweb.sock http://localhost # 应返回应用的正常响应内容
4. 其他排查点
- 确认DigitalOcean Droplet的防火墙规则已允许80端口的HTTP流量
- 检查系统防火墙(ufw)是否开放80端口:
sudo ufw status,若未开放则执行sudo ufw allow 80
内容的提问来源于stack exchange,提问作者dms_quant
相关产品推荐
相关产品推荐

