836 字
4 分钟
Nginx 生产环境:高性能调优与日志自动化管理方案
一、 Nginx 生产环境核心调优
Nginx 的性能上限很大程度上取决于对系统资源的利用效率。以下配置旨在平衡高并发处理能力与低延迟响应。
1. 进程与资源调度
合理的进程分配能减少 CPU 上下文切换的开销。
# 推荐以专门的 web 用户运行,降低安全风险user www-data;
# 自动根据 CPU 核心数启动进程,2026 年多核服务器推荐使用 autoworker_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.logkill -USR1 $(cat /run/nginx.pid)
# 压缩昨天的日志gzip $BACKUP_DIR/access_$DATE.log
# 清理 30 天前的压缩包find $BACKUP_DIR -name "*.gz" -mtime +30 -delete四、 总结
- 性能:关键在于
worker_rlimit_nofile、epoll以及sendfile的开启。 - 稳定性:利用
logrotate实现日志自动化管理,防止磁盘溢出。 - 观测:生产环境下务必配置
http_stub_status_module实时监控连接数。
通过上述优化,Nginx 可以在单机环境下支撑数万并发,并保持极高的运行稳定性。
Nginx 生产环境:高性能调优与日志自动化管理方案
https://sw.rscclub.website/posts/nginxszrz/