IDO老徐,在深圳,某上市公司质量部负责人,干了十二年软件测试,公号"简尚" ,博客isTester.com ,关注「软件测试从业者综合能力提升」,微信957863300

从「简书」平台的服务器故障,谈Nginx An error occurred异常~

上一篇 / 下一篇  2016-09-27 17:06:12 / 个人分类:linux

51Testing软件测试网f~KR_^

51Testing软件测试网Psq7H z#R*A

09.26简书平台的短暂异常

&Ot S:Fn!aD"g0


51Testing软件测试网E&H0D%x2K,pr

An error occurred.51Testing软件测试网.~GQ,aw2L h

Sorry, the page you are looking for is currently unavailable.

[%kq'S0d4e,a-b0

Please try again later.

qw_M9u!D DI(y0

If you are the system administrator of this resource then you should check theerror log for details.

$t9fwI8^0

Faithfully yours, nginx.51Testing软件测试网2v d5qi!] Ac


51Testing软件测试网|qtH/}7l`K;x

老徐观点:对于一个平台级产品,服务器的生产故障,而且是直接抛出nginx的错误页面,无任何转向处理,是非常严重的事故~至于,具体原因,老徐不得而知~如下是老徐的一些猜测,正在继续老徐近期的服务器部署系列文章

3g2e2V1]f"Y$v){q0

今天,刚老徐正打算上简书平台,写文章;突然,出现如上错误(本着tester从业者的严谨度,老徐再三确认不是我电脑的问题,是真的发生故障了),应该持续了几分钟~

AIL&J)`0W]$h0

不知道有多少用户有感知,好在平台响应速度还算不错,几分钟后已恢复正常~

VS-K ~}gdZ0

一般nginx的此类报错,原因如下(当然,老徐对nginx了解不深,如下都是一些可能原因)51Testing软件测试网 l/A"jAT#~,q;G

出现问题,首先是去分析nginx的日志,得到一些线索~

