首页主机资讯LNMP在Ubuntu上的缓存策略如何设置

LNMP在Ubuntu上的缓存策略如何设置

时间2025-12-08 19:09:04发布访客分类主机资讯浏览205
导读:Ubuntu LNMP缓存策略实操指南 一 整体思路与层级 建议按层级构建缓存: Nginx 浏览器/内容缓存(静态资源长Cache-Control、动态内容可按需开启FastCGI或反向代理缓存) PHP 运行时缓存(OPcache用...

Ubuntu LNMP缓存策略实操指南

一 整体思路与层级

  • 建议按层级构建缓存:
    1. Nginx 浏览器/内容缓存(静态资源长Cache-Control、动态内容可按需开启FastCGI或反向代理缓存)
    2. PHP 运行时缓存(OPcache用于字节码,APCu用于用户数据,Memcached/Redis用于对象/会话)
    3. MySQL 数据层缓存(以InnoDB缓冲池为核心,查询缓存仅在MySQL 5.7及以下考虑)
  • 目标:让可缓存的内容尽量在边缘命中,减少后端PHP与数据库的重复计算与I/O。

二 Nginx缓存配置

  • 静态资源长缓存(浏览器侧)
    • 在 server 或 location 中对静态资源设置长期 Cache-Control,减少重复请求与回源。
    • 示例:
      location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff2)$ {
          
          expires 30d;
          
          add_header Cache-Control "public, no-transform";
          
          access_log off;
        # 可选:静态资源关闭日志
      }
      
      
  • 动态内容缓存(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/php8.1-fpm.sock;
            # 按实际版本调整
      
                  fastcgi_cache php_cache;
          
                  fastcgi_cache_valid 200 302 10m;
          
                  fastcgi_cache_valid 404 1m;
          
                  fastcgi_cache_valid any 5m;
          
                  add_header X-FastCGI-Cache $upstream_cache_status;
        # HIT/MISS/BYPASS
              }
      
          }
      
      }
      
      
  • 反向代理缓存(如 Nginx 作为反向代理)
    • 使用 proxy_cache_path 定义缓存区,在 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:9000;
          
                  proxy_cache my_cache;
          
                  proxy_cache_valid 200 302 10m;
          
                  proxy_cache_valid 404 1m;
          
                  add_header X-Proxy-Cache $upstream_cache_status;
      
              }
      
          }
      
      }
          
      
  • 关键参数说明
    • levels=1:2:两级目录分层,避免单目录文件过多导致性能下降。
    • keys_zone=name:size:共享内存区,存放键与元数据;1M≈8000个key
    • max_size:缓存上限,超出后按LRU淘汰。
    • inactive:未被访问的缓存清理时间(与过期不同)。
    • use_temp_path=off:避免额外拷贝,提升性能。
    • proxy_cache_valid / fastcgi_cache_valid:对不同状态码设置缓存有效期。

三 PHP缓存配置

  • OPcache(字节码缓存,强烈建议开启)
    • 安装与启用(以 PHP 8.1 为例):
      sudo apt update
      sudo apt install php8.1-opcache
      sudo systemctl restart php8.1-fpm
      
    • 建议基础配置(/etc/php/8.1/fpm/php.ini 或相应池配置):
      [opcache]
      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
      
  • APCu(用户数据缓存,适合页面片段/计算结果)
    • 安装与启用:
      sudo apt install php-apcu
      sudo systemctl restart php8.1-fpm
      
    • 建议基础配置:
      [apcu]
      extension=apcu.so
      apcu.enable_cli=0
      apcu.shm_size=32M
      
  • 对象/会话缓存(Memcached 或 Redis)
    • Memcached:
      sudo apt install memcached php-memcached
      sudo systemctl enable --now memcached
      # php.ini 中确保 extension=memcached.so
      
    • Redis:
      sudo apt install redis-server php-redis
      sudo systemctl enable --now redis-server
      # php.ini 中确保 extension=redis.so
      
    • 应用侧将可缓存的数据(如热点查询结果、页面片段、会话)写入 Memcached/Redis,避免频繁访问数据库。

四 MySQL缓存配置

  • InnoDB缓冲池(核心)
    • 建议将 innodb_buffer_pool_size 设为物理内存的50%~75%(专机更高),以提升热点数据与索引的命中率。
    • 监控与计算命中率(理想值> 95%):
      SHOW ENGINE INNODB STATUS\G
      # 命中率 = (1 - Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests) * 100%
      
    • 可开启缓冲池快照加速冷启动:
      SET GLOBAL innodb_buffer_pool_load_at_startup=ON;
          
      SET GLOBAL innodb_buffer_pool_dump_at_shutdown=ON;
          
      
  • 查询缓存(仅 MySQL 5.7 及以下)
    • 在高并发/高写入场景,查询缓存可能带来锁争用与失效抖动,命中率低时可考虑关闭;若使用,建议小容量并监控命中。
  • 其他常用项
    • table_open_cachethread_cache_size 结合并发与表数量适当调大,减少打开表与线程创建开销。

五 生效验证与运维要点

  • 生效与验证
    • 检查配置语法并热重载:sudo nginx -t & & sudo systemctl reload nginx;PHP 变更后重启:sudo systemctl restart php8.1-fpm
    • 观察响应头:
      • FastCGI 缓存:响应头 X-FastCGI-Cache: HIT/MISS/BYPASS
      • 反向代理缓存:响应头 X-Proxy-Cache: HIT/MISS
    • 观察缓存目录增长与命中情况,确认 /var/cache/nginx 按预期写入与淘汰。
  • 缓存失效与更新
    • 对动态内容使用合适的 Cache-Control / ExpiresVary,必要时在应用层生成缓存键(如含版本/参数哈希),变更时主动变更键或设置短TTL。
    • 对 Nginx 层缓存,可通过删除对应缓存文件或借助第三方 purge 模块实现按需清理(需额外模块与策略)。
  • 监控与容量规划
    • 持续监控 Nginx 缓存命中率、PHP-FPM 进程与慢请求、MySQL 缓冲池命中率与慢查询;按业务增长调整 keys_zonemax_size、InnoDB 缓冲池大小等阈值。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: LNMP在Ubuntu上的缓存策略如何设置
本文地址: https://pptw.com/jishu/766219.html
PHP-FPM在Linux下的日志管理方法 如何在Ubuntu上实现LNMP自动化运维

游客 回复需填写必要信息