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 运行状态的全维度掌控,为业务的稳定运行提供保障。

相关推荐
乘云数字DATABUFF4 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--6 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森6 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜7 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB8 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode9 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户03284722207010 天前
如何搭建本地yum源(上)
运维
ping某11 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树8813 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠13 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql