欢迎光临
我们一直在努力

第八阶段:工程化、质量管控与高级拓展(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-Control HTTP头: 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服务器的性能、可扩展性、可用性以及可维护性。以上配置需要根据实际业务需求和服务器环境进行调整和测试。

    赞(0)
    未经允许不得转载:171主机测评 » 第八阶段:工程化、质量管控与高级拓展(135天),Nginx高级优化:静态资源缓存策略+反向代理负载均衡+日志切割
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址