DataDog/nginx-datadog
GitHub: DataDog/nginx-datadog
Datadog 官方维护的 Nginx 动态模块,提供开箱即用的 APM 分布式链路追踪和应用安全防护能力。
Stars: 39 | Forks: 11

[](https://codecov.io/gh/DataDog/nginx-datadog)
# Datadog Nginx 模块
本仓库包含 `ngx_http_datadog_module` 的源代码,这是一个 Nginx 模块,用于将 Datadog [APM](https://docs.datadoghq.com/tracing) 和 [Application Security Management](https://docs.datadoghq.com/security/application_security) 集成到 Nginx 中。
## 用法
1. 从[最新发布版本](https://github.com/DataDog/nginx-datadog/releases)中下载一个 gzip 压缩包,将其解压到 Nginx 查找模块的目录(例如 `/usr/lib/nginx/modules/`)。
2. 在 Nginx 主配置文件(例如 `/etc/nginx/nginx.conf`)的顶部添加以下行:
```
load_module modules/ngx_http_datadog_module.so;
```
默认情况下,链路追踪(Tracing)会自动添加到所有端点。有关更多信息,请参阅 [API 文档](doc/API.md)。
## 兼容性
针对以下每种组合:1) Nginx 版本,2) 架构,3) 是否内置 AppSec,都有两个压缩包(实际的 executable module 和单独的调试符号)。主压缩包包含一个文件 `ngx_http_datadog_module.so`,即 Datadog Nginx 模块。
命名规则如下:
* `ngx_http_datadog_module-
-.so.tgz`:不带 AppSec 支持的构建版本。
* `ngx_http_datadog_module-appsec--.so.tgz`:带有 AppSec 支持的构建版本。
支持的架构(``)为 `amd64` 和 `arm64`。
虽然**可能**可以针对较旧版本构建扩展,但这不受保证;特别是 AppSec 构建需要版本 1.21.4 中引入的功能。
## 默认行为
除非另行配置,`ngx_http_datadog_module` 会为 Nginx 添加以下默认行为:
### 链路追踪 (Tracing)
- 连接到位于 `http://localhost:8126` 的 Datadog agent。
- 为每个请求创建一个 span:
- 服务名称为 "nginx"。
- 操作名称为 "nginx.request"。
- 资源名称为 `"$request_method $uri"`,例如 "GET /api/book/0-345-24223-8/title"。
- 包含多个 `http.*` [标签](https://github.com/DataDog/nginx-datadog/blob/535a291ce96d8ca80cb12b22febac1e138e45847/src/tracing_library.cpp#L187-L203)。
可以通过 Nginx 配置文件中的 [datadog\_*](doc/API.md) 系列指令或通过[环境变量](https://github.com/DataDog/dd-trace-cpp/blob/main/include/datadog/environment.h)指定自定义配置。
## 启用 AppSec
要启用 AppSec,除了使用正确的二进制文件(名称中带有 "-appsec" 的发布构件)外,还需要编辑 Nginx 配置:
* 设置 `datadog_appsec_enabled on;`。
* 定义一个(或多个)线程池。
* 选择 AppSec 将使用的线程池,可以在全局范围或按 location 进行选择。
有关更多信息,请参阅[文档](doc/API.md)。
## 构建模块
如果您使用的 Nginx 版本不再受本仓库支持,可以按照以下步骤构建模块。
本仓库对其某些依赖项使用 [git submodules](https://git-scm.com/book/en/v2/Git-Tools-Submodules)。为了确保在构建之前所有依赖项都可用或已更新,请运行以下命令:
```
git submodule update --init --recursive
```
### 前置条件
在构建模块之前,请确保您的环境满足以下要求:
- 较新的 C 和 C++ 工具链(`clang` 或 `gcc/g++`)(必须至少支持某些 C++20 特性)。
- make。
- CMake `v3.24` 或更新版本。
- 架构为 `x86_64` 或 `arm64`。
### 使用 Docker 构建
我们推荐使用 Docker,这可以大大简化各种环境的构建过程。以下是针对不同构建目标的具体命令和选项。
#### 为 Nginx 构建
```
WAF=ON ARCH=x86_64 NGINX_VERSION=1.27.1 make build-musl
```
选项:
- `WAF=`:启用 (`ON`) 或禁用 (`OFF`) AppSec。
- `ARCH=`:指定 CPU 架构。
- `NGINX_VERSION=`:指定要构建的 Nginx 版本。
Nginx 模块将在 `.musl-build\ngx_http_datadog_module.so` 处生成。
### 使用 Docker 为 OpenResty 构建
要为 OpenResty 构建模块:
```
WAF=ON ARCH=x86_64 RESTY_VERSION=1.27.1.1 make build-openresty
```
选项:
- `WAF=`:启用 (`ON`) 或禁用 (`OFF`) AppSec。
- `ARCH=`:指定 CPU 架构。
- `RESTY_VERSION=`:指定要构建的 OpenResty 版本。
Nginx 模块将在 `.musl-build\ngx_http_datadog_module.so` 处生成。
### 使用 Docker 为 Ingress Nginx 构建
要为 [Ingress Nginx](https://github.com/kubernetes/ingress-nginx) 构建模块:
```
WAF=ON ARCH=x86_64 INGRESS_NGINX_VERSION=1.11.2 make build-ingress-nginx
```
选项:
- `WAF=`:启用 (`ON`) 或禁用 (`OFF`) AppSec。
- `ARCH=`:指定 CPU 架构。
- `INGRESS_NGINX_VERSION=`:指定要构建的 Ingress Nginx 版本。
Nginx 模块将在 `.musl-build\ngx_http_datadog_module.so` 处生成。
## 致谢
本项目主要基于先前的工作。请参阅 [CREDITS.md](CREDITS.md)。标签:API集成, APM, ASM, Bash脚本, Datadog, Nginx, SRE, Web服务器, 中间件, 偏差过滤, 分布式追踪, 动态链接库, 可观测性, 安全模块, 应用性能监控, 性能分析, 架构可视化, 站点可靠性工程, 请求拦截, 请求追踪