You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker化Nginx反向代理无法监听指定端口问题求助

Docker化Nginx反向代理无响应问题排查(EC2 + Django + tiangolo/nginx-rtmp)

问题描述

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 15:07:34