如何让你的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 ngx_cache_purge模块的使用

    web缓存位于内容源Web服务器和客户端之间,当用户访问一个URL时,Web缓存服务器会去后端Web源服务器取回要输出的内容,然后,当下一个请求到来时,如果访问的是相同的URL,Web缓存服务器直接输出内容给客户端,而不是向源服务器再次发送请求.Web缓存降低了内容源Web服务器,数据库的负载,减少了网络延迟,提高了用户访问的响应速度,增强了用户体验. we…

    Nginx 2023年4月12日
    00
  • nginx的简单转发请求之server和location配置详解

    请听我详细讲解“nginx的简单转发请求之server和location配置详解”。 需要了解的前置知识 在进行nginx简单转发的配置之前,需要了解一些基本的前置知识,包括:- nginx的基本配置语法- nginx的server块和location块的作用及配置方法- 转发请求的相关概念及方式 server配置详解 在nginx中,server块用来配置…

    Nginx 2023年5月16日
    00
  • CentOS7.5下开发systemctl管理的自定义Nginx启动服务程序

      一、systemctl知识简介 从CentOS7 Linux开始,系统里的网络服务启动已经从传统的service改成了systemctl(一个systemd工具,主要负责控制systemd系统和服务管理器。),管理开机自启动的命令也从chkconfig改为了systemctl,由systemctl一个命令代替了CentOS7以前系统中的service和c…

    Nginx 2023年4月11日
    00
  • Nginx 配置过程的具体步骤

    下面是Nginx配置过程的具体步骤攻略。 步骤一:安装Nginx 首先需要安装Nginx,以Ubuntu系统为例,可以使用以下命令进行安装: sudo apt-get update sudo apt-get install nginx 步骤二:配置Nginx监听端口 默认情况下,Nginx监听80端口,如果需要修改端口,可以编辑Nginx配置文件 /etc/…

    Nginx 2023年5月16日
    00
  • nginx+防盗链+下载大文件+路径直接获取文件

    今天突然接到leader的issue,说超过一个G的大文件,下载不了。于是立马,查配置查资料。结果看到几个陌生名词。 下载大文件: nginx: X-Accel-Redirect  //nginx自带,很方便,尤其和yii框架结合使用,更方便。squid: X-Accelerator-Varyapache: X-Sendfile   //apache的一个第…

    Nginx 2023年4月12日
    00
  • 深入理解Nginx:模块开发与架构解析

    《深入理解Nginx:模块开发与架构解析》基本信息作者: 陶辉 出版社:机械工业出版社ISBN:9787111414780上架时间:2013-3-20出版日期:2013 年4月开本:16开页码:1版次:1-1所属分类:计算机 > 计算机网络 > Web Server > WebServer更多关于 》》》《深入理解Nginx:模块开发与架构…

    Nginx 2023年4月16日
    00
  • Nginx服务器配置文件完全解析

    当我们使用Nginx作为Web服务器来托管我们的网站时,配置文件就是我们进行配置的载体。因此,了解和掌握Nginx服务器配置文件的语法和基本结构是非常必要的。下面就为您介绍Nginx服务器配置文件的完全解析攻略。 1. 理解Nginx服务器配置文件的结构 在了解Nginx配置文件的语法之前,我们可以先来介绍一下它的基本结构。Nginx的配置文件是由多个指令和…

    Nginx 2023年5月16日
    00
  • nginx配置返回文本或json的方法

    下面是讲解“nginx配置返回文本或json的方法”的完整攻略。 方法一:返回文本 在nginx配置文件中,使用add_header指令来设置响应头部信息,如下所示: location /text { add_header Content-Type text/plain; return 200 "Hello, World!"; } 上述配…

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