第八阶段:工程化、质量管控与高级拓展(135天),Nginx高级优化:静态资源缓存策略+反向代理负载均衡+日志切割
·
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;
}
...
}
解释:
proxy_cache_path: 定义磁盘缓存存储路径、目录结构、共享内存区名称和大小(keys_zone)、缓存失效时间(inactive)。proxy_cache_max_size: 设置磁盘缓存总大小的上限。proxy_cache_valid: 指定不同HTTP状态码响应的缓存时间。Cache-ControlHTTP头:public表示响应可被任何缓存(浏览器、CDN)缓存。max-age=31536000指示缓存的有效期(秒),这里是1年。对于版本化文件名(如style.v123.css),可以使用非常长的有效期。ETag: 启用后,浏览器会发送If-None-Match头进行验证,如果资源未修改,服务器返回304 Not Modified,节省带宽。proxy_cache: 在需要代理后端获取资源时,启用之前定义的缓存区。proxy_cache_key: 定义缓存项的键值,通常包含协议、主机名和请求URI,确保不同请求缓存不同。
二、反向代理与负载均衡
目的: 将请求分发到多个后端服务器,提高应用的可扩展性、可用性和性能。
关键配置 (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;
}
}
}
解释:
upstream: 定义一组后端服务器,Nginx将请求分发到这些服务器。- 负载均衡算法:
round-robin(默认): 轮询分发请求。least_conn: 将请求发送给当前活跃连接数最少的服务器。ip_hash: 基于客户端IP地址进行哈希,确保同一客户端的请求总是发给同一后端服务器(用于会话保持)。hash $cookie_jsessionid等也可用于应用层会话保持。
server:weight: 设置服务器权重,权重越高分配的请求越多。backup: 标记为备用服务器,仅当主服务器都不可用时才使用。down: 标记服务器为永久不可用。
proxy_pass: 将匹配到的请求转发到指定的上游服务器组。proxy_set_header: 将原始请求的信息(如Host、真实客户端IP)传递给后端服务器,后端应用才能正确处理。- 超时设置 (
proxy_connect_timeout,proxy_read_timeout,proxy_send_timeout): 防止后端故障导致Nginx工作进程长时间阻塞。 - 缓冲区设置: 优化代理过程中请求和响应的缓冲,提高性能。对于流式响应或长连接,可能需要关闭缓冲(
proxy_buffering off)。
三、日志切割 (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 }
解释:
logrotate: Linux系统自带的日志管理工具。- 配置项:
daily/weekly/monthly: 切割频率。rotate N: 保留旧日志的份数。compress: 使用gzip压缩旧日志。delaycompress: 本次切割的日志在下一次切割时才压缩(方便查看最新切割的日志)。notifempty: 空日志不切割。sharedscripts: 所有匹配的日志文件处理完后,只执行一次postrotate脚本。
postrotate脚本: 最关键的部分。向Nginx主进程发送USR1信号。Nginx收到此信号后会:- 关闭当前打开的日志文件。
- 重新打开新的日志文件(文件名不变,但已被
logrotate重命名为旧文件)。 - 后续日志写入新文件。
- 运行:
logrotate通常由系统定时任务(如cron.daily)自动执行,无需手动干预。也可手动测试:logrotate -d /etc/logrotate.d/nginx(调试模式) 或logrotate -f /etc/logrotate.d/nginx(强制运行)。
总结: 通过合理配置静态资源缓存策略、反向代理负载均衡和日志切割,可以显著提升Nginx服务器的性能、可扩展性、可用性以及可维护性。以上配置需要根据实际业务需求和服务器环境进行调整和测试。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)