温馨提示×

Linux LNMP中如何配置缓存

小樊
54
2026-01-02 16:09:44
栏目: 智能运维

LNMP缓存配置实战

一、整体思路与层级

  • 建议从四层入手:
    1. Nginx层:静态资源与动态内容的缓存(浏览器缓存、反向代理缓存、FastCGI页面缓存)。
    2. PHP层:字节码缓存与用户态数据缓存(OPcache、APCu)。
    3. 数据库层:InnoDB缓冲池等内存结构(MySQL/MariaDB)。
    4. 应用层:分布式对象缓存(Memcached)与CDN。
  • 配置顺序建议:先浏览器/Nginx,再PHP,再数据库,最后应用层与CDN,逐层验证命中率与回源情况。

二、Nginx缓存配置

  • 浏览器与静态资源缓存(在 server 或 location 中按需设置):
    • 示例:对图片、CSS、JS设置长期缓存,对HTML设置较短协商缓存
      location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
          expires 1y;
          add_header Cache-Control "public, immutable";
      }
      location ~* \.html$ {
          add_header Cache-Control "public, must-revalidate, max-age=600";
      }
      
  • FastCGI页面缓存(动态PHP内容,命中后直接由Nginx返回,大幅降低PHP-FPM与数据库压力):
    • 在 http 段定义缓存区与目录:
      http {
          fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=my_fcgi_cache:10m max_size=1g inactive=60m use_temp_path=off;
          fastcgi_cache_key "$scheme$request_method$host$request_uri";
          fastcgi_cache_lock on;
          fastcgi_cache_use_stale error timeout invalid_header http_500;
          fastcgi_cache_valid 200 302 10m;
          fastcgi_cache_valid 404 1m;
          fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
      }
      
    • 在 PHP location 中启用:
      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 my_fcgi_cache;
          fastcgi_cache_valid 200 302 10m;
          fastcgi_cache_valid 404 1m;
          add_header X-Cache $upstream_cache_status;  # 便于观察命中:HIT/MISS/BYPASS
      }
      
  • 反向代理缓存(若Nginx作为反向代理,如对接后端应用服务器):
    http {
        proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_proxy_cache:10m max_size=1g inactive=60m use_temp_path=off;
    }
    server {
        location / {
            proxy_pass http://backend;
            proxy_cache my_proxy_cache;
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404 1m;
            add_header X-Proxy-Cache $upstream_cache_status;
        }
    }
    
  • 生效与验证:
    • 检查配置并重载:sudo nginx -t && sudo systemctl reload nginx
    • 通过响应头 X-Cache/X-Proxy-Cache 观察命中情况(HIT/MISS/BYPASS)。

三、PHP缓存配置

  • OPcache(字节码缓存,强烈建议开启):
    • 编辑 PHP-FPM 使用的 php.ini(如:/etc/php/7.x/fpm/php.ini/etc/php/8.x/fpm/php.ini):
      [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
      opcache.enable_cli=0   # 生产建议CLI关闭,避免开发/CLI与FPM行为不一致
      
  • APCu(用户态数据缓存,适合页面片段、配置、计算结果等):
    [apcu]
    extension=apcu.so
    apcu.enable=1
    apcu.shm_size=64M
    apcu.ttl=7200
    
  • 生效与验证:
    • 重启 PHP-FPM:sudo systemctl restart php-fpm
    • 创建 info.php<?php phpinfo(); ?> 访问确认 opcacheapcu 模块已启用。

四、数据库缓存配置

  • MySQL/MariaDB(以 InnoDB 为主,查询缓存在新版本已弃用):
    • 编辑配置文件(如:/etc/mysql/my.cnf/etc/mysql/mysql.conf.d/mysqld.cnf):
      [mysqld]
      # InnoDB缓冲池:建议为可用内存的 50%~70%(专用数据库服务器)
      innodb_buffer_pool_size=1G
      innodb_buffer_pool_instances=8
      innodb_log_file_size=256M
      innodb_log_buffer_size=16M
      # 仅当确有需要再调整(如极端一致性场景),默认 1 更安全
      innodb_flush_log_at_trx_commit=1
      
    • 注意:MySQL 8.0 起已移除查询缓存(query cache),无需再配置。
  • 生效与验证:
    • 重启数据库:sudo systemctl restart mysql
    • 登录 MySQL 执行:SHOW ENGINE INNODB STATUS\GSHOW VARIABLES LIKE 'innodb_buffer_pool%'; 检查状态与参数。

五、应用层与CDN缓存

  • Memcached(分布式对象缓存,降低数据库读压):
    • 安装与启动(Debian/Ubuntu 示例):
      sudo apt-get update
      sudo apt-get install memcached php-memcached
      sudo systemctl enable --now memcached
      
    • 基础配置(/etc/memcached.conf,按需调整):
      -l 127.0.0.1
      -p 11211
      -m 64
      -c 1024
      
    • PHP 最小可用示例:
      <?php
      $memcached = new Memcached();
      $memcached->addServer('127.0.0.1', 11211);
      $key = 'site:home';
      $data = $memcached->get($key);
      if (!$data) {
          $data = build_expensive_data(); // 伪函数:从DB/API获取
          $memcached->set($key, $data, 600); // 缓存 10 分钟
      }
      echo $data;
      
    • 监控与调优:使用 memcached-toolecho stats | nc 127.0.0.1 11211 查看命中率、内存占用与连接数,按业务调整 -m/-c 与缓存 TTL
  • CDN缓存(静态资源与可缓存的API响应):
    • 为图片、CSS、JS、字体、下载包等设置长 Cache-Control: public, max-age=…;对可缓存的页面或接口设置较短 max-agestale-while-revalidate
    • 通过 CDN 控制台配置缓存规则、回源策略与缓存键(忽略不必要的查询参数),并开启 压缩、Brotli、HTTP/2/3TLS
  • 生效与验证:
    • 重载服务:sudo systemctl reload nginx && sudo systemctl restart php-fpm
    • 观察浏览器开发者工具 Network 的响应头(Cache-Control、Age、X-Cache),以及 Memcached 命中率与 NginxX-Cache 头。

0