HTTP/HTTPS 01-不同状态码含义

本文详细解析了HTTP协议中各类状态码的含义,包括1xx至5xx的不同响应类别,阐述了每种状态码所代表的具体情况,如客户端或服务器错误、资源定位变更等,帮助读者理解HTTP交互过程中的常见问题。

转自:http://m.blog.youkuaiyun.com/blog/u013857407/21741847

HTTP协议状态码,是指在HTTP协议运作中由客户端发出请求连接,服务端建立连接,客户端发出HTTP请求,服务端返回响应信息,而在这个过程张由于客户端或服务端的问题会返回相应的错误代码并显示给用户,对应的错误代码表示不同的错误信息,根据这个信息用户可以调整相应的操作来修改出现的错误,最终避免错误的再现

HTTP协议状态码一共有5中类别,分别是1xx,2xx,3xx,4xx,5xx 用2位数字来表示不同的错误:

  1XX类状态码信息表示:临时的响应。客户端在收到常规响应之前,应准备接收一个或多个1XX响应

  2XX类状态码信息表示:服务器成功的接收了客户端请求

   3XX类状态码信息表示:客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同页面,或者通过代理服务器重复该请求

  4XX类状态码信息表示:发生错误,客户端似乎有问题。例如:客户端请求不存在的页面,客户端为提供有效的身份验证信息

  5XX类状态码信息表示:服务器遇到错误而不能完成该请求

 

状态码 含义
100——客户必须继续发出请求
101——客户要求服务器根据请求转换HTTP协议版本
200——交易成功
201——提示知道新文件的URL
202——接受和处理、但处理未完成
203——返回信息不确定或不完整
204——请求收到,但返回信息为空
205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206——服务器已经完成了部分用户的GET请求
300——请求的资源可在多处得到
301——删除请求数据
302——在其他地址发现了请求数据
303——建议客户访问其他URL或访问方式
304——客户端已经执行了GET,但文件未变化
305——请求的资源必须从服务器指定的地址得到
306——前一版本HTTP中使用的代码,现行版本中不再使用
307——申明请求的资源临时性删除
400——错误请求,如语法错误
401——请求授权失败
402——保留有效ChargeTo头响应
403——请求不允许
404——没有发现文件、查询或URl
405——用户在Request-Line字段定义的方法不允许
406——根据用户发送的Accept拖,请求资源不可访问
407——类似401,用户必须首先在代理服务器上得到授权
408——客户端没有在用户指定的饿时间内完成请求
409——对当前资源状态,请求不能完成
410——服务器上不再有此资源且无进一步的参考地址
411——服务器拒绝用户定义的Content-Length属性请求
412——一个或多个请求头字段在当前请求中错误
413——请求的资源大于服务器允许的大小
414——请求的资源URL长于服务器允许的长度
415——请求资源不支持请求项目格式
416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段
417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求
500——服务器产生内部错误
501——服务器不支持请求的函数
502——服务器暂时不可用,有时是为了防止发生系统过载
503——服务器过载或暂停维修
504——关口过载,服务器使用另一个关口或服务来响应用户,等待时间设定值较长
505——服务器不支持或拒绝支请求头中指定的HTTP版本

工作并不只是为了那点工资,而是为了创造一份属于自己的事业

转载于:https://www.cnblogs.com/feihujiushiwo/p/10979111.html

