温馨提示×

Debian LAMP缓存机制如何优化

小樊
34
2025-12-22 16:14:41
栏目: 智能运维

Debian LAMP 缓存机制优化路线图

一 分层缓存总体策略

  • 建议按“浏览器/CDN → 反向代理 → Web 服务器 → PHP 字节码 → 对象/页面 → 数据库缓冲”的顺序构建多层缓存,命中率与总体延迟同时优化。
  • 浏览器与 CDN:为静态资源设置长期 Cache‑Control / Expires,利用强缓存减少回源;动态内容使用协商缓存或短 TTL。
  • 反向代理:在 VarnishNginx 前置,缓存整页或片段,降低后端压力。
  • Web 服务器:启用 mod_cache/mod_cache_diskmod_expires,对可缓存内容做磁盘/内存级缓存。
  • PHP:启用 OPcache(字节码缓存),业务数据用 APCu(本地用户缓存)或 Redis/Memcached(分布式对象缓存)。
  • 数据库:优先优化 InnoDB 缓冲池 与查询,旧版本 MySQL 的查询缓存已弃用,不建议依赖。

二 Apache 层优化

  • 启用缓存模块与规则
    • 模块:启用 mod_cache、mod_cache_disk、mod_expires、mod_deflate、mod_headers
    • 示例(在虚拟主机或全局配置中):
      <IfModule mod_expires.c>
        ExpiresActive On
        ExpiresByType image/jpg  "access plus 1 month"
        ExpiresByType text/css  "access plus 1 week"
        ExpiresByType application/javascript "access plus 1 week"
      </IfModule>
      
      <IfModule mod_headers.c>
        Header set Cache-Control "public, max-age=86400"
      </IfModule>
      
      <IfModule mod_cache.c>
        <IfModule mod_cache_disk.c>
          CacheEnable disk  /
          CacheRoot "/var/cache/apache2/mod_cache_disk"
          CacheDirLevels 2
          CacheDirLength 1
          CacheDefaultExpire 3600
        </IfModule>
      </IfModule>
      
      <IfModule mod_deflate.c>
        AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript
      </IfModule>
      
    • 注意:对含用户身份/隐私的响应应返回 Cache‑Control: private 或禁用缓存。
  • 连接与协议
    • 开启 KeepAlive On、合理设置 MaxKeepAliveRequestsKeepAliveTimeout,并启用 HTTP/2 以提升并发与首包时间。

三 PHP 层优化

  • OPcache(必开)
    • 安装与启用:
      sudo apt-get install php-opcache
      # 编辑 /etc/php/8.x/apache2/php.ini 或相应 FPM ini
      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 缓存已编译字节码,显著降低解析与编译开销。
  • 用户与对象缓存
    • APCu(本地用户缓存,适合小块数据/配置/模板片段):
      sudo apt-get install php-apcu
      # php.ini
      extension=apcu.so
      apcu.enable=1
      apcu.shm_size=32M
      apcu.ttl=7200
      
    • Redis/Memcached(分布式对象缓存,适合数据库查询结果、会话等):
      sudo apt-get install redis-server php-redis    # 或 php-memcached
      sudo systemctl restart apache2
      
    • 建议将会话存储改为 Redis/Memcached,提升多实例一致性与扩展性。

四 MySQL 层优化

  • 缓冲与日志
    • innodb_buffer_pool_size 设为物理内存的60%–80%(如 16GB 内存可先设为 10G),减少磁盘 I/O。
    • 适度增大 innodb_log_file_size(如 256M)与 innodb_log_buffer_size(如 64M),提升写入吞吐。
    • 如为 MySQL 5.7 及以下且存在大量重复查询,可尝试 query_cache(示例:query_cache_type=1, query_cache_size=64M),但在 MySQL 8.0 中已移除,不建议依赖。
  • 查询与索引
    • 使用 EXPLAIN 分析执行计划,避免 **SELECT ***,为常用过滤/排序/分组列建立合适索引,必要时采用复合索引与分区。
    • 控制临时表与排序开销:合理设置 tmp_table_size / max_heap_table_size,减少磁盘临时表。

五 前端与反向代理及验证

  • 反向代理缓存
    • Varnish(示例要点):
      backend default {
        .host = "127.0.0.1";
        .port = "80";
      }
      sub vcl_recv {
        if (req.http.Cookie ~ "PHPSESSID" || req.http.Authorization) {
          return (pass);
        }
        return (hash);
      }
      sub vcl_backend_response {
        set beresp.ttl = 1h;
        return (deliver);
      }
      
    • 动态页面可按路由/对象设置不同 TTL,对登录态、购物车等私有内容直接 pass
  • 前端与传输
    • 启用 Gzip/Brotli 压缩,合并与最小化 CSS/JS,使用 WebP/AVIF 等更优图片格式,结合 CDN 分发静态资源。
  • 验证与监控
    • 配置完成后执行 sudo apachectl configtest && sudo systemctl reload apache2;使用浏览器开发者工具查看响应头(如 Cache‑Control、Expires、Age、X‑Proxy‑Cache),并通过日志与监控观察命中率与延迟变化。

0