通过Nginx正向代理接入ARMS

本文介绍如何通过Nginx正向代理接入ARMS应用监控。

使用场景

对于非阿里云环境(包括线下数据中心以及其他云环境)的应用,只要网络能和ARMS服务端连通,就可以接入ARMS应用监控。您可以选择通过公网接入,或者通过专线接入,具体接入方式请参见应用监控接入概述

如果应用所在的环境只有特定的机器可以连通公网,就需要通过正向代理进行中转。对于大多数用户而言,正向代理通常是不需要的,但金融系统等对网络安全性有特殊要求场景,可能存在这样的需求。

前提条件

  • 已自行部署Nginx,并确保Nginx的稳定运行。

  • 该方案目前暂不支持4.x版本探针,请先使用3.x版本探针接入,探针版本说明请参见探针(Java Agent)版本说明

架构方案

image

如图所示,在用户所在IDC,业务应用部署区的Java应用无法访问公网,只有DMZ区域具备访问公网的能力,可以通过如下两个步骤进行正向代理转发:

  1. DMZ区域部署Nginx,参见本文提供的Nginx配置脚本,将ARMS探针上报的监控数据转发到阿里云ARMS服务端。

  2. 修改ARMS探针的配置,将DMZ区域部署的Nginx作为监控数据上报目标。

Nginx配置

步骤一:安装部署Nginx

请先确保Nginx已经安装,并具备公网访问能力,Nginx的安装方式请参见Nginx官方文档

步骤二:获取ARMS接入点信息

根据需要接入的阿里云地域,获取ARMS接入点域名,以及ACM引擎的IP地址。具体操作,请参见Java应用监控网络配置

步骤三:获取阿里云账号ID

获取阿里云账号ID,具体操作,请参见如何查看阿里云账号ID?

步骤四:修改Nginx配置文件

修改/etc/nginx/site-available/default文件,添加如下内容:

server {
  listen 80 default_server;
  listen [::]:80 default_server;

  server_name arms-service;
  ignore_invalid_headers off;

  # 请将数字部分替换为步骤三中获取的阿里云账号ID
  location /1672753017****** {
    # 请将URL替换为步骤二中获取的持续剖析接入点
    proxy_pass http://arms-profiling-cn-shenzhen.oss-cn-shenzhen.aliyuncs.com;
  }

  location / {
    # 请将URL替换为步骤二中获取的调用链接入点
    proxy_pass http://arms-dc-sz.aliyuncs.com;
  }
}

server {
  listen 9990;
  server_name arms-meta;
  ignore_invalid_headers off;
  location / {
    # 请将URL替换为步骤二中获取的调用链接入点
    proxy_pass http://arms-dc-sz.aliyuncs.com:9990;
  }
}

server {
  listen 80;
  server_name arms-metrics;
  ignore_invalid_headers off;

  location / {
    # 请将URL替换为步骤二中获取的指标接入点
    proxy_pass http://cn-shenzhen.arms.aliyuncs.com;
  }
}

server {
  listen 8080;
  server_name arms-acm;
  ignore_invalid_headers off;

  location / {
    return 200 $server_addr;
  }
}

server {
  listen 8848;
  server_name arms-acm;
  ignore_invalid_headers off;

  location / {
    # 请将IP地址替换为步骤二中获取的ACM引擎IP地址
    proxy_pass http://139.196.XX.XX:8848;
  }
}

修改/etc/nginx/nginx.conf文件,添加如下内容:

stream {
    upstream arms-arthas {
        # 请将URL替换为步骤二中获取的调用链接入点
        server arms-dc-sz.aliyuncs.com:9092;
    }

    server {
        listen 9092;
        proxy_pass arms-arthas;
    }
}

ARMS探针配置

目前ARMS正向代理模式支持手动接入的探针,以及通过Kubernetes环境自动接入的探针。请先参考手动安装探针通用Kubernetes环境自动安装探针文档安装探针。探针安装完成之后,数据上报目标为ARMS的公网接入点,由于Java应用所在的环境没有公网访问能力,所以暂时无法接入ARMS。参考本节内容,将探针的数据上报目标修改为Nginx之后,即可成功接入ARMS。

手动安装模式

步骤一:修改hosts

修改应用所在机器的/etc/hosts文件,添加如下内容,请将IP地址替换为NginxIP地址。

