反向代理、上传、压缩与流式传输

验证:未记录
适用版本
未记录
验证范围
尚未登记验证记录。

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。长连接服务不能只验收建立成功,还需验证断线重连、慢消费者和发布排空,见 实时协议。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