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后获得下面这句话