Nginx性能调优与深度监控

目录

前言

全球流量激增背景下,Nginx作为核心反向代理/负载均衡器,其性能直接影响用户体验和业务连续性。通过调优最大化硬件资源利用率,通过监控实现故障预测与快速响应,是运维工程师的核心能力

一.Nginx性能调优

1. 修改用户与组

Nginx 运行时进程需要有用户与组的支持,用以实现对网站文件读取时进行访问控制。主进程由 root 创建,子进程由指定的用户与组创建。Nginx 默认使用 nobody 用户帐号与组帐号,一般也要进行修改。修改 Nginx 用户与组有两种方法,一种是在编译安装时指定用户与组,另一种是修改配置文件指定用户与组

修改 Nginx 配置文件 nginx.conf 指定用户与组

复制代码
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
user nginx nginx;  				 #修改用户为 nginx ,组为 nginx

2.更改进程数与连接数

(1)进程数

在高并发环境中,需要启动更多的 Nginx 进程以保证快速响应,用以处理用户的请求,避免造成阻塞。使用 ps aux 命令查看 Nginx 运行进程的个数。从命令执行结果可以看出 master process 是 Nginx 的主进程,开启1个;worker process 是子进程,子进程也是开启了 1 个。修改 Nginx 的配置文件的 worker_processes 参数,一般设为 CPU 的个数或者核数,在高并发的情况下可设置为 CPU 个数或者核数的 2 倍,可以查看 CPU 的核数以确定参数

参数设置为 4,和 CPU 的核数相同。运行进程数多一些,响应客户端访问请求时,Nginx 就不会临时启动新的进程提供服务,减少了系统的开销,提升了服务速度

复制代码
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

检查语法、并重启

修改完后,重启服务,使用 ps aux 查看运行进程数的变化情况。从下面执行结果中可以看出开启了 1 个主进程和 4 个子进程,参数设置起到了作用

默认情况下,Nginx 的多个进程可能更多的跑在一颗 CPU 上。为了充分利用硬件多核多 CPU,可以分配不同的进程给不同的 CPU 处理。在一台 4 核 CPU 服务器上,可以设置每个进程分别由不同的 CPU 核心处理,达到 CPU 的性能最大化

复制代码
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

检查语法、并重启

(2)连接数

单个Worker进程最大并发连接数

复制代码
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

所以nginx的总并发数计算: 总并发数 = worker_processes × worker_connections

3. 静态缓存功能设置

当 Nginx 将网页数据返回给客户端后,可设置缓存时间,以便在日后进行相同内容的请求时直接返回,以避免重复请求,加快访问速度。缓存时间一般针对静态资源进行设置,对动态网页不用设置缓存时间

(1)设置静态资源缓存
复制代码
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

检查语法、并重启

(2)验证静态缓存

4. 设置连接超时

在企业网站中,为了避免同一个客户长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连接访问时间。可以修改配置文件 nginx.conf,设置 keepalive_timeout超时时间

复制代码
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

keepalive_timeout

  • 第一个参数指定了与客户端的 keep-alive 连接超时时间,服务器将会在这个时间后关闭连接
  • 可选的第二个参数指定了在响应头 Keep-Alive: timeout=time中的time 值。这个头能够让一些浏览器主动关闭连接,这样服务器就不必去关闭连接了。没有这个参数,Nginx不会发送 Keep-Alive 响应头

5.日志切割

随着 Nginx 运行时间的增加,产生的日志也会逐渐增加,为了方便掌握 Nginx 的运行状态,需要时刻关注 Nginx 日志文件。太大的日志文件对监控是一个大灾难,不便于分析排查,需要定期的进行日志文件的切割

Nginx 没有类似 Apache 的 cronlog 日志分割处理功能,但是可以通过 Nginx 的信号控制功能脚本来实现日志的自动切割,并将脚本加入到 Linux 的计划任务中,让脚本在每天的固定时间执行,便可实现日志切割功能。下面是具体操作步骤

(1)编写脚本

/opt/qiege.sh,把 Nginx 的日志文件/usr/local/nginx/logs/access.log 移动到目录/var/log/nginx 下面,以当前时间做为日志文件的名称,然后用 kill --USR1 创建新的日志文件/usr/local/nginx/logs/access.log,最后删除 30 天之前的日志文件

bash 复制代码
[root@localhost ~]# vim /opt/qiege.sh
#!/bin/bash
d=$(date -d " -1 day" "+%Y%m%d")

log_path="/var/log/nginx"
pid_path="/usr/local/nginx/logs/nginx.pid"

[ -d $log_path ] ||  mkdir -p /var/log/nginx 

mv /usr/local/nginx/logs/access.log ${log_path}/access-log.$d
kill -USR1 $(cat $pid_path)

find $log_path -mtime +30 | xargs rm -rf
(2)验证

设置 crontab 任务,定期执行脚本自动进行日志分割

bash 复制代码
[root@localhost ~]# crontab -e

6. 配置网页压缩

