如何让部署在AWS Fargate上的Docker化Django应用暴露80端口?
解决Django DRF应用在ECS Fargate上切换到80端口的问题
你有两种可行方案来实现应用运行在80端口,以下是具体操作细节:
方案一:直接让Django开发服务器运行在80端口(适合测试/轻量场景)
这种方式最简单,无需额外组件,直接修改端口配置即可:
1. 修改Dockerfile
将EXPOSE和启动命令中的端口从8000改为80:
# Pull base image FROM python:3.12 # Set environment variables ENV PIP_DISABLE_PIP_VERSION_CHECK 1 ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 # Set work directory WORKDIR /app # Install dependencies COPY ./requirements.txt . RUN pip install -r requirements.txt # Copy project COPY . . # 暴露80端口 EXPOSE 80 # 启动Django开发服务器在80端口 CMD ["python", "manage.py", "runserver", "0.0.0.0:80"]
2. 更新ECS任务定义
修改portMappings中的端口配置为80:
{ "taskDefinitionArn": "arn:aws:ecs:us-west-1:123:task-definition/app-task:12", "containerDefinitions": [ { "name": "container-name", "image": "dockerhub/app:latest", "cpu": 0, "portMappings": [ { "name": "default", "containerPort": 80, "hostPort": 80, "protocol": "tcp", "appProtocol": "http" } ], "essential": true, "environment": [], "mountPoints": [], "volumesFrom": [], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-create-group": "true", "awslogs-group": "/ecs/app-api-task", "awslogs-region": "us-west-1", "awslogs-stream-prefix": "ecs" } } } ], .... }
3. 调整安全组
在ECS服务对应的安全组中,添加80端口的TCP入站规则(原8000端口规则可保留测试用,也可删除)。
方案二:用Nginx反向代理(生产环境推荐)
Django自带的runserver是开发服务器,性能和稳定性不足,生产环境建议用Nginx做前端代理,将80端口的请求转发到内部8000端口的Django服务:
1. 调整Dockerfile
安装Nginx和进程管理工具supervisord,用于同时启动Nginx和Django服务:
# Pull base image FROM python:3.12 # 安装Nginx和supervisord RUN apt-get update && apt-get install -y nginx supervisor # Set environment variables ENV PIP_DISABLE_PIP_VERSION_CHECK 1 ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 # Set work directory WORKDIR /app # Install dependencies COPY ./requirements.txt . RUN pip install -r requirements.txt # Copy project COPY . . # 复制Nginx配置文件到容器 COPY nginx.conf /etc/nginx/conf.d/default.conf # 复制supervisord配置文件 COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf # 暴露80端口 EXPOSE 80 # 用supervisord启动Nginx和Django CMD ["/usr/bin/supervisord"]
2. 编写Nginx配置文件(nginx.conf)
server { listen 80; server_name _; location / { proxy_pass http://127.0.0.1:8000; 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; } # 若有静态文件,可添加如下配置 # location /static/ { # root /app; # } }
3. 编写supervisord配置文件(supervisord.conf)
[supervisord] nodaemon=true [program:nginx] command=/usr/sbin/nginx -g "daemon off;" autostart=true autorestart=true stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 [program:django] command=python manage.py runserver 0.0.0.0:8000 directory=/app autostart=true autorestart=true stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0
4. 更新ECS任务定义
仅需将portMappings中的端口改为80(同方案一的任务定义修改),同时确保安全组放行80端口。
方案对比
- 方案一:操作简单,适合快速测试或内部小应用,但不适合生产环境(
runserver性能差,无负载均衡、静态文件处理能力弱)。 - 方案二:符合生产环境规范,Nginx可处理静态文件、请求缓存、负载均衡等,提升应用稳定性和性能,推荐用于生产场景。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

