常用HTTP状态码必知必会

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。
200状态码
这个是⼀个⼤家都希望看到的状态码,表示⼀个HTTP请求得到了正确的响应。

3XX状态码

3XX 类型状态码主要表示HTTP请求URL重定向⾏为。常⻅的3XX状态码有301、302及304。
301状态码
URL 永久性重定向。在Nginx中通过rewrite 指令结合 permanent 标记实现。
测试⽤例

# cat 301.conf
server {
 	listen 80;
 	server_name test.1111.com;
 	root /usr/share/nginx/html;
 	access_log /var/log/nginx/test.1111.com-acess.log;
	error_log /var/log/nginx/test.1111.com-error.log;
	rewrite ^(.*)$ /index.html permanent;
 	location / {
		index index.html index.htm;
	 }
}
 

测试结果

# curl http://127.0.0.1/ -H "HOST: test.1111.com" -I
HTTP/1.1 301 Moved Permanently
Server: nginx/1.12.2
Date: Tue, 08 May 2018 17:02:26 GMT
Content-Type: text/html
Content-Length: 185
Location: http://test.1111.com/index.html
Connection: keep-alive

302状态码
URL 临时重定向。在Nginx中通过rewrite 指令结合 redirect 标记实现
测试⽤例

# cat 302.conf
server {
	 listen 80;
	 server_name test.1111.com;
	 root /usr/share/nginx/html;
	 access_log /var/log/nginx/test.1111.com-acess.log;
	 error_log /var/log/nginx/test.1111.com-error.log;
	 rewrite ^(.*)$ /index.html redirect;
	 location / {
 		index index.html index.htm;
	 	}
}

测试结果

# curl http://127.0.0.1/ -H "HOST: test.1111.com" -I
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.12.2
Date: Tue, 08 May 2018 17:04:37 GMT
Content-Type: text/html
Content-Length: 161
Location: http://test.1111.com/index.html
Connection: 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.conf
server {
	 listen 80;
	 server_name test.1111.com;
	 root /usr/share/nginx/html;
	 access_log /var/log/nginx/test.1111.com-acess.log;
	 error_log /var/log/nginx/test.1111.com-error.log;
	 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|html)$ {
	 	expires 1d;
 	 }
}

第一次访问测试
由于是第⼀次访问,在浏览器的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.conf
server {
	 listen 80;
	 server_name test.111.com;
	 root /usr/share/nginx/html;
	 access_log /var/log/nginx/test.111.com-acess.log;
	 error_log /var/log/nginx/test.111.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=sidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidisidis
isidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidissidisisid
isidisisidisidisisidisidisisidisidisisidisidisisidisidissidisisidisidisisid
isidisisidisidisisidisidisisidisidisisidisidissidisisidisidisisidisidisisid
isidisisidisidisisidisidisisidisidissidisisidisidisisidisidisisidisidisisid
isidisisidisidisisisidisisidisidisisidisidisisidisidisisidisidisisidisidisi
sidisidisidisisidisisidisidisisidisidisisidisidisisidisidisisidisidisisidis
idissidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidissidisi
sidisidisisidisidisisidisidisisidisidisisidisidisisidisidissidisisidisidisi
sidisidisisidisidisisidisidisisidisidisisidisidissidisisidisidisisidisidisi
sidisidisisidisidisisidisidisisisidisisidisidisisidisidisisidisidisisidisid
isisidisidisisidisidisidisisidisisidisidisisidisidisisidisidisisidisidisisi
disidisisidisidissidisisidisidisisidisidisisidisidisisidisidisisidisidisisi
disidissidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidissid
isisidisidisisidisidisisidisidisisidisidisisidisidisisidisidissidisisidisid
isisidisidisisidisidisisidisidisisidisidisisisidisisidisidisisidisidisisidi
sidisisidisidisisidisidisisidisidisidisisidisisidisidisisidisidisisidisidis
isidisidisisidisidisisidisidissidisisidisidisisidisidisisidisidisisidisidis
isidisidisisidisidissidisisidisidisisidisidisisidisidisisidisidisisidisidis
isidisidissidisisidisidisisidisidisisidisidisisidisidisisidisidisisidisidis
sidisisidisidisisidisidisisidisidisisidisidisisidisidisisisisisisisisisisis
isisisisisisisisisisisisisisisisisisisisisisisisissisisisisisisisisisisisis
isiisissiissisisisiissi" http://127.0.0.1/ -H "HOST: test.111.com" -I
HTTP/1.1 400 Bad Request
Server: nginx/1.12.2
Date: Sun, 13 May 2018 14:35:53 GMT
Content-Type: text/html
Content-Length: 249
Connection: close

401状态码
权限验证错误。就是需要⽤户名、密码等权限认证,但是客户端⼜没有通过认证。在Nginx中要想模拟
这种状态码,必须将Nginx调整成认证模式。
测试⽤例
生产授权的用户和密码

# htpasswd -c /etc/passwd.db 111
New password:
Re-type new password:
Adding password for user 111

nginx授权配置

# cat 401.conf
server {
	 listen 80;
	 server_name test.111.com;
	 root /usr/share/nginx/html;
	 access_log /var/log/nginx/test.111.com-acess.log;
	 error_log /var/log/nginx/test.111.com-error.log;
	 location / {
		 auth_basic "secret";
		 auth_basic_user_file /etc/passwd.db;
		 index index.html index.htm;
	 }
}

测试
将 test.111.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.111.com;
	 root /usr/share/nginx/html;
	 access_log /var/log/nginx/test.111.com-acess.log;
	 error_log /var/log/nginx/test.111.com-error.log;
	 location / {
	 	index index.html index.htm;
	 }
}

