如何让你的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反向代理之多端口映射的实现

    为了详细讲解Nginx反向代理实现多端口映射的完整攻略,我们需要分为以下几个步骤: 安装 Nginx 在Ubuntu系统中,可以通过以下命令进行Nginx的安装: sudo apt-get update sudo apt-get install nginx 在Centos系统中,可以通过以下命令进行Nginx的安装: sudo yum install epe…

    Nginx 2023年5月16日
    00
  • Nginx基础02:配置文件nginx.conf(Part1)

    我们使用Nginx主要是通过其配置文件nginx.conf来实现的。按照一定的规则,编写特定的指令,可以帮助我们实现对Web服务的控制!所以,学习Nginx的用法,几乎就是学习nginx.conf! 如何使用本篇文章 本文作为一篇高度总结和罗列nginx.conf中所有的基础配置项,循规蹈矩地按照文章的顺序阅读的方式不可取 笔者建议所有读者,先看目录,掌握N…

    2023年4月10日
    00
  • nginx的启动流程和接客流程

      把这些日子看nginx的一些笔记整理了下,准备放在这里,发现越整理越大,这次有些比较粗糙,下次按照各个模块在细化下 主要是两部分,诞生准备接客流程,和接客服务流程。为了清晰点,这里只分析单进程的nginx,对于多个工作进程的nginx模式,这里暂时不讨论。   诞生准备接客流程    nginx的这个小baby诞生前的初始化工作若干,这里的小baby特指…

    Nginx 2023年4月11日
    00
  • 替换gitlab自带的Nginx,并修改仓库存储路径

    默认情况下,gitlab使用自带的Nginx,占用80端口,这样就与系统原本安装的Nginx冲突。导致其中一个nginx无法启动; 解决方案: 禁用gitlab自带Nginx 并把 UNIX套接字 更改为 TCP端口 禁用捆绑的Nginxvim /etc/gitlab/gitlab.rb   将 nginx[‘enable’] = true 修改为 ngin…

    Nginx 2023年4月10日
    00
  • nginx是如何处理一个请求的(包含https配置)

    配置https首先要有ssl证书,这个证书目前阿里有免费的,但如果自己做实验,也是可以自签证书,只不过不受信 openssl genrsa -des3 -out server.key 1024             ##创建服务器私钥 openssl req -new -key server.key -out server.csr     ##创建签名请求…

    Nginx 2023年4月13日
    00
  • Nginx HTTP变量原理

    L:72     首先如何获取url追加参数值 如: http://www.xxx.com?a=1&b=2 return 200 ‘$arg_a, $arg_b’; #通过前缀 arg_a 就能获取到 参数a http 请求的相关变量(一) arg_参数 url中某个具体的参数值 query_string 与args变量完全相同 取到问号后所有内容 …

    Nginx 2023年4月13日
    00
  • nginx 变量相关的map模块与split_clients模块及geo模块和geoip模块及keepalive介绍

    map 模块指令默认编译进nginx的 Syntax: map string $variable { … } # 表示string匹配到{}里的值或变量赋值给$variable Default: — Context: http Syntax: map_hash_bucket_size size; Default: map_hash_bucket_size…

    Nginx 2023年4月13日
    00
  • nginx 配置301转发

    学习nginx 推荐 http://www.nginx.cn/nginx-how-to    1. 设置域名解析     daijun.me 指向 234.33.22.21   2.主机234.33.22.21 nginx配置 转发  server { listen 80; server_name daijun.me www.daijun.me; acces…

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