Nginx 性能调优与深度监控实战指南

在互联网流量持续攀升的背景下,Nginx 作为高性能的反向代理、负载均衡器和 Web 服务器,其性能表现直接决定业务的用户体验与服务连续性。做好 Nginx 的性能调优,能最大化硬件资源利用率;搭建深度监控体系,可实现故障提前预测与快速响应,二者是运维工程师的核心必备技能。本指南从实操角度讲解 Nginx 性能调优全流程,搭配两款主流监控工具的部署与使用,同时补充核心知识点,让配置更规范、监控更高效。

一、Nginx 性能调优

性能调优的核心思路是匹配硬件资源、优化请求处理、减少重复运算,从编译安装、权限配置、进程连接数、静态资源处理、日志管理、压缩配置六个维度逐步优化,所有操作均基于 CentOS 系统实操。

1. 编译安装 Nginx(定制化基础环境)

Nginx 官方预编译包功能有限,编译安装可按需开启模块,为后续调优打下基础,需先安装依赖、创建专用用户,再完成编译与系统服务配置。

(1)安装编译及运行支持软件
复制代码
[root@localhost ~]# dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar

补充知识点:pcre-devel 支持正则表达式解析(Nginx 配置路由必备),zlib-devel 支持压缩,openssl-devel 支持 HTTPS/SSL 协议。

