反向代理、上传、压缩与流式传输
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
HTTP(Hypertext Transfer Protocol,超文本传输协议)代理既转发请求,也影响缓冲、消息边界、超时和连接生命周期。关闭缓冲只对特定路由做,不能把全站改成流式作为通用优化。
1. 关键开关#
| 机制 | 作用 | 权衡 |
|---|---|---|
| 请求体缓冲 | 先收完整上传再转上游 | 保护上游免受慢上传,但占临时磁盘并增加等待 |
| 响应缓冲 | 先从上游读取,分批交给客户端 | 隔离慢客户端;事件流可能被积攒后才显示 |
| 上传大小限制 | 限制请求体 | CDN、代理、应用都可能限制,应定义统一业务上限 |
| gzip/其他压缩 | 减少文本传输量 | 消耗计算;已压缩媒体收益小;敏感数据与攻击者输入混合压缩需评估泄露风险 |
| 消息长度与分块 | 标识正文边界 | 不手工拼相互冲突的 Content-Length/Transfer-Encoding;不同代理解析不一致有请求走私风险 |
HTTP/1.1 chunked 是传输分帧,不等于应用每个事件会立即到浏览器;HTTP/2 用自己的帧机制。参见 HTTP/1.1 消息边界。
2. Hands-on:为现有流接口配置独立 Nginx 路由#
前提:专用预发布 Nginx;后端已有真实事件流接口 /events,每 15 秒发送心跳,并有可控测试事件;应用已实现身份、租户隔离和重连。下面是 http {} 内片段,替换上游和域名;不替换整份生产配置。
upstream stream_backend {
server 127.0.0.1:9000; # 替换为真实受控上游;此处假设同机进程
keepalive 16;
}
server {
listen 127.0.0.1:18081;
server_name localhost;
location = /events {
proxy_pass http://stream_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_buffering off;
proxy_cache off;
gzip off;
proxy_connect_timeout 3s;
proxy_read_timeout 45s;
proxy_send_timeout 15s;
}
}该监听器仅本机诊断访问;外部接入复用已有 HTTPS、认证和可信代理设置。proxy_read_timeout 是两次上游读之间的间隔,不是流的总寿命。代理配置含义见 Nginx proxy 模块。
在预发布主机保存该专用片段为 /etc/nginx/conf.d/http-stream-lab.conf(先确认文件不存在),测试再重载:
sudo nginx -t && sudo nginx -s reload
curl -N -sS --max-time 35 -D /tmp/http-stream-headers http://127.0.0.1:18081/events认证接口使用权限 0600 的本地请求头文件 -H @文件路径,不要把 token 放进 URL。预期心跳/事件逐条到达;35 秒截止后 curl 28 是本次主动停止。用事件时间戳对比到达时间,而不是只看 HTTP 200。
3. 上传与压缩验收#
准备一个已部署的测试租户上传接口,明确字段名、最大大小和删除方法;以下假设 multipart 字段名为 file:
export UPLOAD_URL='https://api.staging.example.com/test-uploads'
umask 077
UPLOAD_WORK=$(mktemp -d)
python3 - "$UPLOAD_WORK" <<'PY'
from pathlib import Path
import sys
p=Path(sys.argv[1]); (p/'probe.bin').write_bytes(b'0' * 1024 * 1024)
PY
# 私有接口按上文提供认证文件;不要自己设置 multipart boundary。
curl -sS --max-time 30 -F "file=@$UPLOAD_WORK/probe.bin" -o "$UPLOAD_WORK/result.json" -w '%{http_code}\n' "$UPLOAD_URL"按接口契约验收对象大小/校验和;再在隔离环境测试略高于配置上限的文件,预期 413 或契约规定错误,且没有残留完整/分片对象。超限测试必须先明确配额,不能任意生成巨型文件。
公开文本资源可用 curl --compressed -D - -o /dev/null URL 检查 Content-Encoding 和 Vary: Accept-Encoding;已压缩媒体不应强制重复压缩。
4. 故障与恢复#
将本次专用路由的 proxy_buffering 临时改为 on,重载后对比事件到达时间;小事件可能仍因应用 X-Accel-Buffering: no 等因素即时到达,需记录实际行为,不伪造必然积攒结论。恢复 off,确认心跳间隔小于链路最短 idle timeout。
完成后删除本次新增的专用配置文件,nginx -t 通过再 reload;删除测试上传对象及本地 $UPLOAD_WORK。长连接服务不能只验收建立成功,还需验证断线重连、慢消费者和发布排空,见 实时协议。