一、为什么要做Nginx性能监控?

很多开发者在打理网站或服务时,常碰到这类问题:网站突然变卡,却不知道是请求太多、Nginx内存炸了,还是某个接口报错太多;或是想知道一天里哪个时段访问量最高,Nginx的连接处理能力能不能扛住。如果只靠看日志,不仅要翻好几页文件,还没法直观看到变化趋势,这时候就需要一套能实时展示Nginx状态的监控方案——把分散的运行数据变成清晰的图表,一眼就能看出问题在哪。

二、用到的核心工具

要实现这个需求,我们选三个成熟的工具搭一套轻量方案:Prometheus负责采集和存储Nginx的运行数据,Grafana负责把这些数据做成可视化图表,还有Nginx的配套小工具Exporter(专门给Prometheus捞数据的采集器),整套工具都用官方维护的版本,稳定性有保障,不用自己写复杂代码。

三、具体实现步骤

1.1 给Nginx开监控接口

首先要在Nginx里加一个专门返回运行状态的接口,不用额外编译Nginx(默认就带这个功能),只需要修改Nginx的配置文件,在http块里加一段代码:

# Nginx配置片段,放在http区块内
server {
    listen 80;
    server_name 你的域名或服务器IP; # 替换成实际地址,比如localhost
    # 开启Nginx状态监控的接口
    location /nginx_status {
        stub_status on; # 这个参数必须加,才会返回状态数据
        access_log off; # 关闭这个接口的访问日志,减少Nginx开销
        allow 127.0.0.1; # 只允许本地(就是服务器自己)访问这个接口,安全第一
        deny all; # 其他IP都拒绝访问,防止泄露Nginx状态
    }
}

改完配置后,重启Nginx,用浏览器或curl访问http://你的IP/nginx_status,能看到一串数字,这就是Nginx的原始状态数据。

1.2 安装Exporter,把Nginx数据递给Prometheus

Exporter是Prometheus的“数据搬运工”,专门负责把Nginx的状态数据转成Prometheus能认的格式,这里用Docker安装更简单,不用处理依赖:

# 拉取官方的Nginx Exporter镜像,版本选稳定的0.11.0
docker pull nginx/nginx-prometheus-exporter:0.11.0
# 启动Exporter,连接刚才开的nginx_status接口,端口映射成9113
# host.docker.internal是Docker容器访问宿主机的固定地址,适合开发/测试环境
docker run -d -p 9113:9113 nginx/nginx-prometheus-exporter:0.11.0 --nginx.scrape-uri=http://host.docker.internal/nginx_status

启动后,访问http://你的IP:9113/metrics,能看到一堆以nginx_开头的指标,说明数据已经搬过来了。

1.3 配置Prometheus存储数据

Prometheus需要知道要从哪里捞数据,所以要写它的配置文件prometheus.yml,内容如下:

# Prometheus配置文件,全局设置
global:
  scrape_interval: 15s # 每隔15秒捞一次数据,这个间隔不会给Nginx加太多负担
# 要采集的目标配置
scrape_configs:
  - job_name: 'nginx' # 这个采集任务的名字,随便起
    static_configs:
      # 刚才Exporter的地址,host.docker.internal:9113
      - targets: ['host.docker.internal:9113']

然后启动Prometheus,用Docker命令:

# 启动Prometheus,指定刚才的配置文件,端口映射成9090
docker run -d -p 9090:9090 -v /你放prometheus.yml的路径:/etc/prometheus/prometheus.yml prom/prometheus:v2.45.0

启动后访问http://你的IP:9090/targets,能看到nginx这个任务状态是UP,说明采集正常。

1.4 用Grafana做可视化图表

Grafana是专门做图表的工具,它有现成的Nginx监控面板,不用自己写图表,导入就能用:

  1. 启动Grafana,默认端口是3000,账号密码都是admin;
  2. 添加Prometheus数据源,地址填http://host.docker.internal:9090,保存测试成功;
  3. 导入官方的Nginx面板,面板ID是10649,导入后就能看到现成的图表:活跃连接数、总请求数、错误率、内存占用这些核心指标,还能选时间范围,看一天或一周的变化趋势。

四、方案的应用场景

这个轻量方案特别适合几类场景:一是个人站长的小网站,不想买昂贵的监控工具,几分钟就能搭好;二是中小团队的Nginx节点,要快速排查运行异常,比如请求报错突增、连接数不够用;三是云服务器上的Nginx实例,要做性能基线对比,比如节假日高峰期和平时的性能差异;还有做A/B测试时,对比两个Nginx节点的请求处理能力。

五、方案的优缺点

这套方案的优点很明显:一是搭建简单,全步骤都是复制粘贴就能完成,不用写复杂代码;二是可视化直观,现成的面板已经覆盖了大部分核心指标,不用自己调图表;三是资源占用低,Exporter和Prometheus都是轻量工具,不会给服务器加负担;四是可扩展性强,以后要加其他监控项,只要改Exporter或Prometheus配置就行。 缺点也有:一是只能监控Nginx本身,没法看到Nginx后端应用的处理时间,要全链路监控得加其他工具;二是如果有多个Nginx集群,管理Exporter的工作量会增加,不过用Prometheus的服务发现能解决;三是默认的Nginx指标有限,要监控接口级别的请求统计,得换更复杂的VTS模块,稍微多一步配置。

六、落地时的注意事项

第一是安全:刚才配置的nginx_status接口只允许本地访问,要是对外用,一定要加基础认证,不然会泄露Nginx的连接、请求量这些敏感数据,可能被攻击者利用;第二是采集间隔:scrape_interval别设太短,比如设成5秒,会增加Nginx和Prometheus的负载,15-30秒最合适;第三是版本匹配:Exporter、Prometheus和Nginx的版本尽量选官方最近维护的稳定版,避免出现兼容性问题;第四是数据存储:Prometheus默认只存15天的数据,要长期存得加Thanos这类远程存储工具;第五是端口:开放的9113(Exporter)、9090(Prometheus)、3000(Grafana)端口,别给外网直接开放,要在防火墙里限制IP访问。

七、方案总结

这套基于Prometheus和Grafana的Nginx监控方案,是目前轻量运维里最实用的选择之一,不用复杂的架构,就能快速实现Nginx状态的实时监控和可视化,帮助开发者快速排查性能问题、优化配置。不管是个人站长、中小团队还是学生练手,都能轻松上手,落地后能直观掌握Nginx的运行状况,少走很多运维的弯路。