使用UWSGI部署Flask实时仪表盘页面无响应问题排查求助
实时仪表盘在uWSGI+Nginx下卡顿的问题排查与解决
问题背景
你遇到的这个情况很典型——本地直接跑Flask应用时响应流畅、图表实时更新正常,但部署到uWSGI+Nginx后就出现页面无响应、图表每隔30秒才加载的问题。大概率是长连接的支持配置没跟上,毕竟实时仪表盘依赖的SSE(服务器推送事件)或WebSocket,和普通HTTP请求的处理逻辑完全不一样。先把你的问题和配置梳理清楚:
你的配置信息
uWSGI配置
[uwsgi] base = /home/pi/Desktop/Bingo app = application module = %(app) home = %(base)/venv pythonpath = /home/pi/Desktop/Bingo/venv/bin/python socket = /home/pi/Desktop/Bingo/%n.sock chmod-socket = 666 callable = app logto = /home/pi/Desktop/Bingo/log/uwsgi/%n.log
Nginx配置
server { listen 80; server_name localhost; charset utf-8; client_max_body_size 75M; location /static { root /home/pi/Desktop/Bingo; } location / { try_files $uri @labapp; } location @labapp { include uwsgi_params; uwsgi_pass unix:/home/pi/Desktop/Bingo/lab_app_uwsgi.sock; } }
核心问题分析与修复方案
1. uWSGI默认并发不足,无法维持长连接
实时仪表盘的更新依赖长连接,而uWSGI默认的进程/线程数极少,单个进程被长连接占满后,新的请求就会排队等待,直接导致页面卡顿、更新延迟。
修改uWSGI配置,添加以下参数:
# 增加并发处理能力,树莓派硬件的话,4进程2线程足够 processes = 4 threads = 2 # 明确支持WebSocket(如果你的应用使用了该协议) http-websockets = true # 延长超时时间,防止长连接被强制断开 socket-timeout = 300 harakiri = 300
另外注意:你配置里的pythonpath指向了Python可执行文件,这是错误的!pythonpath应该是Python模块的搜索路径,改成:
pythonpath = %(base)
或者直接删掉这行——因为base已经是项目根目录,加上虚拟环境的home配置,uWSGI能正确找到你的Flask应用模块。
2. Nginx缺少长连接适配配置
Nginx默认的超时设置很短,会主动断开和uWSGI、浏览器之间的长连接,导致实时数据流中断,表现为图表很久才加载一次。
更新Nginx的@labapp location块:
location @labapp { include uwsgi_params; uwsgi_pass unix:/home/pi/Desktop/Bingo/lab_app_uwsgi.sock; # 保持Nginx和uWSGI之间的长连接 uwsgi_socket_keepalive on; # 延长读写超时,适配实时数据传输 uwsgi_read_timeout 300s; uwsgi_send_timeout 300s; # 禁用缓存,确保SSE的实时数据不会被浏览器缓存 add_header Cache-Control "no-cache"; }
3. 额外验证点
- 检查应用的实时响应头:如果是SSE,必须有
Content-Type: text/event-stream;如果是WebSocket,要确保握手流程正常 - 查看uWSGI日志:
/home/pi/Desktop/Bingo/log/uwsgi/lab_app_uwsgi.log,排查是否有超时、连接断开的错误信息 - 用浏览器开发者工具的Network标签,观察实时请求的状态:正常的长连接应该是
200 OK且持续保持连接状态
最后一步:重启服务
修改配置后,一定要重启uWSGI和Nginx才能生效:
# 重启uWSGI(如果没设置pid文件,先停止再启动) uwsgi --stop /home/pi/Desktop/Bingo/lab_app_uwsgi.pid uwsgi --ini /home/pi/Desktop/Bingo/lab_app_uwsgi.ini # 重启Nginx sudo systemctl restart nginx
内容的提问来源于stack exchange,提问作者Baseman
相关产品推荐
相关产品推荐

