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

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

set_time_limit()函数和配置指令max_execution_time只影响脚本本身执行的时间。任何发生在诸如使用system()的系统调用,流操作,数据库操作等的脚本执行的最大时间不包括其中,当该脚本已运行。

就是说如果脚本中执行了其它操作的时间是不计在脚本运行时间当中的,如果你没设置超时,那么php就会一直等待调用的结果。

查看open.php源文件一看,果然没有设置curl的超时时间。

增加如下两行,重新刷新,后问题解决了。

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); //timeout on connect
curl_setopt($ch, CURLOPT_TIMEOUT, 10); //timeout on response

当然,除了这种方法外,php-fpm里也提供参数供我们强制杀死长时间无结果的进程,只是该参数默认没打开。

php-fpm的配置文件里可以设置一个参数request_terminate_timeout,请求终止的超时时间,当请求执行超过这个时间就会被kill。

同时它还有个参数request_slowlog_timeout,用来记录慢请求日志的。

命令行运行php的话,可以使用这段代码

$real_execution_time_limit = 60; //时间限制

if (pcntl_fork())
{
// some long time code which should be
// terminated after $real_execution_time_limit seconds passed if it's not
// finished by that time
}
else
{
sleep($real_execution_time_limit);
posix_kill(posix_getppid(), SIGKILL);
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索nginx
, 配置
, 错误
nginx配置
nginx 414、nginx 504、nginx tomcat 504、nginx 504错误、nginx 504 gateway,以便于您获取更多的相关知识。

时间: 2024-11-01 08:10:08

Nginx服务器中414错误和504错误的配置解决方法_nginx的相关文章

Nginx服务器中处理AJAX跨域请求的配置方法讲解_nginx

Nginx 实现AJAX跨域请求AJAX从一个域请求另一个域会有跨域的问题.那么如何在nginx上实现ajax跨域请求呢?要在nginx上启用跨域请求,需要添加add_header Access-Control*指令.如下所示: location /{ add_header 'Access-Control-Allow-Origin' 'http://other.subdomain.com'; add_header 'Access-Control-Allow-Credentials' 'true'

Nginx服务器中的模块编写及相关内核源码初探_nginx

1.nginx模块首先nginx和apache最大的不同就是nginx的模块不能够动态添加,需要在编译时,指定要添加的模块路径,与nginx源码一起编译. nginx模块的处理流程: a.客户端发送http请求到nginx服务器 b.nginx基于配置文件中的位置选择一个合适的处理模块 c.负载均衡模块选择一台后端服务器(反向代理情况下) d.处理模块进行处理并把输出缓冲放到第一个过滤模块上 e.第一个过滤模块处理后输出给第二个过滤模块 f.然后第二个过滤模块又到第三个过滤模块 g.第N个过滤模

详解nginx服务器中的安全配置_nginx

本篇文章详细的讲诉了nginx服务器中的安全配置,具体如下: 一.关闭SELinux 安全增强型Linux(SELinux)的是一个Linux内核的功能,它提供支持访问控制的安全政策保护机制. 但是,SELinux带来的附加安全性和使用复杂性上不成比例,性价比不高 sed -i /SELINUX=enforcing/SELINUX=disabled/ /etc/selinux/config /usr/sbin/sestatus -v #查看状态 二.通过分区挂载允许最少特权 服务器上 nginx

MySQL 出现错误1418 的原因分析及解决方法_Mysql

MySQL 出现错误1418 的原因分析及解决方法 具体错误:  使用mysql创建.调用存储过程,函数以及触发器的时候会有错误符号为1418错误. ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL,or READS SQL DATA in its declaration and binary logging is enabled(you *might* want to use the less safe lo

win8系统连接宽带时提示错误813的故障原因及解决方法

  win8系统连接宽带时提示"错误813:建立了前一个宽带连接的情况下,你在使用相同的设备或端口尝试建立另一个宽带连接.请断开前一个连接,然后重新建立连接.",具体问题现象如下图所示: 故障原因: 其他宽带连接已连接上或系统原因等. 解决方法: 1.重新启动电脑(一般能解决); 2. 重建宽带连接; 3. 重装操作系统. 错误813的流程图: 上述就是对win8系统连接宽带时提示错误813的故障原因及解决方法的介绍,连接宽带过程中需要注意提示的错误代码,然后根据此代码提示解决问题.

对于技术人员的出现了运行时间错误,是否要进行调试的解决方法_网络冲浪

第一种:针对网页制作者这个是我们讨论的重点,这样的情况我么需要检查脚本错误,并根据提示的错误行数迅速锁定所在行,并解决,如果是新手应该就没那么容易了,本站提供了一个在线运行脚本并提示错误相对详细的错误提醒在线JS脚本校验器检测js错误如果仍不能解决问题,或这个问题并不影响我们想要得到的结果我们可以用 复制代码 代码如下: window.onerror=function{return true} 放到js代码中即可第二种:针对用户的解决方法通常上网的时候会碰到这种错误,其实这是你访问网站的网页中有

c++-编译时出现这样的错误,求大神指点解决方法

问题描述 编译时出现这样的错误,求大神指点解决方法 程序如下:#includeusing namespace std;class zrf_Ratio;zrf_Ratio operator+(const zrf_Ratio& r1 const zrf_Ratio& r2);zrf_Ratio operator-(const zrf_Ratio& const zrf_Ratio&);zrf_Ratio operator*(const zrf_Ratio& const z

nginx-window7下搭建一个Nginx服务器 需要哪些安装环境 并做什么样的配置 急等!

问题描述 window7下搭建一个Nginx服务器 需要哪些安装环境 并做什么样的配置 急等! 需要搭建一个web app测试服务器,要求能处理高并发.最好可以配置一个域名服务测试一下. 解决方案 参考:http://www.cnblogs.com/hxxy2003/archive/2012/09/20/2695254.htmlhttp://blog.csdn.net/dhx20022889/article/details/30219471 解决方案二: 不过Windows 7是客户端操作系统,

jQuery中ajax的使用与缓存问题的解决方法

本篇文章主要介绍了jQuery中ajax的使用与缓存问题的解决方法.需要的朋友可以过来参考下,希望对大家有所帮助 1:GET访问 浏览器 认为 是等幂的 就是 一个相同的URL 只有一个结果[相同是指 整个URL字符串完全匹配] 所以 第二次访问的时候 如果 URL字符串没变化 浏览器是 直接拿出了第一次访问的结果   POST则 认为是一个 变动性 访问 (浏览器 认为 POST的提交 必定是 有改变的)   防止 GET 的 等幂 访问 就在URL后面加上 ?+new Date();,[总之