缓存与性能
proxy_cache、expires、keepalive upstream。
缓存与性能
这一课你将能做到
- 解释 upstream
keepalive为何要搭配proxy_http_version 1.1与清空Connection,并对照prod.conf.example - 设计一处 只读 GET 的
proxy_cache示例,并列出至少三个 禁止缓存 的 API 路径类型 - 为 Next 的
/_next/static/与 HTML 文档写出不同的expires/Cache-Control策略
为什么要学
反代正确只是「能用」;生产还要「扛得住」。最便宜的两刀是:复用到上游的连接(keepalive) 与 对可缓存响应做边缘缓存。
CodeRoadMap 已在 upstream 打开 keepalive;proxy_cache 则是可选加速,且极易误伤登录态与写操作。
业务层还有 Redis 缓存(redis-essentials)——Nginx 缓存是更外层。本课把分层与「什么绝对不能缓存」讲清。
先建立图像
浏览器缓存 (expires / Cache-Control)
│
▼
Nginx proxy_cache(可选,按 URI/状态码)
│
▼
upstream keepalive 池 ──► Spring / Next
│
▼
应用内缓存(Redis 等)──► MySQL
人话:越靠外的缓存越要「傻而安全」——只缓存公开、幂等、可过期的;越靠内越懂业务失效。
| 手段 | 作用 | 本站现状 |
|---|---|---|
| upstream keepalive | 少握手 | prod 已开 |
| expires / Cache-Control | 控浏览器 | 按资源类型配 |
| proxy_cache | 缓存上游响应 | 可选实验 |
| Redis | 业务热点 | 应用层开关 |
跟着做
步骤 1:读懂已有 keepalive
upstream coderoadmap_backend {
server 127.0.0.1:8080;
keepalive 64;
}
location /api/ {
proxy_pass http://coderoadmap_backend/;
proxy_http_version 1.1;
# 清空 Connection,才能复用上游 keep-alive
proxy_set_header Connection "";
# … 其他 proxy_set_header …
}
注意:这与 WebSocket location 里 Connection "upgrade" 不同。页面反代若要同时支持 HMR,需按 location 分开策略,或接受「开发走直连、生产关 HMR」。
步骤 2:规划 proxy_cache(实验向)
# 放在 http 块
proxy_cache_path /var/cache/nginx/api
levels=1:2
keys_zone=api_cache:10m
max_size=100m
inactive=10m;
# 仅示意:公开列表可短缓存
location = /api/tracks {
proxy_cache api_cache;
proxy_cache_valid 200 60s;
proxy_cache_key "$scheme$request_method$host$request_uri";
add_header X-Cache-Status $upstream_cache_status always;
proxy_pass http://coderoadmap_backend/tracks;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
}