894 字
约 2 分钟
8
S15-A01 · Nginx:反向代理、gzip 与 TLS
适用读者:要把多个服务暴露成一个域名、并让静态资源更快的人。
前置:S15-J03、S14-J03。
实测环境:nginx 1.24.0(Ubuntu),自签证书(2026-11-05)。
覆盖旧文:1848(105) 2629(198) 1828(308) 391(147) 1275(71) 393(212) = 1,041 点。
覆盖扩展:E-S15-007(反向代理与 TLS 终止)、E-S15-008(gzip_static 与静态托管)。
上一篇:S15-J05 · Dockerfile 与 Compose
下一篇:S15-A02 · 容器化部署与 CI/CD。
1. 一句话结论
Nginx 在架构里的位置是"统一入口":TLS 在它这里终止、静态资源由它直接发、动态请求按路径反代到后端。所以"证书配一次、gzip 配一次"就够了。
实测(nginx -t):
nginx: the configuration file ... syntax is ok
nginx: configuration file ... test is successful
2. 反向代理:一个域名分发给多个服务(E-S15-007)
location /api/ { proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $host; }
location / { root /var/www/site; try_files $uri $uri/ /index.html; }
实测(TLS + 反代):
curl -sk https://127.0.0.1:28443/api/
→ HTTP/1.1 200 OK
→ <h1>hi</h1> # 来自后端 28080
| 关键点 | 说明 |
|---|---|
proxy_pass 末尾的 / |
有 / 会替换掉 location 前缀(/api/x → /x) |
proxy_set_header Host |
后端能拿到原始域名 |
| TLS 只在 nginx 终止 | 后端用 HTTP 即可(内网) |
判据:"后端需要知道原始协议/域名吗?" 需要 → 加 X-Forwarded-Proto / Host 头。
3. TLS 终止的两条边界
| 边界 | 说明 |
|---|---|
| 证书只在入口 | 内网明文(需信任网络) |
| 重定向 HTTP → HTTPS | 避免明文泄露 |
| HSTS | 强制 HTTPS(上线前确认全站可用) |
"后端也要 HTTPS 吗":多数不必——除非内网也不可信(那样要 mTLS/服务网格)。
4. gzip_static:实测直接发 .gz(E-S15-008)
实测对比:
/big.js(存在 big.js.gz)→ Content-Encoding: gzip, Content-Length: 43
/index.html(无 .gz) → 无 Content-Encoding, Content-Length: 12
| 观察 | 结论 |
|---|---|
有 .gz 时直接发压缩版 |
gzip_static 生效 |
2000 字节的 x 压成 43 字节 |
高重复内容压缩率极高 |
无 .gz 的小文件不压缩 |
低于阈值/无预压缩文件 |
配置:
gzip on;
gzip_static on; # 优先发 .gz
gzip_types text/css application/javascript application/json;
gzip_min_length 1k;
与 S14-J03 的呼应:gzip_static 省的是 CPU(不现压),压缩率取决于内容。
5. 性能与安全的四个必配
| 项 | 配置 |
|---|---|
| 长缓存 | location /assets/ { expires 1y; add_header Cache-Control "public, immutable"; } |
| 入口不缓存 | location = /index.html { add_header Cache-Control "no-cache"; } |
| 限流 | limit_req_zone + limit_req |
| 隐藏版本 | server_tokens off; |
6. 五个误区
| 误区 | 真相 |
|---|---|
"proxy_pass 加不加 / 一样" |
URI 替换行为不同 |
| "TLS 必须配到后端" | 入口终止即可(内网可信时) |
"开了 gzip 就不用 gzip_static" |
后者省 CPU |
| "静态资源交给后端也行" | 浪费应用线程 |
| "HSTS 可以随便开" | 开错会导致子域无法访问 |
7. 自检(架构师版)
- Nginx 在架构里的三个职责?
proxy_pass末尾/的影响?- TLS 终止在入口的代价与前提?
gzip_static与gzip的分工?- 哪些配置属于"必配"?
8. 下一篇
S15-A02 · 容器化部署与 CI/CD
入口讲完,下一篇讲"代码怎么从提交走到这台机器"。
本篇属于系列《S15 · Linux 与运维》。旧文来源:A-1848/2629/1828/391/1275/393;扩展点 E-S15-007/008。nginx -t、gzip_static 与反代为实测。
S15-A01 · Nginx:反向代理、gzip 与 TLS
https://www.clxhxhhr.top/posts/5401/ 评论
0 条
还没有评论,先写一条吧。