typora-root-url: ./HTTPCODE
HTTP状态码必知必会
这里主要介绍运维过程中经常遇到的状态码。并通过业界流行的Nginx进行模拟实现,让大家能有一种所见即所得的感觉。希望大家通过此知识点的学习,能够对HTTP状态码有一个理性的认识(如果你是一名运维人员,那么请记牢记些状态码的含义)。
实验场景介绍
操作系统: CentOS 7.3实验用软件包: nginx php-fpm php httpd-tools(使用了YUM仓库原生软件包)yum -y install nginx php-fpm php httpd-tools
2XX状态码
2XX 类型的状态码表示一个HTTP请求成功。我们遇到的最典型2XX状态码为200,其他2XX状态码我在目前运维生涯中还未遇到。
200状态码
这个是一个大家都希望看到的状态码,表示一个HTTP请求得到了正确的响应。在此不做模拟测试。
3XX状态码
3XX 类型状态码主要表示HTTP请求URL重定向行为。常见的3XX状态码有301、302及304。
301状态码
URL 永久性重定向。在Nginx中通过rewrite 指令结合 permanent 标记实现。
测试用例
# cat 301.confserver { listen 80; server_name test.qfedu.com; root /usr/share/nginx/html; access_log /var/log/nginx/test.qfedu.com-acess.log; error_log /var/log/nginx/test.qfedu.com-error.log;? rewrite ^(.*)$ /index.html permanent;? location / { index index.html index.htm; }}
测试
# curl http://127.0.0.1/ -H "HOST: test.qfedu.com" -IHTTP/1.1 301 Moved PermanentlyServer: nginx/1.12.2Date: Tue, 08 May 2018 17:02:26 GMTContent-Type: text/htmlContent-Length: 185Location: http://test.qfedu.com/index.htmlConnection: keep-alive
302状态码
URL 临时重定向。在Nginx中通过rewrite 指令结合 redirect 标记实现。
测试用例
# cat 302.confserver { listen 80; server_name test.qfedu.com; root /usr/share/nginx/html; access_log /var/log/nginx/test.qfedu.com-acess.log; error_log /var/log/nginx/test.qfedu.com-error.log;? rewrite ^(.*)$ /index.html redirect;? location / { index index.html index.htm; }}
测试
# curl http://127.0.0.1/ -H "HOST: test.qfedu.com" -IHTTP/1.1 302 Moved TemporarilyServer: nginx/1.12.2Date: Tue, 08 May 2018 17:04:37 GMTContent-Type: text/htmlContent-Length: 161Location: http://test.qfedu.com/index.htmlConnection: keep-alive
301 VS 302
301和302状态码都是URL重定向。其中301永久重定向,302临时重定向。不管是永久还是临时,但对用户而言这两者没有任何感官上的区别。都是在访问连接A的时候跳转到了连接B,并看到浏览器上的地址同样由A变成了B。既然如此,那为什么还要同时存在301和302呢?
它们主要区别在于搜索引擎。搜索引擎是要建立索引规则和权重的,如果连接A被设定为永久重定向到连接B,那搜索引擎可以确定A的地址永久改变了,就会把B当做唯一有效的目标地址。这时搜索引擎会把老地址相关信息带到新地址,同时在搜索引擎索引库中彻底废弃掉原先的老地址。而搜索引擎对于302则没有这样的行为。
304状态码
客户端缓存。通过Nginx 中的 expires 指令完成。
测试用例
# cat 304.confserver { listen 80; server_name test.qfedu.com; root /usr/share/nginx/html; access_log /var/log/nginx/test.qfedu.com-acess.log; error_log /var/log/nginx/test.qfedu.com-error.log;? location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|html)$ { expires 1d; }}
测试
将 test.qfedu.com 域名在本地的hosts文件中进行绑定。然后开浏览器进行测试。
第一次访问测试
由于是第一次访问,在浏览器的DEBUG模式下发现返回状态码是200。
第二次访问测试
由于已经经过了一次访问,客户端已经将静态资源信息换成到了本地。在第二次访问时,确认本地资源没有过期,返回状态码为304。说明使用了上一次请求时的响应资源。
4XX状态码
4XX 类型状态码主要表示客户端错误。客户端发起的HTTP请求头不完整、客户度使用的用户名、密码错误等等。都会被标示为客户端错误。常见的4XX状态码有 400、401、403等。
400状态码
当WEB服务器遇到不完整的HTTP请求头时,会返回400状态码。请求头信息或者Cookie信息过大,通常是导致不完整的请求头的原因。那多大的请求头算过大呢? 这个值由WEB服务器端配置决定。在Nginx 这类WEB服务器中,决定这个值的配置字段是large_client_header_buffers。 我们通过调小这个字段,来模拟400状态码。
测试用例
# cat 400.confserver { listen 80; server_name test.qfedu.com; root /usr/share/nginx/html; access_log /var/log/nginx/test.qfedu.com-acess.log; error_log /var/log/nginx/test.qfedu.com-error.log;? # 此指令在NGINX的HTTP段和SERVER段都可以生效。 # 若实验室发现在SERVER段中不生效,可以在HTTP段中设置。 large_client_header_buffers 1 1k;? location / { index index.html index.htm; }}
测试
# 模式时,设置了一个远超过1K的cookie头部# curl --cookie "user=sidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidisidisisidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidissidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidissidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidissidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidissidisisidisidisisidisidisisidisidisisidisidisisidisidisisisidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidisidisisidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidissidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidissidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidissidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidissidisisidisidisisidisidisisidisidisisidisidisisidisidisisisidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidisidisisidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidissidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidissidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidissidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidissidisisidisidisisidisidisisidisidisisidisidisisidisidisisisidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidisidisisidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidissidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidissidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidissidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidissidisisidisidisisidisidisisidisidisisidisidisisidisidisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisissisisisisisisisisisisisisisiisissiissisisisiissi" http://127.0.0.1/ -H "HOST: test.qfedu.com" -IHTTP/1.1 400 Bad RequestServer: nginx/1.12.2Date: Sun, 13 May 2018 14:35:53 GMTContent-Type: text/htmlContent-Length: 249Connection: close
401状态码
权限验证错误。就是需要用户名、密码等权限认证,但是客户端又没有通过认证。在Nginx中要想模拟这种状态码,必须将Nginx调整成认证模式。
测试用例
生产授权用户名和密码
# htpasswd -c /etc/passwd.db qfeduNew password:Re-type new password:Adding password for user qfedu
Nginx授权配置
# cat 401.confserver { listen 80; server_name test.qfedu.com; root /usr/share/nginx/html; access_log /var/log/nginx/test.qfedu.com-acess.log; error_log /var/log/nginx/test.qfedu.com-error.log;? location / { auth_basic "secret"; auth_basic_user_file /etc/passwd.db; index index.html index.htm; }}
测试
将 test.qfedu.com 域名在本地的hosts文件中进行绑定。然后开浏览器进行测试。
在弹出的认证授权框中输入正确的用户名和密码
在弹出的认证授权框中输入错误的用户名和密码,并退出认证授权框
403状态码
没有权限访问。文件权限过小或者人为设置不允许某个IP地址访问等,都会浮现403状态码。
测试用例1
# 将文件权限设置为最小# ll /usr/share/nginx/html/index.html-rw-r--r-- 1 root root 3700 3月 6 04:26 /usr/share/nginx/html/index.html# chmod 0 /usr/share/nginx/html/index.html# ll /usr/share/nginx/html/index.html---------- 1 root root 3700 3月 6 04:26 /usr/share/nginx/html/index.html
Nginx配置文件
server { listen 80; server_name test.qfedu.com; root /usr/share/nginx/html; access_log /var/log/nginx/test.qfedu.com-acess.log; error_log /var/log/nginx/test.qfedu.com-error.log;? location / { index index.html index.htm; }}
测试
# curl http://127.0.0.1/index.html -H "HOST: test.qfedu.com" -IHTTP/1.1 403 ForbiddenServer: nginx/1.12.2Date: Sun, 13 May 2018 15:04:04 GMTContent-Type: text/htmlContent-Length: 169Connection: keep-alive
测试用例2
# 不允许客户端IP地址为127.0.0.1的用户访问。先确保上一步测试中的文件权限还原。# chmod 644 /usr/share/nginx/html/index.html# 测试已经可以正常访问# curl http://127.0.0.1/index.html -H "HOST: test.qfedu.com" -I
Nginx配置
# cat 401.confserver { listen 80; server_name test.qfedu.com; root /usr/share/nginx/html; access_log /var/log/nginx/test.qfedu.com-acess.log; error_log /var/log/nginx/test.qfedu.com-error.log;? if ($remote_addr = "127.0.0.1") { return 403; }? location / { index index.html index.htm; }}
测试
# curl http://127.0.0.1/index.html -H "HOST: test.qfedu.com" -IHTTP/1.1 403 ForbiddenServer: nginx/1.12.2Date: Sun, 13 May 2018 15:06:35 GMTContent-Type: text/htmlContent-Length: 169Connection: keep-alive
404状态码
文件不存在。当我们访问一个不存在的文件时,就会出现这个错误。
模拟
# 取消测试403状态码的配置。随意输入URL进行访问。# curl http://127.0.0.1/aaa -H "HOST: test.qfedu.com" -IHTTP/1.1 404 Not FoundServer: nginx/1.12.2Date: Sun, 13 May 2018 15:11:43 GMTContent-Type: text/htmlContent-Length: 169Connection: keep-alive
499状态码
499这个状态码并不是http协议中定义的标准状态码,而是Nginx自己定义的一个状态码。 当客户端主动断开连接的时候,Nginx就会返回499的状态码。按照这个状态码的定义,只要在Nginx返回结果之前主动断开客户端连接,就应该会复现这个状态码。
测试用例
创建一个PHP脚本,并将脚本存放在Nginx 的 root 目录中。以此脚本模拟一个很长时间的响应。
# cat sleep.php<?phpsleep(80);echo "ok"?>
开启PHP-FPM服务
# 开启# systemctl start php-fpm# 查看状态# systemctl status php-fpm
测试Nginx配置文件
server { listen 80; server_name test.qfedu.com; root /usr/share/nginx/html; access_log /var/log/nginx/test.qfedu.com-acess.log; error_log /var/log/nginx/test.qfedu.com-error.log;? location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|html)$ { expires 1d; }? location / { # 确保 fastcgi.conf 中存在 SCRIPT_FILENAME 配置, 以下5XX案例中也要确保存在 # fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi.conf; # PHP-FPM 默认开启了9000端口。若做了个性化配置,请手动调整。 fastcgi_pass 127.0.0.1:9000; }}
测试
# 不要等待程序正常结束,CTRL + C 直接退出。# curl http://127.0.0.1/sleep.php -H "HOST: test.qfedu.com" -I ^C
# 在CURL模拟测试的同时查看 access log # tail -f /var/log/nginx/test.qfedu.com-acess.log127.0.0.1 - - [13/May/2018:23:24:33 -0400] "HEAD /sleep.php HTTP/1.1" 499 0 "-" "curl/7.29.0"
5XX状态码
5XX 类型的状态码主要表示服务端错误。此时就不要再纠结客户端问题了。
500状态码
服务器端代码出现了异常。代码语法错误、连接不上数据库资源等等都会出现这种错误。
测试用例
# 将Nginx 的root 目录中的sleep.php 随意个更改,让它的PHP语法出现问题。# cat sleep.php<?phpecho "aa"sleep(80);echo "ok"?>
测试Nginx配置文件
server { listen 80; server_name test.qfedu.com; root /usr/share/nginx/html; access_log /var/log/nginx/test.qfedu.com-acess.log; error_log /var/log/nginx/test.qfedu.com-error.log; location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|html)$ { expires 1d; } location / { include fastcgi.conf; fastcgi_pass 127.0.0.1:9000; } }
模拟
# curl http://127.0.0.1/sleep.php -H "HOST: test.qfedu.com" -I HTTP/1.1 500 Internal Server Error Server: nginx/1.12.2 Date: Sun, 13 May 2018 15:19:14 GMT Content-Type: text/html Connection: keep-alive X-Powered-By: PHP/5.4.16
502状态码
502 Bad Geteway。Nginx 502错误的原因比较多,主要是因为在代理模式下后端服务器出现问题引起的。这些错误一般都不是Nginx本身的问题,一定要从后端找原因。比如这里复现一种后端PHP-FPM进程挂掉的情况,就会出现502错误
模拟
# 先将后端的PHP-FPM进程关闭。# systemctl stop php-fpm
# 模拟测试# curl http://127.0.0.1/sleep.php -H "HOST: test.qfedu.com" -IHTTP/1.1 502 Bad GatewayServer: nginx/1.12.2Date: Sun, 13 May 2018 15:23:28 GMTContent-Type: text/htmlContent-Length: 173Connection: keep-alive
504状态码
504 Gateway Time-out。顾名思义,就是超时了。当PHP-FPM的执行时间大于Nginx的读超时时间,此时就会出现 504状态码。
测试用例
NGINX
server { listen 80; server_name test.qfedu.com; root /usr/share/nginx/html; access_log /var/log/nginx/test.qfedu.com-acess.log; error_log /var/log/nginx/test.qfedu.com-error.log; # Nginx 的读超时设置为30s, 默认应该是60s fastcgi_read_timeout 30;? location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|html)$ { expires 1d; }? location / { include fastcgi.conf; fastcgi_pass 127.0.0.1:9000; }}
PHP脚本
# 恢复Nginx 的root目录中的sleep.php脚本# pwd/usr/share/nginx/html# cat sleep.php<?phpsleep(80);echo "ok";?>
模拟
# 测试时,记得开启PHP-FPM# time curl http://127.0.0.1/sleep.php -H "HOST: test.qfedu.com" -IHTTP/1.1 504 Gateway Time-outServer: nginx/1.12.2Date: Sun, 13 May 2018 15:36:20 GMTContent-Type: text/htmlContent-Length: 183Connection: keep-alive??real 0m30.034suser 0m0.005ssys 0m0.009s
原文地址:https://www.cnblogs.com/lianfulin/p/11391808.html
时间: 2024-11-08 00:25:29