欢迎来到云服务器

服务器租用

Nginx处事器中的414错误和504错误的办理要领

414 Request-URI Too Large

#客户端请求头缓冲区巨细,假如请求头总长度大于小于128k,则利用此缓冲区,
#请求头总长度大于128k时利用large_client_header_buffers配置的缓存区
client_header_buffer_size 128k;
#large_client_header_buffers 指令参数4为个数,128k为巨细,默认是8k。申请4个128k。
large_client_header_buffers 4 128k;

当http 的URI太长可能request header过大时会报414 Request URI too large或400 bad request错误。

大概原因

场景1.cookie中写入的值太大造成的,因为header中的其他参数的size一般较量牢靠,只有cookie大概被写入较大的数据

场景2.请求参数太长,好比宣布一个文章正文,用urlencode后,利用get方法传到靠山。

GET http://www.264.cn/ HTTP/1.1
Host: www.264.cn
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.31
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Cookie: bdshare_firstime=1363517175366;
If-Modified-Since: Mon, 13 May 2013 13:40:02 GMT

当请求头过大时,高出large_client_header_buffer时,
nginx大概返回"Request URI too large" (414)可能"Bad-request"(400)错误,

如上例HTTP请求头由多行组成,
个中"GET http://www.264.cn/ HTTP/1.1"暗示Request line

当Request line的长度大于large_client_header_buffer的一个buffer(128k)时,nginx会返回"Request URI too large" (414)错误,对应上面的场景2。

请求投中最长的一行也要小于large_client_header_buffer,当不是Request line的最长行大于一个buffer(128k)时,会返回"Bad-request"(400)错误,对应上面的场景1。

办理步伐:这时可以调大上述两个值。

client_header_buffer_size 512k;
large_client_header_buffers 4 512k;

504 Gateway Time-out
之前网站一直是利用nginx做署理后端的apache运行php来提供处事。

apache常常会不按期不按时间的呈现不能处事失去响应,然后nginx呈现"504 Gateway Time-out"

查察错误日志也看不到任何对象,觉得是apache的bug(其实不是,下面会说原因)。

也许年数大了人就不爱折腾,愿意保持原状不动,利用监控东西,每次收到报警后都从头启动apache委曲维持着。

终于有一天我烦了,不就是处理惩罚php吗,我不消apache总行了吧,,一怒之下利用源安装php-fpm转移到php-fpm来运行php。

安装php并不贫苦,利用源安装照旧很顺利的,独一需要做的就是配置php worker事情历程的日志输出php错误日志。

 

一切筹备停当后把本来的proxy_pass换成fastcgipass就可以了。

 

upstream apachephp {
  server www.quancha.cn:8080; #Apache1
}
....
proxy_pass http://apachephp;

替换成成

upstream php {
    server 127.0.0.1:9000;
}
...
fastcgi_pass php;

就可以把apache上跑的php迁移到php-fpm上来跑。

原觉得这样就可以安枕无忧了,迁移完成是也确实没什么问题,可是假如你不去阐明问题的基础原因在哪。

问题照旧会找上门来,第二天nginx又报了504的gateway timeout。

这回没apache什么事了吧,apache总算撇清了干系。

那应该照旧在nginx和php-fpm身上,查察nginx的错误日志,可以看到

[error] 6695#0: *168438 upstream timed out (110: Connection timed out) while reading response header from upstream,
...
request: "GET /kd/open.php?company=chinapost&number=PA24977020344 HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.quancha.cn"

看到这里根基上就解除了nginx嫌疑,nginx是在期待php处理惩罚"GET /kd/open.php?company=chinapost&number=PA24977020344 HTTP/1.1"超时退出了。

顿时重启php-fpm,问题没有了,网站可以会见了。

再次会见该页面,依然没有响应,但同时会见此外页面正常,该页面刷新屡次后,整个网站都是bad gateway timeout了。

问题就缩小到这个php剧本上了。

netstat -napo |grep "php5-fpm" | wc -l

查察php事情历程已经到达了设置文件里的上限10,有种感受就是各人都被open.php这个剧本卡住了。

这个剧本是干什么的呢?这个剧本就是收罗快递信息的,内里用到了php_curl。

PHP剧本假如执行时间高出php.ini中的设置项max_execution_time不出功效就会强制退出。

查察了php.ini中max_execution_time确实配了,值为30。

万能google派上用场了,颠末不绝google后获得下面这句话

腾讯云代理

Copyright © 2003-2021 MFISP.COM. 国外vps服务器租用 梦飞云服务器租用 版权所有 粤ICP备11019662号