LNMP在Ubuntu上的缓存策略如何设置
导读:Ubuntu LNMP缓存策略实操指南 一 整体思路与层级 建议按层级构建缓存: Nginx 浏览器/内容缓存(静态资源长Cache-Control、动态内容可按需开启FastCGI或反向代理缓存) PHP 运行时缓存(OPcache用...
Ubuntu LNMP缓存策略实操指南
一 整体思路与层级
- 建议按层级构建缓存:
- Nginx 浏览器/内容缓存(静态资源长Cache-Control、动态内容可按需开启FastCGI或反向代理缓存)
- PHP 运行时缓存(OPcache用于字节码,APCu用于用户数据,Memcached/Redis用于对象/会话)
- MySQL 数据层缓存(以InnoDB缓冲池为核心,查询缓存仅在MySQL 5.7及以下考虑)
- 目标:让可缓存的内容尽量在边缘命中,减少后端PHP与数据库的重复计算与I/O。
二 Nginx缓存配置
- 静态资源长缓存(浏览器侧)
- 在 server 或 location 中对静态资源设置长期 Cache-Control,减少重复请求与回源。
- 示例:
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff2)$ { expires 30d; add_header Cache-Control "public, no-transform"; access_log off; # 可选:静态资源关闭日志 }
- 动态内容缓存(FastCGI/PHP)
- 在 http 块定义共享内存与磁盘缓存区,在 PHP location 启用缓存与命中状态头,便于观测。
- 示例:
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$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # 按实际版本调整 fastcgi_cache php_cache; fastcgi_cache_valid 200 302 10m; fastcgi_cache_valid 404 1m; fastcgi_cache_valid any 5m; add_header X-FastCGI-Cache $upstream_cache_status; # HIT/MISS/BYPASS } } }
- 反向代理缓存(如 Nginx 作为反向代理)
- 使用 proxy_cache_path 定义缓存区,在 location 启用并区分状态码缓存时间。
- 示例:
http { proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off; server { location / { proxy_pass http://127.0.0.1:9000; proxy_cache my_cache; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; add_header X-Proxy-Cache $upstream_cache_status; } } }
- 关键参数说明
- levels=1:2:两级目录分层,避免单目录文件过多导致性能下降。
- keys_zone=name:size:共享内存区,存放键与元数据;1M≈8000个key。
- max_size:缓存上限,超出后按LRU淘汰。
- inactive:未被访问的缓存清理时间(与过期不同)。
- use_temp_path=off:避免额外拷贝,提升性能。
- proxy_cache_valid / fastcgi_cache_valid:对不同状态码设置缓存有效期。
三 PHP缓存配置
- OPcache(字节码缓存,强烈建议开启)
- 安装与启用(以 PHP 8.1 为例):
sudo apt update sudo apt install php8.1-opcache sudo systemctl restart php8.1-fpm - 建议基础配置(/etc/php/8.1/fpm/php.ini 或相应池配置):
[opcache] opcache.enable=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=10000 opcache.revalidate_freq=60 opcache.fast_shutdown=1
- 安装与启用(以 PHP 8.1 为例):
- APCu(用户数据缓存,适合页面片段/计算结果)
- 安装与启用:
sudo apt install php-apcu sudo systemctl restart php8.1-fpm - 建议基础配置:
[apcu] extension=apcu.so apcu.enable_cli=0 apcu.shm_size=32M
- 安装与启用:
- 对象/会话缓存(Memcached 或 Redis)
- Memcached:
sudo apt install memcached php-memcached sudo systemctl enable --now memcached # php.ini 中确保 extension=memcached.so - Redis:
sudo apt install redis-server php-redis sudo systemctl enable --now redis-server # php.ini 中确保 extension=redis.so - 应用侧将可缓存的数据(如热点查询结果、页面片段、会话)写入 Memcached/Redis,避免频繁访问数据库。
- Memcached:
四 MySQL缓存配置
- InnoDB缓冲池(核心)
- 建议将 innodb_buffer_pool_size 设为物理内存的50%~75%(专机更高),以提升热点数据与索引的命中率。
- 监控与计算命中率(理想值>
95%):
SHOW ENGINE INNODB STATUS\G # 命中率 = (1 - Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests) * 100% - 可开启缓冲池快照加速冷启动:
SET GLOBAL innodb_buffer_pool_load_at_startup=ON; SET GLOBAL innodb_buffer_pool_dump_at_shutdown=ON;
- 查询缓存(仅 MySQL 5.7 及以下)
- 在高并发/高写入场景,查询缓存可能带来锁争用与失效抖动,命中率低时可考虑关闭;若使用,建议小容量并监控命中。
- 其他常用项
- table_open_cache、thread_cache_size 结合并发与表数量适当调大,减少打开表与线程创建开销。
五 生效验证与运维要点
- 生效与验证
- 检查配置语法并热重载:sudo nginx -t & & sudo systemctl reload nginx;PHP 变更后重启:sudo systemctl restart php8.1-fpm。
- 观察响应头:
- FastCGI 缓存:响应头 X-FastCGI-Cache: HIT/MISS/BYPASS
- 反向代理缓存:响应头 X-Proxy-Cache: HIT/MISS
- 观察缓存目录增长与命中情况,确认 /var/cache/nginx 按预期写入与淘汰。
- 缓存失效与更新
- 对动态内容使用合适的 Cache-Control / Expires 与 Vary,必要时在应用层生成缓存键(如含版本/参数哈希),变更时主动变更键或设置短TTL。
- 对 Nginx 层缓存,可通过删除对应缓存文件或借助第三方 purge 模块实现按需清理(需额外模块与策略)。
- 监控与容量规划
- 持续监控 Nginx 缓存命中率、PHP-FPM 进程与慢请求、MySQL 缓冲池命中率与慢查询;按业务增长调整 keys_zone 与 max_size、InnoDB 缓冲池大小等阈值。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: LNMP在Ubuntu上的缓存策略如何设置
本文地址: https://pptw.com/jishu/766219.html
