【实操指南】Apache Apollo 从 Windows 迁移至 Linux 服务器全流程(附避坑手册)
背景:作为轻量级消息中间件,Apache Apollo 常被用于 MQTT 协议的消息通信场景。但实际部署中,不少同学会遇到从 Windows 测试环境迁移到 Linux 生产环境的需求 —— 这过程看似简单,却容易踩 “路径兼容”“权限”“数据完整性” 的坑。
本文就带你走完 Apollo 跨系统迁移的全流程,从环境准备到服务验证,一次搞定!
一、迁移前必知:核心背景与环境信息
先明确迁移的基础信息,避免版本 / 环境不兼容:
Apollo 版本:必须保持一致(本文以 1.7.1 为例,这是 Apollo 最后一个稳定版);
JDK 版本:统一用 JDK 1.8(Apollo 对高版本 JDK 兼容性较差);
实例目录:
原 Windows:D:pache-apollo-1.7.1inmybroker
目标 Linux:/home/apollo/apache-apollo-1.7.1/bin/mybroker
二、迁移前准备:Linux 环境先搭好
迁移前先把 Linux 环境配置到位,避免后续 “卡壳”。
1. 安装 JDK 1.8(以 CentOS 为例)
Apollo 依赖 JDK 1.8,高版本会报类加载错误,所以必须严格匹配:
# 下载 JDK 1.8(或上传本地安装包)
wget https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz
# 解压到 /usr/local
tar -zxvf jdk-8u202-linux-x64.tar.gz -C /usr/local/
# 配置环境变量(编辑 /etc/profile)
echo 'export JAVA_HOME=/usr/local/jdk1.8.0_202' >> /etc/profile
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile
source /etc/profile
# 验证
java -version
2. 安装 Apollo 1.7.1(与 Windows 版本一致)
# 下载 Apollo 安装包
wget http://apache.fayea.com/activemq/activemq-apollo/1.7.1/apache-apollo-1.7.1-unix-distro.tar.gz
# 解压
tar -zxvf apache-apollo-1.7.1-unix-distro.tar.gz -C /home/apollo/
# 赋予执行权限(Linux 必须!)
chmod -R 755 /home/apollo/apache-apollo-1.7.1
三、核心步骤:迁移关键文件
Apollo 的配置、数据都存在 ** 实例目录(mybroker)** 里,只需把这些文件从 Windows 传到 Linux 即可。
要迁移的文件清单(必传)
用 WinSCP/FileZilla 把 Windows 端 mybroker 目录下的这些内容,传到 Linux 端的 mybroker 目录:
| Windows 路径 | Linux 路径 | 作用 |
|---|---|---|
| mybroker/etc/ | /home/apollo/apache-apollo-1.7.1/bin/mybroker/etc/ | 端口、认证等核心配置 |
| mybroker/data/ | /home/apollo/apache-apollo-1.7.1/bin/mybroker/data/ | 持久化消息数据(重要!) |
| mybroker/etc/users.properties | /home/apollo/apache-apollo-1.7.1/bin/mybroker/etc/users.properties | 管理后台账号密码 |


