如何讓你的Nginx支持分布式追蹤詳解
Background
NGINX 是一個(gè)通用且流行的應(yīng)用程序。也是最流行的 Web 服務(wù)器,它可用于提供靜態(tài)文件內(nèi)容,但也通常與其他服務(wù)一起用作分布式系統(tǒng)中的組件,在其中它用作反向代理、負(fù)載均衡 或 API 網(wǎng)關(guān)。
分布式追蹤 distributed tracing
是一種可用于分析與監(jiān)控應(yīng)用程序的機(jī)制,將追蹤在從源到目的的整個(gè)過程中的單個(gè)請求,這與僅通過單個(gè)應(yīng)用程序域來追蹤請求的形式不同。
換句話說,我們可以說分布式追蹤是對跨多個(gè)系統(tǒng)的多個(gè)請求的拼接。拼接通常由一個(gè)或多個(gè)相關(guān) ID 完成,并且跟蹤通常是一組記錄的、跨所有系統(tǒng)的結(jié)構(gòu)化日志事件,存儲在一個(gè)中心位置。
在這種背景的情況下, OpenTracing
應(yīng)運(yùn)而生。OpenTracing
是一個(gè)與應(yīng)用供應(yīng)商無關(guān)的 API,它可幫助開發(fā)人員輕松地跟蹤單一請求的域。目前有多種開源產(chǎn)品都支持 OpenTracing(例如,Jaeger
, skywalking
等),并將其作為一種檢測分布式追蹤的標(biāo)準(zhǔn)化方法。
本文將圍繞,從0到1實(shí)現(xiàn)在nginx配置分布式追蹤的架構(gòu)的簡單實(shí)例說明。本文實(shí)例使用的組件為
nginx-1.22
jaeger-all-in-on v1.38
nginx-opentracing v1.22
jaeger-client-cpp v0.9
源碼構(gòu)建nginx-opentracing
準(zhǔn)備nginx-opentracing
nginx-opentracing 倉庫中可以看到,官方為每個(gè)nginx版本都提供了一個(gè)編譯好的動態(tài)庫(Nginx1.19.13+),我們可以直接拿來使用這個(gè)動態(tài)庫,如果你想將這個(gè)利用Nginx 提供的編譯參數(shù) --add-module=/path/to/module
構(gòu)建為nginx的內(nèi)置功能的話,可能會出現(xiàn)一些問題,例如下面的一些錯(cuò)誤:
ngx_http_opentracing_module.so/config was found
/root/nginx-opentracing-0.25.0/opentracing//src/ngx_http_opentracing_module.cpp In file included from /root/nginx-opentracing-0.25.0/opentracing//src/ngx_http_opentracing_module.cpp:1:0: /root/nginx-opentracing-0.25.0/opentracing//src/load_tracer.h:3:38: fatal error: opentracing/dynamic_load.h: No such file or directory
根據(jù) issue 中查詢得知 nginx-opentracing
需要嵌入到nginx中,是需要一些 opentracing-cpp 因?yàn)閷++不熟,嘗試調(diào)試很久還是上面的錯(cuò)誤,故直接使用了官方提供的動態(tài)庫。
準(zhǔn)備jaeger-client-cpp
根據(jù) nginx-opentracing
中提到的,還需要一個(gè) jaeger-client-cpp 的 tracer
才可以正常運(yùn)行(這也是作為jaeger架構(gòu)中的角色)
來到 jaeger-client-cpp
看到Release提供的編譯好的動態(tài)庫已經(jīng)很久了,而最新版都沒有提供相應(yīng)編譯的版本,需要我們自己編譯
說明: 編譯依賴CMake 3.3+,gcc 4.9.2+
我們的編譯環(huán)境使用CentOS 7 默認(rèn)gcc與CMake都符合要求需要自行編譯兩個(gè)的版本。
編譯gcc
gcc下載地址:https://ftp.gnu.org/gnu/gcc/
cd gcc-5.4.0 ./contrib/download_prerequisites mkdir gcc-build-5.4.0 cd gcc-build-5.4.0 /usr/local/src/gcc-5.4.0/configure \ --enable-checking=release \ --enable-languages=c,c++ \ --disable-multilib make && make install
引用處理 refer 1
cd /usr/bin/ mv gcc gcc_back mv g++ g++_back ln -s /usr/local/bin/gcc gcc ln -s /usr/local/bin/g++ g++
編譯時(shí)遇到幾個(gè)問題
/lib64/libstdc++.so.6: version GLIBCXX_3.4.20' not found
gcc 編譯,libgcc
動態(tài)庫有改動,恢復(fù)原狀即可
configure: error: C++ compiler missing or inoperational make[2]: \*** [configure-stage1-libcpp] Error 1 make[2]: Leaving directory `/home/clay/programming/C++/gcc-4.8.1' make[1]: \*** [stage1-bubble] Error 2 make[1]: Leaving directory `/home/clay/programming/C++/gcc-4.8.1' make: \*** [all] Error 2
編譯cmake
./configure --prefix=/path/to/app make make install
這里遇到一個(gè)小問題 編譯過程中遇到 [libstdc++.so.6: version GLIBCXX_3.4.20 not found
因?yàn)檫@里使用了自己編譯的gcc版本,需要指定下動態(tài)庫的路徑 refer 2
LD_LIBRARY_PATH=/usr/local/lib64 ./configure --prefix=/usr/local/cmake
編譯jaeger-client-cpp
這里根據(jù)官方提供的步驟操作即可
cd jaeger-client-cpp-0.9.0/ mkdir build cd build # 這里建議使用下強(qiáng)國特色上網(wǎng),編譯過程中會使用Hunter自動下載所需的依賴項(xiàng) ALL_PROXY=http://x.0.0.x:10811 /usr/local/cmake/bin/cmake .. make
注:依賴項(xiàng)挺大的,下載時(shí)間可能很長,會hang主,只需等待結(jié)束即可
?編譯完成后 libjaegertracing.so.0.9.0
則是我們需要的
編譯nginx
./configure \ --user=web_www \ --group=web_www \ --with-pcre \ --with-compat \ --with-http_ssl_module \ --with-http_gzip_static_module \ --prefix=/root/nginx \ --with-http_stub_status_module
--with-compat
必須加上,表面允許使用動態(tài)庫,否則編譯完在啟動時(shí)會報(bào)下面的錯(cuò)誤
nginx: [emerg] module "/root/nginx/conf/ngx_http_opentracing_module.so" is not binary compatible in /root/nginx/conf/nginx.conf:1
遇到的問題,cc nou found
,這里只需將 gcc
軟連接一份為 cc
即可
配置nginx
準(zhǔn)備jaeger-client的配置
jaeger.json
{ "service_name": "nginx", // 服務(wù)名 "sampler": { "type": "const", "param": 1 }, "reporter": { "localAgentHostPort": "jaeger:6831" // jaeger agent的地址 }, "headers": { // jaeger的默認(rèn)的jaeger Baggage頭設(shè)置 "jaegerDebugHeader": "jaeger-debug-id", "jaegerBaggageHeader": "jaeger-baggage", "traceBaggageHeaderPrefix": "uberctx-" }, "baggage_restrictions": { "denyBaggageOnInitializationFailure": false, "hostPort": "" } }
在nginx中開啟opentracing
# 加載 OpenTracing 動態(tài)模塊。 load_module conf/ngx_http_opentracing_module.so; worker_processes 1; user root root; events { worker_connections 1024; } http { log_format opentracing '{"timestamp":"$time_iso8601",' '"source":"$server_addr",' '"hostname":"$hostname",' '"ip":"$http_x_forwarded_for",' '"traceID":"$opentracing_context_uber_trace_id",' '"clie
注:這里使用的
opentracing-nginx
的動態(tài)庫為 ot16 ,linux-amd64-nginx-1.22.0-ot16-ngx_http_module.so.tgz
,另外一個(gè)版本不兼容,-t
檢查語法時(shí)會提示
此時(shí)我們可以在jaeger上查看,可以看到 NGINX 的 span(因?yàn)檫@里只配置了NGINX,沒有配置更多的后端)。
Reference
1 CentOS7 升級 GCC 到 5.4.0 版本
2 libstdc++.so.6: version GLIBCXX_3.4.20 not found
3 nginx load_module
總結(jié)
到此這篇關(guān)于如何讓你的Nginx支持分布式追蹤的文章就介紹到這了,更多相關(guān)Nginx支持分布式追蹤內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。