0I-z%`+tDP8W0


n%Abr$i0

可能的常见原因:51Testing软件测试网Y Cit'eD%l


v6q@hG ^"iJ0

/ 1 /51Testing软件测试网 Fz J,W/i D L

很明显这是一个nginx的错误,查看nginx.conf的文件过程中分析可能是以下的问题,在nginx.xml中有如下配置:51Testing软件测试网lgJUW.sPXm4v

51Testing软件测试网@ X5G#Bx

如上图片源自网络51Testing软件测试网;So0]8qvZ


51Testing软件测试网"^'Iyn)heoy

标红的部分是很大的嫌疑,恰好应用中在提交数据的一瞬间和服务器有多次交互,这些交互都要过nginx。再加上用户IP来做key,假如多个用户访问在网上的最后一跳是同一个路由器,很显然会被服务器当成是一台电脑,从而出现判断错误。那么又一个新问题来了,出现503错误后为啥返回的是那个错误页面呢?51Testing软件测试网:x,oJn}yT&mZ3s

带着这个问题在nginx.conf中又发现了一段配置,如下图:51Testing软件测试网f%L&wx-JqE

51Testing软件测试网p'm'W4JM;Dk4r

如上图片源自网络

&_+fkS,w$rZ"I4{0


51Testing软件测试网#xn+T5UHvUA

这个配置的意思是当出现500、502、503、504的错误时返回50x.html页面,这个页面在nginx安装目录的html文件夹下,内容如下:

G-lA] jE6h"[y9L&VKI/}0

51Testing软件测试网3Ode;n P6{ o

如上图片源自网络51Testing软件测试网"ue)AA Q-x9L


I*Qq,GgD9fDH"]0

这个页面经过浏览器解析就是开头第一幅图的样子。

.Y tl[k&Y&zr0

分析到这里,就大概估计出原因了,把之前的rate值该大一点即可。那么到底改多大?这个要根据不同的业务而定,甚至去掉这个配置,所以这个是个经验值,通过多次试验可以得到一个相对于应用合理的值,这里就不说了。

8j$f?6|,{!r1_0

实际nginx出现这个错误原因应该有很多,这里提供一种可能原因,以供网友参考。

j%Rbn6vQ(WY[|0


2x,rZ:vPJ ]1R+e0

/ 2 /

.q0S tL&^'y[u'|0

日志记录中HTTP状态码出现499错误有多种情况,我遇到的一种情况是nginx反代到一个永远打不开的后端,就这样了,日志状态记录是499、发送字节数是0。

_K:ar$nr0

老是有用户反映网站系统时好时坏,因为线上的产品很长时间没有修改,所以前端程序的问题基本上可以排除,于是就想着是Get方式调用的接口不稳定,问了相关人员,说没有问题,为了拿到确切证据,于是我问相关人员要了nginx服务器的日志文件(awstats日志),分析后发现日志中很多错误码为499的错误,约占整个日志文件的1%,而它只占全部报错的70%左右(全部报错见下图),那么所有报错加起来就要超过1%了,这个量还是特别大的。51Testing软件测试网,c`Qq;{ A/S

499错误是什么?让我们看看NGINX的源码中的定义:

0^7HmN5T-UB0

ngx_string(ngx_http_error_495_page), /* 495, https certificate error */51Testing软件测试网W`9^&NQ%}hq

ngx_string(ngx_http_error_496_page), /* 496, https no certificate */51Testing软件测试网h@,m Yj0Z2@RJ9Y

ngx_string(ngx_http_error_497_page), /* 497, http to https */51Testing软件测试网4D~7w/K'W+y

ngx_string(ngx_http_error_404_page), /* 498, canceled */

2Hy&pk2\dj"X)h7N0

ngx_null_string,                    /* 499, client has closed connection */

Y(\M#Isd%[0


N5W^*PJ _z7I0

可以看到,499对应的是 “client has closed connection”。这很有可能是因为服务器端处理的时间过长,客户端“不耐烦”了。

Kd4h0]#fG[M0

Nginx 499错误的原因及解决方法

j:V9m ux9Kxv0

打开Nginx的access.log发现在最后一次的提交是出现了HTTP1.1 499 0 -这样的错误,在百度搜索nginx 499错误,结果都是说客户端主动断开了连接。51Testing软件测试网OJ XT,Y l }3a3Eu)mF

但经过我的测试这显然不是客户端的问题,因为使用端口+IP直接访问后端服务器不存在此问题,后来测试nginx发现如果两次提交post过快就会出现499的情况,看来是nginx认为是不安全的连接,主动拒绝了客户端的连接.51Testing软件测试网;R&lrHvx&k&ao

但搜索相关问题一直找不到解决方法,最后终于在google上搜索到一英文论坛上有关于此错误的解决方法:

/n{tp-Epo0

proxy_ignore_client_abort on;51Testing软件测试网%M q.S4Ua&{#][

Don’t know if this is safe.

PB$G@Fcbv0

就是说要配置参数 proxy_ignore_client_abort on;51Testing软件测试网_s!P;e,_2|_m}

表示代理服务端不要主要主动关闭客户端连接。

yN~&]zd ^"ks0

以此配置重启nginx,问题果然得到解决。只是安全方面稍有欠缺,但比总是出现找不到服务器好多了。

i/t)hxQ$hv9d0

还有一种原因是 我后来测试发现 确实是客户端关闭了连接,或者说连接超时 ,无论你设置多少超时时间多没用 原来是php进程不够用了 改善一下php进程数 问题解决

*ap``MqU0


d({%R1e g0


E'}.n^{o-N9^?0

/ 3 /51Testing软件测试网!F7f3jyy({%{.a

今天网站突然出现如下错误:51Testing软件测试网L3MBzJP|+T

The page you are looking for is temporarily unavailable.Please try again later.51Testing软件测试网jJW$?(r

很奇怪,我对服务器端的技术不是很熟悉,于是查询了下google,在https://wiki.archlinux.org/index.php/Nginx51Testing软件测试网N0TAG9v

上面的解决方法:

S${^~Q1I6MY8w0

Error: The page you are looking for is temporarily unavailable. Please try again later.

5D)l%Y9D:F~ e,k!e"ZR0

This is because the FastCGI server has not been started.

n&v'ZBE2_4R*g0

如何解决呢?51Testing软件测试网!H2V7LrB

刚开始我怀疑是不是nginx挂了,我首先通过ps aux | grep nginx,结果出现:

%K)a"u.m,G$o*^0

root      3769  0.0  0.0   5760   692 ?        Ss   Apr21   0:00 nginx: master process /usr/local/nginx/sbin/nginx51Testing软件测试网Ug'Pm'E-fXf9R

www       3770  0.0  0.1  18680 14252 ?        S    Apr21   0:03 nginx: worker process

5s.T^0w&L}7\3X0

www       3771  0.0  0.1  18680 14252 ?        S    Apr21   0:03 nginx: worker process

L.Kx0t%d M E SF0

www       3772  0.0  0.1  18712 14276 ?        S    Apr21   0:03 nginx: worker process

Zs-I9hH8V\;T'H0

www       3774  0.0  0.1  18680 14248 ?        S    Apr21   0:03 nginx: worker process

;nBD&OI5H1H5m[0

www       3776  0.0  0.1  18712 14240 ?        S    Apr21   0:03 nginx: worker process

0C8S+VAEH L0

www       3777  0.0  0.1  18680 14252 ?        S    Apr21   0:03 nginx: worker process51Testing软件测试网 e1dS)x|'I

www       3778  0.0  0.1  18680 14232 ?        S    Apr21   0:02 nginx: worker process51Testing软件测试网+`N#^ fB7c3Zw-Y

root     24068  0.0  0.0   5196   756 pts/1    S+   14:33   0:00 grep nginx51Testing软件测试网"\"wp}J8M%v i


51Testing软件测试网BD!Ka-}cn)}Sf