四、Linux 端适配:避坑关键!
Windows 和 Linux 的 “差异” 是迁移的坑点,这一步必须做:
1. 修复文件权限(Linux 特有)
Windows 传过来的文件默认权限可能不足,导致 Apollo 启动失败:
chmod -R 755 /home/apollo/apache-apollo-1.7.1/bin/mybroker
2. 配置文件路径适配
打开 Linux 端的 mybroker/etc/apollo.xml,检查路径配置:
Windows 用 作为路径分隔符,Linux 用 /;
但 Apollo 支持 ${apollo.base} 变量(自动识别实例目录),所以只要原配置用了相对路径,Linux 会自动适配,无需手动修改。
举个例子:
原 Windows 配置 directory=“D:pollodata” → Linux 自动变成 ${apollo.base}/data。
五、启动 + 验证:确保服务正常
- 启动 Linux 端 Apollo
用之前写好的 apollo.sh 脚本启动(没脚本的话,直接用实例的启动命令):
cd /home/apollo/apache-apollo-1.7.1/bin
# 启动服务
./apollo.sh start
# 查看状态(显示“运行中”则成功)
./apollo.sh status
此处为启动脚本
#!/bin/bash
# Apache Apollo Linux 启动脚本
# 功能:替代Windows的apollo.cmd,支持启动/停止/重启/状态查询
# ======================== 配置区(根据你的实际路径修改)========================
# Apollo安装根目录(替换为你的apollo解压路径)
APOLLO_HOME="/home/你的用户名/Downloads/apache-apollo-1.7.1"
# Broker实例目录(创建的mybroker路径)
APOLLO_BASE="${APOLLO_HOME}/bin/mybroker"
# Java安装目录(如果已配置JAVA_HOME环境变量,可留空)
JAVA_HOME="/usr/lib/jvm/jdk1.8.0_381"
# JVM参数配置(和Windows版保持一致)
JVM_FLAGS="-server -Xmx1G -XX:-UseBiasedLocking"
# 日志输出目录
LOG_DIR="${APOLLO_BASE}/logs"
# 进程PID文件路径
PID_FILE="${LOG_DIR}/apollo.pid"
# ==============================================================================
# 确保日志目录存在
mkdir -p ${LOG_DIR}
# 日志文件
LOG_FILE="${LOG_DIR}/apollo.out"
# 颜色输出函数(可选,提升可读性)
red_echo() { echo -e "[31m$1[0m"; }
green_echo() { echo -e "[32m$1[0m"; }
yellow_echo() { echo -e "[33m$1[0m"; }
# 检查Java环境
check_java() {
if [ -n "${JAVA_HOME}" ] && [ -x "${JAVA_HOME}/bin/java" ]; then
JAVACMD="${JAVA_HOME}/bin/java"
else
JAVACMD=$(which java 2>/dev/null)
if [ -z "${JAVACMD}" ]; then
red_echo "错误:未找到Java环境,请配置JAVA_HOME或确保java命令在PATH中!"
exit 1
fi
yellow_echo "警告:未配置JAVA_HOME,使用系统默认java: ${JAVACMD}"
fi
}
# 检查Apollo目录
check_apollo() {
if [ ! -d "${APOLLO_HOME}" ]; then
red_echo "错误:APOLLO_HOME路径不存在:${APOLLO_HOME}"
exit 1
fi
if [ ! -d "${APOLLO_BASE}" ]; then
red_echo "错误:Broker实例目录不存在,请先执行 ./apollo create mybroker 创建实例!"
exit 1
fi
}
# 启动函数(前台/后台)
start() {
# 先检查环境
check_java
check_apollo
# 检查是否已运行
if [ -f "${PID_FILE}" ] && ps -p $(cat ${PID_FILE}) >/dev/null 2>&1; then
yellow_echo "Apollo已在运行中(PID: $(cat ${PID_FILE}))"
return 0
fi
# 组装完整JVM参数(和Windows版apollo.cmd逻辑一致)
FULL_JVM_FLAGS="${JVM_FLAGS}"
# 开启JMX远程管理(可选)
FULL_JVM_FLAGS="${FULL_JVM_FLAGS} -Dcom.sun.management.jmxremote"
# 绑定Apollo路径
FULL_JVM_FLAGS="${FULL_JVM_FLAGS} -Dapollo.home=${APOLLO_HOME}"
FULL_JVM_FLAGS="${FULL_JVM_FLAGS} -Dapollo.base=${APOLLO_BASE}"
# 类路径
FULL_JVM_FLAGS="${FULL_JVM_FLAGS} -classpath ${APOLLO_HOME}/lib/apollo-boot.jar"
# 核心启动命令(和Windows版的Java调用逻辑完全对应)
BOOT_CMD="${JAVACMD} ${FULL_JVM_FLAGS} org.apache.activemq.apollo.boot.Apollo ${APOLLO_HOME}/lib org.apache.activemq.apollo.cli.Apollo run"
green_echo "开始启动Apollo..."
if [ "$1" = "foreground" ]; then
# 前台启动(调试用,日志输出到终端)
${BOOT_CMD}
else
# 后台启动(生产用,日志输出到文件)
nohup ${BOOT_CMD} > ${LOG_FILE} 2>&1 &
echo $! > ${PID_FILE}
sleep 3
# 检查启动结果
if ps -p $(cat ${PID_FILE}) >/dev/null 2>&1; then
green_echo "Apollo启动成功!PID: $(cat ${PID_FILE}),日志文件:${LOG_FILE}"
else
red_echo "Apollo启动失败!请查看日志:${LOG_FILE}"
rm -f ${PID_FILE}
exit 1
fi
fi
}
# 停止函数
stop() {
if [ ! -f "${PID_FILE}" ]; then
yellow_echo "Apollo未运行(PID文件不存在)"
return 0
fi
PID=$(cat ${PID_FILE})
if ps -p ${PID} >/dev/null 2>&1; then
green_echo "正在停止Apollo(PID: ${PID})..."
kill ${PID}
# 等待进程退出
sleep 5
if ps -p ${PID} >/dev/null 2>&1; then
red_echo "优雅停止失败,强制杀死进程..."
kill -9 ${PID}
fi
rm -f ${PID_FILE}
green_echo "Apollo已停止"
else
yellow_echo "Apollo未运行(PID: ${PID} 不存在)"
rm -f ${PID_FILE}
fi
}
# 状态查询
status() {
if [ -f "${PID_FILE}" ] && ps -p $(cat ${PID_FILE}) >/dev/null 2>&1; then
green_echo "Apollo正在运行中!PID: $(cat ${PID_FILE})"
else
red_echo "Apollo未运行"
fi
}
# 帮助信息
usage() {
echo "用法:$0 [命令]"
echo "支持的命令:"
echo " start - 后台启动Apollo(生产环境推荐)"
echo " start-fg - 前台启动Apollo(调试用,日志输出到终端)"
echo " stop - 停止Apollo"
echo " restart - 重启Apollo"
echo " status - 查看Apollo运行状态"
echo " help - 显示帮助信息"
exit 1
}
# 主逻辑
case "$1" in
start)
start
;;
start-fg)
start foreground
;;
stop)
stop
;;
restart)
stop
sleep 2
start
;;
status)
status
;;
help|*)
usage
;;
esac
exit 0
三步验证服务可用性
- 管理后台:浏览器访问 http://Linux服务器IP:61680,用默认账号 admin/password 登录(和 Windows 端一致);
- MQTT 连接:用 MQTTX 等工具,连接 tcp://Linux服务器IP:61613,发一条测试消息,能收到则正常;
- 数据完整性:在管理后台查看 “队列 / 主题”,和 Windows 端的数量、名称一致,说明数据迁移成功。
六、收尾:生产环境优化
- 设置开机自启
避免服务器重启后服务挂掉,把 Apollo 注册为系统服务:
sudo ln -s /home/apollo/apache-apollo-1.7.1/bin/mybroker/bin/apollo-broker-service /etc/init.d/
sudo update-rc.d apollo-broker-service defaults
- 关闭 Windows 端服务
确认 Linux 端完全正常后,彻底关掉 Windows 端的 Apollo,避免端口冲突。
七、避坑手册:常见问题解决
| 问题现象 | 原因 + 解决方法 |
|---|---|
| 启动失败,日志报 “权限不足” | Linux 权限问题 → 执行 chmod -R 755 mybroker |
| 管理后台打不开 | 防火墙没开 61680 端口 → sudo firewall-cmd --add-port=61680/tcp --permanent |
| MQTT 连不上 | 61613 端口没开放 → 开放端口,或检查 apollo.xml 端口配置 |
总结
Apollo 跨系统迁移的核心逻辑是 “复制实例文件 + 适配 Linux 环境”,只要注意 “权限”“路径” 这两个坑,基本能一次成功。
如果你也在做消息中间件的跨系统迁移,欢迎在评论区交流踩过的坑~








