宝塔Nginx添加nginx-moudle-vts模块并添加Prometheus

最近需要对服务器每个站点进行流量监控,从而筛查出服务器中高负载的站点进行迁移。

nginx-moudle-vts更新后增加了原生的Prometheus的支持 后面不用再装一个中间件了

碰到这个问题首先就是想到再nginx增加拓展模块进行实现,但是宝塔的nginx和通常直接安装的nginx有些不太相同,不能直接网上基于普通Nginx的教程来解决问题,经过一些磕磕盼盼我也总结了一些心得记录下来进行分享。

常规路径

  1. 创建nginx-module目录
mkdir -p /www/server/nginx-modules/

2.移动到目录并且克隆仓库

cd /www/server/nginx-modules/
git clone git@codechina.csdn.net:mirrors/vozlt/nginx-module-vts.git

3.卸载原有宝塔Nginx 重新安装Nginx版本并勾选 编译安装 注意Nginx的设置保存

这里一定要注意保存Nginx的全局配置 ,配置内容在 软件中心-已安装-Nginx 中的 ”配置修改“,这部分的配置信息会因为宝塔卸载nginx而被删除,其他vhost的站点设置因为存储位置不同可以幸免于难。

编译安装中注意选择”添加自定义模块“

在模块参数添加:

--add-module=/www/server/nginx-modules/nginx-module-vts

剩下随便填写,点击提交

上图红框位置都需要勾选上 然后选择提交进行编译。等待编译完成。

4. 检查编译结果

[root@localhost ~]# nginx -V

nginx version: nginx/1.20.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 1.1.1k  25 Mar 2021
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/www/server/nginx --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/ngx_cache_purge --add-module=/www/server/nginx/src/nginx-sticky-module --with-openssl=/www/server/nginx/src/openssl --with-pcre=pcre-8.43 --with-http_v2_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_stub_status_module --with-http_ssl_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt=-Wl,-E --with-cc-opt=-Wno-error --with-ld-opt=-ljemalloc --with-http_dav_module --add-module=/www/server/nginx/src/nginx-dav-ext-module --add-module=/www/server/nginx-modules/nginx-module-vts

看到 最后含有一开始创建用于存放模块的目录即可认为编译成功。

5. 应用模块

我这里就选择一个最方便的方案 直接使用phpmyadmin的888端口的/status目录进行功能挂载。方便享受phpmyadmin的内网策略,防止信息泄露。

.............
http
    {
    vhost_traffic_status_zone; #开启Nginx-VTS功能
       .......

server
    {
        listen 888;
        server_name phpmyadmin;
        index index.html index.htm index.php;
        root  /www/server/phpmyadmin;
        location /status {
		vhost_traffic_status_display;
		vhost_traffic_status_display_format html;
        }#添加Nginx-VTS访问路径
       ..........

        access_log  /www/wwwlogs/access.log;
    }
include /www/server/panel/vhost/nginx/*.conf;
}

为了不让博文显得又臭又长 我对通用配置进行了删减 留下了重要的配置信息,并打上了备注。而后访问一下http://ip:888/status即可观察到所有站点信息,另外VTS只记录开始以后的站点(vhost)产生的流量信息,对于未被访问的站点VTS并不会显示出来。

6. 直连Prometheus

因VTS版本的更新,新增Prometheus的直连功能 直连链接如下:

http://ip:888/status/format/prometheus

知道链接后可直接添加在prometheus的配置文件中,以下内容使用yaml方式书写

- job_name: "Servers_Nginx"
    metrics_path: /status/format/prometheus
    #访问路径
    static_configs:
      - targets: 
        - HK18:888
        - server30:888

填写好之后Prometheus重启即可使用。

以上就是常规的部署方案,但是编译nginx导致的业务中断时间可短可长,有很大的不稳定性,不太适合生产环境,所以诞生了一条”从未设想的道理“

从未设想的道路

已知重装nginx并选择编译安装会导致业务的不稳定中断,所以可以提前编译好nginx执行文件替换线上文件即可。

线上运行文件位置位于:/www/server/nginx/sbin/nginx 大小约为4.5M

添加拓展后的Nginx文件大小约为12M左右

替换掉线上文件,再手动重启一次nginx即可完成整套编译流程。

可能遇到的问题

Nginx-VTS路径访问报错 501 Not Implemented

解决方案: 问题出在没有再nginx总设置里添加 vhost_traffic_status_zone;开启VTS功能

Nginx编译模块闪退 或 编译模块完成后 nginx显示未安装

解决方案:检查模块路径书写是否正常。宝塔不会报编译错误,所以会直接弹出安装成功。通常这种错误会导致在很短的时间(10S)内完成安装。