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

如何让部署在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:32:50