http_code499、500、502、503、504
HTTP处理请求流程:
uWSGI是⼀个,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作⽤是与uWSGI服务器进⾏交换。WSGI是⼀种Web服务器⽹关接⼝。
⼀个普通的http请求处理流程,如上图所⽰:
A -> client端发起请求给nginx
B -> nginx处理后,将请求转发到uwsgi(线路协议,不是通信协议),并等待结果
C -> uwsgi处理完请求后,返回数据给nginx
D -> nginx将处理结果返回给客户端
每个阶段都会有⼀个预设的超时时间,由于⽹络、机器负载、代码异常等等各种原因,如果某个阶段没有在预期的时间内正常返回,就会导致这次请求异常,进⽽产⽣不同的状态码。
503
503是服务不可⽤的返回状态。由于在nginx配置中,设置了limit_req的流量限制,导致许多请求返回503错误代码,在限流的条件下,为提⾼⽤户体验,希望返回正常Code 200,且返回操作频繁的信息:
location  /test {
...
limit_req zone=zone_ip_rm burst=1 nodelay;
error_page 503 =200 /dealwith_503?callback=$arg_callback;
}
location /dealwith_503{
set $ret_body '{"code": "V00006","msg": "操作太频繁了,请坐下来喝杯茶。"}';
if ( $arg_callback != "" )
{
return 200 'try{$arg_callback($ret_body)}catch(e){}';
}
return 200 $ret_body;
}
504
504主要是针对B、C阶段。⼀般nginx配置中会有:
location / {
...
uwsgi_connect_timeout 6s;
uwsgi_send_timeout 6s;
uwsgi_read_timeout 10s;
uwsgi_buffering on;
uwsgi_buffers 80 16k;
...
}
这个代表nginx与上游服务器(uwsgi)通信的超时时间,也就是说,如果在这个时间内,uwsgi没有响应,则认为这次请求超时,返回504状态码。
具体的⽇志如下:
access_log
[16/May/2016:22:11:38 +0800] 10.4.31.562016051622112801000403105615231523140146340788890810.*.*.* 127.0.0.1:8500"GET /api/media_article_list/?count=10&source_type=0&status=all&from_time=0&item_id=0&flag=2&_=1463407896 error_log
2016/05/1622:11:38 [error] 90674#0: *947302032 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 10.6.19.81, server: **.***, request: "GET /ap
i/media_article_list/?count=10&source_type error_log中upstream timed out (110: Connection timed out) while reading response header from upstream,
意思是说,在规定的时间内,没有从header中拿到数据,即uwsgi没有返回任何数据。
502
502主要针对B 、C阶段。产⽣502的时候,对应的error_log中的内容会有好⼏种:
access_log
[16/May/2016:16:39:49 +0800] 10.4.31.56201605161639490100040310562612261222146338798997210.6.19.81127.0.0.1:88"GET /articles/?source_type=0 HTTP/1.1"503 **.*** **.**.**.4, **.**.**.1600.0000.000"Mozilla/5.0 (Windows NT error_log
2016/05/1616:39:49 [error] 90693#0: *944980723 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 10.6.19.80, server: **.***, request: "GET /articles/ HTTP/1.1", upstream: "127.0.0.1:85
列⼀下常见的⼏种502对应的 error_log:
l recv() failed (104: Connection reset by peer) while reading response header from upstream
l upstream prematurely closed connection while reading response header from upstream
l connect() failed (111: Connection refused) while connecting to upstream
....
这些都代表,在nginx设置的超时时间内,上游uwsgi没有给正确的响应(但是是有响应的,不然如果⼀直没响应,就会变成504超时了),因此nginx这边的状态码为502。client_header_buffer_size 32k;
large_client_header_buffers 8 64k;
client_max_body_size 100m;
如上,access_log中出现503,为什么?
这个是因为nginx upstream的容灾机制。如果nginx有如下配置:
upstream app_backup {
server 127.0.0.1:8500 max_fails=3 fail_timeout=5s;
server 127.0.0.1:88 backup;
}
l max_fails=3 说明尝试3次后,会认为“ server 127.0.0.1:8500” 失效,于是进⼊ “server 127.0.0.1:88 backup”,即访问本机的88端⼝;
l nginx upstream的容灾机制,默认情况下,Nginx 默认判断失败节点状态以connect refuse和time out状态为准,不过location⾥加了这个配置:
proxy_next_upstream error http_502;
proxy_connect_timeout 1s;
proxy_send_timeout    6s;
proxy_read_timeout    10s;
proxy_set_header Host $host;
l这个配置是说,对于http状态是502的情况,也会⾛upstream的容灾机制;
l概括⼀下就是,如果连续有3次(max_fails=3)状态为502的请求,则会任务这个后端server 127.0.0.1:8500 挂掉了,在接下来的5s(fail_timeout=5s)内,就会访问backup,即server 127.0.0.1:88 ,看下88端⼝对应的是什么:server {
listen 88;
access_log /var/log/nginx/failover.log;
expires 1m;
error_page  500 502 503 504 /500.html;
location / {
return 503;
}
location = /500.html {
root /**/**/**/nginx/5xx/;
}
}
这个的意思就是,对于访问88端⼝的请求,nginx会返回503状态码,同时返回/opt/tiger/ss_conf/nginx/5xx/这个路径下的500.html⽂件。因此,access_log中看到的是503
499
client发送请求后,如果在规定的时间内(假设超时时间为500ms)没有拿到nginx给的响应,则认为这次请求超时,会主动结束,这个时候nginx的access_log就会打印499状态码。
A+B+C+D > 500ms 其实这个时候,server端有可能还在处理请求,只不过client断掉了连接,因此处理结果也⽆法返回给客户端。499如果⽐较多的话,可能会引起服务雪崩。
⽐如说,client⼀直在发起请求,客户端因为某些原因处理慢了,没有在规定时间内返回数据,client认为请求失败,中断这次请求,然后再重新发起请求。这样不断的重复,服务端的请求越来越多,机器负载变⼤,请求处理越来越慢,没有办法响应请求
官⽹总结nginx返回499的情况,是由于:
client has closed connection    #客户端主动关闭了连接。
解决的话,可以添加
proxy_ignore_client_abort    on;  #忽略掉客户端请求
Php代码需要做程序上的优化
500
服务器内部错误,也就是服务器遇到意外情况,⽽⽆法执⾏请求。发⽣错误,⼀般的⼏种情况:
web脚本错误,如php语法错误,lua语法错误等。
访问量⼤的时候,由于系统资源限制,⽽不能打开过多的⽂件句柄
分析错误的原因
查看nginx,php的错误⽇志
如果是too many open files,修改nginx的worker_rlimit_nofile参数,使⽤ulimit查看系统打开⽂件限制,修改/etc/f
如果脚本存在问题,则需要修复脚本错误,并优化代码
各种优化都做好,还是出现too many open files,那就需要考虑做负载均衡,把流量分散到不同服务器上去
http_code⼀览表
200:服务器成功返回⽹页
403:服务器拒绝请求。
404:请求的⽹页不存在
499:客户端主动断开了连接。
500:服务器遇到错误,⽆法完成请求。
502:服务器作为⽹关或代理,从上游服务器收到⽆效响应。
503 - 服务不可⽤
504:服务器作为⽹关或代理,但是没有及时从上游服务器收到请求。
这些状态码被分为五⼤类:
100-199 ⽤于指定客户端应相应的某些动作。
200-299 ⽤于表⽰请求成功。
300-399 ⽤于已经移动的⽂件并且常被包含在定位头信息中指定信息。
400-499 ⽤于指出客户端的错误。⾃⼰电脑浏览器这边的问题)
500-599 ⽤于⽀持服务器错误。对⽅的问题)
---------------------------------------------------------------------------------------------
200 (成功)服务器已成功处理了请求。通常,这表⽰服务器提供了请求的⽹页。
201 (已创建)请求成功并且服务器创建了新的资源。
202 (已接受)服务器已接受请求,但尚未处理。
203 (⾮授权信息)服务器已成功处理了请求,但返回的信息可能来⾃另⼀来源。
204 (⽆内容)服务器成功处理了请求,但没有返回任何内容。
205 (重置内容)服务器成功处理了请求,但没有返回任何内容。
206 (部分内容)服务器成功处理了部分 GET 请求。
---------------------------------------------------------------------------------------------
300 (多种选择)针对请求,服务器可执⾏多种操作。服务器可根据请求者 (user agent) 选择⼀项操作,或提供操作列表供请求者选择。301 (永久移动)请求的⽹页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会⾃动将请求者转到新位置。302 (临时移动)服务器⽬前从不同位置的⽹页响应请求,但请求者应继续使⽤原有位置来进⾏以后的请求。
303 (查看其他位置)请求者应当对不同的位置使⽤单独的 GET 请求来检索响应时,服务器返回此代码。
304 (未修改)⾃从上次请求后,请求的⽹页未修改过。服务器返回此响应时,不会返回⽹页内容。
305 (使⽤代理)请求者只能使⽤代理访问请求的⽹页。如果服务器返回此响应,还表⽰请求者应使⽤代理。
307 (临时重定向)服务器⽬前从不同位置的⽹页响应请求,但请求者应继续使⽤原有位置来进⾏以后的请求。
---------------------------------------------------------------------------------------------
400 (错误请求)服务器不理解请求的语法。
401 (未授权)请求要求⾝份验证。对于需要登录的⽹页,服务器可能返回此响应。
403 (禁⽌)服务器拒绝请求。
404 (未到)服务器不到请求的⽹页。
405 (⽅法禁⽤)禁⽤请求中指定的⽅法。
406 (不接受)⽆法使⽤请求的内容特性响应请求的⽹页。
407 (需要代理授权)此状态代码与 401(未授权)类似,但指定请求者应当授权使⽤代理。
408 (请求超时)服务器等候请求时发⽣超时。
409 (冲突)服务器在完成请求时发⽣冲突。服务器必须在响应中包含有关冲突的信息。
410 (已删除)如果请求的资源已永久删除,服务器就会返回此响应。
411 (需要有效长度)服务器不接受不含有效内容长度标头字段的请求。
412 (未满⾜前提条件)服务器未满⾜请求者在请求中设置的其中⼀个前提条件。
413 (请求实体过⼤)服务器⽆法处理请求,因为请求实体过⼤,超出服务器的处理能⼒。
414 (请求的 URI 过长)请求的 URI(通常为⽹址)过长,服务器⽆法处理。
415 (不⽀持的媒体类型)请求的格式不受请求页⾯的⽀持。
416 (请求范围不符合要求)如果页⾯⽆法提供请求的范围,则服务器会返回此状态代码。
417 (未满⾜期望值)服务器未满⾜"期望"请求标头字段的要求。
---------------------------------------------------------------------------------------------
500 (服务器内部错误)服务器遇到错误,⽆法完成请求。
501 (尚未实施)服务器不具备完成请求的功能。例如,服务器⽆法识别请求⽅法时可能会返回此代码。
502 (错误⽹关)服务器作为⽹关或代理,从上游服务器收到⽆效响应。
博客为什么没人用了503 (服务不可⽤)服务器⽬前⽆法使⽤(由于超载或停机维护)。通常,这只是暂时状态。
504 (⽹关超时)服务器作为⽹关或代理,但是没有及时从上游服务器收到请求。
505 (HTTP 版本不受⽀持)服务器不⽀持请求中所⽤的 HTTP 协议版本。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。