HTTP状态码面试必知

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

HTTP状态码面试必知的相关文章

转载 java基础题(面试必知)

1.面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象.2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类).派生类可以从它的基类那

JAVA程序员面试必知32个知识点

第一,谈谈final, finally, finalize的区别. final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承.finally是异常处理语句结构的一部分,表示总是执行.finalize是 Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等. 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现

2018年线程与多线程面试必知必会内容

本文目录 线程与多线程 线程的运行与创建 线程的状态 1 线程与多线程 线程是什么? 线程(Thread)是一个对象(Object).用来干什么?Java 线程(也称 JVM 线程)是 Java 进程内允许多个同时进行的任务.该进程内并发的任务成为线程(Thread),一个进程里至少一个线程. Java 程序采用多线程方式来支持大量的并发请求处理,程序如果在多线程方式执行下,其复杂度远高于单线程串行执行.那么多线程:指的是这个程序(一个进程)运行时产生了不止一个线程. 为啥使用多线程? 适合多核

产品新人面试必知的3招

本文和大家分享的主要是一个有着多年产品经验的 产品经理 整理的面试必备的3 个步骤,一起来看看吧,希望在招聘季对广大新产品人面试有所帮助. 在做决定之前,请不要太过冲动,除非你已经想地很清楚!  因为选择没有对错之分,只要勇于选择并愿意承担相应的责任,那就是最正确的决定! 第二段工作经历虽时间不久,但着实让我有种太长太久的错觉!这是我工作以来的第二个东家,这次离开没有第一次辞职时的不舍与留恋,没有任何遗憾和感动. 第二份工作以来,我接触全新行业领域.弥补知识短板,还是有不少的成长和收获的,正是这

BAT面试必知:Dubbo&amp;Zookeeper面试集锦

技术面试是每一位程序员都会经历的一件事情,技术面试官会通过自己的方式去考察程序员的技术功底与基础理论知识,这个过程被有的程序员成为"造火箭式的技术轰炸",不同程序员的面试经历与体验也是千差万别,各种奇怪,奇葩的情况也是层出不穷. 小编准备了一些关于Dubbo,Zookeeper面试集锦,大部分题目不设标准答案,需要答案的提示可以加小编QQ群937053620,获取! Dubbo面试题锦集 1.默认也推荐使用netty框架,还有mina. 2.默认是阻塞的,可以异步调用,没有返回值的可以

大厂面试必知必会:图解分布式事务实现原理

问题场景 什么是事务? 事务是数据库从一个稳定状态变迁到另一个稳定状态的保证,具备 ACID 这 4 个特性: 原子性(Atomicity):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节.事务在执行过程中发生错误,会被回滚到事务开始前的状态. 一致性(Consistency):在事务开始之前和事务结束以后,数据库的完整性限制没有被破坏. 隔离性(Isolation):两个事务的执行是互不干扰的,两个事务时间不会互相影响. 持久性(Durability):在事务完成以

JAVA后端面试必知——ListIterator和Iterator的异同

在使用Java集合的时候,都需要使用Iterator.但是java集合中还有一个迭代器ListIterator,在使用List.ArrayList.LinkedList和Vector的时候可以使用.这两种迭代器有什么区别呢?下面我们详细分析.这里有一点需要明确的时候,迭代器指向的位置是元素之前的位置. 首先看一下Iterator和ListIterator迭代器的方法有哪些. Iterator迭代器包含的方法有: hasNext():如果迭代器指向位置后面还有元素,则返回 true,否则返回fal

15分钟带你了解前端工程师必知的javascript设计模式(附详细思维导图和源码)

15分钟带你了解前端工程师必知的javascript设计模式(附详细思维导图和源码) 前言 设计模式是一个程序员进阶高级的必备技巧,也是评判一个工程师工作经验和能力的试金石.设计模式是程序员多年工作经验的凝练和总结,能更大限度的优化代码以及对已有代码的合理重构.作为一名合格的前端工程师,学习设计模式是对自己工作经验的另一种方式的总结和反思,也是开发高质量,高可维护性,可扩展性代码的重要手段. 我们所熟知的金典的几大框架,比如jquery, react, vue内部也大量应用了设计模式, 比如观察

走向面试之经典的数据库笔试题:一、你必知必会的SQL语句练习-Part 2

本文是在Cat Qi的参考原帖的基础之上经本人一题一题练习后编辑而成,非原创,仅润色而已.另外,本文所列题目的解法并非只有一种,本文只是给出比较普通的一种而已,也希望各位园友能够自由发挥. 一.书到用时方恨少:"图书-读者-借阅"类题目 1.1 本题目的表结构 本题用到下面三个关系表: CARDS 借书卡. CNO 卡号,NAME 姓名,CLASS 班级 BOOKS 图书. BNO 书号,BNAME 书名,AUTHOR 作者,PRICE 单价,QUANTITY 库存册数 BORROW