Nginx状态码出现000,请求失败,排查及解决办法点开本文..
问题现象
- 业务反馈新上线的广告页面无法打开,手百端打开白屏。发现有问题的的请求的header大于4k会有问题,小于4k可以正常访问。
- 搭建测试环境后,发现nginx访问日志很奇怪如下图,状态码为000!
排查过程
- 业务反馈header大于4k有问题,小于4k能正常返回200。
- 通过调整
client_header_buffer_size
large_client_header_buffers
这两个参数(调整前直觉觉得和这俩无关,如果有问题会返回400报错),调整到1M,问题均出现。 - 无任何其他错误日志,只能通过抓包查看问题。
- 抓包发现https报文出现 encrypt alert警告包,取消强制https跳转后,让业务使用http测试,发现http协议能正常返回200.
- 确定和https有关,通过查询https的配置,发现使用了http2
- 查询nginx模块文档,发现可能与参数
http2_max_field_size
有关,且该参数默认为4k
修改配置
Syntax: http2_max_field_size size;
Default: http2_max_field_size 4k;
Context: http, server
Limits the maximum size of an HPACK-compressed request header field. The limit applies equally to both name and value. Note that if Huffman encoding is applied, the actual size of decompressed name and value strings may be larger. For most requests, the default limit should be enough.
增加到8k,发现header为8k内的请求从000状态码成功返回200.
http2相关
http2和http1.1的区别:
- 二进制分帧(Binary Format):HTTP/2是一个二进制协议,增加了数据传输的效率
- 多路复用 (Multiplexing) / 连接共享:HTTP/2是可以在一个TCP链接中并发请求多个HTTP请求,移除了HTTP/1.1中的串行请求
- 头部压缩(Header Compression):使用HPACK算法
- 服务端push:HTTP/2允许服务端在客户端放cache
赞赏支持一下