为什么需要流量监控
一般来说,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
现在可以慢慢查看与分析自己每个站点的流量数据了!
Comments NOTHING