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' })) - PHP:
php.ini的upload_max_filesize与post_max_size都要 ≥ 50M(同样可用.platform下的 php 配置覆盖)
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
nginx -T | grep client_max_body_size
# 实测:构造一个 20MB 的文件上传
curl -X POST -F "file=@/path/to/big.bin" https://your-env.amazonaws.com/upload
413 Request Entity Too Large 消失即生效。
注意:client_max_body_size 的三个层级
这个指令可以出现在 http、server、location 任意层级,就近优先。EB 场景放 conf.d/*.conf 是 http 级;若应用里某个 location 又单独设了更小的值,以 location 的为准——排障时记得 nginx -T 看完整生效配置。
观测云对照
上传链路是典型的高失败率路径:413、499(客户端断开)、502 都集中在这里。把 EB 环境的 Nginx 访问日志通过 DataKit 采集到观测云,按状态码和 URI 聚合,"哪个接口的上传失败率高"一图即见;对 413 数量设告警阈值,限额配置回退或缺失时立刻能发现。
常见问题(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 本身默认不限制 body 大小(只受 idle timeout 影响)。