温馨提示×

如何在Linux LAMP上使用缓存

小樊
54
2025-09-22 17:14:18
栏目: 智能运维

1. Linux系统级缓存(Buffers与Cached)
Linux内核通过Buffers(缓存块设备数据,如磁盘写入缓冲)和Cached(缓存文件系统数据,如频繁访问的文件)优化I/O性能。这些缓存由内核自动管理,无需手动配置,可通过free -h命令查看使用情况(buff/cache列)。定期执行sync && echo 3 > /proc/sys/vm/drop_caches可手动释放Cached内存(生产环境需谨慎,避免影响正在运行的服务)。

2. Apache缓存模块(mod_cache与mod_expires)
Apache的mod_cache(磁盘/内存缓存)与mod_expires(HTTP头控制)可减少重复请求的处理时间。

  • 安装与启用
    sudo yum install mod_cache mod_cache_disk mod_expires  # CentOS
    sudo systemctl restart httpd
    
  • 配置示例
    编辑Apache配置文件(如/etc/httpd/conf/httpd.conf),添加:
    # 磁盘缓存配置
    CacheRoot "/var/cache/apache2/mod_cache_disk"
    CacheEnable disk /
    CacheDirLevels 2
    CacheDirLength 1
    
    # HTTP头控制(设置静态资源过期时间)
    ExpiresActive On
    ExpiresByType text/html "access plus 1 hour"
    ExpiresByType text/css "access plus 1 week"
    ExpiresByType application/javascript "access plus 1 week"
    
    重启Apache使配置生效。

3. PHP缓存加速(OPcache与APCu)

  • OPcache:PHP内置的字节码缓存,加速PHP脚本执行(减少解析与编译时间)。
    编辑php.ini(如/etc/php.ini),启用OPcache:
    [opcache]
    zend_extension=opcache.so
    opcache.enable=1
    opcache.memory_consumption=128  # 内存大小(MB)
    opcache.interned_strings_buffer=8
    opcache.max_accelerated_files=4000
    opcache.revalidate_freq=60      # 脚本重新验证间隔(秒)
    
  • APCu:用户数据缓存扩展,适用于缓存数据库查询结果、函数返回值等。
    安装APCu:
    sudo yum install php-pecl-apcu  # CentOS
    sudo systemctl restart php-fpm
    
    编辑php.ini启用:
    [apcu]
    extension=apcu.so
    apcu.enable_cli=1
    apcu.shm_size=32M
    
    PHP代码中使用示例:
    $data = apcu_fetch('my_key');
    if ($data === false) {
        $data = fetchDataFromDB(); // 从数据库获取数据
        apcu_store('my_key', $data, 3600); // 缓存1小时
    }
    ```。
    
    
    

4. 数据库缓存(MySQL查询缓存与InnoDB缓冲池)

  • 查询缓存:适用于读多写少的场景(如博客),缓存查询结果。
    编辑MySQL配置文件(如/etc/mysql/my.cnf),启用查询缓存:
    [mysqld]
    query_cache_type=1       # 开启查询缓存(0=关闭,1=开启,2=按需)
    query_cache_size=64M     # 缓存大小
    query_cache_limit=2M     # 单条查询最大缓存大小
    
  • InnoDB缓冲池:缓存InnoDB表的数据与索引,是MySQL性能的关键优化项。
    编辑my.cnf调整缓冲池大小(建议设置为系统内存的50%-80%):
    [mysqld]
    innodb_buffer_pool_size=1G
    innodb_buffer_pool_instances=8  # 缓冲池实例数(多核CPU建议设置为8及以上)
    
    重启MySQL使配置生效。

5. 分布式缓存(Redis与Memcached)
Redis与Memcached是高性能的内存缓存系统,适用于缓存热点数据(如商品详情、用户会话),减轻数据库压力。

  • Redis安装与配置
    sudo yum install redis  # CentOS
    sudo systemctl start redis
    sudo systemctl enable redis
    
    PHP使用Redis扩展(php-redis):
    sudo yum install php-pecl-redis
    sudo systemctl restart php-fpm
    
    代码示例(缓存商品详情):
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    $cacheKey = "product:{$productId}";
    $data = $redis->get($cacheKey);
    if ($data === false) {
        $data = $pdo->query("SELECT * FROM products WHERE id = {$productId}")->fetch();
        $redis->setex($cacheKey, 3600, json_encode($data)); // 缓存1小时
    } else {
        $data = json_decode($data, true);
    }
    
  • Memcached安装与配置
    sudo yum install memcached php-pecl-memcached  # CentOS
    sudo systemctl start memcached
    sudo systemctl enable memcached
    
    PHP使用Memcached扩展:
    $memcached = new Memcached();
    $memcached->addServer('127.0.0.1', 11211);
    $data = $memcached->get($cacheKey);
    if ($data === false) {
        $data = fetchDataFromDB();
        $memcached->set($cacheKey, $data, 3600);
    }
    
    缓存失效策略:当数据更新时,需主动删除缓存(如更新商品信息后,删除对应的Redis键),确保下次获取最新数据。

6. Web服务器缓存(Nginx反向代理缓存)
若使用Nginx作为反向代理,可通过proxy_cache缓存后端Apache的响应,减少Apache的负载。

  • 配置示例
    编辑Nginx配置文件(如/etc/nginx/nginx.conf),添加:
    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://backend_apache;  # 后端Apache地址
                proxy_cache my_cache;
                proxy_cache_valid 200 302 10m;    # 200/302状态码缓存10分钟
                proxy_cache_valid 404 1m;         # 404状态码缓存1分钟
                add_header X-Proxy-Cache $upstream_cache_status;  # 显示缓存状态(HIT/MISS/BYPASS)
            }
        }
    }
    
    重启Nginx使配置生效。通过X-Proxy-Cache头可查看缓存是否命中(HIT表示命中缓存)。

0