跳转到主要内容
杨月昌的软件博客
返回

Nginx 生产环境:高性能调优与日志自动化管理方案

一、 Nginx 生产环境核心调优

Nginx 的性能上限很大程度上取决于对系统资源的利用效率。以下配置旨在平衡高并发处理能力低延迟响应

1. 进程与资源调度

合理的进程分配能减少 CPU 上下文切换的开销。

# 推荐以专门的 web 用户运行,降低安全风险
user  www-data;

# 自动根据 CPU 核心数启动进程,2026 年多核服务器推荐使用 auto
worker_processes  auto;

# 将 worker 进程固定在指定的 CPU 核心上,减少缓存失效
worker_cpu_affinity auto;

# 提升单个进程能打开的文件句柄数,必须与系统 ulimit -n 一致
worker_rlimit_nofile 1048576;

2. 高效事件驱动机制

events {
    use epoll;
    # 允许一个 worker 同时接受多个新连接
    multi_accept on;
    # 增加单进程并发上限
    worker_connections 10240;
}

3. HTTP 层优化:传输与缓存

这是提升用户感知的关键配置。

http {
    include       mime.types;
    server_tokens off; # 隐藏版本号,基础安全必备

    # 零拷贝技术:直接在内核空间完成文件传输
    sendfile           on;
    tcp_nopush         on;
    tcp_nodelay        on;

    # 开启长连接复用,减少 TCP 三次握手次数
    keepalive_timeout  65;
    keepalive_requests 1000;

    # 【新增】开启文件元数据缓存,减少系统调用
    open_file_cache          max=10000 inactive=20s;
    open_file_cache_valid    30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors   on;

    # Gzip 压缩:推荐级别 5-6,兼顾压缩率与 CPU 负载
    gzip            on;
    gzip_min_length 1k;
    gzip_comp_level 6;
    gzip_types      text/plain text/css application/json application/javascript text/xml;
}

二、 业务场景配置:静态与动态分离

1. 动态后端负载均衡

upstream api_backend {
    # 推荐使用 keepalive 保持与后端的长连接,提升转发效率
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
    keepalive 64;
}

2. Server 块最佳实践

server {
    listen 80;
    listen [::]:80; # 开启 IPv6 支持
    server_name example.com;

    # 安全头部优化
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";

    # 静态资源缓存策略
    location ~* \.(jpg|jpeg|png|gif|css|js|ico)$ {
        expires 30d;
        add_header Cache-Control "public, no-transform";
    }

    # API 转发
    location /api/ {
        proxy_pass http://api_backend;
        proxy_http_version 1.1; # 必须配合 upstream keepalive
        proxy_set_header Connection "";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

三、 日志切割与清理:双重方案

日志文件若不处理,会导致磁盘 I/O 压力增大甚至爆满。

方案 A:Logrotate(Linux 标准推荐)

在现代生产环境中,推荐使用系统内置的 logrotate,它比手写脚本更健壮,支持压缩。

创建 /etc/logrotate.d/nginx:

/var/log/nginx/*.log {
    daily           # 每天切割
    missingok       # 忽略错误
    rotate 14       # 保留 14 份日志
    compress        # 开启压缩,节省磁盘空间
    delaycompress   # 延迟压缩
    notifempty      # 空文件不切割
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

方案 B:自定义 Shell 脚本(灵活性高)

如果您需要根据特定日期格式命名日志,可使用以下优化版脚本:

#!/bin/bash
# 路径请根据实际情况修改
LOG_DIR="/usr/local/nginx/logs"
BACKUP_DIR="/data/logs/nginx_history"
DATE=$(date -d "yesterday" +"%Y-%m-%d")

mkdir -p $BACKUP_DIR

# 移动并重新打开
mv $LOG_DIR/access.log $BACKUP_DIR/access_$DATE.log
kill -USR1 $(cat /run/nginx.pid)

# 压缩昨天的日志
gzip $BACKUP_DIR/access_$DATE.log

# 清理 30 天前的压缩包
find $BACKUP_DIR -name "*.gz" -mtime +30 -delete

四、 总结

  1. 性能:关键在于 worker_rlimit_nofileepoll 以及 sendfile 的开启。
  2. 稳定性:利用 logrotate 实现日志自动化管理,防止磁盘溢出。
  3. 观测:生产环境下务必配置 http_stub_status_module 实时监控连接数。

通过上述优化,Nginx 可以在单机环境下支撑数万并发,并保持极高的运行稳定性。



上一篇
Transformer:注意力革命十年回顾与2026年生态全景
下一篇
深入解析 NGINX `location` 和 `rewrite` 的进阶实战