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

在AWS Elastic Beanstalk部署Django+Gunicorn+Nginx+RDS的步骤及技术疑问

AWS Elastic Beanstalk部署Django(Gunicorn+Nginx+RDS)详细指南

刚好我之前做过类似的部署,给你整理一份完整步骤,再逐一解答你的疑问:

一、部署前准备与项目配置

1. 梳理Django项目依赖与基础配置

  • 确保本地项目运行正常,根目录下生成requirements.txt,要包含gunicorn、django以及数据库驱动(比如mysqlclient或psycopg2-binary)
  • 修改settings.py:
    • 把ALLOWED_HOSTS改成['your-app-name.elasticbeanstalk.com', 'localhost'](替换成你的EB域名)
    • 设置DEBUG=False(生产环境必须关闭)
    • 配置静态文件收集路径:STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
    • 数据库配置先留空,后面用EB环境变量注入

2. 配置Gunicorn

  • 在项目根目录创建Procfile,内容如下(替换your_project_name为实际项目名):
    web: gunicorn --bind 0.0.0.0:8000 your_project_name.wsgi:application
    
  • 可选:创建gunicorn.conf.py优化性能(适合Micro实例的配置):
    workers = 2  # 后面会详细说这个数的选择
    worker_class = 'sync'
    timeout = 30
    max_requests = 1000
    

3. 配置Nginx(EB实例内部)

Beanstalk自带的负载均衡器管外部流量分发,但实例内部还是需要Nginx来处理静态文件和反向代理Gunicorn。在项目根目录创建.ebextensions文件夹,里面新建nginx.config文件:

files:
  "/etc/nginx/conf.d/elasticbeanstalk/django.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      server {
          listen 80;
          server_name localhost;

          # 反向代理Gunicorn的Django服务
          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;
          }

          # 直接用Nginx处理静态文件,比Gunicorn高效
          location /static/ {
              alias /var/app/current/staticfiles/;
              expires 30d;
          }
      }

二、部署到Elastic Beanstalk

  1. 安装并配置AWS CLI,确保能正常访问你的AWS账号
  2. 初始化EB应用:
    eb init -p python-3.11 your-app-name  # 选择对应Python版本
    
  3. 创建EB环境:
    eb create your-env-name
    
  4. 部署项目:
    eb deploy
    

三、配置RDS数据库

  1. 登录AWS控制台,进入你的EB环境,在「配置」→「数据库」中添加RDS实例(选择MySQL/PostgreSQL,和Django配置对应)
  2. 在EB环境的「配置」→「软件」中添加环境变量,比如:
    • DB_NAME:数据库名
    • DB_USER:数据库用户名
    • DB_PASSWORD:数据库密码
    • DB_HOST:RDS实例的Endpoint
    • DB_PORT:数据库端口(MySQL是3306,PostgreSQL是5432)
  3. 修改settings.py的DATABASES配置,读取环境变量:
    import os
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',  # 换成postgresql_psycopg2如果用PostgreSQL
            'NAME': os.environ.get('DB_NAME'),
            'USER': os.environ.get('DB_USER'),
            'PASSWORD': os.environ.get('DB_PASSWORD'),
            'HOST': os.environ.get('DB_HOST'),
            'PORT': os.environ.get('DB_PORT'),
        }
    }
    
  4. 重新部署并运行迁移:
    eb deploy
    eb ssh -c "python manage.py migrate"
    

你的疑问解答

1. 使用Beanstalk部署Django时是否需要Nginx?因Beanstalk自带负载均衡器

Beanstalk的负载均衡器是外部流量分发层,负责把用户请求分到各个EC2实例,但每个实例内部,Nginx还是很有必要的:

  • Gunicorn是WSGI服务器,擅长处理Django的动态请求,但不适合直接暴露在公网,Nginx可以帮它处理HTTP请求的细节(比如请求头、超时、错误页面)
  • Nginx处理静态文件的效率比Gunicorn高得多,能减轻Gunicorn的负载
  • 简单说,负载均衡器管“多个实例之间的流量分配”,Nginx管“单个实例内部的请求路由与优化”,两者是不同层级的组件,缺一不可。

2. 若通过S3与CloudFront部署Angular应用,是否仍需Nginx来提供静态资源?Nginx在此场景下的作用有多大?

如果是纯静态Angular应用(没有后端API依赖),完全用S3+CloudFront托管就足够了,不需要额外的Nginx——S3可以存静态文件,CloudFront做全球CDN加速和缓存,性能已经很好。

但如果你的Angular需要调用Django的API,Nginx可以派上用场:你可以把Nginx放在Beanstalk实例前面(或者单独用EC2/Nginx),做反向代理,把Angular的API请求转发到Django服务,避免跨域问题。另外,如果有URL重写、请求头修改这类需求,Nginx也能处理。但纯静态场景下,Nginx作用很小。

3. AWS免费套餐提供的Micro EC2实例适合配置多少闲置进程/工作线程?

Micro实例(t2.micro/t3.micro)是1核CPU、1GB内存,针对Gunicorn的worker数,建议遵循2*CPU核心数 +1的经验公式,但因为Micro只有1核,所以实际配置要保守一点:

  • Gunicorn workers设置为2-3(不要超过3,否则内存容易不够用)
  • 如果用sync worker模式,每个worker的线程数可以设为2-4,能提升并发处理能力
  • 同时要监控实例的内存使用(在CloudWatch里看),如果内存占用长期超过80%,就把worker数降到2

另外,一定要让Nginx处理静态文件,别让Gunicorn碰,这样能省不少内存和CPU资源。


内容的提问来源于stack exchange,提问作者batbark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 16:32:46