实测 Spring Security 7 的 JWT 资源服务器:scope 映射成 SCOPE_ 权限、roles 声明默认被忽略;篡改、alg=none、HS256 混淆的令牌都被拒绝;默认的校验只看时间不看签发者,别的 iss 的令牌也会通过;时间偏差默认容忍 60 秒;JWKS 里 kid 不在缓存时会立即重新获取,切换到新密钥后旧密钥立即失效;JWKS 服务宕机时已缓存的密钥继续可用。
用 Spring Authorization Server 跑通授权码加 PKCE:公开客户端不需要 client_secret,换令牌必须带 code_verifier;授权码只能用一次;缺 code_challenge 或用 plain 会被拒绝;redirect_uri 未注册时不重定向;公开客户端拿不到 refresh_token,机密客户端的 refresh_token 默认被复用;access_token 是 300 秒的 RS256 JWT。
实测 nginx 1.31.6 到上游的长连接:什么都不配时 1000 个请求只用 1 条连接(复用率 99.9%),显式 HTTP/1.0 或 Connection: close 则 1000 条;keepalive 2 在并发 8 时 3000 个请求要 834 条连接,keepalive 32 只要 28 条;后端先关空闲连接的偶发 502 没有复现。
实测 proxy_buffering:开着缓冲时 SSE 流式响应照样每块立刻到达,真正把流攒到最后的是 gzip(第一批 2.09 s 才到);40 MB 响应遇到慢 client,缓冲打开时上游 0.0 s 写完(nginx 在 38.9 MB 的临时文件里替它缓冲),关掉则上游被占 9.2 到 10.1 s。
实测长连接穿过 nginx:不配 Upgrade 与 Connection 头握手被拒(HTTP 426),完整配置后往返 0.18 ms(直连 0.06 ms);proxy_read_timeout 2 s 时心跳 1.5 s 保持、2.5 s 断开;worker_connections 64 时 45 个 WebSocket 只能保持 31 个。
实测网关改写请求头:默认原样转发伪造的 X-Forwarded-For,$remote_addr 才能覆盖;两层网关 realip 只信 L1 时还原出真实来源 ::1,信任范围包含 client 时被伪造的 6.6.6.6 冒充;Host 在 $host、$http_host、默认(u)下后端看到的值各不相同。
实测 nginx 限流:limit_req 同一时刻 30 个请求,无 burst 放行 1 个、burst=5 放行 6 个(排队的每隔约 100 ms 一个)、burst=5 nodelay 6 个都立刻处理;持续 20 个/秒打 10r/s 的限额,burst 5 共放行 55 个;limit_conn 3 在 12 个并发里放行 3 个。
实测 nginx 请求体大小限制:Content-Length 超限的 200 MB 请求也返回 413、不到上游,但 client 仍把 200 MB 发完;chunked 加 proxy_request_buffering off 时上游会收到 1.05 MB 残缺请求体;按 location 放宽到 50m;带 Expect: 100-continue 的 client 超限时不发请求体。
实测 nginx location 匹配:正则胜过普通前缀、^~ 前缀不再试正则、多个正则按文件顺序;URI 先规范化(//、%61、..);这台 macOS 的 nginx 1.31.6 连 ~ 正则也不区分大小写,Linux 容器里的 nginx 1.27.5 区分。
实测 nginx 路径重写:proxy_pass 带 URI 与不带 URI、location 带斜杠与不带斜杠的 6 种组合各得到什么路径(/api/users → /users、/v1users、/x/y);rewrite 无标志等同 last、break 才继续 proxy_pass;带 URI 的 proxy_pass 把 %2F 解码成斜杠。
实测 nginx 与 Envoy 1.39.3 的流量分流:90/10 权重下 split_clients 得到 10.4%、upstream weight 正好 10.0%、Envoy 9.8%;split_clients 用固定 key 时 C 是 0;按请求头和 cookie 定向两个网关结果一致;按用户哈希分流 0 个用户见到两个版本,每个请求独立分流则有 88% 的用户见到。
实测发布策略:金丝雀 5% 错误率的新版本在 1% / 5% 阶段都攒不够 5 个错误,4 次都在 25% 阶段才发现回滚(用户看到 7 到 10 个 503);发现概率取决于 canary 自己收到的请求数(50/s 的服务 1% 比例观察 10 s 为 0.0%);蓝绿切换 reload 后立刻 kill 旧版本会有 3 / 1200 个在途请求失败。