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. 自检(架构师版)

  1. Nginx 在架构里的三个职责?
  2. proxy_pass 末尾 / 的影响?
  3. TLS 终止在入口的代价与前提?
  4. gzip_static 与 gzip 的分工?
  5. 哪些配置属于"必配"?

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/
作者
clxstart
发布于
2024-12-31
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。