如何优化Nginx的性能?

阅读 25

05-18 06:00

Nginx 的缓存策略是提升性能的关键手段,合理配置缓存可以显著减少后端负载、降低响应时间并提高吞吐量。以下是常见的缓存策略及其配置方法:

1. 浏览器缓存(客户端缓存)

通过设置 HTTP 头信息,控制浏览器本地缓存资源的时间,减少重复请求。

静态资源长期缓存

location ~* \.(js|css|png|jpg|jpeg|gif|ico|woff|woff2|ttf|svg|map)$ {
    expires 365d;  # 缓存 1 年
    add_header Cache-Control "public, immutable";  # 告知浏览器资源不可变
    access_log off;  # 关闭日志以减少 I/O
}

动态资源条件缓存

location /api/ {
    add_header Cache-Control "no-cache";  # 强制验证缓存
    # 或使用:add_header Cache-Control "private, max-age=60";  # 私有缓存 60 秒
}

2. Nginx 代理缓存(反向代理缓存)

通过 proxy_cache 模块缓存后端响应,减少对上游服务器的请求。

基础配置

http {
    # 定义缓存路径、大小和清理策略
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g 
                     inactive=60m use_temp_path=off;
    
    server {
        location / {
            proxy_cache my_cache;  # 使用名为 my_cache 的缓存区
            proxy_cache_valid 200 302 10m;  # 200 和 302 状态码缓存 10 分钟
            proxy_cache_valid 404 1m;      # 404 状态码缓存 1 分钟
            proxy_cache_key $scheme$host$request_uri;  # 缓存键生成规则
            
            # 其他代理设置
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

缓存控制

# 忽略后端的 Cache-Control 头,强制缓存
proxy_ignore_headers Cache-Control Expires;

# 只缓存 GET/HEAD 请求
if ($request_method !~ ^(GET|HEAD)$) {
    proxy_cache_bypass $http_pragma;
    proxy_no_cache $http_pragma;
}

# 基于 Cookie 控制缓存
proxy_cache_bypass $cookie_session;  # 有 session cookie 时不缓存
proxy_no_cache $cookie_session;

3. FastCGI 缓存(PHP 应用)

针对 PHP 等 FastCGI 应用的缓存策略。

配置示例

http {
    fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=php_cache:10m;
    
    server {
        location ~ \.php$ {
            fastcgi_pass unix:/run/php/php7.4-fpm.sock;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            
            fastcgi_cache php_cache;
            fastcgi_cache_valid 200 30m;  # 成功响应缓存 30 分钟
            fastcgi_cache_key $scheme$host$request_uri;
            
            # 缓存状态变量
            add_header X-Cache-Status $upstream_cache_status;
        }
    }
}

4. 缓存失效策略

控制缓存的更新和失效机制。

主动刷新(需要扩展模块)

使用 ngx_cache_purge 模块主动清除缓存:

location ~ /purge(/.*) {
    allow 127.0.0.1;  # 仅允许本地访问
    deny all;
    proxy_cache_purge my_cache $scheme$host$1;
}

缓存时间阶梯策略

# 热门内容缓存更久,冷门内容自动淘汰
proxy_cache_valid 200 1h;  # 普通响应缓存 1 小时
proxy_cache_valid 200 5m;  # 对频繁更新的内容缩短缓存时间

5. 缓存状态监控

通过添加响应头查看缓存命中情况:

add_header X-Cache-Status $upstream_cache_status;  # 添加缓存状态头
  • MISS:缓存未命中,请求转发到后端。
  • HIT:缓存命中,直接返回缓存内容。
  • EXPIRED:缓存已过期,需重新请求后端。
  • UPDATING:缓存正在更新(配合 proxy_cache_use_stale)。

6. 高级缓存策略

使用 stale 数据

在缓存更新时继续使用旧数据,减少等待时间:

proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_background_update on;  # 后台更新缓存(需商业版或第三方模块)

缓存分区

根据用户角色或请求参数分区缓存:

proxy_cache_key "$scheme$request_method$host$request_uri$cookie_user";  # 按用户分区

CDN 集成

对静态资源使用 CDN,并配置合适的回源策略:

location ~* \.(js|css|png|jpg)$ {
    proxy_pass https://cdn.example.com;  # CDN 地址
    proxy_cache_valid 200 30d;  # CDN 回源缓存 30 天
}

7. 性能优化建议

  1. 使用 SSD 存储缓存:减少 I/O 延迟。
  2. 合理设置缓存大小:根据服务器内存和磁盘空间调整 max_size
  3. 定期清理缓存:通过脚本或 inactive 参数自动淘汰旧缓存。
  4. 避免缓存抖动:对频繁更新的资源缩短缓存时间,而非禁用缓存。
  5. 监控缓存命中率:通过日志或监控工具确保命中率在 80% 以上。

总结

合理的缓存策略可以大幅提升 Nginx 性能,建议组合使用:

  • 浏览器缓存:处理静态资源,减少客户端请求。
  • Nginx 代理缓存:减少对后端服务器的访问。
  • 分层缓存:结合 CDN、本地缓存和浏览器缓存构建多级缓存体系。

根据业务特性调整缓存时间和失效策略,平衡性能与数据实时性。

精彩评论(0)

0 0 举报