HTTP
HTTP(Hypertext Transfer Protocol,超文本传输协议)学习与排障索引。先读请求生命周期,再按问题进入专题;每篇都有独立实操步骤。
| 顺序 | 文档 | 目标 |
|---|---|---|
| 1 | 请求生命周期 | 定位解析、连接、TLS、代理、应用与响应阶段 |
| 2 | 请求方法、状态码与重定向 | 理解请求语义、错误来源与跳转行为 |
| 3 | Header 基础与排障 | 常用字段的用途与信任边界 |
| 4 | 浏览器跨域请求 | OPTIONS、实际请求、Cookie 与失败分支 |
| 5 | HTTPS 与证书 | 证书链、域名、SNI 与更新验收 |
| 6 | 超时、重试与幂等 | 避免重复写入及重试放大 |
| 7 | HTTP 排障手册 | 用客户端、代理、应用证据收敛问题 |
| 8 | 缓存与发布失效 | 缓存键、条件请求、更新和回退 |
| 9 | Cookie、Session 与 Token | 登录、租户隔离、过期与注销验收 |
| 10 | 连接池与协议版本 | 连接复用、HTTP/2/3、排队与排空 |
| 11 | 反向代理与流式传输 | 缓冲、上传、压缩与流接口 |
| 12 | WebSocket、SSE 与 gRPC | 长连接、消息恢复和调用状态 |
AWS 专项见 ALB Header 配置实战。
实操前提与验证范围#
- 使用 Bash、curl、Python 3;部分章节需要 jq、Docker、OpenSSL 3 或 grpcurl,按篇准备。
*.example.com、证书路径、租户等是占位;真实服务实验需已有预发布环境和日志权限。不能将不存在的端点直接当成可运行服务。- 订单写入复用 企业订单工程,长连接复用既有服务契约;本系列不重复搭建业务系统。
- 下方 Nginx 是隔离的协议与故障诊断夹具,用于可重复观察 HTTP 行为,不作为企业应用或生产部署模板。
- 本地诊断用例、文档语法和构建会单独验证;TLS/登录/真实 CDN/长连接的业务验收必须在目标环境执行,不能由静态检查代替。
隔离实验环境#
需要 Docker。下载 nginx.conf 到本地,从同一 Bash 会话执行。镜像使用组织批准的 Nginx 版本和摘要;示例不固定过期版本。
export NGINX_IMAGE='nginx@sha256:REPLACE_APPROVED_DIGEST'
export HTTP_LAB_CONFIG='/替换为下载后的/nginx.conf'
test -f "$HTTP_LAB_CONFIG"
HTTP_LAB_DIR=$(mktemp -d)
HTTP_LAB_NAME="http-diagnostics-$(python3 -c 'import uuid; print(uuid.uuid4().hex[:10])')"
mkdir "$HTTP_LAB_DIR/www"
chmod 755 "$HTTP_LAB_DIR/www"
cp "$HTTP_LAB_CONFIG" "$HTTP_LAB_DIR/nginx.conf"
chmod 644 "$HTTP_LAB_DIR/nginx.conf"
printf 'release-one\n' > "$HTTP_LAB_DIR/www/asset.txt"
python3 - "$HTTP_LAB_DIR/www/slow.bin" <<'PY'
from pathlib import Path
import sys
Path(sys.argv[1]).write_bytes(b'x' * 65536)
PY
chmod 644 "$HTTP_LAB_DIR/www/asset.txt" "$HTTP_LAB_DIR/www/slow.bin"
docker run --rm --network none --user 101:101 --read-only --tmpfs /tmp:rw,noexec,nosuid,uid=101,gid=101 -v "$HTTP_LAB_DIR/nginx.conf:/etc/nginx/nginx.conf:ro" --entrypoint nginx "$NGINX_IMAGE" -t
docker run -d --name "$HTTP_LAB_NAME" --user 101:101 --read-only --cap-drop ALL --security-opt no-new-privileges:true --tmpfs /tmp:rw,noexec,nosuid,uid=101,gid=101 -p 127.0.0.1:18080:8080 -v "$HTTP_LAB_DIR/nginx.conf:/etc/nginx/nginx.conf:ro" -v "$HTTP_LAB_DIR/www:/srv:ro" --entrypoint nginx "$NGINX_IMAGE" -g 'daemon off;'
curl --fail --retry 3 --retry-connrefused --retry-delay 1 --max-time 5 http://127.0.0.1:18080/health端口占用时停止本次启动,选空闲端口并同步修改实验 URL,不停止其他容器。实验只绑定回环地址,不对外提供服务;日志不记录 Cookie/Authorization/正文。
| 路径 | 用途 |
|---|---|
/health |
正常 200 |
/r301…/r308 |
本文提供 301、302、303、307、308 跳转到方法观察端点 |
/unavailable |
主动 503 + Retry-After |
/broken |
真实上游连接拒绝 → 502 |
/asset.txt |
静态缓存/ETag 验证 |
/slow.bin |
有响应头但正文缓慢,验证客户端截止时间 |
完成本地实验后,仅删除本次创建的资源:
docker rm -f "$HTTP_LAB_NAME"
rm -r -- "$HTTP_LAB_DIR"
unset HTTP_LAB_DIR HTTP_LAB_NAME重新开终端后需使用此前记录的确切容器名和目录,不使用通配符批量删除。