Ubuntu 20.10 Google Cloud VPS中Flask使用flask-sse无法连接Redis求助
Flask结合Flask-SSE连接Redis的排障指南
1. 优先修正连接配置的常见踩坑点
- 把代码里的
app.config["REDIS_URL"] = "redis://localhost"替换为redis://127.0.0.1:6379,避免VPS上localhost默认解析到IPv6地址::1,但Redis默认只监听IPv4的127.0.0.1导致连接拒绝的问题 - 登录VPS进入项目虚拟环境,执行快速连通性测试:
python -c "import redis; r = redis.from_url('redis://127.0.0.1:6379'); print(r.ping())"
返回True就说明网络层面没有连接障碍,如果报错直接根据报错信息定位是权限还是网络问题 - 如果Redis开启了访问密码,需要把REDIS_URL改成
redis://:你的密码@127.0.0.1:6379的格式
2. 修正Gunicorn启动命令的错误
你当前的启动脚本存在两个会直接导致运行异常的问题:
- 命令末尾多余的
server参数是Gunicorn无法识别的无效参数,需要直接删除 - Unix套接字文件用了相对路径
mainsite.sock,Nginx和系统服务找文件的时候容易出现路径不匹配,必须改成绝对路径,比如unix:/home/foo/boo/mainsite.sock - 调整后的可正常运行的启动命令参考:
ExecStart=/home/foo/boo/mainenv/bin/gunicorn --workers 3 --worker-class gevent --bind unix:/home/foo/boo/mainsite.sock -m 007 wsgi:app --log-level debug
3. 适配Nginx对SSE流的处理规则
Flask-SSE是长连接流式响应,Nginx默认开启的缓冲会把流截断,导致前端EventSource报连接失败的错,这类报错往往和Redis本身无关。需要在Nginx的站点配置里,针对/stream路径单独加配置:
- 关闭代理缓冲、关闭缓存
- 拉长代理超时时间
- 透传Connection头
配置示例:
location /stream { proxy_pass http://unix:/home/foo/boo/mainsite.sock; proxy_http_version 1.1; proxy_set_header Connection ""; proxy_buffering off; proxy_cache off; proxy_read_timeout 24h; chunked_transfer_encoding off; }
4. 修正代码层面的冗余问题
- 代码块里
if __name__ == '__main__'下的http_server.serve_forever()属于未定义变量,开发模式启动时会直接报错,需要删掉 - 确认wsgi.py的导出逻辑正确:必须保证Gunicorn加载的app实例和你定义了Redis配置、注册了SSE蓝图的app是同一个对象,不然会出现配置不生效的问题
内容的提问来源于stack exchange,提问作者gabriel.dev
相关产品推荐
相关产品推荐

