温馨提示×

centos lnmp如何集成缓存系统

小樊
46
2025-12-21 16:17:09
栏目: 智能运维

在 CentOS 的 LNMP 环境中,建议分层集成缓存:Nginx 层、PHP 层、对象缓存层(Redis/Memcached)、数据库层(MySQL 缓冲池)。下面给出可直接落地的配置步骤与要点。


一、整体架构与缓存层次

  • Nginx 层
    • 反向代理或静态资源:启用 proxy_cachefastcgi_cache,减少回源与 PHP 执行次数。
    • 静态资源:设置 expiresCache-Control 长缓存。
  • PHP 层
    • 字节码缓存:OPcache(必开)。
    • 用户数据缓存:APCu(可选,适合本机 KV)。
  • 对象缓存层
    • 选择其一或并用:Redis(数据结构丰富、持久化与集群友好)或 Memcached(简单 KV、极致吞吐)。
  • 数据库层
    • 重点优化 InnoDB Buffer Pool,并视版本与场景调整查询缓存策略。

二、Nginx 层缓存配置

  • 反向代理场景启用 proxy_cache
    • 在 http 段定义缓存区与路径,在 server/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 {
          listen 80;
          server_name example.com;
      
          location / {
            proxy_pass http://127.0.0.1:8080;
            proxy_cache my_cache;
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404 1m;
            add_header X-Proxy-Cache $upstream_cache_status;
          }
      
          location /static/ {
            alias /var/www/static/;
            expires 30d;
            add_header Cache-Control "public";
          }
        }
      }
      
  • PHP-FPM 场景启用 fastcgi_cache
    • 在 http 段定义 fastcgi 缓存区,在 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-fpm.sock;
            fastcgi_cache php_cache;
            fastcgi_cache_valid 200 302 10m;
            fastcgi_cache_valid 404 1m;
          }
        }
      }
      
  • 验证
    • 重启服务:systemctl restart nginx php-fpm
    • 访问站点并检查响应头:curl -I http://example.com,应看到 X-Proxy-Cache: HIT/MISS

三、PHP 层缓存配置

  • OPcache(推荐默认启用)
    • 编辑 php.ini(路径因安装方式可能为 /etc/php.ini/etc/php.d/opcache.ini):
      [opcache]
      zend_extension=opcache.so
      opcache.enable=1
      opcache.memory_consumption=128
      opcache.interned_strings_buffer=8
      opcache.max_accelerated_files=4000
      opcache.revalidate_freq=60
      opcache.fast_shutdown=1
      
  • APCu(用户数据缓存,可选)
    • 安装:yum install php-apcu(或 pecl 安装),在 php.ini 启用:
      [apcu]
      extension=apcu.so
      apcu.enable_cli=1
      apcu.shm_size=32M
      
  • 重启:systemctl restart php-fpm

四、对象缓存层 Redis 或 Memcached

  • 方案 A:Redis(推荐)
    • 安装与自启:
      yum install -y redis
      systemctl enable --now redis
      
    • PHP 扩展(phpredis):
      • 推荐通过 Remi 或 PECL 安装:yum install php-redispecl install redis && echo "extension=redis.so" >> /etc/php.d/redis.ini
      • 验证:php -m | grep redis
    • 简单连通性测试(info.php 或 test.php):
      <?php
      $r = new Redis();
      $r->connect('127.0.0.1', 6379);
      $r->set('k','v', 3600);
      var_dump($r->get('k'));
      
  • 方案 B:Memcached
    • 安装与自启:
      yum install -y memcached
      systemctl enable --now memcached
      
    • PHP 扩展(注意扩展名区分:memcached vs memcache):
      yum install -y php-pecl-memcached   # 推荐,扩展名为 memcached
      # 或 yum install -y php-pecl-memcache  # 扩展名为 memcache
      systemctl restart php-fpm
      
    • 简单连通性测试:
      <?php
      $m = new Memcached();
      $m->addServer('127.0.0.1', 11211);
      $m->set('k','v', 600);
      echo $m->get('k');
      
  • 扩展选择提示
    • phpredis(Redis 官方扩展)功能完整;Memcached(libmemcached 客户端)与 Memcache(老牌扩展)二者 API 不同,应用中需对应使用。

五、数据库层与监控优化

  • MySQL/MariaDB
    • 重点优化 InnoDB 缓冲池(示例为 1G,请按内存与负载调整):
      [mysqld]
      innodb_buffer_pool_size=1G
      innodb_buffer_pool_instances=8
      
    • 如仍使用 MySQL 5.7 且负载允许,可开启查询缓存(注意 8.0 已移除):
      query_cache_type=1
      query_cache_size=64M
      
    • 重启数据库生效:systemctl restart mysqld
  • 监控与验证
    • Redis:redis-cli info 查看命中率、内存与连接数。
    • Memcached:memcached-tool 127.0.0.1:11211 stats 查看命中率与 evictions。
    • Nginx:观察 X-Proxy-Cache 与缓存目录增长;静态资源检查 Cache-Control/expires
    • PHP:使用 phpinfo()php -m 确认 opcache/redis/memcached 已加载。

六、实践建议与注意事项

  • 缓存粒度与失效
    • 页面/接口级:按 业务键 生成缓存,更新数据时主动 delete/invalidate
    • 列表/聚合:设置合理 TTL主动刷新,避免雪崩(随机过期、预热)。
  • 一致性策略
    • 写后失效或 Cache-Aside 模式更通用;对强一致场景引入 消息队列/延迟双删
  • 安全
    • 对象缓存服务绑定 127.0.0.1 或内网;如需远程访问,配置 防火墙/密码/ACL
  • 版本差异
    • 查询缓存MySQL 8.0 已移除,优先加大 InnoDB Buffer Pool 与优化索引/SQL。

0