头图

基于 NGINX 的代理缓存配置指南

NGINX 作为一款高性能的 web 服务器,广泛用于反向代理和负载均衡,其强大的缓存能力能够显著提升网站性能,减少后端服务器的负载,提高响应速度。通过配置代理缓存,NGINX 可以缓存后端服务器的响应数据,并根据设定的有效期返回缓存内容,而无需每次都从后端重新获取。

以下是基于 NGINX 的代理缓存配置步骤,包括详细的配置文件说明和每个指令的功能解析。


1. 安装和配置 NGINX

在配置缓存之前,首先确保 NGINX 已正确安装并运行。常见的安装方式如下:

sudo apt update
sudo apt install nginx

安装后,检查 NGINX 状态确保服务正常运行:

sudo systemctl status nginx

2. 配置反向代理

接下来,配置 NGINX 作为反向代理服务器,将请求转发到后端服务器(如应用服务器或数据库服务器)。在 NGINX 配置文件中定义一个 server 块来设置代理规则。

配置示例:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_server;  # 将请求转发到后端服务器
        proxy_set_header Host $host;       # 保持原始请求的Host头部
        proxy_set_header X-Real-IP $remote_addr;  # 将真实IP传递给后端
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 传递X-Forwarded-For头部
    }
}

3. 启用缓存

要启用缓存,可以在 location 中添加缓存相关配置。NGINX 使用 proxy_cache 模块来缓存后端响应。

配置缓存:

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_cache my_cache;  # 启用名为my_cache的缓存区域
    proxy_cache_valid 200 1h;  # 缓存200 OK响应,缓存1小时
}

解释:

  • proxy_cache my_cache:指定缓存区域(my_cache),需要在全局的 http 块中定义。
  • proxy_cache_valid 200 1h:设置缓存策略,这里表示对于 200 状态码的响应,缓存 1小时

4. 定义缓存区域

缓存区域在 http 块中定义,用于指定缓存存储路径和其他相关参数。缓存路径应该是 NGINX 具有读写权限的目录。

缓存区域配置示例:

http {
    proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g;
}

解释:

  • proxy_cache_path:指定缓存的存储路径 /path/to/cache
  • levels=1:2:缓存目录的层级结构,1:2 表示一级目录有一个字符,二级目录有两个字符,用于避免缓存文件过多导致单个目录负担过重。
  • keys_zone=my_cache:10m:指定缓存区域的名字为 my_cache,并分配 10MB 内存用于存储缓存的键值。
  • max_size=10g:限制缓存的最大大小为 10GB,超过部分会被自动清理。

5. 手动刷新缓存

有时需要手动刷新缓存,可以使用 proxy_cache_bypass 指令。该指令允许在某些条件下绕过缓存并直接请求后端服务器。

配置刷新缓存:

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_cache my_cache;
    proxy_cache_valid 200 1h;
    proxy_cache_bypass $http_cache_control;  # 根据请求头中的Cache-Control决定是否绕过缓存
}

解释:

  • proxy_cache_bypass $http_cache_control:根据客户端请求的 Cache-Control 头部判断是否绕过缓存。如果 Cache-Control 中包含 no-cacheno-store,则绕过缓存。

6. 清除缓存

如果需要清除缓存,可以使用 proxy_cache_purge 模块。该模块通常配合自定义的 URL 来清除缓存。

清除缓存配置:

location ~ /purge(/.*) {
    allow 127.0.0.1;  # 只允许本地请求清除缓存
    deny all;  # 禁止其他IP访问
    proxy_cache_purge my_cache $1$is_args$args;  # 清除指定的缓存内容
}

解释:

  • location ~ /purge(/.*):通过匹配 /purge 路径来触发缓存清除。
  • proxy_cache_purge my_cache $1$is_args$args:清除缓存区域 my_cache 中与请求路径相匹配的缓存文件。
proxy_cache_purge 需要在 NGINX 中编译时启用,通常需要使用 ngx_cache_purge 模块。

7. 完整配置示例

以下是一个完整的配置示例,包含了反向代理、缓存、缓存清除等功能:

http {
    # 定义缓存区域
    proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g;

    server {
        listen 80;
        server_name 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_cache my_cache;
            proxy_cache_valid 200 1h;
            proxy_cache_bypass $http_cache_control;  # 根据请求头决定是否绕过缓存
        }

        # 清除缓存的接口
        location ~ /purge(/.*) {
            allow 127.0.0.1;  # 只允许本地访问
            deny all;
            proxy_cache_purge my_cache $1$is_args$args;
        }
    }
}

8. 总结与最佳实践

  • 缓存路径与大小:确保缓存路径具有足够的磁盘空间,同时根据实际需求合理设置缓存最大值。
  • 缓存时间:根据页面内容的动态程度合理设置 proxy_cache_valid 的有效期,避免过长的缓存时间导致内容过时。
  • 清理缓存:定期清理缓存,避免存储大量过期数据。可以使用手动清除策略或者设置定期清理机制。
  • 安全性:使用 proxy_cache_purge 时,确保只允许信任的客户端(如本地服务器)访问清除缓存的接口。

通过合理配置 NGINX 代理缓存,能够大大提高网站的响应速度,减少后端服务器的负载,优化用户体验。


蓝易云
28 声望3 粉丝