2023年11月27日发(作者:)

http_code499500502503504

HTTP处理请求流程:

uWSGI是⼀个,它实现了WSGI协议、uwsgihttp等协议。NginxHttpUwsgiModule的作⽤是与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主要是针对BC阶段。⼀般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.56 281523 15231408 10.*.*.* 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/16 22: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: **.***.com, request: "GET /api/media_article_list/?count=10&source_type

error_logupstream 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.56 292612 26989972 10.6.19.81 127.0.0.1:88 "GET /articles/?source_type=0 HTTP/1.1" 503 **.***.com **.**.**.4, **.**.**.160 0.000 0.000 "Mozilla/5.0 (Windows NT

error_log

2016/05/16 16: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: **.***.com, request: "GET /articles/ HTTP/1.1", upstream: "127.0.0.1:85

列⼀下常见的⼏种502对应的 error_log

lrecv() failed (104: Connection reset by peer) while reading response header from upstream

lupstream prematurely closed connection while reading response header from upstream

lconnect() 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 refusetime 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/;

expires 1m;

error_page 500 502 503 504 /;

location / {

return 503;

}

location = / {

root /**/**/**/nginx/5xx/;

}

}

这个的意思就是,对于访问88端⼝的请求,nginx会返回503状态码,同时返回/opt/tiger/ss_conf/nginx/5xx/这个路径下的⽂件。因此,access_log中看到的是50

3

499

client发送请求后,如果在规定的时间内(假设超时时间为500ms)没有拿到nginx给的响应,则认为这次请求超时,会主动结束,这个时候nginxaccess_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语法错误等。

访问量⼤的时候,由于系统资源限制,⽽不能打开过多的⽂件句柄

分析错误的原因

查看nginxphp的错误⽇志

如果是too many open files,修改nginxworker_rlimit_nofile参数,使⽤ulimit查看系统打开⽂件限制,修改/etc/security/

如果脚本存在问题,则需要修复脚本错误,并优化代码

各种优化都做好,还是出现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 协议版本。