行環(huán)境)
1. 為什么要在Linux上折騰ActiveMQ的運(yùn)行環(huán)境很多剛接觸消息隊(duì)列的朋友第一次在Linux上裝ActiveMQ的時(shí)候第一反應(yīng)往往是去官網(wǎng)找壓縮包然后手動(dòng)下載、解壓、配環(huán)境變量。這個(gè)流程本身沒錯(cuò)但問題出在下載速度上——從海外站點(diǎn)拉一個(gè)幾十兆的壓縮包有時(shí)候能卡上十幾分鐘甚至中途斷流。我在早期做消息中間件選型測試的時(shí)候就因?yàn)檫@個(gè)原因反復(fù)重裝了好幾次時(shí)間全耗在等下載上了。后來我逐漸把思路轉(zhuǎn)過來與其跟海外源較勁不如直接換成國內(nèi)鏡像站。阿里云鏡像站就是其中一個(gè)非常穩(wěn)的選擇它同步了主流開源軟件的發(fā)行包包括ActiveMQ這種Apache旗下的項(xiàng)目。用鏡像站的好處很直接——下載速度從幾十KB每秒變成幾MB每秒原本十幾分鐘的事情壓縮到幾十秒。這篇文章就是圍繞這個(gè)思路展開的我會把整個(gè)流程拆開講清楚從鏡像源的選擇邏輯到ActiveMQ運(yùn)行環(huán)境的具體搭建再到啟動(dòng)驗(yàn)證和常見坑的處理。適合誰看如果你是在Linux上第一次部署消息隊(duì)列的運(yùn)維或后端開發(fā)或者你之前裝過但被下載速度折磨過這篇內(nèi)容應(yīng)該能幫你省下不少時(shí)間。我下面用的命令和路徑都是通用寫法不綁定某個(gè)特定發(fā)行版CentOS、Ubuntu、Debian都能照著改。2. 鏡像源的選擇邏輯與阿里云鏡像的定位2.1 為什么是阿里云鏡像而不是其他源國內(nèi)可用的開源鏡像站不止一家常見的有阿里云、騰訊云、華為云、清華TUNA、中科大USTC等。它們各有側(cè)重但如果你追求的是“穩(wěn)定覆蓋廣同步及時(shí)”阿里云鏡像站在我實(shí)際使用中的表現(xiàn)是比較均衡的。它同步Apache項(xiàng)目比較勤快ActiveMQ這種更新頻率不算特別高的項(xiàng)目基本能在官方發(fā)版后較短時(shí)間內(nèi)跟上。另一個(gè)現(xiàn)實(shí)原因是很多公司的服務(wù)器本身就跑在阿里云上內(nèi)網(wǎng)訪問鏡像站的速度幾乎等于本地磁盤讀取。即便你的機(jī)器不在阿里云公網(wǎng)訪問的速度也遠(yuǎn)比海外源穩(wěn)定。我做過一個(gè)粗略對比同一個(gè)ActiveMQ壓縮包海外源平均下載速度在80KB/s左右阿里云鏡像能跑到5MB/s以上差距是幾十倍。2.2 鏡像站到底鏡像了什么這里需要說清楚一個(gè)概念鏡像站不是把所有東西都搬過來它主要同步的是軟件發(fā)行包、系統(tǒng)包倉庫、容器鏡像等。對于ActiveMQ來說我們關(guān)心的是它作為Apache項(xiàng)目發(fā)行包是否被鏡像。阿里云鏡像站對Apache項(xiàng)目的同步路徑通常遵循官方目錄結(jié)構(gòu)所以只要找到對應(yīng)的目錄就能直接下載。需要提醒的是鏡像站的內(nèi)容會定期同步但偶爾會有延遲。如果你要的是剛發(fā)布幾小時(shí)的版本可能鏡像站還沒跟上這時(shí)候要么等要么臨時(shí)用官方源。但對于絕大多數(shù)生產(chǎn)或測試場景用鏡像站上的穩(wěn)定版本完全夠用。2.3 鏡像源使用前的網(wǎng)絡(luò)與權(quán)限確認(rèn)在動(dòng)手之前有兩件事必須先確認(rèn)。第一是網(wǎng)絡(luò)連通性用ping或者curl測試一下鏡像站域名是否可達(dá)。第二是權(quán)限下載和解壓通常不需要root但如果你要把ActiveMQ裝到/opt這類系統(tǒng)目錄就需要sudo權(quán)限。我個(gè)人的習(xí)慣是先在用戶目錄下解壓測試跑通了再決定是否移到系統(tǒng)目錄。# 測試鏡像站連通性 curl -I https://mirrors.aliyun.com/ # 查看當(dāng)前用戶是否有sudo權(quán)限 sudo -l這兩步看起來簡單但我見過不少人跳過之后在下載到一半時(shí)才發(fā)現(xiàn)網(wǎng)絡(luò)不通或者在解壓時(shí)才發(fā)現(xiàn)目錄沒權(quán)限白白浪費(fèi)時(shí)間。3. 用阿里云鏡像拉取ActiveMQ壓縮包的完整操作3.1 定位ActiveMQ在鏡像站上的目錄阿里云鏡像站的Apache項(xiàng)目通常放在apache目錄下。ActiveMQ的發(fā)行包路徑大致是/apache/activemq/里面會按版本號分目錄。你可以先用瀏覽器或者curl列出目錄內(nèi)容確認(rèn)你要的版本存在。# 列出ActiveMQ可用版本目錄 curl -s https://mirrors.aliyun.com/apache/activemq/ | grep -o href[^]* | head -20這一步的目的是避免盲目拼URL。有時(shí)候版本號里帶-M之類的后綴或者有l(wèi)atest軟鏈接直接列出來看最穩(wěn)妥。我一般會選一個(gè)穩(wěn)定的次版本比如5.16.x或5.17.x而不是剛出的主版本因?yàn)樾轮靼姹究赡芤氩患嫒莞膭?dòng)。3.2 下載壓縮包并校驗(yàn)完整性確認(rèn)版本后用wget或curl下載。我習(xí)慣用wget因?yàn)樗J(rèn)支持?jǐn)帱c(diǎn)續(xù)傳網(wǎng)絡(luò)抖動(dòng)時(shí)不用從頭再來。# 下載ActiveMQ壓縮包 wget https://mirrors.aliyun.com/apache/activemq/5.17.6/apache-activemq-5.17.6-bin.tar.gz # 查看文件大小確認(rèn)下載完整 ls -lh apache-activemq-5.17.6-bin.tar.gz下載完成后強(qiáng)烈建議做一次校驗(yàn)。Apache官方會提供.sha512或.asc文件鏡像站上通常也有。校驗(yàn)的意義在于確認(rèn)文件在傳輸過程中沒有損壞尤其是大文件。我遇到過下載到99%時(shí)網(wǎng)絡(luò)中斷文件大小看起來對但解壓時(shí)報(bào)錯(cuò)的情況校驗(yàn)?zāi)芴崆鞍l(fā)現(xiàn)這類問題。# 下載校驗(yàn)文件 wget https://mirrors.aliyun.com/apache/activemq/5.17.6/apache-activemq-5.17.6-bin.tar.gz.sha512 # 執(zhí)行校驗(yàn) sha512sum -c apache-activemq-5.17.6-bin.tar.gz.sha512如果輸出OK說明文件沒問題。如果提示FAILED別猶豫刪掉重新下載。3.3 解壓與目錄結(jié)構(gòu)說明校驗(yàn)通過后就可以解壓了。ActiveMQ的壓縮包解壓后會生成一個(gè)以版本號命名的目錄里面包含bin、conf、data、lib等子目錄。每個(gè)目錄的作用不同理解它們對后續(xù)配置和排錯(cuò)很有幫助。# 解壓 tar -zxvf apache-activemq-5.17.6-bin.tar.gz # 進(jìn)入目錄查看結(jié)構(gòu) cd apache-activemq-5.17.6 ls -lbin啟動(dòng)腳本包括activemq和activemq-admin前者用于日常啟停后者用于管理操作。conf核心配置文件activemq.xml是主配置jetty.xml管Web控制臺login.config管認(rèn)證。data運(yùn)行時(shí)數(shù)據(jù)包括消息存儲和日志默認(rèn)用KahaDB。lib依賴的jar包ActiveMQ本身是Java寫的這里放的是它運(yùn)行所需的庫。我一般會把解壓后的目錄移到/opt下方便統(tǒng)一管理但這不是必須的。如果你只是測試放在用戶目錄也完全沒問題。4. Java環(huán)境的前置檢查與版本匹配4.1 ActiveMQ對JDK版本的要求ActiveMQ是Java應(yīng)用運(yùn)行前必須有JDK。不同版本的ActiveMQ對JDK要求不同比如5.16.x通常要求JDK 8及以上5.17.x也支持JDK 8和11。如果你用的JDK版本太低啟動(dòng)時(shí)會直接報(bào)UnsupportedClassVersionError這個(gè)錯(cuò)誤很明確一看就知道是版本不匹配。# 查看當(dāng)前Java版本 java -version如果輸出顯示是1.8或11基本都沒問題。如果顯示1.7或更低就需要升級。我建議直接用JDK 11因?yàn)樗诜€(wěn)定性和性能上比8更好而且ActiveMQ 5.17.x對11的支持很成熟。4.2 用鏡像站安裝JDK的思路如果你的機(jī)器上還沒有JDK同樣可以用鏡像站來裝。阿里云鏡像站上有OpenJDK的發(fā)行包路徑通常在/openjdk/或者通過系統(tǒng)包管理器配置鏡像源后直接yum install或apt install。用包管理器裝的好處是依賴自動(dòng)處理省心。# 以CentOS為例先備份原有repo文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak # 下載阿里云repo文件 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo # 清理緩存并安裝OpenJDK 11 yum clean all yum makecache yum install -y java-11-openjdk-develUbuntu的話思路類似改/etc/apt/sources.list指向阿里云鏡像然后apt update apt install openjdk-11-jdk。裝完后再次java -version確認(rèn)。4.3 JAVA_HOME的配置與驗(yàn)證有些啟動(dòng)腳本會依賴JAVA_HOME環(huán)境變量。雖然ActiveMQ的bin/activemq腳本會嘗試自動(dòng)探測Java路徑但顯式配置JAVA_HOME更穩(wěn)妥尤其是在一臺機(jī)器上有多個(gè)JDK版本的時(shí)候。# 查找Java安裝路徑 readlink -f $(which java) # 編輯環(huán)境變量文件 vi /etc/profile # 在末尾添加 export JAVA_HOME/usr/lib/jvm/java-11-openjdk-11.0.x export PATH$JAVA_HOME/bin:$PATH # 使配置生效 source /etc/profile配置完后用echo $JAVA_HOME確認(rèn)路徑正確再用java -version確認(rèn)命令可用。這兩步都通過Java環(huán)境就算準(zhǔn)備好了。5. 啟動(dòng)ActiveMQ并驗(yàn)證運(yùn)行狀態(tài)5.1 前臺啟動(dòng)與后臺啟動(dòng)的區(qū)別ActiveMQ的啟動(dòng)腳本支持前臺和后臺兩種模式。前臺啟動(dòng)會把日志直接打到終端適合第一次啟動(dòng)時(shí)觀察有沒有報(bào)錯(cuò)后臺啟動(dòng)則把進(jìn)程放到后臺適合日常運(yùn)行。# 前臺啟動(dòng)觀察輸出 ./bin/activemq console # 后臺啟動(dòng) ./bin/activemq start我第一次裝的時(shí)候習(xí)慣用前臺啟動(dòng)因?yàn)槟苤苯涌吹絾?dòng)日志里的異常。如果一切正常你會看到類似ActiveMQ Broker started的提示。如果報(bào)錯(cuò)日志里會明確指出問題比如端口被占用、配置文件語法錯(cuò)誤等。5.2 檢查進(jìn)程與端口監(jiān)聽后臺啟動(dòng)后用ps和netstat確認(rèn)進(jìn)程和端口狀態(tài)。ActiveMQ默認(rèn)會監(jiān)聽兩個(gè)端口61616用于消息通信8161用于Web控制臺。# 查看ActiveMQ進(jìn)程 ps -ef | grep activemq # 查看端口監(jiān)聽 netstat -tlnp | grep -E 61616|8161如果61616沒監(jiān)聽說明broker沒起來如果8161沒監(jiān)聽可能是Web控制臺配置有問題。這兩個(gè)端口的狀態(tài)是判斷ActiveMQ是否正常工作的最直接依據(jù)。5.3 Web控制臺的訪問與默認(rèn)憑據(jù)ActiveMQ自帶一個(gè)Web控制臺默認(rèn)地址是http://服務(wù)器IP:8161/admin。默認(rèn)用戶名和密碼都是admin。第一次登錄后建議立刻改掉默認(rèn)密碼因?yàn)檫@是公網(wǎng)暴露時(shí)最常見的安全隱患??刂婆_里能看到隊(duì)列、主題、連接數(shù)、消息積壓等實(shí)時(shí)信息對調(diào)試和監(jiān)控很有用。如果你在瀏覽器里打不開先檢查防火墻是否放行了8161端口再檢查jetty.xml里的綁定地址是不是0.0.0.0。# 查看防火墻狀態(tài) firewall-cmd --list-ports # 放行8161端口 firewall-cmd --add-port8161/tcp --permanent firewall-cmd --reload6. 鏡像站使用中的常見坑與排查鏈路6.1 下載速度突然變慢或中斷鏡像站雖然整體速度快但偶爾也會遇到某個(gè)時(shí)段變慢。這時(shí)候先別急著換源用wget -c續(xù)傳試試。如果續(xù)傳也失敗再檢查是不是本地網(wǎng)絡(luò)出口有問題。我遇到過一次是公司出口帶寬被其他任務(wù)占滿換什么源都慢這種情況只能等或者錯(cuò)峰下載。另一個(gè)可能是鏡像站正在同步目錄暫時(shí)不可用。這時(shí)候可以換個(gè)時(shí)間再試或者臨時(shí)用官方源應(yīng)急。6.2 校驗(yàn)失敗但文件大小正常這種情況通常是下載過程中出現(xiàn)了靜默損壞。文件大小對但內(nèi)容有幾位不對。解決辦法就是刪掉重下不要試圖修復(fù)。我見過有人用tar --ignore-zeros強(qiáng)行解壓結(jié)果解出來的文件缺斤少兩啟動(dòng)時(shí)報(bào)各種奇怪的類找不到錯(cuò)誤排查半天才發(fā)現(xiàn)是壓縮包本身壞了。6.3 啟動(dòng)時(shí)報(bào)端口被占用61616或8161被占用是常見問題。先用netstat或lsof找到占用進(jìn)程確認(rèn)是不是之前啟動(dòng)的ActiveMQ沒關(guān)干凈。如果是用./bin/activemq stop停掉或者直接kill進(jìn)程。如果占用的是其他應(yīng)用要么改ActiveMQ端口要么停掉那個(gè)應(yīng)用。# 查找占用61616的進(jìn)程 lsof -i:61616 # 停止ActiveMQ ./bin/activemq stop改端口的話編輯conf/activemq.xml里的transportConnector的uri把61616改成其他端口然后重啟。6.4 內(nèi)存不足導(dǎo)致啟動(dòng)失敗ActiveMQ默認(rèn)的JVM內(nèi)存配置可能偏大或偏小。如果機(jī)器內(nèi)存小啟動(dòng)時(shí)可能報(bào)OutOfMemoryError。這時(shí)候需要調(diào)整bin/activemq腳本里的ACTIVEMQ_OPTS把-Xmx調(diào)小。反過來如果消息量大默認(rèn)內(nèi)存不夠也需要調(diào)大。# 編輯啟動(dòng)腳本 vi bin/activemq # 找到類似這行調(diào)整Xmx和Xms ACTIVEMQ_OPTS-Xms64M -Xmx1G ...我一般會根據(jù)機(jī)器內(nèi)存的50%左右來設(shè)-Xmx留一半給系統(tǒng)和其他進(jìn)程。這個(gè)值沒有絕對標(biāo)準(zhǔn)要結(jié)合消息吞吐量和機(jī)器配置來定。7. 把ActiveMQ做成系統(tǒng)服務(wù)的思路7.1 為什么建議做成系統(tǒng)服務(wù)手動(dòng)用./bin/activemq start啟動(dòng)的進(jìn)程在終端關(guān)閉或服務(wù)器重啟后不會自動(dòng)恢復(fù)。生產(chǎn)環(huán)境肯定不能這樣。做成系統(tǒng)服務(wù)后可以用systemctl管理支持開機(jī)自啟、自動(dòng)重啟運(yùn)維起來規(guī)范得多。7.2 編寫systemd unit文件以systemd為例在/etc/systemd/system/下新建一個(gè)activemq.service文件內(nèi)容大致如下[Unit] DescriptionActiveMQ Broker Afternetwork.target [Service] Typeforking Useractivemq Groupactivemq ExecStart/opt/apache-activemq-5.17.6/bin/activemq start ExecStop/opt/apache-activemq-5.17.6/bin/activemq stop Restarton-failure [Install] WantedBymulti-user.target這里有幾個(gè)細(xì)節(jié)要注意Type設(shè)為forking是因?yàn)锳ctiveMQ的啟動(dòng)腳本會fork出后臺進(jìn)程User和Group建議單獨(dú)建一個(gè)專用賬戶不要用root跑Restarton-failure能在進(jìn)程意外退出時(shí)自動(dòng)拉起。7.3 啟用服務(wù)并驗(yàn)證開機(jī)自啟寫完unit文件后執(zhí)行systemctl daemon-reload讓systemd重新加載配置然后systemctl enable activemq設(shè)置開機(jī)自啟最后systemctl start activemq啟動(dòng)。用systemctl status activemq查看狀態(tài)確認(rèn)是active (running)。systemctl daemon-reload systemctl enable activemq systemctl start activemq systemctl status activemq這套流程走下來ActiveMQ就從“手動(dòng)跑著的進(jìn)程”變成了“受系統(tǒng)管理的服務(wù)”后續(xù)維護(hù)省心很多。8. 一些實(shí)際使用中的經(jīng)驗(yàn)補(bǔ)充鏡像站的使用不止于下載ActiveMQ。同樣的思路可以套用到其他Apache項(xiàng)目比如Kafka、Tomcat、Zookeeper它們的發(fā)行包在阿里云鏡像站上都有同步。我現(xiàn)在的習(xí)慣是凡是Apache系的開源軟件先去鏡像站找找不到再考慮官方源。另外鏡像站的目錄結(jié)構(gòu)有時(shí)候會調(diào)整比如從/apache/移到/apache-mirror/之類的。如果你按老路徑訪問返回404別急著懷疑網(wǎng)絡(luò)先去鏡像站首頁看看目錄導(dǎo)航通常能找到新路徑。還有一點(diǎn)關(guān)于版本選擇生產(chǎn)環(huán)境不要盲目追新。我一般會選一個(gè)已經(jīng)發(fā)布幾個(gè)月、社區(qū)反饋穩(wěn)定的次版本。新主版本剛出來時(shí)可能有一些未暴露的兼容性問題等一兩個(gè)小版本修復(fù)后再上更穩(wěn)妥。ActiveMQ 5.x系列已經(jīng)非常成熟選一個(gè)近期的穩(wěn)定版就行。最后說個(gè)細(xì)節(jié)解壓后的目錄名帶版本號升級時(shí)如果直接覆蓋容易搞混。我的做法是每次升級都解壓到新目錄改好配置后把systemd unit里的路徑指過去重啟服務(wù)確認(rèn)沒問題后再刪舊目錄。這樣回滾也方便出問題把路徑改回去就行。