(2)创建 Nginx 专用运行用户、组及日志目录
复制代码
[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# mkdir -p /var/log/nginx
[root@localhost ~]# chown -R nginx:nginx /var/log/nginx

补充知识点-M不创建家目录,/sbin/nologin禁止用户登录系统,降低服务器安全风险;日志目录归属 nginx 用户,避免权限不足导致日志无法写入。

(3)编译安装 Nginx(开启核心模块)
复制代码
[root@localhost ~]# tar zxf nginx-1.26.3.tar.gz
[root@localhost ~]# cd nginx-1.26.3
[root@localhost nginx-1.26.3]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_realip_module \
--with-pcre \
--with-stream
[root@localhost nginx-1.26.3]# make && make install
# 创建主程序软链接,方便全局调用
[root@localhost nginx-1.26.3]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

补充知识点--with-stream开启四层 TCP/UDP 代理(负载均衡必备),--with-http_realip_module可获取客户端真实 IP(反向代理场景必备),--with-http_stub_status_module开启 Nginx 基础状态监控。

(4)添加 Nginx 系统服务(实现系统级管理)
复制代码
[root@localhost ~]# vi /lib/systemd/system/nginx.service
# 写入以下内容
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target

[Service]
Type=forking
ExecStartPre=/usr/local/sbin/nginx -t
ExecStart=/usr/local/sbin/nginx
ExecReload=/usr/local/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
User=root
Group=root

[Install]
WantedBy=multi-user.target

# 重新加载服务配置、启动并设置开机自启
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# systemctl enable nginx

补充知识点ExecStartPre=/usr/local/sbin/nginx -t启动前检查配置文件语法,避免配置错误导致服务启动失败;Type=forking适配 Nginx 后台运行的特性。

2. 修改 Nginx 运行用户与组(权限精细化控制)

Nginx 主进程由 root 启动(绑定 80/443 等特权端口),子进程需由普通用户运行,降低权限泄露风险,有编译指定配置文件修改两种方式,可按需选择。

方式 1:编译安装时指定(一次性生效,适合新部署)
复制代码
[root@localhost nginx-1.26.3]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
# 后续追加其他模块参数
方式 2:修改配置文件指定(灵活修改,适合已部署环境)
复制代码
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
# 首行修改,指定用户和组
user nginx nginx;
# 保存后重启Nginx生效
[root@localhost ~]# systemctl restart nginx

补充知识点:Nginx 默认使用 nobody 用户,该用户为系统公共用户,权限过大,单独创建 nginx 用户可实现权限隔离,仅让其拥有网站文件读取和日志写入权限。

3. 优化进程数与连接数(核心高并发调优)

Nginx 的请求处理能力由工作进程数单进程最大连接数决定,核心是让进程数匹配 CPU 核心,连接数适配业务并发量,充分利用硬件资源。

(1)工作进程数调优

工作进程(worker_processes)负责处理实际请求,建议设为CPU 核心数 (常规场景)或CPU 核心数 2 倍(高并发场景),避免进程切换开销。

复制代码
# 查看服务器CPU核心数
[root@localhost ~]# nproc
4
# 修改配置文件设置进程数
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
worker_processes 4;
# 进程绑定CPU核心(多核优化,避免进程抢占CPU)
worker_cpu_affinity 0001 0010 0100 1000;
# 重启生效并验证
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# ps -ef | grep nginx

补充知识点worker_cpu_affinity通过二进制掩码绑定进程与 CPU,4 核对应0001(核 1)、0010(核 2)、0100(核 3)、1000(核 4);8 核则对应0000000100000010依次类推,实现 CPU 资源独占,提升处理效率。

(2)最大连接数调优

worker_connections定义单个工作进程的最大并发连接数,Nginx总并发数 = worker_processes × worker_connections

复制代码
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
# 在events块中配置
events {
    worker_connections 1024; # 单进程默认1024,高并发可调至65535(需配合系统内核调优)
}

补充知识点:修改 worker_connections 为 65535 时,需先调优 Linux 系统内核,增大文件描述符限制:

复制代码
# 临时生效
[root@localhost ~]# ulimit -n 65535
# 永久生效,修改配置文件
[root@localhost ~]# vi /etc/security/limits.conf
# 末尾添加
* soft nofile 65535
* hard nofile 65535

文件描述符是 Linux 系统对文件、网络连接的标识,Nginx 每个连接占用一个文件描述符,默认系统限制为 1024,高并发场景必须调大。

4. 静态资源缓存配置(减少重复请求,提升访问速度)

Nginx 对静态资源(图片、css、js、图标)的处理能力远高于动态服务器,为静态资源设置缓存时间,让客户端浏览器缓存资源,后续请求无需重新从服务器获取,大幅降低服务器压力。

复制代码
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
# 在http块或server块的location中配置
location ~\.(gif|jpg|jpeg|png|bmp|ico|css|js)$ {
    root html; # 静态资源存放目录
    expires 1d; # 缓存时间1天,可设为1h(1小时)、30d(30天)
}
# 检查配置语法并重新加载
[root@localhost ~]# nginx -t
[root@localhost ~]# nginx -s reload

补充知识点

  1. 缓存时间根据资源更新频率设置:不常更新的图片 / 图标设为 30d,经常更新的 css/js 设为 1h;
  2. 验证缓存是否生效:通过浏览器 F12 开发者工具查看Response Headers ,若包含ExpiresCache-Control字段,说明缓存配置成功;
  3. 动态网页(.php、.jsp)禁止设置缓存,避免客户端获取过期的动态数据。

5. 日志自动切割(避免日志过大,方便监控分析)

Nginx 运行过程中会持续生成访问日志(access.log)和错误日志(error.log),日志文件过大会导致无法快速分析问题,甚至占满磁盘。Nginx 无内置日志切割功能,可通过脚本 + 定时任务实现日志自动切割,并清理历史日志。

(1)编写日志切割脚本
复制代码
[root@localhost ~]# vi /opt/fenge.sh
# 写入以下脚本内容
#!/bin/bash
# 定义昨天的日期(日志命名用)
d=$(date -d "-1 day" "+%Y%m%d")
# 日志存放目录
logs_path="/var/log/nginx"
# Nginx进程PID文件路径
pid_path="/usr/local/nginx/logs/nginx.pid"
# 若日志目录不存在则创建
[ ! -d $logs_path ] && mkdir -p $logs_path
# 移动并重命名访问日志
mv /usr/local/nginx/logs/access.log ${logs_path}/test.com-access.log-${d}
# 向Nginx主进程发送USR1信号,重建新的日志文件
kill -USR1 $(cat $pid_path)
# 删除30天前的历史日志,释放磁盘空间
find $logs_path -mtime +30 | xargs rm -rf

# 赋予脚本执行权限
[root@localhost ~]# chmod +x /opt/fenge.sh
# 测试脚本执行
[root@localhost ~]# /opt/fenge.sh
(2)配置定时任务(实现每日自动切割)
复制代码
# 编辑定时任务
[root@localhost ~]# crontab -e
# 写入内容:每天凌晨1点30分执行脚本
30 1 * * * /opt/fenge.sh
# 查看定时任务
[root@localhost ~]# crontab -l

补充知识点kill -USR1 $MAINPID是 Nginx 的安全日志切割信号,发送后 Nginx 会关闭当前日志文件并创建新文件,不中断服务;crontab 时间格式为分 时 日 月 周*表示任意时间。

6. Gzip 压缩配置(减少传输数据量,提升响应速度)

Gzip 压缩可对 Nginx 返回的文本类资源(html、css、js、xml)进行压缩,压缩后数据量可减少 60%-80%,大幅降低网络传输耗时,仅对大于指定大小的资源压缩,避免小文件压缩的性能损耗。

复制代码
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
# 在http块中配置
http {
    gzip on; # 开启Gzip压缩
    gzip_min_length 1k; # 仅压缩大于1KB的资源
    gzip_vary on; # 告诉代理服务器缓存压缩后的资源
    gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss; # 指定需要压缩的资源类型
    # 其他原有配置...
}
# 检查配置并重新加载
[root@localhost ~]# nginx -t
[root@localhost ~]# nginx -s reload

# 验证压缩是否生效
[root@localhost ~]# curl -I -H "Accept-Encoding: gzip" 192.168.10.101

补充知识点

  1. curl -I仅获取 HTTP 响应头,-H "Accept-Encoding: gzip"模拟客户端支持 Gzip 压缩,若响应头包含Content-Encoding: gzipVary: Accept-Encoding,说明压缩生效;
  2. 图片、视频等二进制资源已做过压缩,无需开启 Gzip,否则会增加服务器 CPU 开销。

二、Nginx 深度监控

仅做性能调优不够,需搭建深度监控体系,实时跟踪 Nginx 的运行状态、流量变化、请求响应情况,及时发现性能瓶颈和故障。本指南介绍两款主流监控工具:GoAccess(实时日志分析,快速看访问统计)Nginx VTS(实时流量监控,精准看服务指标),覆盖日志分析和服务监控两大维度。

1. GoAccess 监控(实时 Web 日志分析工具)

GoAccess 是开源的实时日志分析器,支持终端和浏览器可视化,能快速统计独立访客、请求量、带宽、慢请求、虚拟主机资源消耗等指标,配置简单、实时性强,适合快速排查访问类问题。

(1)安装 GoAccess
复制代码
# 安装编译依赖
[root@localhost ~]# dnf install -y gcc make ncurses-devel openssl-devel gettext-devel
# 安装中文字体支持(避免中文乱码)
[root@localhost ~]# dnf install -y wqy-microhei-fonts
# 源码编译安装GoAccess
[root@localhost ~]# tar -xzvf goaccess-1.7.2.tar.gz
[root@localhost ~]# cd goaccess-1.7.2
[root@localhost goaccess-1.7.2]# ./configure --enable-utf8 --with-openssl
[root@localhost goaccess-1.7.2]# make && make install

补充知识点--enable-utf8开启 Unicode 支持,是显示中文的必备参数;--with-openssl支持 HTTPS 协议的日志分析。

(2)配置系统中文环境(全局生效)
复制代码
# 安装中文语言包
[root@localhost ~]# dnf install -y glibc-langpack-zh
# 设置系统Locale为中文
[root@localhost ~]# localectl set-locale LANG=zh_CN.UTF-8
# 验证中文环境是否生效
[root@localhost ~]# locale
# 输出包含LANG=zh_CN.UTF-8即为生效
(3)生成 GoAccess 实时中文监控报告
复制代码
[root@localhost ~]# goaccess --log-format=COMBINED --output=/usr/local/nginx/html/report.html --real-time-html /usr/local/nginx/logs/access.log
(4)测试访问监控报告

在浏览器中输入地址:http://你的服务器IP/report.html,即可查看实时更新的 Nginx 访问统计报告,包含独立访客、请求文件、响应码、带宽使用等核心指标。补充知识点

  1. --log-format=COMBINED指定 Nginx 的组合日志格式,是 Nginx 默认的日志格式;
  2. --real-time-html开启实时更新,浏览器端每秒刷新一次数据;
  3. 若需后台运行 GoAccess,可添加&符号:goaccess ...... &

2. Nginx VTS 监控(虚拟主机流量状态监控)

Nginx VTS(Virtual Host Traffic Status)是 Nginx 的专用流量监控模块,需编译到 Nginx 中,能实时统计每个虚拟主机的 QPS、连接数、带宽、响应码(2xx/4xx/5xx)、缓存命中情况等核心指标,支持 HTML 可视化和 JSON 数据输出,方便集成到 Prometheus+Grafana 等监控平台,适合企业级多虚拟主机场景。

(1)重新编译 Nginx,添加 VTS 模块

VTS 是第三方模块,需在 Nginx 编译时通过--add-module添加,步骤如下:

复制代码
# 解压Nginx源码和VTS模块源码
[root@localhost ~]# tar xzf nginx-1.26.3.tar.gz
[root@localhost ~]# unzip nginx-module-vts-master.zip
# 进入Nginx源码目录,重新配置编译参数
[root@localhost ~]# cd nginx-1.26.3
[root@localhost nginx-1.26.3]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--add-module=/root/nginx-module-vts-master
# 重新编译并安装(覆盖原有Nginx,不丢失配置)
[root@localhost nginx-1.26.3]# make && make install

补充知识点 :重新编译 Nginx 时,需保留原有所有模块参数,仅追加--add-module,否则会丢失原有功能;编译前建议备份 Nginx 配置文件。

(2)修改 Nginx 配置,开启 VTS 监控
复制代码
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
# 在http块中添加,启用流量统计共享内存区
http {
    vhost_traffic_status_zone;
    # 其他原有配置...
    # 在server块中添加监控访问路径
    server {
        listen 80;
        server_name localhost;
        # VTS监控页面配置
        location /vts {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
            access_log off; # 关闭监控页面的访问日志,减少日志量
        }
        # 其他原有配置...
    }
}
# 检查配置语法并重启Nginx
[root@localhost ~]# nginx -t
[root@localhost ~]# systemctl restart nginx
(3)测试访问 VTS 监控页面

在浏览器中输入地址:http://你的服务器IP/vts,即可查看 Nginx 实时流量监控数据,包含每个虚拟主机的连接数、请求量、响应码、流量使用、缓存状态等详细指标。补充知识点

  1. vhost_traffic_status_zone用于创建共享内存区,存储流量统计数据,默认大小 10M,足够常规场景使用;
  2. VTS 支持 JSON 格式输出,将vhost_traffic_status_display_format改为json,即可获取 JSON 数据,方便集成到 Prometheus、Zabbix 等监控平台;
  3. 可通过 VTS 的 4xx/5xx 响应码统计,快速发现网站的访问错误(如 404 页面不存在、502 网关错误)。

三、调优与监控核心总结

  1. 性能调优核心 :围绕硬件资源匹配 (进程数、CPU 绑定)、请求处理优化 (连接数、内核调优)、数据传输优化 (静态缓存、Gzip 压缩)、日志管理(自动切割)展开,所有调优操作需根据业务并发量调整,避免过度调优增加服务器开销;
  2. 深度监控核心 :GoAccess 侧重访问日志实时分析 ,快速掌握用户访问情况;Nginx VTS 侧重服务流量实时监控,精准掌握 Nginx 自身运行状态,二者搭配使用,实现 Nginx 监控的全覆盖;
  3. 运维建议:调优后需进行压力测试(如使用 ab、jmeter 工具),验证调优效果;监控体系搭建后,需配置告警(如 Zabbix、钉钉 / 企业微信机器人),当 QPS 突增、5xx 响应码过多、带宽占用过高时,及时触发告警,实现故障快速响应。

通过以上性能调优和深度监控的配置,能让 Nginx 在高并发场景下保持高性能、高稳定性,同时实现对 Nginx 运行状态的全维度掌控,为业务的稳定运行提供保障。

相关推荐
FriendshipT2 小时前
Ultralytics Docker 安装使用教程(以训练 YOLO26 模型为例)
linux·运维·人工智能·目标检测·ubuntu·docker·容器
2301_816374332 小时前
AutoBackupGuard 多服务器自动化备份与完整性校验系统
linux·运维·服务器·centos·自动化·github
安科瑞小许2 小时前
零碳园区的电力保障——变电站综合自动化系统
运维·自动化·零碳园区
袁小皮皮不皮2 小时前
【HCIA】第二章 ipv4协议以及子网划分与集合
linux·运维·服务器·网络·网络协议·tcp/ip·信息与通信
暴力求解2 小时前
Linux---ELF动态库加载
linux·运维·服务器
技术宅星云2 小时前
【极客的Ubuntu 操作系统维护手册】
linux·运维·ubuntu
艾莉丝努力练剑2 小时前
System V IPC内核实现精析
linux·运维·服务器·网络·c++·人工智能·学习
小璐资源网2 小时前
Nginx安装教程:Windows/Linux/macOS全平台覆盖
linux·windows·nginx
万象.2 小时前
docker虚拟化,容器化的原理与实现
运维·docker·容器