在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
- 安装并配置AWS CLI,确保能正常访问你的AWS账号
- 初始化EB应用:
eb init -p python-3.11 your-app-name # 选择对应Python版本 - 创建EB环境:
eb create your-env-name - 部署项目:
eb deploy
三、配置RDS数据库
- 登录AWS控制台,进入你的EB环境,在「配置」→「数据库」中添加RDS实例(选择MySQL/PostgreSQL,和Django配置对应)
- 在EB环境的「配置」→「软件」中添加环境变量,比如:
DB_NAME:数据库名DB_USER:数据库用户名DB_PASSWORD:数据库密码DB_HOST:RDS实例的EndpointDB_PORT:数据库端口(MySQL是3306,PostgreSQL是5432)
- 修改
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'), } } - 重新部署并运行迁移:
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
相关产品推荐
相关产品推荐