10.0.0.201 arms-service
10.0.0.201 arms-metrics
10.0.0.201 arms-meta
10.0.0.201 arms-acm
# 将域名中的cn-shanghai替换为对应的阿里云地域代码
10.0.0.201 arms-profiling-cn-shanghai.arms-service

步骤二:修改探针配置文件

在探针目录下找到arms-agent.config配置文件,修改如下配置项对应的值:

# 如下5个配置项在所有版本的ARMS探针中都存在
profiler.collector.trace.endpoint=arms-service
profiler.collector.metric.endpoint=arms-metrics
profiler.collector.meta.endpoint=arms-meta
profiler.collector.endpoint=arms-service
profiler.acm.endpoint=arms-acm
# 探针版本为3.2.0+新增了profiler.oss.endpoint配置项,需要将此配置的值修改为arms-service
profiler.oss.endpoint=arms-service

Kubernetes环境自动安装模式

说明

通过容器环境自动接入的探针,需要版本在3.2.0或以上才能使用正向代理模式。如果您的探针版本低于3.2.0,请先升级探针,具体操作,请参见升级ARMS探针

步骤一:获取探针配置文件的内容

对于已经自动安装ARMS探针的Java应用,登录其中的一个Pod,可以在/home/admin/.opt/ArmsAgent/arms-agent.config路径找到探针的配置文件,复制其中的内容。

步骤二:创建ConfigMap

针对上一步复制的内容,修改如下配置项对应的值:

profiler.collector.trace.endpoint=arms-service
profiler.collector.metric.endpoint=arms-metrics
profiler.collector.meta.endpoint=arms-meta
profiler.collector.endpoint=arms-service
profiler.acm.endpoint=arms-acm
profiler.oss.endpoint=arms-service

创建名为arms-agent-proxy-mode.configConfigMap,填入修改后的内容:

apiVersion: v1
kind: ConfigMap
metadata:
  name: arms-agent-proxy-mode.config
data:
  arms-agent.config: |-
    ### arms-agent.config的其他内容复制过来,只修改6个配置项 ####
    profiler.collector.trace.endpoint=arms-service
    profiler.collector.metric.endpoint=arms-metrics
    profiler.collector.meta.endpoint=arms-meta
    profiler.collector.endpoint=arms-service
    profiler.acm.endpoint=arms-acm
    profiler.oss.endpoint=arms-service
    ### arms-agent.config的其他内容复制过来,只修改6个配置项 ####

步骤三:修改应用YAML

参考以下内容,修改应用所在工作负载的YAML。

apiVersion: apps/v1
kind: Deployment
metadata:    
  labels:
    app: spring-boot-demo
  name: spring-boot-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-boot-demo
  template:
    metadata:
      labels:
        app: spring-boot-demo
        armsPilotAutoEnable: "on"
        armsPilotCreateAppName: spring-boot-demo
    spec:
      hostAliases:
      # 将此IP替换为Nginx的IP
      - ip: "192.168.172.171" 
        hostnames:
        - "arms-service"
        - "arms-metrics"
        - "arms-meta"
        - "arms-acm"
        # 将域名中的cn-shanghai替换为对应的阿里云地域代码
        - "arms-profiling-cn-shenzhen.arms-service"
      containers:
        - env:
            # 将探针配置指向修改后的新的配置文件
            - name: ARMS_CONFIG_FILE
              value: /home/admin/.opt/ArmsAgent/arms-agent-proxy-mode.config
          image: >-
            registry.cn-hangzhou.aliyuncs.com/ahas_apsara_adp/spring-boot-demo:wt-test
          imagePullPolicy: Always
          name: spring-boot-demo
          ports:
            - containerPort: 80
              protocol: TCP
          resources:
            limits:
              cpu: 500m
              memory: 1Gi
            requests:
              cpu: 250m
              memory: 512Mi
          volumeMounts:
            # 作为新的配置文件,挂载到探针目录
            - mountPath: /home/admin/.opt/ArmsAgent/
              name: arms-agent-proxy-mode
      imagePullSecrets:
        - name: wt-test
      volumes:
        # 将configMap映射成名为arms-agent-proxy-mode的volume
        - configMap:
            name: arms-agent-proxy-mode.config
          name: arms-agent-proxy-mode
说明

上述YAML中,带注释的部分是需要关注并修改的内容。

确认接入成功

重启应用,等待2分钟左右,若您的应用出现在ARMS控制台应用监控 > 应用列表页面中且有数据上报,则说明接入成功。