836 字
4 分钟
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 可以在单机环境下支撑数万并发,并保持极高的运行稳定性。

Nginx 生产环境:高性能调优与日志自动化管理方案
https://sw.rscclub.website/posts/nginxszrz/
作者
杨月昌
发布于
2021-08-19
许可协议
CC BY-NC-SA 4.0