文章目录
概要
在web开发过程中,通过HTTP错误码快速定位问题是一个非常重要的技能,同时Nginx是非常常用的一个实现HTTP协议的服务,因此本文结合二者谈谈Nginx对HTTP错误码的处理。
一、HTTP错误码
在RFC2616对HTTP协议做了定义,其对错误码定义分为5大类,依次分为100-199、200-299、300-399、400-499、500-599。
1.1、1xx
RFC定义: Informational - Request received, continuing process,即用于响应客户端的某些动作。
- 100用来提示客户端请求继续;
- 101用来表示更换协议,最典型的就是HTTP协议升级到WS协议。
1.2、2xx
RFC定义:Success - The action was successfully received,understood, and accepted,即表示请求成功。
- 200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页;
- 201 (已创建) 请求成功并且服务器创建了新的资源;
- 202 (已接受) 服务器已接受请求,但尚未处理;
- 203 (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源;
- 204 (无内容) 服务器成功处理了请求,但没有返回任何内容;
- 205 (重置内容) 服务器成功处理了请求,但没有返回任何内容;
- 206 (部分内容) 服务器成功处理了部分 GET 请求。
1.3、3xx
RFC定义:Redirection - Further action must be taken in order to complete the request,即用于重定向的。
- 300 (多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择;
- 301 (永久重定向) 请求的网页已永久移动。到新位置服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置;
- 302 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求;
- 303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码;
- 304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容;
- 305 (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理;
- 307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
其中301与302是最常用到的。
1.4、4xx
RFC定义:Client Error - The request contains bad syntax or cannot be fulfilled,即表示客户端请求请求包含错误语法或无法履行。
- 400 (错误请求) 服务器不理解请求的语法;
- 401 (未授权) 请求要求身份验证, 对于需要登录的网页,服务器可能返回此响应;
- 403 (禁止) 服务器拒绝请求;
- 404 (未找到) 服务器找不到请求的网页;
- 405 (方法禁用) 禁用请求中指定的方法;
- 406 (不接受) 无法使用请求的内容特性响应请求的网页;
- 407 (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理;
- 408 (请求超时) 服务器等候请求时发生超时;
- 409 (冲突) 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息;
- 410 (已删除) 如果请求的资源已永久删除,服务器就会返回此响应;
- 411 (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求;
- 412 (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件;
- 413 (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力;
- 414 (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理;
- 415 (不支持的媒体类型) 请求的格式不受请求页面的支持;
- 416 (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码;
- 417 (未满足期望值) 服务器未满足"期望"请求标头字段的要求。
其中较为常见的是400、401、402、403、404、405。
1.5、5xx
RFC定义:Server Error - The server failed to fulfill an apparently valid request,即表示服务端无法完成客户端请求。
- 500 (服务器内部错误) 服务器遇到错误,无法完成请求;
- 501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码;
- 502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应;
- 503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态;
- 504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求;
- 505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
常见的有500、502、503、504。
二、Nginx对常见错误处理
- 403:一般由文件或目录没有读写权限造成的
2023/10/01 21:29:30 [error] 13030#0: *143214 open() "/home/PHP/project/disdir/kk.html" failed (13: Permission denied), client: 200.200.110.29, server: www.8089.cn, request: "GET /disdir/kk.html HTTP/1.1", host: "200.200.110.39:8089"
- 404:文件或目录不存在造成的
2023/10/01 21:23:14 [error] 24291#0: *143205 open() "/home/PHP/project/jj.html" failed (2: No such file or directory), client: 200.200.110.29, server: www.8083.cn, request: "GET /jj.html HTTP/1.1", host: "200.200.110.39:8089"
-
405:请求方法不支持,如伪造非HTTP支持的方法(即非GET、POST、PUT等方法),这种Nginx并不会打印错误到error log
-
500:服务器内部错误,一般见于Nginx代理的上游服务出现错误,但并未断开TCP连接。比如在Nginx+PHP的情况下,PHP运行出现致命错误,就会出现500错误
2023/10/01 21:42:06 [error] 13030#0: *143244 FastCGI sent in stderr: "PHP message: PHP Fatal error: Class 'Product' not found in /home/PHP/project/index.php on line 5" while reading response header from upstream, client: 200.200.170.29, server: www.8089.cn, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "200.200.110.39:8089"
- 502:Bad Gateway,Nginx代理的上游服务未启动(TCP无法建立连接)或突然挂了(TCP 突然连接断开),在负载均衡中无可用上游服务也会报502
1)TCP无法建立连接
2023/09/20 13:52:57 [error] 6068#0: *539 connect() failed (111: Connection refused) while connecting to upstream, client: 200.200.110.39, server: www.8084.cn, request: "GET
/test/jj HTTP/1.1", upstream: "http://200.200.110.39:9503/test/jj", host: "200.200.110.39:8089", referrer: "http://200.200.169.89"
2)TCP 突然连接断开
2023/09/21 10:44:55 [error] 32565#0: *34202 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 200.200.110.29, server: www.8089.cn, request: "GET /index.php?opr=hh HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "200.200.110.39:8089", referrer: "http://200.200.169.89"
3)无可用上游服务
2023/09/20 13:52:59 [error] 6067#0: *544 no live upstreams while connecting to upstream, client: 200.200.110.29, server: www.8089.cn, request: "GET /test/jj HTTP/1.1", upstream: "http://test_upstreams/test/jj", host: "200.200.110.39:8089", referrer: "http://200.200.169.89"
- 503:Service Unavailable,服务不可用,一般是临时的。比如命中Nginx限流,默认就是503错误码,显然限流状态是临时的,等流量高峰过去就自动恢复了。还有Nginx与上游TCP连接超过可打开文件数也会触发503错误。
2023/09/25 10:12:37 [error] 31111#0: *143112 limiting requests, excess: 0.980 by zone "one", client: 200.200.110.29, server: www.8089.cn, request: "GET /index.php HTTP/1.1", host: "200.200.110.39:8089"
- 504:Gateway Time-out,网冠超时,即上游服务响应超时,取决于反向代理配置的proxy_connect_timeout、proxy_read_timeout、proxy_send_timeout参数。
2023/09/21 11:18:59 [error] 1375#0: *142421 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 200.200.110.29, server: www.8089.cn, request: "GET /index.php?opr=hh HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "200.200.110.39:8089", referrer: "http://200.200.169.89"
当然了,其他错误还有很多,慢慢积累,欢迎大家评论区补充
三、参考资料
1]:RFC文档
2]:HTTP请求错误