可见nginx是正常的,本来打算重启nginx的:

pC'xiu4_c(K0

/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf的,

.v Rr0zVuTqv(K0

突然觉得有没有其他方法,有同事提示先在一个目录下运行下test.html和test.php,结果html可以运行,php无法运行。51Testing软件测试网Tk8y[oT2z\

证实是php没有启动,我刚才也检测过php的进程,的确是没有php进程,这台服务器我不熟悉,同事帮忙查看了下51Testing软件测试网,Q"h%]%G|B0TQ4`

cd /etc/init.d,就是web管理员经常看的地方,是随着系统自动启动的服务,程序等。51Testing软件测试网5~E&X}g(u v

找到:51Testing软件测试网x6kW yNH!H

/usr/local/php/sbin/php-fpm start,首先什么是php-fpm呢?51Testing软件测试网k@*`vGd

就是FastCGI Process Manager,是一种可选的PHP FastGCI执行模式,有一点很有特点的应用,尤其是一个繁忙的网站中:

w8Cp"\p|0

(1)可适应的进行再生(NEW!)

C]2oh0\+y0B0

(2)基本的统计功能(Apache's mod_status)51Testing软件测试网Y iVR/FOg

(3)高级进程管理功能,能够优雅的停止/开始51Testing软件测试网`9k/kt2V"J j

(4)能够使用不同的工作用户和不同的php.ini

xJ1P.aw#k0

(5)输入,输出日志记录...51Testing软件测试网+hSaW&[0R ]+A

开启后,一切恢复正常!自己的服务器端技术还是有很多地方使用的不够。需要多学习使用!

A]P1sbj,T1S0


K L7U7JN,r0

总结,遇到类型问题,常见的问题判断思路:

&|t|p#D _0

1、试检查一下nginx.conf的设置,是不是有limit的设置,比如limit_zone、limit_conn,这些参数也是有影响的。

|+S!`D+F0k2@"b2[0

2、检查一下防火墙,是不是有相关的设置限制。

l3\.K/hs:}0

3、检查一下nginx.conf的设置,看看有没有valid_referers none blocked的防链设置。51Testing软件测试网 [SOB!S h1E

4、看下访问静态文件是否正常,错误排除~

g7a,SM9B T0


2J6`K*Rs8Wa0


51Testing软件测试网"{Oa:u~ nz

OK,如上只是一些猜测~

] X;t#al'|z+Y0

具体原因,具体分析~

#{LD#ljwS0

随着越来越多的系统采用nginx,大家有必要了解些nginx的基础知识~51Testing软件测试网9{]cv5og`$Q

51Testing软件测试网qZ3p dzB
51Testing软件测试网co8m ]Et
原文http://www.jianshu.com/p/d40fa5de6348

TAG: Linux linux

 

评分:0

我来说两句

xuquan

xuquan

IDO老徐,坐标深圳,测试经理,干了十年测试,公号"简尚" ,个人博客isTester.com ,关注「软件测试从业者综合能力提升」,微信957863300

日历

« 2024-04-02  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 912072
  • 日志数: 427
  • 建立时间: 2012-06-04
  • 更新时间: 2022-02-23

RSS订阅

Open Toolbar