Nginx在LNMP架构中主要支持两种缓存:代理缓存(proxy_cache)(缓存后端服务器响应,如PHP-FPM、Node.js等)和FastCGI缓存(fastcgi_cache)(专为PHP应用设计,直接缓存PHP脚本输出)。根据场景选择:
fastcgi_cache(减少PHP-FPM解析开销);proxy_cache(通用代理缓存)。无论选择哪种缓存,核心参数需合理设置:
proxy_cache_path(或fastcgi_cache_path)定义,关键参数包括:
keys_zone=my_cache:10m:缓存区域名称(my_cache)及共享内存大小(10MB,用于存储缓存键和元数据);max_size=1g:缓存最大磁盘空间(1GB),超过后自动清理旧缓存;inactive=60m:缓存项未被访问60分钟后删除(即使未过期);levels=1:2:缓存目录层级(如/var/cache/nginx/ab/cd/),避免单目录文件过多影响性能;use_temp_path=off:禁用临时路径,直接写入缓存目录,提升IO效率。proxy_cache_key(或fastcgi_cache_key)唯一标识缓存项,推荐包含协议、域名、URI:proxy_cache_key "$scheme$proxy_host$request_uri";
若需排除查询参数(如?utm_source=xxx),可简化为"$scheme$proxy_host$request_uri?,避免重复缓存。proxy_cache_valid(或fastcgi_cache_valid)设置不同状态码的缓存时长,例如:proxy_cache_valid 200 302 10m; # 200/302状态码缓存10分钟
proxy_cache_valid 404 1m; # 404状态码缓存1分钟(避免长期缓存错误页面)
proxy_cache_valid any 5m; # 其他状态码缓存5分钟(可选)
add_header指令,通过响应头查看缓存命中情况:add_header X-Proxy-Cache $upstream_cache_status; # 值为HIT(命中)、MISS(未命中)、BYPASS(绕过)
访问网站时通过curl -I http://example.com查看头部,确认缓存是否生效。proxy_cache_bypass(或fastcgi_cache_bypass)指定何时不缓存,例如:proxy_cache_bypass $http_pragma $http_authorization; # 当请求包含Pragma:no-cache或Authorization头时绕过缓存
proxy_no_cache $http_pragma $http_authorization; # 同时不缓存这些请求的响应
proxy_cache_revalidate on;,当缓存过期时向后台发送If-Modified-Since请求,减少数据传输(若后台返回304,则继续使用缓存)。对于图片、CSS、JS等静态文件,可直接在location块中配置缓存,无需经过后端:
location ~* \.(jpg|jpeg|png|gif|css|js|ico)$ {
expires 30d; # 设置浏览器缓存30天
add_header Cache-Control "public, no-transform"; # 允许公共缓存,禁止转换内容(如图片压缩)
access_log off; # 关闭访问日志(减少IO)
add_header X-Static-Cache $upstream_cache_status; # 可选:记录静态缓存状态
}
此配置可显著降低Nginx与后端的通信压力。
若使用PHP应用,需结合fastcgi_cache与OPcache(PHP字节码缓存):
http {
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=php_cache:10m max_size=1g inactive=60m use_temp_path=off;
server {
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_cache php_cache;
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
}
php.ini):[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
两者结合可减少PHP脚本解析时间(OPcache)和后端响应时间(FastCGI缓存),提升整体性能。curl)提前访问热门页面,将内容加载到缓存中,避免用户首次访问时延迟。script.js?v=2),强制Nginx重新缓存;rm -rf /var/cache/nginx/*),或通过Nginx的proxy_cache_purge模块(需额外安装)实现精准清理。access_log记录缓存命中率,计算公式为:HIT次数 / (HIT次数 + MISS次数)。例如:log_format cache_log '$remote_addr - $upstream_cache_status [$time_local] "$request"';
access_log /var/log/nginx/cache.log cache_log;
keys_zone大小(建议为max_size的1/10~1/5)、inactive时间(避免频繁清理)和max_size(预留足够空间防止磁盘写满)。