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;
    }

    ...
}

解释:

  1. proxy_cache_path: 定义磁盘缓存存储路径、目录结构、共享内存区名称和大小(keys_zone)、缓存失效时间(inactive)。
  2. proxy_cache_max_size: 设置磁盘缓存总大小的上限。
  3. proxy_cache_valid: 指定不同HTTP状态码响应的缓存时间。
  4. Cache-Control HTTP头: public表示响应可被任何缓存(浏览器、CDN)缓存。max-age=31536000指示缓存的有效期(秒),这里是1年。对于版本化文件名(如style.v123.css),可以使用非常长的有效期。
  5. ETag: 启用后,浏览器会发送If-None-Match头进行验证,如果资源未修改,服务器返回304 Not Modified,节省带宽。
  6. proxy_cache: 在需要代理后端获取资源时,启用之前定义的缓存区。
  7. 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;
        }
    }
}

解释:

  1. upstream: 定义一组后端服务器,Nginx将请求分发到这些服务器。
  2. 负载均衡算法:
    • round-robin (默认): 轮询分发请求。
    • least_conn: 将请求发送给当前活跃连接数最少的服务器。
    • ip_hash: 基于客户端IP地址进行哈希,确保同一客户端的请求总是发给同一后端服务器(用于会话保持)。hash $cookie_jsessionid等也可用于应用层会话保持。
  3. server:
    • weight: 设置服务器权重,权重越高分配的请求越多。
    • backup: 标记为备用服务器,仅当主服务器都不可用时才使用。
    • down: 标记服务器为永久不可用。
  4. proxy_pass: 将匹配到的请求转发到指定的上游服务器组。
  5. proxy_set_header: 将原始请求的信息(如Host、真实客户端IP)传递给后端服务器,后端应用才能正确处理。
  6. 超时设置 (proxy_connect_timeout, proxy_read_timeout, proxy_send_timeout): 防止后端故障导致Nginx工作进程长时间阻塞。
  7. 缓冲区设置: 优化代理过程中请求和响应的缓冲,提高性能。对于流式响应或长连接,可能需要关闭缓冲(proxy_buffering off)。

三、日志切割 (Log Rotation)

目的: 防止单个日志文件过大,便于归档、分析和故障排查。

方法: 通常使用 logrotate 工具配合 Nginx 的信号控制。

  1. 配置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;
        ...
    }
    

  2. 配置 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
    }
    

解释:

  1. logrotate: Linux系统自带的日志管理工具。
  2. 配置项:
    • daily/weekly/monthly: 切割频率。
    • rotate N: 保留旧日志的份数。
    • compress: 使用gzip压缩旧日志。
    • delaycompress: 本次切割的日志在下一次切割时才压缩(方便查看最新切割的日志)。
    • notifempty: 空日志不切割。
    • sharedscripts: 所有匹配的日志文件处理完后,只执行一次 postrotate 脚本。
  3. postrotate脚本: 最关键的部分。向Nginx主进程发送 USR1 信号。Nginx收到此信号后会:
    • 关闭当前打开的日志文件。
    • 重新打开新的日志文件(文件名不变,但已被logrotate重命名为旧文件)。
    • 后续日志写入新文件。
  4. 运行: logrotate 通常由系统定时任务(如cron.daily)自动执行,无需手动干预。也可手动测试:logrotate -d /etc/logrotate.d/nginx (调试模式) 或 logrotate -f /etc/logrotate.d/nginx (强制运行)。

总结: 通过合理配置静态资源缓存策略、反向代理负载均衡和日志切割,可以显著提升Nginx服务器的性能、可扩展性、可用性以及可维护性。以上配置需要根据实际业务需求和服务器环境进行调整和测试。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