温馨提示×

ubuntu lamp缓存机制详解

小樊
43
2025-12-22 04:06:21
栏目: 智能运维

Ubuntu LAMP 缓存机制全景与落地配置

一、缓存分层与适用场景

  • 浏览器与 CDN 层:通过 Cache-Control / Expires 控制资源在客户端与边缘节点的缓存时效,适合图片、CSS、JS、视频等静态资源,显著降低往返延迟与源站压力。
  • Web 服务器层(Apache):使用 mod_expires 设置资源过期策略;使用 mod_cache / mod_cache_disk 对可缓存响应做反向代理式页面/片段缓存,适合高并发读多写少场景。
  • PHP 层:启用 OPcache 缓存字节码;使用 APCu 做用户态数据缓存;使用 Memcached/Redis 做对象/会话/页面片段缓存,适合降低数据库与业务计算压力。
  • 数据库层(MySQL):以 InnoDB Buffer Pool 为核心的数据与索引缓存;传统 Query Cache 已在 MySQL 8.0 移除,5.7.20 起弃用,需改用其他优化手段(如 ProxySQL、查询重写、合理索引)。

二、Apache 层缓存配置

  • 启用并配置浏览器缓存(mod_expires)
    • 启用模块:sudo a2enmod expires
    • 站点或全局配置示例:
      <IfModule mod_expires.c>
        ExpiresActive On
        ExpiresDefault "access plus 2 months"
        ExpiresByType text/css "access plus 1 year"
        ExpiresByType application/javascript "access plus 1 year"
        ExpiresByType image/jpeg "access plus 1 year"
        ExpiresByType image/png "access plus 1 year"
      </IfModule>
      
    • 作用:在响应头写入 Expires / Cache-Control,指导浏览器与 CDN 缓存策略。
  • 启用并配置页面/片段缓存(mod_cache_disk)
    • 启用模块:sudo a2enmod cache;sudo a2enmod cache_disk
    • 配置示例(仅缓存静态资源路径,避免误缓存含会话的动态页):
      <IfModule mod_cache.c>
        <IfModule mod_cache_disk.c>
          CacheEnable disk /static/
          CacheRoot /var/cache/apache2/mod_cache_disk
          CacheDirLevels 2
          CacheDirLength 1
          CacheDefaultExpire 3600
          CacheIgnoreHeaders Set-Cookie
          CacheIgnoreNoLastMod On
        </IfModule>
      </IfModule>
      
    • 要点:对含 Set-Cookie、个性化或频繁变更的内容禁用缓存;必要时结合 Vary 头控制变体。
  • 验证:重启 Apache 后,用 curl -I 检查 Cache-Control / Expires / X-Cache 等头部是否生效。

三、PHP 层缓存配置

  • OPcache(字节码缓存,强烈建议开启)
    • 安装:sudo apt install php-opcache
    • 生产建议配置(/etc/php/7.x/apache2/php.ini 或 fpm/php.ini):
      [opcache]
      opcache.enable=1
      opcache.memory_consumption=128
      opcache.interned_strings_buffer=8
      opcache.max_accelerated_files=20000
      opcache.validate_timestamps=0   ; 生产建议关闭,用部署流程触发刷新
      opcache.revalidate_freq=0         ; 与上行配合,文件变更由部署脚本重置
      opcache.fast_shutdown=1
      
    • 作用:避免每次请求解析/编译 PHP 脚本,显著降低 CPU 与 I/O。
  • APCu(用户态数据缓存)
    • 安装:sudo apt install php-apcu
    • 配置示例:
      [apcu]
      extension=apcu.so
      apcu.enable_cli=0
      apcu.shm_size=64M
      apcu.ttl=7200
      
    • 适用:配置项、计算结果、局部页面片段等短期/中期数据。
  • Memcached / Redis(对象/会话/页面片段缓存)
    • 安装与启用:
      # Memcached
      sudo apt install memcached php-memcached
      # Redis
      sudo apt install redis-server php-redis
      sudo systemctl restart php**7.x**-fpm
      
    • 适用:会话存储、热点数据、API 结果、全页或片段缓存(配合框架或自研逻辑)。

四、MySQL 层缓存与优化

  • InnoDB Buffer Pool(核心数据/索引缓存)
    • 建议:在不超过物理内存与系统预留的前提下,将 innodb_buffer_pool_size 设为可用内存的较大比例(如 50%–70%,视业务而定),可显著减少磁盘 I/O。
    • 示例:innodb_buffer_pool_size=1G(请结合实例规格与并发调优)。
  • Query Cache(历史特性)
    • 状态:自 MySQL 5.7.20 起弃用,MySQL 8.0 已移除;不建议依赖。
    • 替代:优化索引与 SQL、读写分离、连接池、使用 ProxySQL 做查询缓存/路由与结果集复用等。

五、部署与验证要点

  • 配置生效与平滑更新
    • Apache:sudo systemctl restart apache2
    • PHP-FPM:sudo systemctl restart php7.x-fpm
    • 变更 OPcache 后,生产环境可通过重启 PHP-FPM 或部署脚本触发重置(不建议频繁开启 validate_timestamps)。
  • 验证方法
    • 浏览器/网关:curl -I 查看 Cache-Control / Expires / Age / X-Cache 等头部;命中时 Age 递增。
    • OPcache:php -r ‘var_dump(opcache_get_status());’ 查看命中率与缓存状态。
    • MySQL:SHOW ENGINE INNODB STATUS\G 观察缓冲池命中与读写情况;结合性能模式/慢查询定位瓶颈。
  • 缓存失效与更新策略
    • 静态资源:采用 文件名哈希/版本号(如 app.a1b2c3.js)解决更新后缓存不失效问题。
    • 页面/片段:为可缓存内容设置合理 max-age,变更时通过 Cache-Control: no-cache / must-revalidate 或主动清理后端缓存。
    • OPcache:部署流程中执行 opcache_reset() 或重启 PHP-FPM,避免脏字节码。

0