Posted 2021-07-04 minutes read (About 704 words) 生活记录 Nginx服务400和414报错原因及解决方法 Nginx是异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存。该软件由伊戈尔·赛索耶夫(Игорь Сысоев)创建并于2004年首次公开发布。2011年成立同名公司以提供支持。2019年3月11日,Nginx公司被F5 Networks以6.7亿美元收购。Nginx是免费的开源软件,根据类BSD许可证的条款发布。一大部分Web服务器使用Nginx,通常作为负载均衡器。-「维基百科」 Nginx是Bt推荐安装的网页服务器,在我发布的文章[《节点订阅转换API- P1:Subconverter后端》](https://blog.gatesx.cn/subscription-api-p1.html)中提到过400和414错误,我没有解释,这里就来解释下。 ## 400错误 400 Bad Request,通用的错误码,表示请求报文有错误。 Nginx 400 是request header过大所引起,request过大,一般是由于cookie中写入了较大的值所引起。在nginx.conf中,调整client_header_buffer_size和large_client_header_buffer参数大小可以解决问题,下面的例子就举例例子,调整至128k 。 ``` client_header_buffer_size 128k; large_client_header_buffers 4 128k; ``` 当然两个一起调整是一个粗暴的做法,虽然可以解决问题,但是也会造成内存占用的提高。可以参考以下的内容: 1.如果你的请求中的header都很大,那么应该提高client_header_buffer_size,这样能减少内存分配。 2.如果你的请求中只有一小部分请求header会比较大,那么应该提高large_client_header_buffers,因为这样就仅需在处理大header时才会分配更多的内存,从而减少大部分时间的内存占用。 当然这样你可能不理解,解释一下large_client_header_buffers和client_header_buffer_size关系:**假设client_header_buffer_size的配置为32k,如果(请求行+请求头)的大小如果小于32k,请求放行。如果(请求行+请求头)的大小如果超过32k,就以large_client_header_buffers来确认下一步是否放行。** ## 414错误 414 Request-URI Too Long,请求行里的 URI 太大。 造成的原因可能有两个: 1.cookie中写入的值太大造成。 2.请求参数太长。 也可以提高调整client_header_buffer_size和large_client_header_buffers的大小来解决。参照以下例子: ``` client_header_buffer_size 128k; large_client_header_buffers 4 128k; ``` ## 疑问 (不严谨时刻) 那400和414都是通过修改client_header_buffer_size和large_client_header_buffers的大小来解决的,那么Nginx返回400和414是怎么判断的? **这里我们只看请求行和请求头,忽略请求体** 我们这里假使有一个请求,Nginx配置【client_header_buffer_size 1k; large_client_header_buffers 4 8k;】 我们发起请求前,Nginx就按照**client_header_buffer_size** 分配内存,我们发起,Nginx收到后发现(请求行+请求头)的大小大于**client_header_buffer_size** (1k),此时Ngnix不会直接报错,而是继续以**large_client_header_buffers** 作为判断标准,分配更多的内存来处理,如果请求行(request line)超过4k那么返回**414错误** ,请求头(request header)中的每一个头部字段的大小不能超过8k,否则返回**400** 错误,当然(请求行+请求头)大小不能超过32k(4*8k)。 要了解其中的的顺序的(或者看不懂我胡说八道的)可以参照下图,buffer是缓冲区的意思。图片来自网络。  Loading... 文章目录 Nginx服务400和414报错原因及解决方法 https://blog.gatesx.cn/archives/17/ Author gatesx Posted on 2020-04-01 Licensed under CC BY-NC-SA 4.0
暂无评论