Gunicorn部署Dash应用报OSError: [Errno 98] Address already in use求助
问题根因
你的报错OSError: [Errno 98] Address already in use是两个进程抢占8050端口导致的:
- 当Gunicorn导入
run:application时,会先执行run.py的所有顶层代码 - 你在
run.py末尾直接调用了application.run_server(),这会启动Dash内置的Flask开发服务器,直接占用8050端口 - 之后Gunicorn尝试绑定8050端口启动服务时,发现端口已经被占用,就触发了报错
你杀宿主机的Python进程当然无效,因为端口占用是在容器内部发生的,和宿主机进程无关。
修复方案
直接修改run.py代码,把application.run_server()放在if __name__ == '__main__'判断里,这样只有直接执行run.py的时候才会启动内置开发服务器,被Gunicorn导入的时候不会执行:
from rwg_app.dash_app import create_app application = create_app() if __name__ == '__main__': application.run_server(host="0.0.0.0", port=8050)
可选优化建议
- 你的docker-compose里已经配置了Nginx反向代理,不需要对外暴露rwg_app的8050端口,可以删掉rwg_app配置里的
ports: - 8050:8050,避免直接访问绕过Nginx - 可以根据实际服务器配置调整Gunicorn的worker数量,通常设置为CPU核心数*2+1即可
内容的提问来源于stack exchange,提问作者Niels Hoogeveen
相关产品推荐
相关产品推荐

