HTTP 协议与 Web 服务排障

浏览器报个 502、504,运维的第一反应应该不是”重启”,而是能准确说出这个状态码代表哪一层出了问题。这篇把 HTTP 协议的生产用法整理成一套排障体系。

一、HTTP 是什么

HTTP(超文本传输协议)把超文本文档从 Web 服务器传输到浏览器,应用层协议,基于 TCP 80/443。

URL 组成:协议://主机:端口/路径。三个特点:

  1. 请求/响应模型:客户端发请求,服务端回响应;
  2. 无状态:HTTP 本身不记录用户状态(靠 Cookie/Session 补);
  3. 基于 TCP:先三次握手,再传 HTTP 报文。

一条命令看全流程(curl -v 是 Web 排障的第一工具):

1
2
3
4
5
curl -v http://www.example.com/
# Trying 1.1.1.1... ← DNS 解析出的 IP
# Connected to ... ← TCP 连接建立(三次握手)
# > GET /index.html HTTP/1.1 ← 发出请求
# < HTTP/1.1 200 OK ← 收到响应

二、请求方法与响应结构

GET vs POST:GET 参数在 URL 里(?a=1&b=2),POST 参数在请求体里。POST 更安全——参数不留在日志和地址栏。

响应报文:状态行(HTTP/1.1 200 OK)+ 头部 + 响应体。

三、状态码:生产高频场景(面试必问)

状态码 含义 排障方向
502 Bad Gateway 反向代理连不上后端(Tomcat 挂了/端口不通/连接数满) ss -lnt 看后端端口 → tail 后端日志 → curl 后端健康检查
504 Gateway Timeout 连上了后端但响应超时(后端慢/排队) 后端日志、慢查询、线程池满
503 Service Unavailable 服务暂时不可用(重启/维护/限流) 看部署状态、限流配置
403 Forbidden 无权限(nginx deny/目录权限) nginx 配置、文件权限
404 Not Found 资源不存在 路径写错、静态资源没部署
1
curl -s -o /dev/null -w "%{http_code}" http://localhost/   # 快速看状态码

四、关键头部字段(运维用途)

头部 运维用途
Server curl -I 识别 Web 服务版本(安全审计/指纹)
Referer 防盗链判断——图片 403 先看 Referer
Host 决定 Nginx 走哪个 server 块——多站点访问错页面先查 Host
User-Agent 区分爬虫/正常用户(封爬虫按 UA)

五、重定向 301/302/304

1
2
3
301 永久重定向:域名换了 / HTTP 跳 HTTPS(SEO 权重转移)
302 临时重定向:临时跳转(登录后跳回、活动页)
304 Not Modified:资源没变直接用缓存(配合 Last-Modified/ETag)

Nginx 配置示例:

1
2
3
4
5
server {
listen 80;
server_name www.example.com;
return 301 https://$host$request_uri; # HTTP 全站跳 HTTPS
}

六、PV / UV / IP(站长口径)

1
2
3
PV(Page View):页面浏览量,一个人点 2 次算 2 个 PV
UV(Unique Visitor):独立访客(去重 Cookie/设备),只算 1 个
IP:独立 IP 数(同一 NAT 出口只算 1 个)

经典计算题:公司大厦 100 人、每人 2 台设备、走同一个 NAT 出口、每人点 2 次 → PV=400、UV=200、IP=1。PV ≥ UV ≥ IP 永远成立;IP 在 NAT 场景只是近似值。

七、Web 全链路排障(面试讲故障故事用)

用户报”网站打不开”,从外层到内层逐层看:

1
2
用户浏览器 → DNS 解析 → 防火墙/安全组 → 负载均衡健康检查 → Nginx 日志
(access/error) → Tomcat 日志 → MySQL 慢查询 → 监控图(Zabbix/Prometheus)

入门手段永远是一句话:先 curl 本地确认服务在,再一层层往外查。用户反馈”打开慢”时用浏览器 F12 → Network → Timing 看各段耗时,定位是 DNS 慢、TCP 慢还是 TTFB(服务端处理慢)——比瞎猜快得多。

HTTP 这一层是 Web 排障的”界面层”:状态码告诉你错在哪一段,头部告诉你细节,curl 帮你复现全过程。配合前面的 TCP 和 DNS 知识,一条链路就完整了。