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_bypassproxy_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_sizeinactive,并增加缓存分层目录。

6. 练习#

  1. 配置一个 keepalive 32 的 upstream,观察 ss -tan 中上游连接是否被复用。
  2. proxy_cache_valid 200 设置为 30s,验证 30 秒后是否出现 MISS
  3. 自定义 proxy_cache_key,加入 $cookie_user,观察不同用户缓存是否隔离。
  4. 制造上游故障,验证 proxy_cache_use_stale 是否能返回旧缓存。