Nginx性能优化与监控笔记

一、Nginx性能优化概述

1.1 为什么需要性能优化

Nginx作为高性能Web服务器和反向代理,默认配置已经能够应对中等规模的并发访问。但在高并发、大流量场景下,合理的优化配置可以带来显著的性能提升。根据实际测试,经过全面优化的Nginx可以实现:

  • QPS提升233%(从5,199 → 17,274 请求/秒)

  • 延迟降低69.8%(从192ms → 58ms)

  • 并发能力提升6300%(从1,024 → 65,535 连接)

  • CPU效率提升24.1%(从95.2% → 72.3%)

1.2 性能优化层次

Nginx性能优化可以分为以下几个层次:

优化层次 主要内容 影响程度
系统层 内核参数、文件描述符、网络栈 ★★★★★
应用层 Nginx核心配置、事件模型 ★★★★☆
业务层 缓存策略、压缩、静态资源 ★★★☆☆
架构层 负载均衡、集群部署 ★★★★☆

二、性能瓶颈分析

2.1 常见性能瓶颈

在进行优化前,需要识别系统的性能瓶颈。常见瓶颈包括:

bash

复制代码
# 1. CPU瓶颈:查看CPU使用率
top -bn1 | grep "Cpu(s)"
# 如果us+sy接近100%,说明CPU可能是瓶颈

# 2. 内存瓶颈:查看内存使用
free -h
# 如果available接近0,说明内存不足

# 3. 磁盘I/O瓶颈:查看磁盘读写
iostat -x 1
# 如果await > 100ms,util > 80%,说明磁盘是瓶颈

# 4. 网络瓶颈:查看网络连接
netstat -s | grep -i "retrans"
# 如果重传率过高,说明网络可能是瓶颈

# 5. 文件描述符瓶颈
cat /proc/sys/fs/file-nr
# 如果已分配接近最大值,说明文件描述符不足

2.2 使用stub_status模块监控基础指标

nginx

复制代码
# 启用Nginx状态页
server {
    listen 80;
    server_name localhost;
    
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;  # 只允许本地访问
        deny all;
    }
}

状态页输出示例:

text

复制代码
Active connections: 291 
server accepts handled requests
 16630948 16630948 31070465 
Reading: 6 Writing: 179 Waiting: 106 

指标含义:

  • Active connections:当前活跃连接数

  • accepts:已接受的连接总数

  • handled:已处理的连接总数

  • requests:总请求数

  • Reading:读取请求头的连接数

  • Writing:返回响应的连接数

  • Waiting:空闲keep-alive连接数

三、系统级性能优化

3.1 文件描述符限制

Nginx每个连接都需要消耗一个文件描述符,高并发场景下需要提高系统限制。

bash

复制代码
# 1. 编辑系统限制
sudo vim /etc/security/limits.conf

# 添加以下内容
* soft nofile 100000
* hard nofile 100000
* soft nproc 100000
* hard nproc 100000

# 2. 编辑sysctl配置
sudo vim /etc/sysctl.conf

# 添加
fs.file-max = 1000000

# 3. 应用配置
sudo sysctl -p

# 4. 验证
ulimit -n

3.2 TCP网络参数优化

bash

复制代码
# 编辑sysctl配置
sudo vim /etc/sysctl.conf

# 添加以下TCP优化参数
# 连接队列大小
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535

# TCP超时设置
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0  # 新内核已废弃,设为0

# TCP内存优化(单位:页,通常4KB/页)
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_mem = 94500000 915000000 927000000

# BBR拥塞控制(Linux 4.9+)
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

# 应用配置
sudo sysctl -p

# 验证BBR
sysctl net.ipv4.tcp_congestion_control
lsmod | grep bbr

3.3 网卡队列优化

对于多核CPU系统,增加网卡队列数可以充分利用多核处理软中断。

bash

复制代码
# 查看当前网卡队列数
ethtool -l enp4s0

# 设置网卡队列数(根据CPU核心数调整)
sudo ethtool -L enp4s0 combined 8

# 查看中断分布
cat /proc/interrupts | grep enp4s0

四、Nginx核心配置优化

4.1 基础优化配置

nginx

复制代码
# /etc/nginx/nginx.conf
user nginx;
worker_processes auto;           # 自动匹配CPU核心数
worker_cpu_affinity auto;         # CPU亲和性绑定
worker_priority -10;              # 提高进程优先级
worker_rlimit_nofile 100000;      # worker进程文件描述符限制

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
    use epoll;                     # 使用epoll事件模型
    worker_connections 65535;       # 每个worker最大连接数
    multi_accept on;                # 一次接受所有新连接
    accept_mutex off;               # 关闭互斥锁
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    
    # 日志格式
    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 buffer=32k flush=5s;
    
    # 零拷贝优化
    sendfile on;
    tcp_nopush on;                  # 优化数据包发送
    tcp_nodelay on;                  # 禁用Nagle算法
    
    # 长连接优化
    keepalive_timeout 65;
    keepalive_requests 10000;        # 每个连接最大请求数
    
    # 缓冲区优化
    client_header_buffer_size 4k;
    large_client_header_buffers 4 32k;
    client_body_buffer_size 128k;
    client_max_body_size 100m;
    
    # 文件缓存
    open_file_cache max=10000 inactive=60s;
    open_file_cache_valid 80s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
    
    # 隐藏版本号
    server_tokens off;
    
    # Gzip压缩
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_min_length 1024;
    gzip_types text/plain text/css text/xml text/javascript 
               application/json application/javascript 
               application/xml+rss application/rss+xml 
               image/svg+xml;
    
    # 包含其他配置
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

4.2 关键配置参数详解

配置项 推荐值 说明
worker_processes auto 自动匹配CPU核心数,充分利用多核
worker_connections 65535 每个worker进程最大连接数,受限于ulimit -n
use epoll epoll Linux高性能事件模型,复杂度O(1)
sendfile on 零拷贝传输,减少用户态/内核态切换
tcp_nopush on 优化数据包发送,与sendfile配合使用
tcp_nodelay on 禁用Nagle算法,降低延迟
keepalive_timeout 65 长连接超时时间,太短影响性能,太长浪费资源
keepalive_requests 10000 每个长连接最大请求数
open_file_cache max=10000 inactive=60s 文件句柄缓存,减少磁盘I/O

4.3 允许多进程端口共享

nginx

复制代码
server {
    # 使用reuseport实现多进程负载均衡[citation:1]
    listen 80 reuseport;
    listen [::]:80 reuseport;
    
    server_name example.com;
    # ... 其他配置
}

reuseport让内核能够将新连接均匀分配给各个工作进程,避免某个工作进程负载过高。

相关推荐
xiaokangzhe2 小时前
nginx安全笔记
笔记·nginx·安全
小璐资源网2 小时前
《Nginx安全配置:隐藏版本信息与敏感头》
运维·nginx·安全
-Springer-2 小时前
STM32 学习 —— 个人学习笔记9-1(USART串口协议 & 串口发送及接收数据)
笔记·stm32·学习
_李小白2 小时前
【OSG学习笔记】Day 1: OpenSceneGraph(OSG)安装指南
笔记·学习
深蓝轨迹2 小时前
吃透 Spring Boot dataSource与Starter
java·spring boot·笔记·后端
_下雨天.2 小时前
LNMP架构学习笔记
笔记·学习·架构
卤炖阑尾炎3 小时前
Nginx 安全防护与 HTTPS 部署实战全解析
nginx·安全·https
主角1 73 小时前
Nginx性能优化与监控
网络·nginx·性能优化