>[danger] Swoole Tracker 目前僅支持 Linux 系統,不支持Unix、Windows、Mac OS;不支持ARM架構;支持 PHP5.4、5.5、5.6、7.0、7.1、7.2、7.3、7.4、8.0。
[TOC]
## 安裝部署
### 第一步:后臺申請
在[官網](https://business.swoole.com/SwooleTracker/apply)申請后聯系識沃科技客服,獲取軟件包
### 第二步:安裝Agent進程
點擊客戶端包后的**下載**,會得到一個名為`swoole-tracker-install.sh`的腳本,上傳到機器后進行如下操作:
>[danger] 如果使用 wget 下載,文件名為注冊的手機號,操作和下文相同
```bash
chmod +x swoole-tracker-install.sh
./swoole-tracker-install.sh
```
執行完成后,會在當前目錄下生成`swoole-tracker`文件夾,目錄結構如下
```
.
├── app_deps
├── deploy_env.sh
├── inst.sh
├── musl-compat
├── swoole_tracker54.so #對應各版本的擴展
├── swoole_tracker55.so
├── swoole_tracker56.so
├── swoole_tracker70.so
├── swoole_tracker71.so
├── swoole_tracker72.so
├── swoole_tracker73.so
└── swoole_tracker74.so
```
### 第三步:安裝擴展
根據你的機器PHP版本安裝對應的擴展,復制對應的擴展到PHP環境擴展安裝目錄
>[info] 獲取擴展安裝目錄:php -ini | grep extension 或者php -r "echo @ini_get("extension_dir").PHP_EOL;"
```
cp swoole_tracker70.so /your_php_extensions_path/swoole_tracker.so
```
> [danger] 若擴展安裝不上,可使用下載包中的`inst.sh`進行安裝,或者聯系識沃客服尋求幫助
在 `php.ini` 中加入以下配置
```ini
zend_extension=swoole_tracker.so
;打開總開關
tracker.enable=1
;采樣率 例如:100%
tracker.sampling_rate=100
;開啟內存泄漏檢測時添加 默認0 關閉狀態
tracker.enable_memcheck=1
```
>[danger] `enable`為 1 時表示調用統計百分百攔截并上報
> `sampling_rate`采樣率只作用于鏈路追蹤,設置為 100 則表示每次請求都會生成一條 trace 數據
#### 卸載不兼容擴展
1. xdebug
2. ioncube loader
3. zend guard loader
4. xhprof
5. swoole_loader (加密后的代碼不能進行分析)
### 第四步:重啟PHP服務
安裝完成后,需要**重啟對應的 SwooleServer 或者 php-fpm 服務**,發生請求后稍等片刻,等待服務端接收客戶端發送的數據。
>[success] 以上操作會在宿主機直接安裝,如果你需要在Docker中部署,請看下文
## 在Docker環境中部署客戶端
>[danger] 請注意修改相關路徑為你自己的路徑!!!以下的swoole.so只是演示說明可安裝其他擴展,swoole_tracker不依賴swoole擴展
在docker環境部署需要修改Dockerfile或者docker-compose.yml或者在`docker run`命令中添加參數,以下以采用官方docker-compose v3.7配置文件格式,php:fpm-7.x(-alpine)鏡像為例,描述如何在docker部署
### 修改Dockerfile以部署node-agent
在Dockerfile中執行 `swoole-tracker-install.sh` 來部署node-agent,然后在entrypoint中添加node-agent,例如
```dockerfile
# dockerfile的其他部分
# 部署node-agent
ADD swoole-tracker-install.sh /tmp/
RUN chmod +x /tmp/swoole-tracker-install.sh && \
cd /tmp/ && \
./swoole-tracker-install.sh && \
rm /tmp/swoole-tracker-install.sh
# 添加entrypoint腳本
RUN printf '#!/bin/sh\n/opt/swoole/script/php/swoole_php /opt/swoole/node-agent/src/node.php &\nphp-fpm $@' > /opt/swoole/entrypoint.sh && \
chmod 755 /opt/swoole/entrypoint.sh
# 啟用entrypoint腳本(-x方便調試, 可以去掉)
ENTRYPOINT [ "sh", "-x", "/opt/swoole/entrypoint.sh" ]
```
### 啟用擴展
對于官方鏡像php:fpm系列,php(-fpm)默認讀取/usr/local/etc/php/conf.d下的配置文件,默認的entrypoint會將"-"開頭的參數作為fpm啟動參數,因此可以采用以下方式啟用swoole_tracker擴展
在Dockerfile添加配置文件:
```dockerfile
RUN printf 'extension=/path/to/swoole.so\nextension=/path/to/swoole_tracker7x.so\n' > /usr/local/etc/php/conf.d/swoole-tracker.ini
```
或在docker-compose.yml添加啟動參數
```yml
services:
your-service:
build:
context: cgi-docker
dockerfile: Dockerfile
image: myphpfpm:1
command:
- "-dextension=/path/to/swoole.so"
- "-dextension=/path/to/swoole_tracker7x.so"
```
或在docker run命令中添加啟動參數
```bash
docker run --other-arguments myphpfpm:1 -dextension=/path/to/swoole.so -dextension=/path/to/swoole_tracker7x.so
```
### 配置docker安全選項
擴展中使用了默認權限不允許的系統調用,使用了docker默認seccomp配置不允許的系統調用,需要額外配置:
參考https://docs.docker.com/engine/security/seccomp/
對于權限配置,可以添加SYS_PTRACE cap,或者使用提升權限模式(不推薦)
對于seccomp,可以修改seccomp配置,或關閉seccomp配置(不推薦,這將導致docker內程序可以執行create_module,kexec_load等危險系統調用)
### 修改seccomp配置
修改seccomp配置文件(修改自[默認文件](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json))):
```
--- a.json
+++ b.json
# 在.syscalls[0].names中加入"ptrace",這將允許ptrace
@@ -359,7 +359,8 @@
"waitid",
"waitpid",
"write",
- "writev"
+ "writev",
+ "ptrace"
],
"action": "SCMP_ACT_ALLOW",
"args": [],
# 如果你的docker較新,則它已經配置了ptrace在4.8以上內核可用
# 參考https://github.com/moby/moby/commit/1124543ca8071074a537a15db251af46a5189907
# 移除這段
@@ -369,18 +370,6 @@
},
- {
- "names": [
- "ptrace"
- ],
- "action": "SCMP_ACT_ALLOW",
- "args": null,
- "comment": "",
- "includes": {
- "minKernel": "4.8"
- },
- "excludes": {}
- },
{
"names": [
"personality"
],
"action": "SCMP_ACT_ALLOW",
```
在docker run使用該seccomp并給予SYS_PTRACE權限:
```bash
docker run --other-arguments --cap-add=SYS_PTRACE --security-opt seccomp=/path/to/that/modified/profile.json ...
```
或docker-compose.yml中:
```yml
# 在docker-compose.yml中:
services:
your-service:
build:
context: cgi-docker
dockerfile: Dockerfile
image: myphpfpm:1
# 給予SYS_PTRACE權限
cap_add:
- "SYS_PTRACE"
# 配置使用修改的seccomp
security_opt:
- "seccomp=/path/to/that/modified/profile.json"
```
### 關閉seccomp(不推薦)
與修改配置類似,但不需要創建json,將 `seccomp=/path/to/that/modified/profile.json`換成`seccomp=unconfined`即可
## 管理客戶端進程
查看 [常見問題](qa.md) 中的「管理NodeAgent守護進程」