前言

作为一名使用Nginx的运维工程师或开发者,监控Nginx的运行状态和流量情况是保证服务稳定性和性能优化的重要环节。你可能已经使用过Nginx内置的http_stub_status_module来获取基本监控指标,但或许也感受到了它在功能上的局限。

本文将带你深入了解如何安装更强大的nginx-module-vts模块,并全面对比这两个监控方案的差异,帮助你做出更合适的选择。


一、Nginx监控概述

1.1 为什么需要监控Nginx

Nginx作为高性能的Web服务器和反向代理服务器,承载着业务的关键流量。通过监控Nginx,我们可以:

  • 实时了解服务器健康状况
  • 及时发现性能瓶颈和异常情况
  • 为容量规划和性能优化提供数据支撑
  • 分析流量 patterns 和用户行为

1.2 常见监控方案简介

Nginx监控主要有两种方式:使用内置的stub_status模块或第三方模块如nginx-module-vts

二、stub_status模块的使用与局限

2.1 stub_status模块简介

ngx_http_stub_status_module是Nginx的一个内置模块,提供基本的Nginx性能统计数据。 但这个模块默认不会编译进Nginx,需要在编译时通过指定--with-http_stub_status_module参数来启用。

2.2 配置和使用stub_status

stub_status配置方式可以参考Nginx 实战系列(二)—— Nginx 配置文件与虚拟主机搭建

2.3 stub_status的局限性

虽然stub_status模块提供了一些基本指标,但它存在以下局限:

  • 只有整个服务器级别的基础连接和请求统计数据,缺乏虚拟主机(server block)级别的详细统计
  • 没有缓存统计信息,如FastCGI、uWSGI和代理缓存的使用情况和命中率
  • 缺乏上游服务器(upstream)群集统计,无法了解后端服务器的健康状况、响应时间和失败次数
  • 分类统计缺失,不支持按HTTP方法或状态码进行数据分类统计
  • 数据格式简单,只提供纯文本格式,难以与监控系统集成

三、nginx-module-vts模块的安装与配置

3.1 nginx-module-vts模块简介

nginx-module-vts(Virtual Host Traffic Status Module)是一个第三方开发的Nginx模块,提供更详细和全面的监控数据。 它能够采集包括虚拟主机级别统计、缓存统计、上游服务器统计等在内的多维数据。

3.2 安装nginx-module-vts

3.2.1 下载模块

首先下载nginx-module-vts模块:

wget https://github.com/vozlt/nginx-module-vts/archive/refs/heads/master.zip -O nginx-module-vts-master.zip
unzip nginx-module-vts-master.zip
mv nginx-module-vts-master /usr/local/

在这里插入图片描述

3.2.2 编译Nginx并添加模块

进入Nginx源码目录,重新编译并添加vts模块:

# 安装依赖环境
yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

# 配置编译参数,添加vts模块
cd cd /opt/nginx-1.20.2  # 你的nginx解压的目录(不是安装目录)
./configure --add-module=/usr/local/nginx-module-vts-master/ # 在原参数基础上添加

# 编译
make

手动替换二进制文件:

systemctl stop nginx  #关闭服务
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.backup    # 备份旧版本
cp /opt/nginx-1.20.2/objs/nginx /usr/local/nginx/sbin/nginx              # 替换为新编译的二进制文件
systemctl start nginx #重启服务

在这里插入图片描述

3.2.3 配置Nginx

在nginx.conf配置文件中添加以下配置:

vim /usr/local/nginx/conf/nginx.conf
http {
    # 添加共享内存区域配置
    vhost_traffic_status_zone;
    
    # 启用按主机名统计(当有多个server_name时很重要)
    vhost_traffic_status_filter_by_host on;
    
    server {
        listen 80;
        server_name localhost;
        
        # 状态监控端点
        location /status {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
            # 访问控制设置
            allow 192.168.10.110;
            deny all;
        }
    }
}

3.2.4 重启Nginx并测试

重启Nginx服务后,访问http://your-server/status即可看到监控页面。

在这里插入图片描述

3.4 nginx-module-vts的高级配置

3.4.1 多种输出格式支持

vts模块支持多种输出格式,便于集成到不同监控系统:

location /status {
    vhost_traffic_status_display;
    vhost_traffic_status_display_format html; # 支持html、json、prometheus格式
}

3.4.2 禁用特定server的统计

如果不想统计某些server区块,可以禁用统计:

server {
    server_name example.com;
    vhost_traffic_status off;
    # 其他配置...
}

3.4.3 共享内存大小调整

对于高流量网站,可能需要增加共享内存大小:

http {
    vhost_traffic_status_zone shared:vhost_traffic_status:10m;
    # 其他配置...
}

注意:共享内存配置过小会导致统计丢失,建议每1万QPS预留1MB内存。

四、stub_status与nginx-module-vts的全面对比

4.1 功能对比

功能特性 stub_status nginx-module-vts
安装方式 内置模块,需编译时启用 第三方模块,需重新编译Nginx
统计粒度 全局统计 支持虚拟主机、上游服务器等多维度统计
缓存统计 不支持 支持FastCGI、uWSGI和代理缓存统计
上游服务器监控 不支持 支持上游服务器群集健康状况、响应时间
HTTP状态码统计 不支持 支持按HTTP状态码分类统计
数据输出格式 纯文本 HTML、JSON、Prometheus多种格式
集成便利性 需要自行解析文本 轻松集成Prometheus、Grafana等监控系统
社区活跃度 官方维护,稳定 社区维护,更新较慢

4.2 性能影响

nginx-module-vts采用共享内存技术实现零性能损耗,每秒可处理百万级请求统计,相比传统日志分析,延迟降低90%,内存占用减少70%。 但在高并发场景下,仍需根据QPS适当调整共享内存大小。

4.3 使用场景建议

  • stub_status适用场景

    • 简单监控需求,只需要基本连接数和请求数统计
    • 资源有限,不想重新编译Nginx
    • 快速查看Nginx基本状态
  • nginx-module-vts适用场景

    • 需要详细的虚拟主机级别统计
    • 需要监控上游服务器健康状况和性能
    • 需要集成Prometheus+Grafana监控栈
    • 需要分析HTTP状态码分布和请求方法分布
    • 需要监控缓存命中率和效果

总结

从简单的stub_status模块到功能强大的nginx-module-vts,Nginx监控方案的选择应根据实际需求和环境复杂程度来决定。

  • 如果你只需要基本的状态监控,并且不想重新编译Nginx,那么stub_status模块足以满足需求。
  • 如果你需要详细的监控数据,并且计划构建完整的监控体系(如集成Prometheus+Grafana),那么nginx-module-vts模块是更好的选择,尽管它需要重新编译Nginx。

无论选择哪种方案,定期监控Nginx性能指标都是保证服务稳定性和性能优化的重要环节。通过合理的监控策略,可以及时发现潜在问题,确保服务器高效稳定运行。

注意事项

  1. 生产环境中编译安装新模块前,应在测试环境充分验证
  2. 注意访问控制,避免监控接口暴露给公网
  3. 根据业务流量合理配置共享内存大小,避免统计丢失
  4. 统一多节点时区设置,避免时间戳漂移问题
Logo

电影级数字人,免显卡端渲染SDK,十行代码即可调用,工业级demo免费开源下载!

更多推荐