如何让你的Nginx支持分布式追踪详解

我将会为你详细讲解如何让Nginx支持分布式追踪的完整攻略。

简介

在分布式系统架构中,追踪每个请求在整个系统中的流转和响应时间就非常重要。分布式追踪工具是常用于解决这个问题的一种技术方案。在架构设计中,Nginx 是一个高性能的web服务器,作为反向代理用途广泛,本文将介绍如何在Nginx 中配置分布式追踪。如果您还没有了解过分布式追踪的相关知识,请先学习相关的理论知识和技术。

安装和集成Zipkin

安装Zipkin

首先,您需要安装 Zipkin 服务。可以通过以下链接前往 Github 安装相关的服务:https://github.com/openzipkin/zipkin

$ wget -O zipkin.jar 'https://search.maven.org/remote_content?g=io.zipkin&a=zipkin-server&v=LATEST&c=exec'
$ java -jar zipkin.jar

在上述命令中,wget 命令会将最新的 zipkin-server 包下载到本地。然后,使用 java 命令启动该服务。

集成Zipkin

Nginx 可以通过 OpenTracing 插件将 Zipkin 集成到您的系统中。要启用 OpenTracing 插件,只需要将 nginx_opentracing.so 库文件复制到 Nginx 模块位置,然后编辑 Nginx 配置文件以支持 OpenTracing。在每个代理位置,都需要添加 opentracing 配置以支持追踪系统。

为了使 Nginx 支持 OpenTracing,需要在 Nginx 安装目录里添加以下内容:

load_module modules/ngx_http_opentracing_module.so;

然后,将 lua-resty-openidc 模块文件夹复制到 Nginx 加载路径下。您可以在这里找到 lua-resty-openidc /ngx_http_opentracing_module.so 模块文件的资源:https://github.com/opentracing-contrib/nginx-opentracing/blob/master/Dockerfile

配置OpenTracing支持

在一个Nginx配置文件中,添加以下指令以启用 OpenTracing 支持:

http {

    ...

    opentracing_load_tracer /usr/local/lib/libzipkin_opentracing_plugin.so /usr/local/lib/libzipkin_opentracing_plugin.so:zipkin_ot_init;

    ...

    server {

        ...

        opentracing on;
        opentracing_server_url http://localhost:9411/api/v1/spans;
        opentracing_trace_methods POST PUT;

        ...
    }
}

在这里我们配置了 Zipkin 的源(/api/v1/spans),并限制我们想监视的HTTP方法(POST 和PUT)。

这个指令首先告诉 OpenTracing 加载我们要使用的跟踪插件,这里是我们刚才安装 Zipkin 服务后生成的 libzipkin_opentracing_plugin.so 文件。然后,我们需要指定 Zipkin 服务的源 URL。

开始收集

现在,您已经完成了 Zipkin 的集成和配置。重启 Nginx 并启动 Zipkin 服务,开始分析您的应用程序的跟踪数据。

示例

接下来,我们将通过一个示例来展示如何配置 Nginx 支持分布式追踪。

假设您的应用程序通过Nginx作为反向代理运行。我们来看一个简单的 Web 应用程序,它运行在 http://localhost:3000 上,我们需要对应用程序进行一些修改以支持 OpenTracing 。

修改Web应用程序

我们可以使用 Zipkin 提供的 tracer 对象来创建跟踪环境。以下是一个基于 Node.js 和 Express 的简单示例:

const express = require('express');
const { Tracer, ConsoleRecorder, BatchRecorder } = require('zipkin');
const zipkinOpentracing = require('zipkin-instrumentation-opentracing');
const bodyParser = require('body-parser');
const axios = require('axios');

const tracer = new Tracer({
  recorder: new BatchRecorder({
    logger: {
      logSpan: () => {},
      logSpans: () => {}
    },
    timeout: 10000
  })
});

const zipkinMiddleware = zipkinOpentracing.expressMiddleware({ tracer });

const app = express();

...

app.use(bodyParser.json());
app.use(zipkinMiddleware);

app.get('/test', async (req, res) => {
  const { data } = await axios.get('http://localhost:3000/data');
  res.send(data);
});

...

在这个示例中,我们使用了 axios 发送 HTTP 请求并捕获了响应。这允许我们跟踪 HTTP 请求和响应。通过使用 zipkin-instrumentation-opentracing 模块,我们可以将这些信息发送到 Zipkin 服务。在这个例子中,我们使用了 expressMiddleware() 函数将跟踪信息添加到每个请求和响应。

修改Nginx配置

在Nginx中,我们需要将以下代码添加到server配置中来添加OpenTracing的支持:

