Docker环境下Nginx容器无法连接uWSGI容器求助
解决Nginx(HTTPS)与uWSGI+Flask跨容器请求失败问题
兄弟,这种跨容器的网络问题我之前踩过好几次坑,咱们一步步拆解排查,应该很快能搞定:
1. 先确认两个容器在同一个Docker网络里
Docker容器默认是隔离的,不在同一个网络的话根本没法互相访问。你可以先查一下两个容器的网络归属:
# 列出所有Docker网络 docker network ls # 查看Nginx容器的网络 docker inspect <你的Nginx容器名> | grep Networks # 查看uWSGI容器的网络 docker inspect <你的uWSGI容器名> | grep Networks
如果发现不在同一个网络,赶紧建个自定义网络(比默认bridge更稳定,还支持容器名解析),然后把两个容器都加进去:
# 创建自定义网络 docker network create flask-nginx-net # 重启Nginx容器时加入网络 docker run --network flask-nginx-net -p 443:443 ... <你的Nginx镜像> # 重启uWSGI容器时加入网络 docker run --network flask-nginx-net ... <你的uWSGI镜像>
2. 修正Nginx的反向代理配置
别用服务器公网IP11.11.11.1来指向uWSGI!在容器网络里,你得用uWSGI容器的名称(或者容器在自定义网络里的IP,不过容器名更靠谱,Docker会自动做DNS解析)。
举个正确的Nginx配置例子:
server { listen 443 ssl; server_name 11.11.11.1; ssl_certificate /etc/nginx/ssl/your-cert.pem; ssl_certificate_key /etc/nginx/ssl/your-key.pem; location / { # 这里的uwsgi-flask是你的uWSGI容器名称,5000是uWSGI监听的端口 uwsgi_pass uwsgi-flask:5000; # 一定要加这个,不然uWSGI没法正确解析请求 include uwsgi_params; } }
另外注意alpine版Nginx可能默认没有uwsgi_params,可以在Nginx的Dockerfile里加一句:
COPY uwsgi_params /etc/nginx/
(uwsgi_params文件可以从uWSGI容器里复制,或者直接用官方的模板内容)
3. 检查uWSGI的监听地址
这是最容易犯的错:uWSGI默认可能只监听127.0.0.1,这样只有容器内部能访问,Nginx容器根本连不上。
打开你的uWSGI配置文件(比如uwsgi.ini),把监听地址改成0.0.0.0:
[uwsgi] module = app:app master = true processes = 4 # 用uwsgi协议的话写socket,用http协议的话写http-socket socket = 0.0.0.0:5000
启动uWSGI的时候确保加载这个配置文件。
4. 测试容器间的连通性
如果前面的配置都改了还是不行,直接在Nginx容器里手动测试,定位问题:
# 进入Nginx容器 docker exec -it <你的Nginx容器名> sh # 先ping uWSGI容器名,看DNS解析是否正常 ping uwsgi-flask # 再用curl访问uWSGI的端口,看服务是否正常 curl http://uwsgi-flask:5000
- 如果ping不通:说明网络配置有问题,回去检查容器是否在同一个网络
- 如果curl能返回Flask的响应:说明uWSGI没问题,问题出在Nginx的配置(比如uwsgi_pass写错了,或者没加include uwsgi_params)
- 如果curl也不通:说明uWSGI的监听地址不对,或者服务没启动
按这个流程走下来,90%的概率能解决问题。
内容的提问来源于stack exchange,提问作者kotmsk
相关产品推荐
相关产品推荐

