client_header_buffer_size 和 large_client_header_buffers 共同限制请求头长度,前者为初始缓冲(默认1k),后者为备用缓冲池;必须协同配置且满足前者≤后者单缓冲大小,推荐置于http块顶层,并按实测P99头部长度向上取整设最小够用值。

Linux Nginx 中 server_name 本身不控制请求头大小,真正限制客户端请求头(如 Host、User-Agent、Cookie 等)长度的是 client_header_buffer_size 和 large_client_header_buffers 这两个指令。当请求头超长(比如超长的 Host 值或巨量 Cookie),Nginx 会返回 400 Bad Request,常见错误日志为 "client sent too long header while reading client request line" 或类似提示。
调整请求头缓冲区大小
这两个参数需在 http、server 或 location 块中配置,推荐优先放在 http 块统一管理:
-
client_header_buffer_size:默认 1k,用于存储常规请求行和请求头。若首行(如GET / HTTP/1.1)或首个请求头能放进该缓冲区,就不再分配更大空间。 -
large_client_header_buffers:格式为large_client_header_buffers number size,例如large_client_header_buffers 4 8k表示最多分配 4 个、每个最大 8k 的缓冲区来处理超长请求头(包括请求行 + 所有请求头总和)。
典型调优示例(放入 /etc/nginx/nginx.conf 的 http 块):
large_client_header_buffers 4 16k;
注意 server_name 和 Host 头的关系
server_name 是服务端匹配请求中 Host 请求头的依据,它本身不限制长度;但若客户端发来的 Host 值过长(比如超过 client_header_buffer_size 或单个 large_client_header_buffers 的 size),Nginx 在解析阶段就失败,根本不会走到 server_name 匹配逻辑。所以调大缓冲区是前提。
验证与排查方法
- 修改配置后务必执行
sudo nginx -t检查语法,再sudo systemctl reload nginx生效。 - 用
curl -H "Host: $(printf 'a%.0s' {1..4096})" http://your-domain/模拟超长 Host 测试是否仍返回 400。 - 查看 Nginx 错误日志(通常
/var/log/nginx/error.log)确认是否还有相关报错。
其他可能相关的设置
虽然不直接作用于 Host 头,但以下参数也影响整体请求头处理:
-
client_max_body_size:控制请求体(body),不影响 header,勿混淆。 -
underscores_in_headers on:如需支持带下划线的自定义 header(非标准但某些 SDK 会用),需开启,否则会被直接丢弃。 -
ignore_invalid_headers on(默认开启):对非法 header 名(如含空格、控制字符)静默忽略,避免 400;设为off则严格拒绝。


















