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
}
小结
通过本文学习,你应该掌握:
- 代理缓存和FastCGI缓存配置
- 浏览器缓存控制策略
- 缓存清理和管理方法
- 多层缓存优化技巧
- 缓存监控和调试工具
下一篇文章将介绍Nginx的压缩与静态文件优化。