Nginx 高级优化配置指南
一、静态资源缓存策略优化
目的: 减少服务器负载,加快客户端访问速度,提升用户体验。
原理: 通过配置HTTP头信息,指示浏览器和中间缓存(如CDN)缓存静态资源(图片、CSS、JS、字体等)。
关键配置 (nginx.conf):
# 在http块内定义缓存路径和参数
http {
…
# 定义一个名为 my_cache 的共享内存缓存区,用于存储缓存键和元数据
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m inactive=60m use_temp_path=off;
# 设置缓存文件的最大大小和时长
proxy_cache_max_size 100m; # 缓存最大占用100MB磁盘空间
proxy_cache_valid 200 304 12h; # 缓存200和304响应码12小时
proxy_cache_valid any 1m; # 其他响应码缓存1分钟
…
}
# 在server块内针对特定location配置缓存
server {
listen 80;
server_name example.com;
location ~* \\.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf)$ {
# 设置缓存相关HTTP头
add_header Cache-Control "public, max-age=31536000"; # 指示浏览器缓存1年
add_header Pragma public;
# 启用代理缓存 (如果资源由后端生成)
proxy_cache my_cache;
proxy_cache_key $scheme$proxy_host$request_uri; # 定义缓存键
proxy_cache_valid 200 304 12h; # 可覆盖全局设置
# 可选:启用ETag验证
etag on;
# 指定资源实际路径或代理到后端
root /path/to/static/files;
# 或 proxy_pass http://backend_upstream;
}
…
}
解释:
二、反向代理与负载均衡
目的: 将请求分发到多个后端服务器,提高应用的可扩展性、可用性和性能。
关键配置 (nginx.conf):
http {
…
# 定义一个名为 backend_servers 的上游服务器组
upstream backend_servers {
# 负载均衡算法 (默认轮询round-robin)
# least_conn; # 最少连接数
# ip_hash; # 基于客户端IP哈希 (会话保持)
# 定义后端服务器,weight表示权重
server backend1.example.com:8080 weight=3; # 权重3
server backend2.example.com:8080 weight=2; # 权重2
server backend3.example.com:8080; # 权重默认为1
server backup.example.com:8080 backup; # 备用服务器
# 可选:健康检查
# health_check interval=5s fails=3 passes=2;
}
…
server {
listen 80;
server_name example.com;
location / {
# 反向代理到上游服务器组
proxy_pass http://backend_servers;
# 重要的代理头设置
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 连接优化参数
proxy_connect_timeout 5s; # 连接超时
proxy_read_timeout 60s; # 读取响应超时
proxy_send_timeout 30s; # 发送请求超时
# 缓冲区优化 (根据实际情况调整)
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 16k;
proxy_busy_buffers_size 32k;
# 关闭代理缓冲 (可选,用于长连接如SSE/WebSocket)
# proxy_buffering off;
}
}
}
解释:
- round-robin (默认): 轮询分发请求。
- least_conn: 将请求发送给当前活跃连接数最少的服务器。
- ip_hash: 基于客户端IP地址进行哈希,确保同一客户端的请求总是发给同一后端服务器(用于会话保持)。hash $cookie_jsessionid等也可用于应用层会话保持。
- weight: 设置服务器权重,权重越高分配的请求越多。
- backup: 标记为备用服务器,仅当主服务器都不可用时才使用。
- down: 标记服务器为永久不可用。
三、日志切割 (Log Rotation)
目的: 防止单个日志文件过大,便于归档、分析和故障排查。
方法: 通常使用 logrotate 工具配合 Nginx 的信号控制。
配置Nginx日志路径 (nginx.conf):
http {
…
# 定义访问日志格式
log_format main '$remote_addr – $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 设置访问日志和错误日志路径
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
…
}
配置 logrotate (创建 /etc/logrotate.d/nginx):
/var/log/nginx/*.log { # 匹配所有.log结尾的日志文件
daily # 每天切割一次 (可选: weekly, monthly)
missingok # 如果日志文件不存在,不报错
rotate 30 # 保留30份旧日志
compress # 压缩旧日志
delaycompress # 延迟压缩 (下一次切割时压缩上一次的)
notifempty # 如果日志文件为空,则不切割
sharedscripts # 所有日志处理完后执行一次postrotate脚本
postrotate
# 向Nginx主进程发送USR1信号,让其重新打开日志文件
if [ -f /run/nginx.pid ]; then
kill -USR1 `cat /run/nginx.pid`
fi
endscript
}
解释:
- daily/weekly/monthly: 切割频率。
- rotate N: 保留旧日志的份数。
- compress: 使用gzip压缩旧日志。
- delaycompress: 本次切割的日志在下一次切割时才压缩(方便查看最新切割的日志)。
- notifempty: 空日志不切割。
- sharedscripts: 所有匹配的日志文件处理完后,只执行一次 postrotate 脚本。
- 关闭当前打开的日志文件。
- 重新打开新的日志文件(文件名不变,但已被logrotate重命名为旧文件)。
- 后续日志写入新文件。
总结: 通过合理配置静态资源缓存策略、反向代理负载均衡和日志切割,可以显著提升Nginx服务器的性能、可扩展性、可用性以及可维护性。以上配置需要根据实际业务需求和服务器环境进行调整和测试。




