Nginx作为LNMP的前端Web服务器,其缓存机制可显著减少后端请求压力,提升静态内容与动态页面的响应速度。
通过expires指令设置静态文件(图片、CSS、JS等)的浏览器缓存时间,避免重复请求。例如:
location ~* \.(jpg|jpeg|png|gif|css|js|ico)$ {
expires 30d; # 缓存30天
add_header Cache-Control "public, no-transform";
}
针对PHP等动态内容,使用proxy_cache模块缓存后端响应。需配置以下参数:
http块中定义缓存目录、大小及层级:proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
levels=1:2:缓存目录分为两级(如/var/cache/nginx/a/b/),提升IO效率;keys_zone=my_cache:10m:缓存区域名称为my_cache,内存占用10MB;max_size=1g:缓存最大容量1GB,超过后按LRU算法清理;inactive=60m:缓存项60分钟未被访问则自动删除。server或location块中关联缓存区域:location / {
proxy_cache my_cache;
proxy_pass http://php_backend; # 指向PHP-FPM后端
proxy_cache_valid 200 302 10m; # 200/302状态码缓存10分钟
proxy_cache_valid 404 1m; # 404状态码缓存1分钟
add_header X-Proxy-Cache $upstream_cache_status; # 显示缓存状态(HIT/MISS)
}
proxy_cache_key指定缓存唯一标识,避免不同参数导致重复缓存:proxy_cache_key "$scheme$proxy_host$request_uri$is_args$args";
proxy_cache_methods GET HEAD;
Pragma: no-cache或Authorization头的请求禁用缓存:proxy_cache_bypass $http_pragma $http_authorization;
proxy_no_cache $http_pragma $http_authorization;
PHP脚本的重复编译是性能瓶颈之一,OPcache(PHP内置扩展)可缓存编译后的字节码,避免每次请求都重新解析。
CentOS下通过YUM安装:
sudo yum install php-opcache # PHP 7.x/8.x通用
sudo systemctl restart php-fpm
[opcache]
zend_extension=opcache.so # 启用扩展
opcache.enable=1 # 开启OPcache
opcache.memory_consumption=128 # 缓存内存大小(MB,根据PHP脚本量调整)
opcache.interned_strings_buffer=8 # interned字符串缓冲区大小
opcache.max_accelerated_files=4000 # 最大缓存文件数(需覆盖项目所有PHP文件)
opcache.revalidate_freq=60 # 检查脚本更新的频率(秒,0表示每次请求都检查)
opcache.fast_shutdown=1 # 快速关闭,减少PHP-FPM重启延迟
opcache.revalidate_freq为合理值(如60秒),避免缓存过期导致内容不一致;MySQL的缓存机制可减少磁盘IO,提升查询性能,主要包括查询缓存(Query Cache)、InnoDB缓冲池(Buffer Pool)和表缓存(Table Cache)。
[mysqld]
query_cache_type=1 # 开启查询缓存(1=开启,0=关闭)
query_cache_size=64M # 缓存大小(根据查询量调整,不宜过大)
query_cache_limit=2M # 单个查询结果最大缓存大小
[mysqld]
innodb_buffer_pool_size=8G # 缓冲池大小
innodb_buffer_pool_instances=8 # 缓冲池实例数(多实例提升并发)
SHOW STATUS LIKE 'Open_tables'查看当前打开表数):[mysqld]
table_open_cache=2000 # 表缓存数量
对于高并发场景,Redis(支持持久化、复杂数据结构)或Memcached(纯内存、高性能)可作为外部缓存,缓存热点数据(如用户会话、商品详情、查询结果),减轻数据库压力。
sudo yum install redis php-redis # PHP 7.x/8.x通用
sudo systemctl start redis
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$key = 'product_123';
if ($data = $redis->get($key)) {
echo $data; // 从缓存读取
} else {
$data = $db->query("SELECT * FROM products WHERE id = 123")->fetch();
$redis->set($key, $data, 3600); // 缓存1小时
echo $data;
}
sudo yum install memcached php-memcached
sudo systemctl start memcached
$memcached = new Memcached();
$memcached->addServer('127.0.0.1', 11211);
$key = 'session_user_456';
$sessionData = $memcached->get($key);
if (!$sessionData) {
$sessionData = $db->query("SELECT * FROM sessions WHERE user_id = 456")->fetch();
$memcached->set($key, $sessionData, 1800); // 缓存30分钟
}
缓存与数据库的一致性是关键问题,常见解决方案:
// 更新数据库
$db->query("UPDATE users SET avatar = 'new.jpg' WHERE id = 123");
// 删除缓存
$redis->del('user_avatar_123');
为缓存设置TTL(Time To Live),即使未主动失效,也能自动清理旧数据(如商品详情缓存1小时)。
在高峰期前(如双11凌晨),将热点数据(如热门商品、首页内容)预先加载到缓存中,避免冷启动时数据库压力激增。
通过add_header X-Proxy-Cache $upstream_cache_status添加缓存状态头,使用curl -I查看:
curl -I http://example.com/image.jpg
# 返回X-Proxy-Cache: HIT(命中)或MISS(未命中)
INFO stats查看命中率(keyspace_hits/keyspace_misses);stats命令查看命中率。SHOW STATUS LIKE 'Qcache%'(如Qcache_hits表示命中次数);SHOW ENGINE INNODB STATUS(查看缓冲池利用率)。通过以上缓存策略的组合应用,可显著提升CentOS LNMP架构的性能,应对高并发场景。需根据实际业务需求(如数据更新频率、访问量)调整缓存参数,定期监控缓存效果,确保缓存的有效性与一致性。