如何在LNMP中配置缓存策略
导读:LNMP缓存策略配置指南 一 整体思路与分层 建议按层级构建缓存:浏览器/网关层 → 反向代理/内容层 → 应用层(PHP) → 数据层(MySQL)。 浏览器缓存:通过 Cache-Control / Expires 控制可缓存资源(如...
LNMP缓存策略配置指南
一 整体思路与分层
- 建议按层级构建缓存:浏览器/网关层 → 反向代理/内容层 → 应用层(PHP) → 数据层(MySQL)。
- 浏览器缓存:通过 Cache-Control / Expires 控制可缓存资源(如图片、CSS、JS)的本地复用。
- Nginx层:对静态资源设置长缓存;对动态内容可按需启用 FastCGI 缓存(PHP)或 proxy_cache(反向代理到上游)。
- PHP层:启用 OPcache(字节码缓存),业务数据用 APCu(本地用户缓存)或 Redis/Memcached(分布式对象缓存)。
- MySQL层:优先优化 InnoDB 缓冲池 等内存结构;传统 查询缓存 Query Cache 在 MySQL 8.0 已移除,5.7 及更早版本亦因高并发写入命中率差而不推荐依赖。
二 Nginx缓存配置
- 静态资源长缓存(示例)
- 对不常变的资源设置长 max-age,并清空 ETag 减少 304 验证请求;使用 add_header 设置 Cache-Control。
- 建议配合文件名加版本号或 hash 实现“强缓存 + 变更即更新”。
- 示例:
location ~* \.(jpg|jpeg|gif|png|css|js|ico|webp|svg)$ { expires 1y; add_header Cache-Control "public, no-transform"; add_header ETag ""; }
- 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/php7.4-fpm.sock; fastcgi_cache php_cache; fastcgi_cache_valid 200 302 10m; fastcgi_cache_valid 404 1m; fastcgi_cache_key "$scheme$request_uri"; fastcgi_cache_methods GET HEAD; # 登录、带 Authorization 等请求不命中缓存 fastcgi_cache_bypass $http_authorization; fastcgi_no_cache $http_authorization; add_header X-Proxy-Cache $upstream_cache_status; } } }
- 反向代理缓存(示例)
- 与 FastCGI 缓存类似,使用 proxy_cache_path / proxy_cache / proxy_cache_valid / proxy_cache_key 等指令;按需设置 proxy_cache_bypass / proxy_no_cache 控制不缓存场景。
三 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=4000 opcache.revalidate_freq=60 opcache.fast_shutdown=1
- APCu(用户数据缓存)
- 适合缓存计算结果、配置、字典等小块数据;在 php.ini 启用并设置共享内存大小与 TTL。
- 示例:
[apcu] extension=apcu.so apcu.enable_cli=1 apcu.shm_size=64M apcu.ttl=7200
- Redis / Memcached(分布式对象缓存)
- 安装服务端与 PHP 扩展后,在应用以 Redis/Memcached 客户端访问;适合页面片段、会话、热点数据。
- 示例(Redis):
$redis = new Redis(); $redis-> connect('127.0.0.1', 6379); $redis-> set('key', 'value', 3600); // 缓存 1 小时 echo $redis-> get('key'); - 安装扩展(Debian/Ubuntu 常见做法):
sudo apt install php-redis或sudo apt install php-memcached。
四 MySQL缓存与数据库层优化
- InnoDB缓冲池(核心)
- 将 innodb_buffer_pool_size 设为可用内存的较大比例(如接近物理内存的70%,视实例角色与总内存而定),可显著提升读写性能。
- 可按需调整实例数与日志参数(示例):
[mysqld] innodb_buffer_pool_size=1G innodb_buffer_pool_instances=8 innodb_log_file_size=256M innodb_log_buffer_size=64M
- 查询缓存(历史特性)
- 仅在 MySQL 5.7 及更早版本存在,且对写密集场景命中率差、并发争用明显;在 MySQL 8.0 已移除。不建议作为性能优化重点,优先通过 InnoDB 缓冲池与应用层缓存提升性能。
五 验证与运维要点
- 验证缓存是否生效
- 使用 curl -I 检查响应头:如 Cache-Control / Expires(浏览器缓存)、X-Proxy-Cache(Nginx 层命中状态:HIT/MISS/BYPASS)。
- 示例:
curl -I https://example.com/style.css
- 日志与监控
- 在 Nginx 日志中记录缓存命中(如添加 $upstream_cache_status),定期分析命中率与回源情况;必要时调整 keys_zone / max_size / inactive 等参数。
- 安全与更新
- 对含敏感信息的页面或接口设置 Cache-Control: no-store / no-cache;静态资源采用文件名加 版本号/哈希 的方式避免强缓存导致的内容滞后。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 如何在LNMP中配置缓存策略
本文地址: https://pptw.com/jishu/759306.html
