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