Nginx 反向代理与缓存实现指南

反向代理基础配置

基本反向代理设置

server {
    listen 80;
    server_name proxy.example.com;

    location / {
        proxy_pass http://backend_server;  # 后端服务器地址
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

关键指令说明

​​proxy_pass​​ - 指定后端服务器地址

​​proxy_set_header​​ - 设置转发给后端服务器的请求头

Host $host- 保留原始主机头

X-Real-IP $remote_addr- 传递客户端真实IP

X-Forwarded-For $proxy_add_x_forwarded_for- 记录请求链

完整反向代理配置示例

http {
    # 上游服务器定义(负载均衡)
    upstream backend {
        server 10.0.0.1:8080 weight=5;
        server 10.0.0.2:8080;
        server 10.0.0.3:8080 backup;  # 备用服务器
    }

    server {
        listen 80;
        server_name proxy.example.com;

        # 反向代理配置
        location / {
            proxy_pass http://backend;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            # 超时设置
            proxy_connect_timeout 5s;
            proxy_send_timeout 10s;
            proxy_read_timeout 30s;

            # 缓冲设置
            proxy_buffering on;
            proxy_buffer_size 4k;
            proxy_buffers 8 16k;
            proxy_busy_buffers_size 32k;
        }
    }
}

反向代理缓存实现

1. 定义缓存路径

http {
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=proxy_cache:10m inactive=60m use_temp_path=off;
    # levels=1:2 - 两级目录结构
    # keys_zone=proxy_cache:10m - 10MB共享内存用于缓存键
    # inactive=60m - 60分钟未访问的缓存将被删除
    # use_temp_path=off - 不使用临时路径
}

2. 启用缓存的完整配置

server {
    listen 80;
    server_name cache.example.com;

    # 静态资源缓存
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        proxy_pass http://backend;
        proxy_cache proxy_cache;
        proxy_cache_key "$scheme://$host$request_uri";
        proxy_cache_valid 200 302 12h;
        proxy_cache_valid 404 1m;
        proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
        proxy_cache_background_update on;
        proxy_cache_lock on;

        add_header X-Proxy-Cache $upstream_cache_status;
        expires 30d;
        add_header Cache-Control "public";
    }

    # 动态内容缓存
    location / {
        proxy_pass http://backend;
        proxy_cache proxy_cache;
        proxy_cache_key "$scheme://$host$request_uri$is_args$args";
        proxy_cache_valid 200 5m;
        proxy_cache_methods GET HEAD;
        proxy_cache_min_uses 2;
        proxy_cache_bypass $http_cache_control;
        proxy_no_cache $http_pragma $http_authorization;

        add_header X-Proxy-Cache $upstream_cache_status;
    }
}

缓存相关指令详解

​​proxy_cache​​ - 指定使用的缓存区域

​​proxy_cache_key​​ - 定义缓存键的生成规则

​​proxy_cache_valid​​ - 为不同响应码设置缓存时间

​​proxy_cache_use_stale​​ - 当后端不可用时使用过期缓存

​​proxy_cache_lock​​ - 启用缓存锁防止重复请求

​​proxy_cache_bypass​​ - 定义绕过缓存的条件

​​proxy_no_cache​​ - 定义不缓存的条件

​​add_header X-Proxy-Cache​​ - 显示缓存命中状态(HIT, MISS, BYPASS等)

高级缓存控制

缓存分片

proxy_cache_path /var/cache/nginx/one levels=1:2 keys_zone=one:10m max_size=1G;
proxy_cache_path /var/cache/nginx/two levels=1:2 keys_zone=two:10m max_size=1G;

split_clients $request_uri $proxy_cache {
    50%     "one";
    50%     "two";
}

server {
    location / {
        proxy_cache $proxy_cache;
        # 其他配置...
    }
}

微调缓存性能

location / {
    proxy_pass http://backend;
    proxy_cache proxy_cache;

    # 优化缓存性能
    proxy_cache_min_uses 3;  # 至少被请求3次才缓存
    proxy_cache_revalidate on;  # 使用If-Modified-Since验证缓存
    proxy_cache_lock_timeout 5s;  # 缓存锁超时时间
    proxy_cache_lock_age 10s;  # 其他请求等待缓存生成的最长时间

    # 缓存刷新控制
    proxy_cache_purge PURGE from 127.0.0.1;  # 允许从本地清除缓存
}

缓存清除方法

1. 手动删除缓存文件

sudo rm -rf /var/cache/nginx/*
sudo systemctl reload nginx

2. 使用purge模块清除特定URL缓存

location / {
    # ...其他配置...

    proxy_cache_purge PURGE from 127.0.0.1;
}

然后可以通过发送PURGE请求清除缓存:

curl -X PURGE http://cache.example.com/path/to/resource