7.1.7 连接与缓存关键概念
本节聚焦 Nginx 的连接管理与缓存相关核心概念,理解其工作机制有助于设计高性能、低延迟的 Web 服务,并能快速定位连接与缓存类问题。
1. 原理草图:连接与缓存的请求路径#
2. 连接管理核心概念与示例#
- 连接对象:客户端与上游连接贯穿请求生命周期。
- 事件循环:事件驱动处理读写,避免阻塞。
- 长连接(keepalive):减少握手成本,提升吞吐。
- 连接上限:
worker_processes × worker_connections约等于并发上限。 - 限流限连:防止单客户端耗尽连接。
示例:配置客户端与上游 keepalive
文件:/etc/nginx/conf.d/conn.conf
upstream backend {
server 127.0.0.1:8080;
keepalive 64; # Nginx 到上游的长连接池
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
keepalive_timeout 65s; # 客户端到 Nginx 的 keepalive
keepalive_requests 1000;
}
}
命令与解释
nginx -t # 检查配置是否正确
systemctl reload nginx # 不中断加载新配置
ss -s # 查看当前 TCP 连接汇总
ss -tan state established | wc -l # 估算当前已建立连接数
3. 缓存体系关键概念与示例#
- 缓存层级:
proxy_cache_path定义缓存目录与共享内存区。 - 缓存键:
proxy_cache_key确定唯一缓存对象。 - 命中与失效:
proxy_cache_valid控制 TTL。 - 绕过与刷新:
proxy_cache_bypass或proxy_no_cache控制写入与读取。
示例:完整缓存配置
文件:/etc/nginx/conf.d/cache.conf
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=app_cache:100m
inactive=30m max_size=5g use_temp_path=off;
server {
listen 80;
server_name localhost;
location /api/ {
proxy_pass http://backend;
proxy_cache app_cache;
proxy_cache_key "$scheme$host$request_uri";
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
add_header X-Cache-Status $upstream_cache_status;
}
}
验证缓存命中
curl -I http://localhost/api/test
# 预期首次:X-Cache-Status: MISS
curl -I http://localhost/api/test
# 预期第二次:X-Cache-Status: HIT
4. 安装与验证(基础)#
便于复现实验环境(任选其一)
Ubuntu/Debian
apt update
apt install -y nginx
nginx -v
systemctl enable --now nginx
CentOS/RHEL
yum install -y epel-release
yum install -y nginx
nginx -v
systemctl enable --now nginx
5. 常见故障排查#
问题1:连接数不足导致 502/504
- 排查命令:
grep -n "worker_processes\|worker_connections" /etc/nginx/nginx.conf
ss -tan state established | wc -l
ulimit -n
- 处理思路:提升
worker_connections,同时提升系统文件句柄ulimit -n。
问题2:缓存始终 MISS
- 排查命令:
grep -n "proxy_cache" -n /etc/nginx/conf.d/cache.conf
ls -lh /var/cache/nginx
- 处理思路:确认
proxy_cache已启用、proxy_cache_key一致,且缓存目录有写入权限。
问题3:缓存文件膨胀
- 排查命令:
du -sh /var/cache/nginx
- 处理思路:合理设置
max_size与inactive,并增加缓存分层目录。
6. 练习#
- 配置一个
keepalive 32的 upstream,观察ss -tan中上游连接是否被复用。 - 将
proxy_cache_valid 200设置为30s,验证 30 秒后是否出现MISS。 - 自定义
proxy_cache_key,加入$cookie_user,观察不同用户缓存是否隔离。 - 制造上游故障,验证
proxy_cache_use_stale是否能返回旧缓存。