Docker化Nginx反向代理无法监听指定端口问题求助
问题描述
在Amazon EC2上通过Docker部署Django后端API后,尝试引入基于tiangolo/nginx-rtmp-docker镜像的Docker化Nginx作为反向代理(后续用于静态媒体缓存和直播流服务),但测试时发现访问EC2公网IP:70无响应,该端口应代理至Django API。
已完成的基础检查:
- EC2安全组已添加自定义TCP端口70的入站规则
- Django与Nginx容器均正常运行
- 通过
docker ps确认端口映射配置正确 netstat验证宿主机70、80端口处于监听状态- 访问EC2公网IP:80可正常访问Django API
后续排查进展:
- 确认安全组规则无误
- 发现Nginx容器内无
ping命令,清理配置后通过nginx -t验证语法正确,但Nginx容器日志为空,问题未解决。
相关配置文件
docker-compose.yml
version: '3.8' services: django-api: build: ./django ports: - "80:8000" networks: - app-network nginx-proxy: build: ./nginx ports: - "70:80" - "1935:1935" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf networks: - app-network networks: app-network: driver: bridge
nginx.conf
worker_processes auto; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream django_api { server django-api:8000; } server { listen 80; location / { proxy_pass http://django_api; 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; } } } rtmp { server { listen 1935; chunk_size 4096; application live { live on; record off; } } }
Nginx容器Dockerfile
FROM tiangolo/nginx-rtmp-docker COPY nginx.conf /etc/nginx/nginx.conf
排查与解决步骤
1. 验证容器间网络连通性
由于Nginx容器无ping命令,使用curl测试容器内是否能访问Django服务:
# 若容器内无curl,先安装 docker exec -it <nginx-container-id> apt update && apt install -y curl # 测试访问Django服务内部端口 docker exec -it <nginx-container-id> curl http://django-api:8000
若无法访问,需确认两个容器是否在同一Docker网络(app-network)内,检查docker-compose.yml的网络配置是否一致。
2. 检查Nginx Upstream配置
确保nginx.conf中upstream django_api指向的是Docker Compose服务名(django-api)和Django容器内部端口(如8000),而非宿主机映射的80端口——容器间通信依赖内部端口,与宿主机端口映射无关。
3. 开启Nginx详细日志定位问题
默认镜像可能未输出日志到容器stdout,修改nginx.conf的http块添加日志配置:
access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log;
在docker-compose.yml的Nginx服务中添加日志卷映射:
volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf - ./nginx/logs:/var/log/nginx
重启容器后查看./nginx/logs下的日志文件,定位具体错误。
4. 确认Nginx容器内部端口监听
进入Nginx容器,检查80端口是否被Nginx监听:
docker exec -it <nginx-container-id> netstat -tulpn | grep nginx
若端口未监听,手动重载Nginx配置:
docker exec -it <nginx-container-id> nginx -s reload
仍无效则检查配置文件是否存在隐性语法问题(即使nginx -t通过,也可能存在加载失败情况)。
5. 检查EC2实例本地防火墙
EC2安全组开放端口后,需确认实例本身的防火墙(如iptables)未阻止70端口流量:
sudo iptables -L -n | grep 70
若存在阻止规则,添加允许规则:
sudo iptables -A INPUT -p tcp --dport 70 -j ACCEPT
内容的提问来源于stack exchange,提问作者Ananth

