Nginx 缓存配置与优化

Caching Configuration and Optimization

概述

缓存是提升Web应用性能的重要技术。Nginx提供了多种缓存机制,包括反向代理缓存、FastCGI缓存、浏览器缓存等。

1. 代理缓存 (Proxy Cache)

1.1 基础配置

``nginx

定义缓存路径

proxy_cache_path /var/cache/nginx/proxy levels=1:2 keys_zone=proxy_cache:100m inactive=60m max_size=1g;

server { listen 80; server_name cache.example.com;

location / {
    proxy_cache proxy_cache;
    proxy_cache_key "$scheme$proxy_host$request_uri";
    proxy_cache_valid 200 302 10m;
    proxy_cache_valid 404 1m;

    # 缓存控制
    proxy_cache_use_stale error timeout updating;
    proxy_cache_background_update on;
    proxy_cache_lock on;

    add_header X-Cache-Status $upstream_cache_status;
    proxy_pass http://backend;
}

}


### 1.2 条件缓存

``nginx
location /api {
    set $skip_cache 0;

    if ($request_method = POST) {
        set $skip_cache 1;
    }
    if ($query_string ~ "nocache") {
        set $skip_cache 1;
    }
    if ($http_authorization != "") {
        set $skip_cache 1;
    }

    proxy_cache_bypass $skip_cache;
    proxy_no_cache $skip_cache;
    proxy_cache proxy_cache;
    proxy_pass http://api_backend;
}

2. FastCGI缓存

2.1 PHP缓存配置

``nginx fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=php_cache:100m inactive=60m;

server { listen 80; server_name php.example.com;

# 缓存绕过条件
set $skip_cache 0;
if ($request_method = POST) { set $skip_cache 1; }
if ($query_string != "") { set $skip_cache 1; }
if ($request_uri ~* "/(admin|login)") { set $skip_cache 1; }

location ~ \.php$ {
    fastcgi_cache php_cache;
    fastcgi_cache_key "$scheme$request_method$host$request_uri";
    fastcgi_cache_valid 200 60m;
    fastcgi_cache_bypass $skip_cache;
    fastcgi_no_cache $skip_cache;

    add_header X-FastCGI-Cache $upstream_cache_status;
    fastcgi_pass php-fpm;
    include fastcgi_params;
}

}


## 3. 浏览器缓存控制

### 3.1 静态资源缓存

``nginx
server {
    listen 80;
    server_name static.example.com;

    # 图片缓存
    location ~* \.(jpg|png|gif|ico)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        etag on;
    }

    # CSS/JS缓存
    location ~* \.(css|js)$ {
        expires 30d;
        add_header Cache-Control "public";
        gzip_static on;
    }

    # HTML文件
    location ~* \.html$ {
        expires 1h;
        add_header Cache-Control "public, must-revalidate";
    }
}

3.2 动态缓存策略

``nginx http { map $request_uri $cache_control { ~/admin/ "no-cache"; ~/api/user/ "private, max-age=300"; ~/api/public/ "public, max-age=600"; ~.(css|js)$ "public, max-age=31536000"; default "public, max-age=3600"; }

server {
    location / {
        add_header Cache-Control $cache_control;
        proxy_pass http://backend;
    }
}

}


## 4. 缓存管理

### 4.1 缓存清理

``nginx
# 缓存清理接口
location ~ /cache-purge(/.*) {
    allow 127.0.0.1;
    deny all;

    proxy_cache_purge proxy_cache "$scheme$proxy_host$1";
    return 200 "Cache purged\n";
}

4.2 自动管理脚本

``bash

!/bin/bash

cache-manager.sh

CACHE_DIR="/var/cache/nginx" MAX_SIZE="2G"

check_cache_size() { usage=$(du -sm $CACHE_DIR | cut -f1) max_mb=$(echo $MAX_SIZE | sed 's/G/1024/g' | bc) percent=$((usage 100 / max_mb))

if [ $ $percent -gt 80 ]; then
    echo "Cache usage high: ${percent}%"
    find $CACHE_DIR -type f -mtime +7 -delete
fi

}

analyze_performance() { hit_rate=$(tail -1000 /var/log/nginx/access.log | grep -c "HIT") total=$(tail -1000 /var/log/nginx/access.log | wc -l) percentage=$((hit_rate * 100 / total)) echo "Cache hit rate: ${percentage}%" }

case "$1" in "check") check_cache_size ;; "analyze") analyze_performance ;; *) echo "Usage: $0 {check|analyze}" ;; esac


## 5. 性能优化

### 5.1 多层缓存

``nginx
# 内存缓存(小文件)
proxy_cache_path /dev/shm/nginx/cache 
                 levels=1:2 keys_zone=memory_cache:100m 
                 inactive=30m max_size=500m;

# SSD缓存(大文件)
proxy_cache_path /fast-ssd/nginx/cache 
                 levels=1:2 keys_zone=ssd_cache:200m 
                 inactive=2h max_size=2g;

server {
    # 小文件用内存缓存
    location ~* \.(css|js|json)$ {
        proxy_cache memory_cache;
        proxy_cache_valid 200 1h;
        proxy_pass http://backend;
    }

    # 大文件用SSD缓存
    location ~* \.(pdf|zip|mp4)$ {
        proxy_cache ssd_cache;
        proxy_cache_valid 200 24h;
        proxy_pass http://backend;
    }
}

5.2 缓存预热

``bash

!/bin/bash

cache-warmup.sh

URLS=( "/" "/about" "/products" "/api/popular" )

echo "Starting cache warmup..." for url in "${URLS[@]}"; do curl -s "http://localhost$url" > /dev/null echo "Warmed up: $url" done echo "Cache warmup completed!"


## 6. 监控和调试

### 6.1 缓存状态监控

``nginx
location /cache-status {
    allow 127.0.0.1;
    deny all;

    return 200 "Cache Status:
Hit Count: $cache_hit_count
Miss Count: $cache_miss_count
Cache Size: $(du -sh /var/cache/nginx)
";
    add_header Content-Type text/plain;
}

6.2 调试工具

# 查看缓存信息
nginx_cache_info() {
    echo "=== Nginx缓存信息 ==="
    echo "缓存目录大小: $(du -sh /var/cache/nginx)"
    echo "缓存文件数: $(find /var/cache/nginx -type f | wc -l)"
    echo "最近命中率:"
    tail -1000 /var/log/nginx/access.log | \
    grep -o 'X-Cache-Status: [A-Z]*' | sort | uniq -c
}

小结

通过本文学习,你应该掌握:

  1. 代理缓存和FastCGI缓存配置
  2. 浏览器缓存控制策略
  3. 缓存清理和管理方法
  4. 多层缓存优化技巧
  5. 缓存监控和调试工具

下一篇文章将介绍Nginx的压缩与静态文件优化。

powered by Gitbook© 2025 编外计划 | 最后修改: 2025-08-29 15:40:15

results matching ""

    No results matching ""