百人牛牛

当前位置 主页 > 服务器问题 > nginx问题汇总 > 最大化 缩小

    Nginx服务器中414错误和504错误的配置解决方法

    栏目:nginx问题汇总 时间:2018-10-09 16:02

    这篇文章主要介绍了Nginx服务器中414错误和504错误的配置解决方法,分别对应Request-URI Too Large和Gateway Time-out这样的错误提示,需要的朋友可以参考下

    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.1Host: www.264.cnConnection: keep-aliveCache-Control: max-age=0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.31 Accept-Encoding: gzip,deflate,sdchAccept-Language: zh-CN,zh;q=0.8Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3Cookie: 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上来跑。

    原以为这样就可以高枕无忧了,迁移完成是也确实没什么问题,但是如果你不去分析问题的根本原因在哪。