测试

# curl http://127.0.0.1/index.html -H "HOST: test.111.com" -I
HTTP/1.1 403 Forbidden
Server: nginx/1.12.2
Date: Sun, 13 May 2018 15:04:04 GMT
Content-Type: text/html
Content-Length: 169
Connection: 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.111.com" -I

nginx配置

# cat 401.conf
server {
	 listen 80;
	 server_name test.111.com;
	 root /usr/share/nginx/html;
	 access_log /var/log/nginx/test.111.com-acess.log;
	 error_log /var/log/nginx/test.111.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.111.com" -I
HTTP/1.1 403 Forbidden
Server: nginx/1.12.2
Date: Sun, 13 May 2018 15:06:35 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive

404状态码
⽂件不存在。当我们访问⼀个不存在的⽂件时,就会出现这个错误。

测试用例

# 取消测试403状态码的配置。随意输⼊URL进⾏访问。
# curl http://127.0.0.1/aaa -H "HOST: test.111.com" -I
HTTP/1.1 404 Not Found
Server: nginx/1.12.2
Date: Sun, 13 May 2018 15:11:43 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive

499状态码
499这个状态码并不是http协议中定义的标准状态码,⽽是Nginx⾃⼰定义的⼀个状态码。
当客户端主动断开连接的时候,Nginx就会返回499的状态码。按照这个状态码的定义,只要在Nginx
返回结果之前主动断开客户端连接,就应该会复现这个状态码。

测试用例
创建一个php脚本,并将脚本存放在Nginx的root目录中。以此脚本模拟一个很长时间的响应

# cat sleep.php
<?php
sleep(80);
echo "ok"
?>

开启PHP-FPM服务

# 开启
# systemctl start php-fpm
# 查看状态
# systemctl status php-fpm

测试nginx配置文件

server {
	 listen 80;
	 server_name test.111.com;
	 root /usr/share/nginx/html;
	 access_log /var/log/nginx/test.111.com-acess.log;
	 error_log /var/log/nginx/test.111.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.111.com" -I
# 在CURL模拟测试的同时查看 access log
# tail -f /var/log/nginx/test.111.com-acess.log
127.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
<?php
echo "aa"
sleep(80);
echo "ok"
?>

测试Nginx配置文件

server {
	 listen 80;
	 server_name test.111.com;
	 root /usr/share/nginx/html;
	 access_log /var/log/nginx/test.111.com-acess.log;
	 error_log /var/log/nginx/test.111.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.111.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.111.com" -I
HTTP/1.1 502 Bad Gateway
Server: nginx/1.12.2
Date: Sun, 13 May 2018 15:23:28 GMT
Content-Type: text/html
Content-Length: 173
Connection: keep-alive

504状态码
504 Gateway Time-out。顾名思义,就是超时了。当PHP-FPM的执⾏时间⼤于Nginx的读超时时
间,此时就会出现 504状态码。

测试用例
nginx

server {
	 listen 80;
	 server_name test.111.com;
	 root /usr/share/nginx/html;
	 access_log /var/log/nginx/test.111.com-acess.log;
	 error_log /var/log/nginx/test.111.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
<?php
sleep(80);
echo "ok";
?>

模拟

# 测试时,记得开启PHP-FPM
# time curl http://127.0.0.1/sleep.php -H "HOST: test.111.com" -I
HTTP/1.1 504 Gateway Time-out
Server: nginx/1.12.2
Date: Sun, 13 May 2018 15:36:20 GMT
Content-Type: text/html
Content-Length: 183
Connection: keep-alive
real 0m30.034s
user 0m0.005s
sys 0m0.009s
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值