Nginx 的 ngx_http_gzip_module 压缩模块提供了对文件内容压缩的功能,允许 Nginx服务器将输出内容发送到客户端之前进行压缩,以节约网站的带宽,提升用户的访问体验。默认 Nginx 已经安装该模块,只需要在配置文件中加入相应的压缩功能参数对压缩性能进行优化即可

  • gzipon:开启 gzip 压缩输出;
  • gzip_min_lengthlk:用于设置允许压缩的页面最小字节数;
  • gzip_buffers 4 16k:表示申请 4 个单位为 16k 的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储 gzip 压缩结果;
  • gzip_http_version 1.0:用于设置识别 http 协议版本,默认是 1.1,目前大部分浏览器已经支持 gzip 解压,但处理较慢,也比较消耗服务器 CPU 资源;
  • gzip_comp_level 2:用来指定 gzip 压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理速度最慢,使用默认即可;
  • gzip_types text/plain:压缩类型,是对哪些网页文档启用压缩功能;
  • gzip_vary on:选项可以让前端的缓存服务器缓存经过 gzip 压缩的页面

修改 Nginx 的配置文件,加入压缩功能参数

复制代码
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

注释:

  • gzip on;:开启 Gzip 压缩功能
  • gzip_buffers 4 64k;:设置用于压缩响应的缓冲区数量和大小,这里表示分配 4 个 64KB 的缓冲区
  • gzip_http_version 1.1;:指定启用 Gzip 压缩的 HTTP 协议版本,这里是 HTTP 1.1
  • gzip_comp_level 2;:设置 Gzip 压缩的级别,范围是 1 到 9,2 表示相对较低的压缩级别(压缩速度快,压缩比相对低)
  • gzip_min_length 1k;:指定当响应内容长度大于等于 1KB 时才进行 Gzip 压缩
  • gzip_vary on;:向代理服务器发送 Vary: Accept-Encoding 头信息,让代理服务器根据客户端的 Accept-Encoding 头来决定是否缓存压缩后的内容
  • gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss;:指定对哪些 MIME 类型的内容进行 Gzip 压缩

在 Nginx 工作目录建立一个超过 1K 大小的 html 文件,然后使用浏览器访问网址验证,显示使用 gzip 进行了压缩,如图所示:

http://192.168.10.101/index.html

备注:

  • -I:该参数的作用是只获取服务器返回的 HTTP 头部信息,而不获取响应的主体内容。
  • -H:此参数用于在请求中添加自定义的 HTTP 头部信息。在这个例子里,添加的头部信息是Accept-Encoding: gzip,这表示客户端(也就是发起请求的一方)支持gzip压缩格式的响应内容

二. nginx的深度监控

1. GoAccess简介

GoAccess 是一个开源实时 Web 日志分析器和交互式查看器,可在Linux系统上的 终端中或通过浏览器运行。它为需要动态可视化服务器报告的系统管理员提供快速且有价值的 HTTP 统计信息

GoAccess解析指定的Web日志文件并将数据输出到X终端

特点包括:完全实时、所需的最少配置、跟踪应用程序响应时间、几乎所有web日志格式、GoAccess只有一个依赖项、访问者、每个虚拟主机的指标

2.GoAccess安装

(1)安装编译依赖
(2)安装中文字体支持
(3)源码编译安装GoAccess


(4)配置中文环境

设置系统 Locale 为中文

bash 复制代码
[root@localhost goaccess-1.7.2]# localectl set-locale LANG=zh_CN.UTF-8

验证Locale 是否生效

(5)GoAccess生成中文报告
(6)测试访问

浏览器访问:http://192.168.10.101/report.html

3.nginx vts简介

Nginx 的 VTS 模块(Virtual Host Traffic Status) 是一个开源监控工具,用于实时收集和分析 Nginx 的流量、性能指标及状态数据。以下是其核心功能和特点:

实时监控

统计每个虚拟主机(server 块)的请求量(QPS)、带宽使用、响应时间、连接数 等关键指标。支持按状态码(如 2xx、4xx、5xx)分类统计请求

数据可视化

提供内置监控页面(默认路径 /status),通过图表和表格展示实时及历史数据。支持 JSON 格式输出,方便集成到 Prometheus、Grafana 等监控平台

扩展性

通过 Lua 脚本扩展自定义监控逻辑(如记录特定 API 的响应时间)。

可配置 数据存储策略(如保留最近 1 小时的数据)

报警集成

结合阈值规则触发告警(需配合外部工具如 Zabbix、Telegram Bot)

4.nginx vts安装

(1)编译安装vts


(2)nginx配置开启vts

修改nginx配置文件

复制代码
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf


(3)测试访问
相关推荐
橙子199110161 分钟前
说说 Kotlin 中的 Any 与 Java 中的 Object 有何异同?
java·开发语言·kotlin
我命由我123458 分钟前
Android 开发问题:Plugin [id: ‘org.jetbrains.kotlin.android‘] was not found
android·java·开发语言·java-ee·kotlin·安卓·android-studio
androidwork9 分钟前
使用 Kotlin 实现 Android 自定义 Lint 检查规则的步骤指南
android·java·kotlin
IT利刃出鞘1 小时前
Nginx--手写脚本压缩和切分日志(也适用于docker)
运维·nginx·docker
Orlando cron1 小时前
Jenkins分配对应项目权限与用户管理
java·运维·jenkins
曼岛_1 小时前
[Java实战]Spring Boot切面编程实现日志记录(三十六)
java·开发语言·spring boot
一点博客2 小时前
Redisson WatchDog会一直续期吗?
java·开发语言
coding随想2 小时前
多语言视角下的 DOM 操作:从 JavaScript 到 Python、Java 与 C#
java·javascript·python
不倒翁玩偶2 小时前
Python服务器请求转发服务
服务器·开发语言·python