温馨提示×

LNMP服务器如何配置缓存策略

小樊
32
2025-12-10 02:57:50
栏目: 云计算

LNMP缓存策略实战指南

一 整体思路与分层缓存

  • 建议采用分层缓存:浏览器缓存 → Nginx(静态资源与反向代理/动态内容) → PHP(OPcache、APCu) → 外部对象缓存(Redis/Memcached) → MySQL(InnoDB缓冲池等)。
  • 浏览器缓存通过 Cache-Control / Expires 控制;Nginx 侧可用 proxy_cache / fastcgi_cache 做页面与接口加速;PHP 侧用 OPcache 加速字节码、APCu 做用户态数据缓存;数据库以 InnoDB Buffer Pool 为主,MySQL 8.0+ 已移除查询缓存,需用应用层缓存替代。

二 Nginx缓存配置

  • 静态资源与浏览器缓存

    • 对图片、CSS、JS、字体等设置较长缓存,并标记不可被中间代理篡改:
      location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2)$ {
          expires 1y;
          add_header Cache-Control "public, immutable";
          add_header Vary Accept-Encoding;
      }
      
    • 对需要实时性的资源(如 HTML、登录后页面)禁用或缩短缓存:
      location ~ \.php$ {
          add_header Cache-Control "no-cache, must-revalidate";
          expires off;
      }
      
    • 使用 add_header / expires 可精确控制 Cache-ControlExpires 头,满足不同资源粒度的缓存策略。
  • 反向代理缓存 Proxy Cache(适用于 Nginx 作为反向代理/负载均衡)

    http {
        proxy_cache_path /var/cache/nginx
                         levels=1:2
                         keys_zone=backend_cache:10m
                         max_size=10g
                         inactive=60m
                         use_temp_path=off;
    
        server {
            location / {
                proxy_pass http://backend;
                proxy_cache backend_cache;
                proxy_cache_key "$scheme$proxy_host$request_uri";
                proxy_cache_valid 200 304 12h;
                proxy_cache_valid 301 302 1h;
                proxy_cache_valid any 1m;
                proxy_cache_use_stale error timeout invalid_header http_500;
                proxy_cache_min_uses 1;
                proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
                add_header X-Proxy-Cache $upstream_cache_status;
            }
        }
    }
    
    • 关键指令说明:
      • proxy_cache_path:定义缓存目录、层级、共享内存区与容量上限。
      • proxy_cache / proxy_cache_key:启用缓存与缓存键(可按业务加入 Cookie 区分)。
      • proxy_cache_valid:对不同状态码设置有效期。
      • proxy_cache_use_stale:在后端异常时提供过期内容,提升可用性。
      • proxy_no_cache / proxy_cache_min_uses:控制哪些请求不缓存与最少访问次数再缓存。
  • FastCGI缓存 FastCGI Cache(适用于 PHP-FPM 动态页面)

    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_use_stale error timeout invalid_header http_500;
                fastcgi_cache_min_uses 1;
                fastcgi_cache_bypass $cookie_nocache $arg_nocache;
                add_header X-FastCGI-Cache $upstream_cache_status;
            }
        }
    }
    
    • 要点:为动态内容设置合理 fastcgi_cache_valid;对带身份态或隐私页面使用 fastcgi_cache_bypass / fastcgi_no_cache 跳过缓存;通过 X-FastCGI-Cache 观察命中状态。

三 PHP缓存配置

  • OPcache(字节码缓存,建议默认开启)

    [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
    
    • 作用:减少 PHP 脚本解析与编译开销,显著提升响应速度。
  • APCu(用户态数据缓存,适合片段/配置/计数器等)

    [apcu]
    extension=apcu.so
    apcu.enable=1
    apcu.shm_size=64M
    apcu.ttl=7200
    
    • 作用:在进程内缓存计算结果、配置与临时数据,降低数据库与后端压力。
  • Redis / Memcached(对象缓存,适合热点数据与会话)

    • 安装与启用:
      # Ubuntu/Debian
      sudo apt-get install redis-server php-redis
      sudo apt-get install memcached php-memcached
      sudo systemctl restart php7.4-fpm
      
    • 用途:作为应用层缓存(如查询结果、页面片段、会话存储等),减轻数据库负载,提升并发能力。

四 MySQL缓存与数据库层优化

  • InnoDB 缓冲池(最核心的“缓存”)

    • 建议将 innodb_buffer_pool_size 设为物理内存的50%~80%(视业务而定),并合理设置 innodb_buffer_pool_instances(多核可设为 CPU 核数的 1~2 倍),可显著提升读写性能。
    • 监控与调优:通过 SHOW ENGINE INNODB STATUS 查看命中率,理想值通常**>95%**;必要时结合慢查询日志与索引优化降低物理读。
  • 查询缓存说明

    • MySQL 8.0 已移除查询缓存(Query Cache);对 5.7 及以下版本,若使用查询缓存,需注意高并发写场景下的失效抖动,通常更推荐依赖 InnoDB 缓冲池与**应用层缓存(Redis/Memcached)**替代。

五 上线与运维要点

  • 缓存命中观测与调优

    • Nginx:在响应头加入 X-Proxy-Cache / X-FastCGI-Cache,常见值为 HIT/MISS/EXPIRED/UPDATING/STALE,据此调整 proxy_cache_valid / fastcgi_cache_validkeys_zone 容量。
    • MySQL:关注 InnoDB Buffer Pool 命中率,并通过慢查询与索引优化减少磁盘读。
  • 缓存失效与更新策略

    • 过期刷新:设置合理 inactive / proxy_cache_valid,必要时启用 proxy_cache_background_update 提前后台刷新。
    • 主动刷新:对关键 URL 采用“删除缓存文件”或“按 URL 定向更新”的方式,避免全量失效带来的抖动(适合发布场景)。
  • 安全与合规

    • 对含敏感信息的页面使用 Cache-Control: no-cache / privatefastcgi_cache_bypass / proxy_no_cache 跳过缓存;对可缓存内容设置 Vary: Accept-Encoding 以正确处理压缩协商。

0