<think>我们正在分析HAProxy日志中的BADREQ和cR--状态。首先,需要理解这些术语在HAProxy中的含义。 根据HAProxy文档: - BADREQ:表示客户端发送了一个无效的HTTP请求(例如,不符合HTTP规范)。这可能是由于恶意攻击、客户端错误或网络问题导致的畸形请求。 - cR--:这是会话状态的一部分。HAProxy使用一组标志来表示连接的状态,其中每个字符代表一个特定的状态。具体来说: c:表示该连接是客户端端的连接。 R:表示已经收到了客户端的请求(R代表“Received request”)。 后面的两个字符:第一个'-'可能是等待服务器连接的状态,第二个'-'可能是等待服务器响应的状态。但具体需要结合文档。 然而,更准确的状态解释可以参考HAProxy的官方文档: 在HAProxy中,会话状态通常由5个字符表示,每个位置代表一个特定的状态。例如: 第一个字符:代表客户端连接的状态(c = 客户端,s = 服务器) 第二个字符:代表连接阶段(R = 接收请求,Q = 排队,C = 连接建立,L = 等待响应,等等) 第三、四、五个字符:分别代表其他状态(如等待服务器连接、等待服务器响应、结束等) 对于“cR--”,我们可以这样理解: c: 客户端连接 R: 已经接收到客户端的HTTP请求 第一个'-': 表示还没有建立到服务器的连接(即还没有尝试连接服务器) 第二个'-': 表示还没有接收到服务器的响应 因此,当出现BADREQ并且状态为cR--时,意味着HAProxy已经接收到了客户端的请求,但该请求是无效的(BADREQ),因此HAProxy不会将请求转发到后端服务器(所以服务器连接和响应状态都是未发生)。 接下来,我们需要在日志中查找这些条目。HAProxy的日志格式通常可以通过日志格式字符串定义,但默认格式可能包含以下字段: client_ip:client_port [timestamp] frontend_name backend_name/server_name time_request total_time status_code bytes_read ... state flags ... 为了分析BADREQ和cR--,我们可以: 1. 在日志中过滤包含“BADREQ”和“cR--”的条目。 2. 分析这些条目的客户端IP、请求时间、前端名称等,以寻找模式。 常见原因: - 客户端发送了不完整的HTTP请求(例如,只发送了部分头部,然后断开连接)。 - 客户端发送了非法字符(如非ASCII字符)在HTTP头中。 - 客户端发送了过长的URL或头部字段(超过HAProxy配置的缓冲区大小)。 - 网络问题导致数据包损坏。 排查步骤: 1. 检查HAProxy配置,确认是否有设置缓冲区大小(tune.bufsize, tune.maxrewrite)等,以及是否合理。 2. 检查这些请求的客户端IP是否来自同一个源,可能是某个特定的客户端或攻击。 3. 如果可能,捕获这些请求的原始数据包(例如,通过tcpdump)以分析具体内容。 4. 查看HAProxy的版本,并确认是否有已知的BUG导致误报BADREQ。 引用[1]中提到了HAProxy的启动用户和组,但这与日志分析关系不大。因此,我们主要关注日志分析。 下面是一个示例日志条目(假设使用默认格式): 192.168.1.100:12345 [01/Jan/2020:12:00:00.000] http-in~ http-in/<NOSRV> -1/-1/-1/-1/0 400 187 - - CR-- 0/0/0/0/0 0/0 "GET /invalid%request HTTP/1.0" 在这个示例中: - 状态码400(Bad Request)和标志“BADREQ”可能同时出现(但具体取决于日志格式配置)。 - 状态字段是“CR--”(注意这里是大写,但通常是小写?实际上,在HAProxy日志中状态字段通常是4个字符,但有时会看到5个字符的位置,不过我们这里关注的是4字符状态)。 - 请求是“GET /invalid%request HTTP/1.0”,其中包含了一个无效的编码(%后面没有两个十六进制数字)可能导致BADREQ。 注意:HAProxy的日志格式可以通过“option httplog”或自定义日志格式进行配置。因此,实际日志可能有所不同。 因此,建议: 1. 确认日志格式,以便正确解析。 2. 使用工具(如awk, grep, cut)或日志分析工具(如ELK, Graylog)来过滤和分析日志。 例如,使用grep命令: grep "BADREQ" haproxy.log | grep "cR--" 然后,进一步分析这些日志条目的客户端IP、请求URL、User-Agent等,以确定原因。 如果问题频繁发生,可能需要调整HAProxy配置,例如增加缓冲区大小,或者使用更宽松的解析模式(如果适用)。但要注意,宽松模式可能会降低安全性。 另外,HAProxy提供了实时查看错误的方式,可以通过HAProxy的stats socket(如果配置了)使用命令: echo "show errors" | socat /var/run/haproxy.sock stdio 这将显示最近捕获的错误(包括BADREQ),其中包含更详细的信息(如请求的前几个字节)。 总结: 分析HAProxy日志中的BADREQ和cR--状态,主要是识别无效的客户端请求,并进一步调查这些请求的来源和内容,以确定是客户端问题、攻击还是配置问题。 相关问题: 1. 如何配置HAProxy的日志格式以获取更多关于BADREQ的详细信息? 2. 除了日志分析,还有哪些工具可以实时监控HAProxy的错误? 3. 如何防止恶意客户端发送无效请求导致HAProxy产生大量BADREQ日志? 4. HAProxy的缓冲区大小如何影响BADREQ的出现?</think>### HAProxy日志分析:BADREQ与cR--状态排查 #### 1. **BADREQ与cR--状态的含义** - **`BADREQ`**:表示客户端发送了**无效的HTTP请求**,常见原因包括: - 请求行格式错误(如`GET / HTTP/1.1`缺失协议版本) - 非法字符(如控制字符、非ASCII字符) - 头字段格式错误(如缺少冒号`:`) - 请求超过缓冲区限制(`tune.bufsize`)[^1] - **`cR--`**:描述**TCP/HTTP会话状态**: - `c`:客户端连接 - `R`:已收到请求(Request received) - `--`:等待服务器连接/响应(未建立) #### 2. **日志分析步骤** **步骤1:过滤相关日志条目** 使用`grep`查找同时包含`BADREQ`和`cR--`的日志: ```bash grep -E "BADREQ.*cR--" /var/log/haproxy.log ``` **步骤2:解析关键字段** 典型日志格式示例: ``` <client_ip>:<port> [<timestamp>] <frontend>~ <backend>/<server> 0/0/-1/-1/0 400 0 - - cR-- 1/1/0/0/0 0/0 "BADREQ" ``` - **字段解析**: - `400`:HTTP状态码(Bad Request) - `cR--`:状态标志(客户端请求已接收,但未转发到后端) - 末尾的`"BADREQ"`:错误类型标识 **步骤3:分析请求内容** 启用详细日志模式以捕获原始请求头: ```haproxy # haproxy.cfg global log /dev/log local0 debug # 启用debug级别日志 frontend http-in option httplog log-format "%hr" # 记录完整的HTTP请求行 ``` 重启后,日志将显示触发`BADREQ`的原始请求(如`GET /%00invalid HTTP/1.1`)。 #### 3. **常见原因与解决方案** | 原因 | 解决方案 | |---------------------|--------------------------------------------------------------------------| | **非法字符** | 检查请求中的`%00`(空字节)、非UTF-8字符 | | **缓冲区不足** | 增加`tune.bufsize`(默认16KB)→ `tune.bufsize 32768` | | **请求行过长** | 调整`tune.maxrewrite`(头部预留空间)→ `tune.maxrewrite 8192` | | **客户端异常断开** | 使用`timeout client`设置合理的超时(默认30s) | | **恶意扫描/攻击** | 通过`acl`屏蔽异常IP:<br>`acl bad_ip src <client_ip>`<br>`http-request deny if bad_ip` | #### 4. **实时错误监控** 通过`runtime API`查看实时错误: ```bash echo "show errors" | socat /var/run/haproxy.sock stdio ``` 输出示例: ``` Total events: 3 [ALERT] 231/102045 (12345) : parsing [haproxy.cfg:10]: invalid character 0x00 in request ``` #### 5. **高级调试建议** - **抓包分析**: 在HAProxy服务器运行`tcpdump`捕获原始流量: ```bash tcpdump -i eth0 'port 80' -w badreq.pcap ``` - **模拟请求**: 使用原始请求复现问题: ```bash printf "GET / HTTP/1.1\r\nHost: example.com\r\nX-Invalid:\x00\r\n\r\n" | nc haproxy_ip 80 ``` --- ### 相关问题 1. **如何区分`BADREQ`是由客户端错误还是HAProxy配置问题引起的?** > 需结合日志中的原始请求和抓包分析:若请求包含非法字符(如`\x00`),属客户端问题;若因缓冲区不足触发,需调整`tune.bufsize`[^1]。 2. **HAProxy的`cR--`状态是否总是与`BADREQ`关联?** > 并非绝对。`cR--`仅表示请求未转发到后端,可能由其他错误(如连接超时)引起,需结合日志错误标识(如`BADREQ`、`CLIENT_CLOSE`)综合判断。 3. **如何防止恶意请求导致的`BADREQ`日志洪泛?** > 建议: > - 启用速率限制:`stick-table type ip size 100k expire 5m store http_req_rate(10s)` > - 配置动态黑名单:`acl abuse src_http_req_rate gt 100` → `tarpit deny if abuse` 4. **HAProxy的日志字段`cR--`与`cR`有何区别?** > `cR`表示请求已接收且**正在尝试连接后端**;`cR--`的`--`表明**尚未尝试后端连接**,通常因请求无效(如`BADREQ`)而中断流程[^1]。 [^1]: HAProxy配置手册 - 进程与日志管理章节
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值