Apache SkyWalking 安装指南
本文面向运维与开发工程师,提供 Apache SkyWalking 9.7.0 在 Ubuntu 22.04 上的完整安装流程,涵盖 JDK 依赖、二进制包下载与校验、OAP 与 UI 启动验证、Java Agent 接入 Tomcat 产生链路数据、systemd 服务托管与堆内存配置,全部步骤经过实测验证,可直接照做。
Apache SkyWalking 安装指南
目标:本文面向运维与开发工程师,提供 Apache SkyWalking 9.7.0 在 Ubuntu 22.04 上的完整安装流程,涵盖 JDK 依赖、二进制包下载与校验、OAP 与 UI 启动验证、Java Agent 接入 Tomcat 产生链路数据、systemd 服务托管与堆内存配置,全部步骤经过实测验证,可直接照做。
一、环境信息
本指南基于以下环境实测,所有命令与回显均真实执行,照做即可复现。
| 项目 | 值 |
|---|---|
| 操作系统 | Ubuntu 22.04.5 LTS |
| 发行版 | apache-skywalking-apm-9.7.0.tar.gz |
| Java Agent | apache-skywalking-java-agent-9.8.0.tgz |
| JDK | OpenJDK 17.0.20.1(openjdk-17-jre-headless) |
| 安装根目录 | /opt/skywalking |
| Agent 目录 | /opt/skywalking-agent |
| 被观测服务 | tomcat9(Ubuntu 软件包 9.0.58) |
| JVM 堆 | OAP 与 UI 均限制为 -Xms256m -Xmx512m |
| OAP 端口 | 11800(gRPC)/ 12800(REST) |
| UI 端口 | 8080 |
版本选择说明:SkyWalking 从 11.0.0 起主发行版不再内置 Java Agent 与 Web UI(需要单独下载或采用 BanyanDB 等外部存储),经典一体化发行版(自带 UI、开箱即用、默认 H2 存储)的最后一个版本为 9.7.0。本指南采用 9.7.0 主发行版加 9.8.0 Java Agent 的组合,也是目前生产中广泛使用的稳定组合。
二、前置条件
2.1 硬件与系统
- 可联网的 Linux 服务器(需能访问 archive.apache.org 下载安装包);
- 磁盘剩余空间不少于 3 GB(压缩包与解压目录合计约 1.5 GB,另留日志空间);
- 可用内存不少于 2 GB。
2.2 检查 Java
OAP 9.7.0 要求 JDK 8/11/17。Ubuntu 22.04 直接使用系统仓库安装:
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install -y openjdk-17-jre-headless
执行回显(节选):
Setting up openjdk-17-jre-headless:amd64 (17.0.20.1+1-1-22.04-Ubuntu) ...
验证版本:
java -version
openjdk version "17.0.20.1" 2026-08-18
OpenJDK Runtime Environment (build 17.0.20.1+1-1-22.04-Ubuntu)
OpenJDK 64-Bit Server VM (build 17.0.20.1+1-1-22.04-Ubuntu, mixed mode, sharing)
三、版本选型说明
选型前先确认两类组件的版本对应关系,SkyWalking 主发行版与 Java Agent 各自独立发版,可单独升级 Agent 而不动后端。
| 组件 | 说明 | 本指南选用 |
|---|---|---|
| 主发行版(OAP + UI) | bin/、config/、webapp/、oap-libs/ | 9.7.0 |
| Java Agent | skywalking-agent.jar 及插件目录 | 9.8.0(当前最新) |
| 存储 | 默认 H2(内存库),可换 MySQL/Elasticsearch 等 | H2(体验安装) |
查看官方归档当前提供的版本:
curl -s https://archive.apache.org/dist/skywalking/ | grep -oE 'href="[0-9.]+/"' | tail -3
href="9.5.0/"
href="9.6.0/"
href="9.7.0/"
查看 Java Agent 的最新版本:
curl -s https://archive.apache.org/dist/skywalking/java-agent/ | grep -oE 'href="[0-9.]+/"' | tail -1
href="9.8.0/"
四、安装方案对比与选择建议
| 对比项 | 方案 A:在线安装 tar.gz | 方案 B:离线安装 tar.gz |
|---|---|---|
| 是否需要联网 | 服务器需访问 archive.apache.org | 仅需一台可联网机器中转 |
| 安装包来源 | wget 直接下载 | 先在外部机器下载,scp 上传 |
| 完整性校验 | 下载后对比官方 sha512 | 传输前后各校验一次 sha512 |
| 安装动作 | 完全相同(解压到 /opt) | 完全相同(解压到 /opt) |
| 适用场景 | 普通服务器 | 隔离内网、安全审计严格的机房 |
两个方案的解压、启动、配置、验证步骤完全一致,差异仅在获取安装包的方式。方案 A 在线下载作为主流程展开,方案 B 仅补充分包与校验命令。
五、安装方案 A:官方 tar.gz 在线安装
5.1 下载主发行版并校验
cd /opt
wget -q https://archive.apache.org/dist/skywalking/9.7.0/apache-skywalking-apm-9.7.0.tar.gz
ls -l apache-skywalking-apm-9.7.0.tar.gz
-rw-r--r-- 1 root root 144358332 Nov 28 2023 apache-skywalking-apm-9.7.0.tar.gz
下载官方 sha512 文件并比对:
sha512sum apache-skywalking-apm-9.7.0.tar.gz
curl -s https://archive.apache.org/dist/skywalking/9.7.0/apache-skywalking-apm-9.7.0.tar.gz.sha512
两条命令输出完全一致即为校验通过:
64a428acf22832f4ef3c8dfece9dedc44065c6fd329512a54831306c47995b7dfbba6b15ba9d11333540f23972e35c44dfbf6a315cc2269145e88be329499c90 apache-skywalking-apm-9.7.0.tar.gz
64a428acf22832f4ef3c8dfece9dedc44065c6fd329512a54831306c47995b7dfbba6b15ba9d11333540f23972e35c44dfbf6a315cc2269145e88be329499c90
5.2 安装方案 B:离线安装补充说明
在任一可联网机器执行同样的 wget 下载与 sha512sum 校验,然后传输到目标服务器:
scp apache-skywalking-apm-9.7.0.tar.gz root@目标服务器:/opt/
目标服务器上重新执行一次 sha512sum,确认与官方值一致后再解压,防止传输损坏。
5.3 解压到安装目录
cd /opt
tar -xzf apache-skywalking-apm-9.7.0.tar.gz
mv apache-skywalking-apm-bin skywalking
ls /opt/skywalking
LICENSE
LICENSE.tpl
NOTICE
README.txt
bin
config
config-examples
licenses
oap-libs
tools
webapp
zipkin-LICENSE
目录职责:
- bin/:OAP 与 UI 的启动脚本;
- config/:OAP 主配置 application.yml;
- webapp/:UI 前端服务(内置 skywalking-webapp.jar 与 application.yml);
- oap-libs/:OAP 全部依赖 jar;
- config-examples/:MySQL 等存储的示例配置;
- tools/:数据生成器、性能剖析导出等辅助工具。
5.4 安装 Java Agent
Java Agent 在 9.x 之后已从主发行版中独立出来,必须单独下载:
cd /opt
wget -q https://archive.apache.org/dist/skywalking/java-agent/9.8.0/apache-skywalking-java-agent-9.8.0.tgz
ls -l apache-skywalking-java-agent-9.8.0.tgz
-rw-r--r-- 1 root root 45958718 Oct 8 02:45 apache-skywalking-java-agent-9.8.0.tgz
解压后得到独立的 agent 目录:
tar -xzf apache-skywalking-java-agent-9.8.0.tgz
ls /opt/skywalking-agent
LICENSE
NOTICE
activations
bootstrap-plugins
config
expired-plugins
licenses
logs
optional-plugins
optional-reporter-plugins
plugins
skywalking-agent.jar
插件数量验证:
ls /opt/skywalking-agent/plugins | wc -l
154
其中 bootstrap-plugins/ 目录内置对 JDK 自身能力(HttpURLConnection、HttpClient、线程池等)的增强插件:
ls /opt/skywalking-agent/bootstrap-plugins
apm-jdk-forkjoinpool-plugin-9.8.0.jar
apm-jdk-http-plugin-9.8.0.jar
apm-jdk-httpclient-plugin-9.8.0.jar
apm-jdk-threading-plugin-9.8.0.jar
apm-jdk-threadpool-plugin-9.8.0.jar
apm-jdk-virtual-thread-executor-plugin-9.8.0.jar
六、启动与验证
6.1 启动 OAP 并限制堆内存
oapService.sh 通过 JAVA_OPTS 环境变量读取 JVM 参数(脚本默认 -Xms256M -Xmx4096M),生产建议显式覆盖。本环境限制为 512MB:
export JAVA_OPTS='-Xms256m -Xmx512m'
nohup /opt/skywalking/bin/oapService.sh > /tmp/oap-start.out 2>&1 &
确认进程参数真实生效:
cat /proc/$(pgrep -f 'OAPServerStartU[p]' | head -1)/cmdline | tr '\0' ' ' | grep -oE '\-Xms256M -Xmx512M'
-Xms256M -Xmx512M
说明:pgrep 模式写成 OAPServerStartU[p](方括号正则)是为了避免 pgrep 命中执行命令的 shell 自身。
6.2 验证 OAP 端口
OAP 启动约需 30 秒。gRPC 端口 11800 供 Agent 上报,REST 端口 12800 供 UI 与 API 查询:
ss -tlnp | grep -E '11800|12800'
LISTEN 0 4096 *:12800 *:* users:(("java",pid=3930,fd=2781))
LISTEN 0 4096 *:11800 *:* users:(("java",pid=3930,fd=2777))
查看启动日志确认服务就绪:
grep 'Server started' /opt/skywalking/logs/skywalking-oap-server.log | tail -1
2026-10-12 02:35:34,156 - org.apache.skywalking.oap.server.library.server.grpc.GRPCServer - 108 [main] INFO [] - Server started, host 0.0.0.0 listening on 11800
6.3 启动 Web UI
webappService.sh 同样支持 JAVA_OPTS(脚本默认 -Xms256M -Xmx1024M):
export JAVA_OPTS='-Xms256m -Xmx512m'
nohup /opt/skywalking/bin/webappService.sh > /tmp/webapp-start.out 2>&1 &
验证 8080 端口与首页回显:
ss -tlnp | grep 8080
LISTEN 0 4096 *:8080 *:* users:(("java",pid=4213,fd=88))
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8080/
curl -s http://localhost:8080/ | grep -oE '<title>[^<]+</title>'
200
<title>Apache SkyWalking</title>
浏览器访问 http://服务器IP:8080 即可进入 SkyWalking UI。
6.4 GraphQL 接口验证
12800 端口提供 GraphQL 查询接口,可用于安装后的服务健康验证:
curl -s -X POST http://localhost:12800/graphql \
-H 'Content-Type: application/json' \
-d '{"query":"{ version }"}'
{"data":{"version":"9.7.0-066457b"}}
UI 侧也在 8080 端口提供同样的 GraphQL 代理(生产防火墙只放行 8080 时不影响查询):
curl -s -X POST http://localhost:8080/graphql \
-H 'Content-Type: application/json' \
-d '{"query":"{ version }"}'
{"data":{"version":"9.7.0-066457b"}}
七、Java Agent 接入被观测服务并验证链路
7.1 接入 Tomcat
本示例使用 Ubuntu 软件包安装的 tomcat9。安装后需要修改两处配置。
第一处:server.xml 将默认 8080 端口改为 18080,避免与 SkyWalking UI 冲突(编辑 /var/lib/tomcat9/conf/server.xml):
<Connector port="18080" protocol="HTTP/1.1"
第二处:/etc/default/tomcat9 注入 Agent。注意 apt 安装的 tomcat9 不会自动识别 JAVA_HOME,必须显式声明:
JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
JAVA_OPTS="-Djava.awt.headless=true -Xms256m -Xmx512m -javaagent:/opt/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=tomcat-demo -Dskywalking.collector.backend_service=127.0.0.1:11800"
参数说明:
- -javaagent:Agent jar 的绝对路径;
- -Dskywalking.agent.service_name:服务在拓扑图中的显示名称;
- -Dskywalking.collector.backend_service:OAP 的 gRPC 地址,格式为 IP:11800。
启动 Tomcat 并部署一个最简页面:
systemctl start tomcat9
systemctl is-active tomcat9
active
mkdir -p /var/lib/tomcat9/webapps/ROOT
echo 'hello from tomcat-demo' > /var/lib/tomcat9/webapps/ROOT/index.html
chown -R tomcat:tomcat /var/lib/tomcat9/webapps/ROOT
curl -s http://127.0.0.1:18080/
hello from tomcat-demo
确认 Tomcat 进程确实携带了 Agent 参数(排障必查项):
cat /proc/$(pgrep -f 'catalina.startup.Bootstra[p]' | head -1)/cmdline | tr '\0' '\n' | grep -E 'javaagent|skywalking' | head -3
-javaagent:/opt/skywalking-agent/skywalking-agent.jar
-Dskywalking.agent.service_name=tomcat-demo
-Dskywalking.collector.backend_service=127.0.0.1:11800
说明:pgrep 模式写成 Bootstra[p](方括号正则)是为了避免 pgrep 命中执行命令的 shell 自身。
7.2 产生并验证链路数据
多次请求触发上报(Agent 批量上报存在数十秒延迟):
curl -s -o /dev/null http://127.0.0.1:18080/
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:18080/
200
等待约 30 秒后,通过 GraphQL 查询服务注册情况:
curl -s -X POST http://localhost:12800/graphql \
-H 'Content-Type: application/json' \
-d '{"query":"query ($duration: Duration!) { getAllServices(duration: $duration) { id name } }","variables":{"duration":{"start":"2026-10-12","end":"2026-10-12","step":"DAY"}}}'
{"data":{"getAllServices":[{"id":"ZGVtby1zZXJ2aWNl.1","name":"demo-service"},{"id":"dG9tY2F0LWRlbW8y.1","name":"tomcat-demo2"},{"id":"dG9tY2F0LWRlbW8=.1","name":"tomcat-demo"}]}}
查询已上报的 Trace 列表:
curl -s -X POST http://localhost:12800/graphql \
-H 'Content-Type: application/json' \
-d '{"query":"query ($serviceId: ID!, $duration: Duration!) { queryBasicTraces(condition: {serviceId: $serviceId, queryDuration: $duration, traceState: ALL, queryOrder: BY_DURATION, paging: {pageNum: 1, pageSize: 5}}) { traces { segmentId endpointNames start duration isError } } }","variables":{"serviceId":"dG9tY2F0LWRlbW8=.1","duration":{"start":"2026-10-12","end":"2026-10-12","step":"DAY"}}}'
{"data":{"queryBasicTraces":{"traces":[
{"segmentId":"4053c65f1ce7489e892d5840fd900dd1.43.17917735984060000","endpointNames":["GET:/proxy.jsp"],"start":"1791773598406","duration":1043,"isError":false},
{"segmentId":"4053c65f1ce7489e892d5840fd900dd1.42.17917734423190000","endpointNames":["GET:/"],"start":"1791773442321","duration":67,"isError":false},
{"segmentId":"4053c65f1ce7489e892d5840fd900dd1.48.17917737715090000","endpointNames":["GET:/proxy.jsp"],"start":"1791773771509","duration":5,"isError":false},
{"segmentId":"4053c65f1ce7489e892d5840fd900dd1.45.17917736714810000","endpointNames":["GET:/proxy.jsp"],"start":"1791773671481","duration":4,"isError":false},
{"segmentId":"4053c65f1ce7489e892d5840fd900dd1.46.17917737390870000","endpointNames":["GET:/proxy.jsp"],"start":"1791773739087","duration":4,"isError":false}]}}}
查询 Endpoint(UI 拓扑与指标页的数据基础):
curl -s -X POST http://localhost:12800/graphql \
-H 'Content-Type: application/json' \
-d '{"query":"query ($serviceId: ID!, $keyword: String!, $limit: Int!) { searchEndpoint(keyword: $keyword, serviceId: $serviceId, limit: $limit) { id name } }","variables":{"serviceId":"dG9tY2F0LWRlbW8=.1","keyword":"/","limit":10}}'
{"data":{"searchEndpoint":[{"id":"dG9tY2F0LWRlbW8=.1_R0VUOi8=","name":"GET:/"}]}}
至此服务、Endpoint、Trace 三类数据全部可查,UI 的 Trace 与拓扑页面即可展示真实数据。
八、systemd 服务托管
8.1 OAP 单元
cat > /etc/systemd/system/skywalking-oap.service <<'EOF'
[Unit]
Description=Apache SkyWalking OAP Server
After=network.target
[Service]
Type=simple
User=root
Environment="JAVA_OPTS=-Xms256m -Xmx512m"
ExecStart=/opt/skywalking/bin/oapService.sh
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
8.2 UI 单元
cat > /etc/systemd/system/skywalking-ui.service <<'EOF'
[Unit]
Description=Apache SkyWalking Web UI
After=network.target skywalking-oap.service
[Service]
Type=simple
User=root
Environment="JAVA_OPTS=-Xms256m -Xmx512m"
ExecStart=/opt/skywalking/bin/webappService.sh
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
注意:Environment 行的值必须用双引号包裹。实测中写成 Environment=JAVA_OPTS=-Xms256m -Xmx512m(未加引号)时,systemd 把空格当作变量分隔符,进程实际只带上了 -Xms256m。
8.3 启用与验证
systemctl daemon-reload
systemctl enable skywalking-oap.service
systemctl enable skywalking-ui.service
Created symlink /etc/systemd/system/multi-user.target.wants/skywalking-oap.service → /etc/systemd/system/skywalking-oap.service.
Created symlink /etc/systemd/system/multi-user.target.wants/skywalking-ui.service → /etc/systemd/system/skywalking-ui.service.
systemctl start skywalking-oap.service
systemctl is-active skywalking-oap.service
systemctl start skywalking-ui.service
systemctl is-active skywalking-ui.service
active
active
端口与堆参数复核(用 /proc 与 jps 双重验证):
ss -tlnp | grep -E '11800|12800|8080'
LISTEN 0 4096 *:12800 *:* users:(("java",pid=7496,fd=2781))
LISTEN 0 4096 *:11800 *:* users:(("java",pid=7496,fd=2777))
LISTEN 0 4096 *:8080 *:* users:(("java",pid=7671,fd=88))
cat /proc/7496/cmdline | tr '\0' ' ' | grep -oE '\-Xms256m -Xmx512m'
cat /proc/7671/cmdline | tr '\0' ' ' | grep -oE '\-Xms256m -Xmx512m'
jps -v | grep -E 'OAPServerStartUp|ApplicationStartUp' | grep -oE ' -Xms256m -Xmx512m'
-Xms256m -Xmx512m
-Xms256m -Xmx512m
-Xms256m -Xmx512m
-Xms256m -Xmx512m
九、配置说明
安装完成后默认值可直接跑通 standalone 单机模式,以下为与本指南直接相关的默认配置项。
| 文件 | 配置项 | 默认值 | 说明 |
|---|---|---|---|
| config/application.yml | cluster selector | standalone | 单机模式,无集群注册 |
| config/application.yml | storage selector | h2 | 内置 H2 内存库,重启即清空 |
| config/application.yml | core gRPCPort | 11800 | Agent 上报端口 |
| config/application.yml | core restPort | 12800 | REST/GraphQL 端口 |
| webapp/application.yml | serverPort | 8080 | UI 访问端口 |
| webapp/application.yml | oapServices | http://localhost:12800 | UI 回连 OAP 地址 |
| agent/config/agent.config | agent.service_name | Your_ApplicationName | 服务名,接入时必须覆盖 |
| agent/config/agent.config | collector.backend_service | 127.0.0.1:11800 | OAP gRPC 地址 |
修改配置后需重启对应进程。配置项的完整含义与生产化调整见《Apache SkyWalking 配置参数详解》。
十、注意事项
- 默认 H2 存储为内存库(JDBC URL 为 jdbc:h2:mem:skywalking-oap-db),OAP 重启后历史 Trace 与指标清空,仅适用于体验与功能验证,生产必须切换 Elasticsearch、MySQL 或 BanyanDB 存储。
- Agent 与 OAP 之间走 11800 端口 gRPC 长连接,被观测服务器与 OAP 非同机部署时,agent 的 backend_service 要写成 OAP 服务器地址,防火墙放行 11800。
- 服务名 agent.service_name 一经大量数据上报后不建议再改,改名会在拓扑中生成新服务节点。
- JAVA_OPTS 覆盖堆参数时注意脚本默认值是 4096M,小内存服务器必须显式设置,否则 OAP 可能因申请不到内存启动失败。
- Trace 批量上报存在延迟,Agent 侧默认约 30 秒一批,OAP 侧落库周期 25 秒(persistentPeriod),验证时请等待 1 分钟再查询。
- OAP 默认监听 0.0.0.0,公网服务器务必用防火墙限制 11800/12800/8080 的来源,避免链路数据与接口暴露。
十一、常见问题
11.1 服务已注册但没有 Trace
实测确认:被观测程序里仅作为 HTTP 客户端发起调用(没有任何服务端入口请求被增强)时,客户端 Span 不产生独立 Trace。用 curl 直接请求接入的服务(触发服务端入口 Span)即可看到数据。另需确认 OAP 与 Agent 时间一致,时间偏差会导致查询窗口错位。
11.2 tomcat9 启动报 No JDK or JRE found
apt 安装的 tomcat9 找不到 JVM,在 /etc/default/tomcat9 中显式添加:
JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
然后 systemctl restart tomcat9。
11.3 systemd 启动后堆参数只生效一半
Environment=JAVA_OPTS=-Xms256m -Xmx512m 未加引号时,systemd 将空格解析为变量边界,实际只有 -Xms256m 生效。用 cat /proc/OAP进程ID/cmdline 核查实际参数(进程 ID 用 pgrep -f 'OAPServerStartU[p]' 获取),并将单元文件改为 Environment="JAVA_OPTS=-Xms256m -Xmx512m"。
11.4 GraphQL 查询报 Invalid format
Duration 参数格式必须与 step 匹配:step 为 DAY 时写 2026-10-12,step 为 MINUTE 时写 2026-10-12 0240(HHmm 四位)。实测用 DAY 步长却传 2026-10-12 0000 会直接报错。
11.5 checkHealth 返回 health-checker missing
standalone 单机模式未注册健康检查组件,接口返回 Exception while fetching data (/checkHealth) : health-checker missing.,属预期行为。验证服务可用性改用 version 查询或直接请求 UI 首页。
11.6 新版本 11.0.0 解压后没有 webapp 和 agent 目录
SkyWalking 11.0.0 起主发行版只包含 OAP 后端,Web UI 与 Java Agent 需按官方文档单独获取,且默认存储改为 BanyanDB。需要开箱即用一体化安装时选择 9.7.0。
十二、卸载方式
停止并移除 systemd 单元:
systemctl stop skywalking-ui.service
systemctl stop skywalking-oap.service
systemctl disable skywalking-ui.service
systemctl disable skywalking-oap.service
rm -f /etc/systemd/system/skywalking-oap.service /etc/systemd/system/skywalking-ui.service
systemctl daemon-reload
删除安装目录与临时文件:
rm -rf /opt/skywalking /opt/skywalking-agent
rm -f /opt/apache-skywalking-apm-9.7.0.tar.gz /opt/apache-skywalking-java-agent-9.8.0.tgz
被观测服务按需移除 -javaagent 参数并重启,即可脱离链路追踪。
十三、参考链接
- SkyWalking 主发行版归档:https://archive.apache.org/dist/skywalking/
- Java Agent 归档:https://archive.apache.org/dist/skywalking/java-agent/
- 官方文档主页:https://skywalking.apache.org/docs/
- Java Agent 配置说明:https://skywalking.apache.org/docs/skywalking-java/latest/readme/setup/
- GitHub 仓库:https://github.com/apache/skywalking