http {

    ...

  opentracing_load_tracer /usr/local/lib/libzipkin_opentracing_plugin.so /usr/local/lib/libzipkin_opentracing_plugin.so:zipkin_ot_init;

    ...

  server {
    listen 8080;
    server_name localhost;

    location / {
      proxy_pass http://localhost:3000;
      proxy_http_version 1.1;

      # Immediately forward the headers received from the client with the proxy request.
      proxy_set_header Connection "";
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

      # Extract the trace context from incoming client headers using HTTP Transport.
      opentracing_header_pass request-message-id;

      # Forward the trace context downstream using HTTP transport.
      opentracing_propagate_on;
    }
  }
}

这段配置文件中包含多个指令,下面是指令的详细说明:

  • opentracing_load_tracer:它的作用是告诉 OpenTracing 使用什么样的追踪器(tracer)。我们使用 Zipkin 的追踪器,在上一节中已经对它进行了配置。
  • opentracing_header_pass:当我们在 Nginx 配置中使用 “opentracing_header_pass” 指令时,OpenTracing 会从 HTTP 请求头中提取追踪 ID。此处我们配置提取 request-message-id 标题的追踪 ID。
  • opentracing_propagate_on:当添加这个指令时,Http Transport 将会传递完整的追踪信息到下游服务。

现在,启动您的应用程序,单击浏览器地址栏的“刷新”按钮,您就可以在 Zipkin UI 中查看应用程序的追踪数据了。

参考文献:

  1. https://opentracing.io/guides/nginx/
  2. https://github.com/opentracing-contrib/nginx-opentracing

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何让你的Nginx支持分布式追踪详解 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • 修改Nginx源码实现worker进程隔离实现详解

    下面我将详细讲解“修改Nginx源码实现worker进程隔离实现详解”的完整攻略,并包含两条示例说明。 什么是worker进程隔离? 在Nginx中,worker进程是用来处理请求的进程。多个worker进程可以同时处理多个请求,以达到并行处理请求的目的。但是,在默认情况下,所有的worker进程之间是共享资源的,例如内存、文件描述符等。这样就会出现一个问题…

    Nginx 2023年5月16日
    00
  • Nginx定义域名访问方式

    下面是关于Nginx定义域名访问方式的完整攻略。 步骤1:安装Nginx 首先需要在服务器上安装Nginx。如果已经安装了,请跳过此步骤。 sudo apt update sudo apt install nginx 步骤2:配置虚拟主机 虚拟主机允许多个网站在同一个服务器上运行。要定义域名访问方式,需要先配置虚拟主机。 打开默认配置文件。 sudo nan…

    Nginx 2023年5月16日
    00
  • nginx的location与proxy_pass配置超详细讲解及其有无斜杠( / )结尾的区别

    本文所使用的环境信息如下: windows11 (主机系统) virtual-box-7.0环境下的ubuntu-18.04 nginx-1.22.1 (linux) 斜杠结尾之争 实践中,nginx里最常用的指令就是location和proxy_pass了。前者用于为不同请求uri指定不同nginx配置,后者用于匹配的location进行转发(通常是动态内…

    2023年4月10日
    00
  • nginx-(/etc/init.d/nginx)启动脚本

    #!/bin/bash #nx Startup script for the Nginx HTTP Server # it is v.0.0.2 version. # chkconfig: – 85 15 # description: Nginx is a high-performance web and proxy server. # It has a l…

    Nginx 2023年4月10日
    00
  • Nginx+Tomcat负载均衡集群安装配置案例详解

    Nginx+Tomcat负载均衡集群是在Web应用开发中比较常用的技术架构之一。以下为该技术架构安装配置的详细攻略。 1. 安装Tomcat 安装Tomcat并配置Tomcat集群,这里不做赘述。 2. 安装Nginx 安装Nginx 使用以下命令安装Nginx: sudo apt-get update sudo apt-get install nginx …

    Nginx 2023年5月16日
    00
  • Nginx+keepalived负载均衡

      1、安装Nginx $ yum -y install gcc            # nginx是c写的 $ yum -y install pcre-devel   # url重写用到的包 $ yum -y install zlib  zlib-devel    # 解压缩用到的包   扩展①: yum install -y lsof lsof -i:…

    Nginx 2023年4月10日
    00
  • nginx 负载均衡配置

              worker_processes 2; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; # upstream 配置一组后端服务器, # 请求转发到upstream后,nginx按策略将…

    Nginx 2023年4月10日
    00
  • Nginx的异步非阻塞

    同步与异步 同步与异步的理解 同步与异步的重点在消息通知的方式上,也就是调用结果通知的方式。 同步:当一个同步调用发出去后,调用者要一直等待调用结果的通知后,才能进行后续的执行。 异步:当一个异步调用发出去后,调用者不能立即得到调用结果的返回。 异步调用,要想获得结果,一般有两种方式: 1、主动轮询异步调用的结果; 2、被调用方通过callback来通知调用…

    Nginx 2023年4月9日
    00
合作推广
合作推广
分享本页
返回顶部