AWS Elastic Beanstalk 上如何增大 Nginx 的 client_max_body_size?
EB 环境改 Nginx 上传大小限制:Amazon Linux 2 用 .platform/nginx/conf.d/ 放置配置片段,旧版 AL1 用 .ebextensions 写 files 键;附完整示例与验证方法、FAQ。
在 EB 上不能直接改默认 nginx.conf——部署会被平台覆盖。正确姿势:Amazon Linux 2/2023 平台把配置片段放进源码包的 .platform/nginx/conf.d/ 目录;老的 Amazon Linux 1 平台用 .ebextensions 里的 files 键生成 conf 文件。
Amazon Linux 2/2023(现行平台)
源码包根目录建 .platform/nginx/conf.d/upload.conf:
client_max_body_size 50M;
部署后 EB 会把该目录下的 .conf 文件 include 进 Nginx 的 http 块,eb deploy 即生效。
需要同时调整后端的限制(否则 Nginx 放行了、应用又拒):
- Node/Express:
app.use(express.json({ limit: '50mb' }))只限制 JSON;multipart 文件上传要调整对应上传中间件 - PHP:按平台支持方式调整
upload_max_filesize与post_max_size;后者及 Nginx body 限制应容纳文件加 multipart 开销,50M 的 body 上限不等于可上传完整 50M 文件
Amazon Linux 1(已退役的旧平台)
以下仅用于维护历史配置;应迁移到受支持的平台。
.ebextensions/nginx.config:
files:
"/etc/nginx/conf.d/proxy.conf":
mode: "000644"
owner: root
group: root
content: |
client_max_body_size 50M;
验证是否生效
# 登录 EB 实例
eb ssh
# 确认配置被 include
sudo nginx -T 2>&1 | grep -n client_max_body_size
# 用已有测试文件和实际上传端点验证;此命令不会创建文件
curl -X POST -F "file=@/path/to/big.bin" https://your-env.amazonaws.com/upload
确认实际上传成功,并测试大小边界;仅错误码改变不能证明上传配置正确。
注意:client_max_body_size 的三个层级
这个指令可以出现在 http、server、location 任意层级,就近优先。EB 场景放 conf.d/*.conf 是 http 级;若应用里某个 location 又单独设了更小的值,以 location 的为准——排障时记得 nginx -T 查看磁盘上的完整配置,并确认部署/reload 成功及实际请求结果。
常见问题(FAQ)
Q:改了 .platform 部署后还是 413?
A:三处排查:eb ssh 后 nginx -T 确认值真的进去了;应用层(PHP/Node/Java)自身的 body 限制是否更小;前面是否还有 CloudFront/ALB 的额外限制。
Q:这个值设多大合适?
A:按需最小化。大文件上传(百 MB 级)建议改用 S3 预签名直传,绕开 Nginx 和应用服务器的双重内存/磁盘压力。
Q:单实例环境和负载均衡环境配置一样吗?
A:一样。.platform 和 .ebextensions 对两种拓扑都生效;还需检查实际请求链路及目标类型限制,例如 ALB 的 Lambda target 有请求体大小限制,不能笼统认定 ALB 不限制 body。