我将会为你详细讲解如何让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 中查看应用程序的追踪数据了。
参考文献:
- https://opentracing.io/guides/nginx/
- https://github.com/opentracing-contrib/nginx-opentracing
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何让你的Nginx支持分布式追踪详解 - Python技术站