为什么需要流量监控

一般来说,nginx 和云服务厂商提供的流量监控只能精确到主机,但是如果使用 Nginx 反代建立了很多个站点,那就没法区分哪些流量归谁了。幸好,nginx-module-vts 插件可以做到分网站区分流量,以及其他很细致的指标。

安装 Tailscale(可选)

建立虚拟内网,在其之上传输监控数据更加方便、安全。(夫人,你也不想你的监控数据被别人看到吧?

如果在公网传输,Prometheus可以在配置文件设置 basic_auth 认证,但是比较麻烦;Nginx VTS 则不清楚怎么设置认证。

详见:大内网战略(1):使用 Tailscale 搭建 VNet – Eterance的小窝

nginx-module-vts 安装

插件 repo 地址:https://github.com/vozlt/nginx-module-vts

参考:给已经运行的Nginx安装nginx-module-vts模块_已安装nginx,再安装vts_习惯了想你的博客-CSDN博客

以下命令在此之前基于我的 Nginx 使用宝塔面板安装。非宝塔面板安装的需要自行修改 Nginx 的路径。

下载插件

进入 root:

sudo -i

下载压缩包解压:

cd /www/server/nginx/src
wget -O nginx-module-vts-0.2.2.tar.gz https://github.com/vozlt/nginx-module-vts/archive/refs/tags/v0.2.2.tar.gz
tar -zxvf nginx-module-vts-0.2.2.tar.gz
rm nginx-module-vts-0.2.2.tar.gz

编译安装

首先 nginx -V 查看编译参数(configure arguments)。我的:

nginx version: nginx/1.22.1
built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
built with OpenSSL 1.1.1q  5 Jul 2022
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 --add-module=/www/server/nginx/src/ngx_http_substitutions_filter_module-master --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

然后把宝塔的 nginx 整个备份:

cp -r /www/server/nginx /www/server/nginx-bak

configure:

./configure <原来的参数> --add-module=/www/server/nginx/src/nginx-module-vts-0.2.2

比如我的:

./configure  --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 --add-module=/www/server/nginx/src/ngx_http_substitutions_filter_module-master --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/src/nginx-module-vts-0.2.2

编译:

make

替换之前的 nginx

cp /www/server/nginx/sbin/nginx /www/server/nginx/sbin/nginx.bak
rm /www/server/nginx/sbin/nginx
cp /www/server/nginx/src/objs/nginx /www/server/nginx/sbin/nginx

退出 root

exit

访问配置

回去宝塔,在 nginx 配置的相应位置添加下面两段(端口号 41758 和路径 nginx-status 可随意修改 ):

http {
  vhost_traffic_status_zone;

  server {
    listen 41758;
    location /nginx-status {
        vhost_traffic_status_display;
        vhost_traffic_status_display_format html;
    }
  }
}

保存并重启、重载配置。防火墙和安全组放行端口 41758。(如果你使用 tailscale 组虚拟内网,不需要放行的公网端口,下同)

然后浏览器输入 ip:41758/nginx-status 即可访问:

更加推荐的做法是在宝塔新建一个网站,然后把 server 块里的 location 内容挪到网站的配置下(server 块剩下的丢弃,不要留在 Nginx 主配置里),这样就可以更清楚地看到监控本身的流量,以及给监控网址上 SSL 。

最推荐)如果你安装了 tailscale,可以将建立的网站名改为 tailscale-ip:端口 ,只监听 tailscale-ip,服务完全不暴露在公网;或者解析一个内网域名。

如果没啥问题,可以删除备份:

sudo rm -rf /www/server/nginx-bak

Prometheus 安装

Prometheus 用来收集 nginx-vts 的数据,所以可以安装在不同的服务器上。

参考:手把手搭建Nginx监控:基于Nginx-vts & Prometheus_nginx vts alert_码拉小农虾的博客-CSDN博客

普罗米修斯官网:https://github.com/prometheus/prometheus

首先新建普罗米修斯的配置文件:

sudo mkdir -p /usr/local/etc/prometheus
sudo vim /usr/local/etc/prometheus/prometheus.yml

然后复制粘贴下面的内容(按需修改):

# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]

  # 自己建立的 Nginx 监视服务
  - job_name: "nginx"
    # 如果你上了 SSL ,这里要改成https,下面的target端口是443
    scheme: http
    metrics_path: /nginx-status/format/prometheus
    static_configs:
    - targets: ['<域名或者ip>:80']
    # 更多targets:
    # - targets: ['aaa.xxx.com:80', 'bbb.xxx.com:80']

之后在 docker 中启动:(可以使用 portainer 可视化管理,详见:宝塔安装 Portainer 可视化管理 docker – Eterance的小窝

sudo docker run --name prometheus -d -p 9090:9090 -v /usr/local/etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

提示

如果你安装了 tailscale,可以修改上面命令为:-p <tailscale-ip>:9090:9090,就只能通过大内网访问 prometheus 了。

更进一步,你可以将修改上面命令为:-p 127.0.0.1:9090:9090,之后在宝塔新建网站(可以是外网域名也可以是内网域名),反代至 http://127.0.0.1:9090,即可使用域名访问 prometheus。

防火墙、安全组放行 9090 端口, 打开 ip:9090 ,就可以看到 nginx 结点了。

Grafana 安装

Grafana 用来图形化展示普罗米修斯收集的数据。

参考: 手把手搭建Grafana,图形化展示Nginx监控数据(接上篇vts监控nginx)_grafana图标化nginx_码拉小农虾的博客-CSDN博客

安装网页:Download Grafana | Grafana Labs

这里直接 docker 安装(注意我修改了宿主机的端口):

sudo docker run -d --name=grafana -p 9091:3000 grafana/grafana-enterprise:10.1.1-ubuntu

提示

和安装普罗米修斯类似,可以设置端口为 -p 127.0.0.1:9091:3000,之后在宝塔新建网站(可以是外网域名也可以是内网域名),反代至 http://127.0.0.1:9091,即可使用域名访问 Grafana。

同样的,也可以设置 Grafana 只允许通过 Tailscale 内网访问。不过,我选择了公网访问,这样比较方便。

输入 ip:9091,初始账号密码都是 admin(去官网注册了两个账号都不行才发现)。

右上角点击修改用户名

下面修改时区和语言:

添加数据源,选择第一个的普罗米修斯

之后回到首页,打开 dashboards

点击导入

搜索:https://grafana.com/grafana/dashboards/?search=nginx+vts

模板: 输入 12164,import(不要选最多人下的 2949,那个不能正确显示)(9785 也可以添加)

数据源选择普罗米修斯,import

现在可以慢慢查看与分析自己每个站点的流量数据了!