Nginx的缓存机制和性能调优是构建高性能Web服务的关键。以下从核心机制到高级调优的深度解析:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m
inactive=60m use_temp_path=off max_size=1g;
server {
location / {
proxy_cache my_cache;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 304 12h;
proxy_cache_use_stale error timeout updating;
add_header X-Cache-Status $upstream_cache_status;
}
}
levels=1:2
创建两级目录结构,提升海量文件检索效率keys_zone
在共享内存中维护缓存键索引(10MB约可存储8万键)updating
状态允许在后台更新时继续返回旧缓存fastcgi_cache_path /var/cache/fpm levels=1:2 keys_zone=php_cache:10m
inactive=30m max_size=2g;
location ~ \.php$ {
fastcgi_cache php_cache;
fastcgi_cache_lock on; # 防缓存击穿
fastcgi_cache_methods GET HEAD;
}
events {
worker_connections 10000; # 需配合系统级ulimit调整
use epoll; # Linux内核2.6+必备
multi_accept on; # 批量接收新连接
}
http {
keepalive_timeout 30s;
keepalive_requests 1000; # 单个连接最大请求数
}
proxy_buffers 16 32k; # 后端响应缓冲区
proxy_buffer_size 64k;
proxy_busy_buffers_size 128k;
client_body_buffer_size 1m; # 客户端请求体缓冲
client_header_buffer_size 4k;
large_client_header_buffers 4 16k;
proxy_connect_timeout 5s; # 分级超时设置
proxy_send_timeout 15s;
proxy_read_timeout 30s;
proxy_cache_path /fast_cache levels=1:2 keys_zone=hot:100m inactive=1h max_size=10g;
proxy_cache_path /cold_cache levels=1:2 keys_zone=cold:50m inactive=30d max_size=100g;
map $uri $cache_zone {
~^/hot-content/ "hot";
default "cold";
}
proxy_cache_path /cache/shard1 keys_zone=shard1:10m;
proxy_cache_path /cache/shard2 keys_zone=shard2:10m;
split_clients $request_uri $shard {
50% "shard1";
* "shard2";
}
location /nginx_status {
stub_status on;
access_log off;
allow 192.168.1.0/24;
deny all;
}
输出示例:
Active connections: 291
server accepts handled requests
16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106
# 记录缓存操作日志
proxy_cache_background_update on;
proxy_cache_log /var/log/nginx/cache.log;
log_format cache_log '$remote_addr - $upstream_cache_status [$time_local] '
'"$request" $status $body_bytes_sent';
参数 | 生产环境推荐值 | 说明 |
---|---|---|
worker_processes | CPU核心数 | 可设置为auto自动检测 |
worker_rlimit_nofile | 65535 | 需配合sysctl.conf调整 |
open_file_cache | max=200000 inactive=20s | 文件描述符缓存 |
tcp_nopush | on | 与sendfile配合使用 |
gzip_min_length | 1k | 小文件压缩反而降低性能 |
缓存穿透:
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
proxy_cache_valid 404 1m; # 缓存404响应
大文件缓存失败:
proxy_max_temp_file_size 0; # 禁用临时文件
proxy_busy_buffers_size 256k;
内存耗尽:
proxy_cache_path /data/cache levels=1:2 keys_zone=global:100m
loader_threshold=300 loader_files=200;
# 控制缓存加载速度
通过以上深度优化组合,Nginx可轻松应对10万+ QPS场景。实际部署时建议:
1. 使用nginx -T
测试配置
2. 通过ab
或wrk
进行压测
3. 监控vmstat 1
和nginx -s reload
后的性能变化
是否需要针对特定场景(如微服务API网关、大文件下载等)的专项优化方案?