基于 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-cache
或no-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 代理缓存,能够大大提高网站的响应速度,减少后端服务器的负载,优化用户体验。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。