centos lnmp缓存策略解析
导读:CentOS LNMP 缓存策略解析 一 缓存分层与适用场景 Nginx 静态资源缓存:对图片、CSS、JS等设置长期Cache‑Control/Expires,减少磁盘 I/O 与重复传输。 Nginx 反向代理/页面缓存:通过prox...
CentOS LNMP 缓存策略解析
一 缓存分层与适用场景
- Nginx 静态资源缓存:对图片、CSS、JS等设置长期Cache‑Control/Expires,减少磁盘 I/O 与重复传输。
- Nginx 反向代理/页面缓存:通过proxy_cache缓存后端(如 PHP‑FPM)生成的动态页面或接口,显著降低后端负载与响应时间。
- PHP OPcache:缓存PHP 字节码,避免重复编译,提升脚本执行效率,是 LNMP 的必选项。
- MySQL 层缓存:以InnoDB Buffer Pool为核心,配合查询缓存 Query Cache(注意:MySQL 8.0 起已移除),热点数据尽量留在内存。
- 外部对象缓存:使用Redis/Memcached缓存数据库查询结果、会话与计算结果,适合读多写少与跨进程共享场景。
二 Nginx 缓存配置要点
- 静态资源:在 server/location 中设置过期时间与公共缓存头,示例:
location /static/ { alias /var/www/static/; expires 30d; add_header Cache-Control "public, immutable"; } - 反向代理/页面缓存:在 http 块定义共享内存区与磁盘路径,在 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:8080; proxy_cache my_cache; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; proxy_cache_key "$scheme$proxy_host$request_uri"; proxy_cache_methods GET HEAD; add_header X-Proxy-Cache $upstream_cache_status; # 按需绕过/不缓存 proxy_cache_bypass $http_pragma; proxy_no_cache $http_pragma $http_authorization; proxy_cache_revalidate on; } } } - 关键指令说明:
- proxy_cache_path:定义缓存目录层级、键区与容量;levels=1:2 为常见层级;inactive=60m 控制未被访问对象的回收;use_temp_path=off 减少额外拷贝。
- proxy_cache / proxy_cache_key / proxy_cache_valid:启用缓存、定义键与不同状态码的TTL。
- proxy_cache_bypass / proxy_no_cache / proxy_cache_revalidate:实现按请求头/条件绕过、不缓存与条件 GET 重新验证。
三 PHP 层缓存配置要点
- 启用并优化 OPcache(php.ini):
[opcache] zend_extension=opcache.so 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- 建议将 opcache.memory_consumption 设为可用内存的约1/8~1/4,并结合文件数调大 max_accelerated_files。
- PHP‑FPM 进程池(www.conf)与性能:
- 合理设置 pm.max_children / pm.start_servers / pm.min_spare_servers / pm.max_spare_servers,并视内存与泄漏风险配置 pm.max_requests(如500~1000)以定期回收进程。
- 结合 OPcache 与对象缓存(Redis/Memcached)共同减少后端计算与数据库压力。
四 MySQL 层缓存配置要点
- InnoDB Buffer Pool(核心):将热点表/索引留在内存,建议设置为系统内存的50%~70%(如1G/2G/8G视规格而定),显著减少磁盘 I/O。
- 查询缓存 Query Cache(已移除于MySQL 8.0):
- 在 5.7 及更早版本中,可通过 query_cache_type / query_cache_size 启用;但高并发/写多场景下易成为争用点,命中率与维护成本需评估,必要时关闭。
- 若使用 5.7,可通过状态变量评估效果:Qcache_hits / Com_select 等(命中率≥30%通常更有价值,命中/写入比≥3:1更理想)。
- 其他:结合慢查询日志、合理索引与语句优化,必要时引入Redis/Memcached做结果集或热点数据缓存。
五 验证与运维实践
- 生效验证:
- 静态资源:使用 curl 检查 Cache‑Control/Expires 与 Age 头。
- 反向代理:观察响应头 X‑Proxy‑Cache: HIT/MISS/EXPIRED/UPDATING/STALE,并核对 proxy_cache_valid 的 TTL 行为。
- PHP:确认 opcache 已加载(phpinfo/ini_get),并监控 opcache_get_status() 命中率与内存使用。
- MySQL:在 5.7 下查看 Qcache_hits / Com_select 等指标;在 8.0 聚焦 InnoDB Buffer Pool 命中与磁盘读写。
- 运维建议:
- 为 /var/cache/nginx 配置合适的磁盘空间与清理策略(如按 inactive 回收),并定期审计缓存命中与后端负载。
- 对“不可缓存”的请求(如带Authorization或Pragma: no-cache)使用 proxy_cache_bypass / proxy_no_cache 精确控制。
- 结合监控与日志(如 Prometheus/Grafana、Nginx/MySQL 日志)持续评估与迭代缓存策略。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: centos lnmp缓存策略解析
本文地址: https://pptw.com/jishu/747817.html
