DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

Nginx 长查询返回 414:请求行要能放进单个缓冲区

长查询返回 Nginx 414 时,核对请求由哪一层拒绝,以及 large_client_header_buffers 的单个大小。配置位置、默认站点与上游限制都可能影响最终结果。

普通页面能访问,但查询参数变长后返回 414 Request-URI Too Large。如果这条响应由 Nginx 在读取客户端请求时产生,应检查 large_client_header_buffers 的单个缓冲区大小。把缓冲区数量从 4 改成 8,并不会让一条请求行获得两倍空间。

本文讨论 Nginx 接收 HTTP/1.x 长请求行的场景。HTTP/2、HTTP/3 的头部限制机制不同,不能直接按 HTTP/1.x 请求行长度套算;上游应用或前置代理返回的 414,也需要检查它们自己的限制。

先确认拒绝请求的是哪一层

保留触发错误的真实请求,核对 Nginx 错误日志、访问日志和上游是否收到请求。日志若显示客户端请求行过长,而上游没有收到这次请求,就先处理 Nginx 接收阶段。

如果请求已经进入上游,或前置 CDN、负载均衡器先返回 414,修改这台 Nginx 不一定生效。仅看到响应中的 Server 名称也不足以判断生成错误的组件,应把同一时间段的各层记录对应起来。

请求行包含方法、请求目标与 HTTP 版本,不只是某一个参数的长度。中文等内容经过 URL 编码后,传输长度也可能变大;应按实际发送的请求判断,不按界面里显示的字符数估算。

调整 size,而不是只增加 number

配置格式为:

large_client_header_buffers number size;

HTTP/1.x 的一条请求行不能超过一个缓冲区的大小,否则返回 414;一个请求头字段超过单个缓冲区时则可能返回 400。这与 client_max_body_size 控制请求体的用途不同,也与 proxy_buffer_size 接收上游响应头的用途不同。

例如,确认业务需要后,可以评估下面的配置片段:

large_client_header_buffers 4 16k;

16k 是示例值,需依据实际业务上限选择,不是所有 414 的推荐值。这个指令允许放在 http 或 server 中,不能放在 location。如果已有同层配置,应修改那一项,不要再追加重复指令。

缓冲区按需要分配,但放宽限制仍可能增加处理大请求的资源需求。不要为了一个长 URL 把每个缓冲区直接设置成数 MB,也不要同时调整不相关的上传或响应缓冲区。

配置写在目标站点,未必就是读取时采用的值

Nginx 创建连接时先处于默认 server 的配置上下文,后续才可能通过 TLS SNI、请求行或 Host 选择站点。读取某些请求内容时,目标站点尚未选定,可能使用该监听地址的默认 server 配置。

因此,多站点部署中只修改一个 server,应核对实际请求读取阶段是否已经采用它。需要一致的公共上限时,可以在 http 层设置,并检查各 server 是否存在覆盖;只想调整一个站点时,要同时评估默认 server 与其他站点的影响,不能随意更换 default_server 来试错。

修改前保存原配置,并确认当前进程实际使用的配置文件和 include 文件。先做配置语法检查,再按现有管理方式平滑重载;检查失败时保留运行中的旧配置,不强行重启。回退时恢复本次修改并重新检查、重载。

放行后的请求还要通过上游限制

用同一条业务请求验收:不再由 Nginx 返回 414,上游确实收到请求,最终响应也符合接口预期。若随后出现 400、502 或上游自己的长度错误,应继续处理新报错,不能把“414 消失”当成整个请求成功。

长期需要携带大量筛选条件或对象数据的接口,可以评估调整接口设计,把适合放在请求体的数据移出查询字符串。这需要客户端与服务端共同支持相应方法、缓存和鉴权行为,不能只在代理上把 GET 强行改成 POST。