簡介
Nginx 是一款流行的高性能 HTTP 和反向代理服務器,以輕量、穩定、併發處理能力強著稱。對 Nginx 進行鏈路追蹤,能在分佈式系統中清晰呈現請求經 Nginx 轉發後的完整路徑,這不僅讓問題定位更高效,可快速鎖定延遲、錯誤等問題發生的具體環節,還能通過追蹤其處理請求的耗時、轉發延遲等數據,精準識別系統性能瓶頸,為優化資源分配和架構設計提供依據。
觀測雲
觀測雲採集器 DataKit 支持 ddtrace 採集插件,能夠接收 nginx-datadog 模塊的鏈路數據並在平台統一分析。
部署 DataKit
登錄觀測雲控制枱,點擊「集成」-「DataKit」-「Linux」,複製安裝命令在服務器執行即可。
開啓 ddtrace 插件
按照以下步驟操作:
# 進入 ddtrace 採集器配置文件目錄
cd /usr/local/datakit/conf.d/ddtrace
# 開啓配置文件
cp ddtrace.conf.sample ddtrace.conf
# 重啓 Datakit
datakit service -R
配置 Nginx
按照以下步驟操作:
1、訪問 https://github.com/DataDog/nginx-datadog/releases ,在 Assets 中尋找並下載與當前處理器架構和版本匹配的模塊 ngx_http_datadog_module-<處理器架構>-<版本>.so.tgz;
2、執行以下操作創建模塊路徑,假設 Nginx 安裝在默認路徑,配置 Nginx:
# 配置 Nginx
cd /usr/local/nginx
mkdir modules && cd $_
3、上傳第一步中下載的模塊至 modules 目錄,執行以下命令解壓,解壓後將獲得 ngx_http_datadog_module.so 文件:
tar xzvf ngx_http_datadog_module-<處理器架構>-<版本>.so.tgz
4、在配置文件 /usr/local/nginx/conf/nginx.conf 的最頂部加載模塊,以在 HTTP 上下文(上下文概念請參考“配置上下文和配置項” 章節)中進行配置為例,註釋中包含詳細説明:
# 加載模塊
load_module modules/ngx_http_datadog_module.so;
worker_processes 1;
events {
worker_connections 1024;
}
http {
# 配置 Datakit URL
datadog_agent_url http://localhost:9529;
# 配置服務名稱
datadog_service_name nginx-demo;
# 配置環境名稱
datadog_environment test;
# 配置版本名稱
datadog_version 1.0.0;
# 配置採樣率 0-1.0
datadog_sample_rate 1.0;
# 配置標籤
datadog_tag foo bar;
include mime.types;
default_type application/octet-stream;
# 通過 $datadog_trace_id 和 $datadog_span_id 為日誌加入 trace_id 和 span_id,均為 16 進制
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
'"$datadog_trace_id" "$datadog_span_id"';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
該模塊默認開啓從請求中提取追蹤上下文,默認支持 tracecontext 和 datadog 兩種協議,可通過如下配置增加對 b3 協議的支持:
datadog_propagation_styles=tracecontext datadog b3
效果展示
配置上下文和配置項
nginx-datadog 模塊將 Nginx 的配置文件劃分為如下上下文區域:
# "main" context
# ...
events {
# ...
}
http {
# "http" context
# ...
server {
# "server" context
# ...
listen 80;
location /ping {
# "location" context
# ...
}
location /auth {
if ($request_method = POST) {
# "if" context
# ...
}
# ...
}
}
}
相同配置項可在不同的上下文區域中配置,例如 datadog_service_name 配置支持 http、server、location 三個不同的上下文區域,如果需要為不同的 server 分別配置服務名稱,則可以在 server 上下文中分別配置,完整配置列表參考:https://github.com/DataDog/nginx-datadog/blob/master/doc/API.md 。
此外,該模塊能夠支持通過環境變量進行配置,例如為應用增加額外的數據標籤,在配置環境變量後啓動 Nginx:
export DD_TAGS=layer:proxy,foo:bar
nginx
最終將在數據的 message.meta 中看到定義的標籤,可用於配置的環境變量列表參考:https://docs.datadoghq.com/tracing/trace_collection/library_c... 。
自行編譯所需版本的模塊
datadog-nginx 是一個較新的模塊,Github 中官方預編譯的版本支持範圍有限,因此可使用容器化構建的方式編譯所需版本。執行以下命令,構建 Nginx 所需的模塊:
mkdir -p $HOME/workspace/nginx-datadog-build && cd $_
git clone https://github.com/DataDog/nginx-datadog.git
cd nginx-datadog/
# 拉取項目中引用的子模塊
git submodule update --init --recursive
# 查看最新版本
git tag
# 檢出到最新 tag
git checkout v1.6.2
# 確認當前檢出的標籤
git status
# 根據需求替換 platform、ARCH、NGINX_VERSION
# 以 Nginx 版本 1.27.1 為例,構建 amd64 架構的模塊
# 注意:
# 構建過程中容器內部會拉取 Github 上的一些倉庫,如果因為無法訪問 Github 導致構建中斷,可為容器增加以下環境變量配置代理:
# - http_proxy=<proxy-addr>
# - https_proxy=<proxy-addr>
docker run --init --rm \
--platform linux/x86_64 \
--env ARCH=x86_64 \
--env BUILD_TYPE=RelWithDebInfo \
--env NGINX_VERSION=1.27.1 \
--env NGINX_SRC_DIR=$HOME/workspace/nginx-datadog-build/nginx-datadog/nginx \
--env WAF=OFF \
--env RUM=OFF \
--env COVERAGE=OFF \
--mount "type=bind,source=$HOME/workspace/nginx-datadog-build/nginx-datadog,destination=/mnt/repo" \
public.ecr.aws/b1o7r7e0/nginx_musl_toolchain:latest \
make -C /mnt/repo build-musl-aux
# 打包製品
cd $HOME/workspace/nginx-datadog-build/nginx-datadog/.musl-build
tar czvf ngx_http_datadog_module-amd64-1.27.1.so.tgz ngx_http_datadog_module.so
注意:
- 模塊構建成功並不意味在最終集成時不存在兼容性問題,以在引入模塊後執行
nginx -t命令檢查的結果為準; - 構建配置遵循 nginx-datadog 項目 Makefile 中的變更。