April 7, 20251 yr 自 Invision Community 5.0.5 起,最低版本要求提升為 Elasticsearch 8.0 ~ 9.0 版本。 注意:IK分詞器版本必須與 Elasticsearch 版本號完全一致,例如,Elasticsearch 8.17.4 版本 需要搭配 IK分詞器 8.17.4 版本。 ------------------------------------------------------------ 前置作業 ------------------------------------------------------------ 更新系統套件 apt update -y && apt upgrade -y 安裝必要依賴套件 apt install -y wget curl gnupg ca-certificates lsb-release ------------------------------------------------------------ 安裝 Elasticsearch ------------------------------------------------------------ 請先至 Elastic 歷史版本頁,確認所需版本,再調整以下指令中的版本號。 https://www.elastic.co/downloads/past-releases/ IK 分詞器 歷史版本 https://release.infinilabs.com/analysis-ik/stable/ 下載安裝包 cd /root wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.17.4-amd64.deb 驗證下載完整性(SHA-512) 跳過校驗是生產環境常見風險,可能因下載中斷或來源污染而安裝損壞的套件。 下載官方 SHA-512 校驗檔 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.17.4-amd64.deb.sha512 執行校驗(應顯示 elasticsearch-8.17.4-amd64.deb: OK) sha512sum -c elasticsearch-8.17.4-amd64.deb.sha512 若顯示 FAILED:請勿繼續安裝。 刪除下載檔案,重新下載後再次驗證。 安裝套件 dpkg -i elasticsearch-8.17.4-amd64.deb 安裝過程中會自動: 建立 elasticsearch 系統使用者與群組 建立資料目錄 /var/lib/elasticsearch 建立日誌目錄 /var/log/elasticsearch 建立設定目錄 /etc/elasticsearch 自動建立 logrotate 設定 安裝輸出中會出現一大段安全性設定資訊(包含自動產生的密碼與 enrollment token)。 由於我們接下來會關閉 Security 功能(僅限 localhost 使用),這些資訊可直接忽略。 ------------------------------------------- 安裝 IK 中文分詞器 ------------------------------------------- 為什麼需要 IK 分詞器? Elasticsearch 內建的 Standard Analyzer(標準分詞器)對中文的處理方式是逐字切割(每個漢字獨立成一個 token),搜尋效果差。 安裝 IK 分詞器後,可依中文語意進行智慧斷詞: 分析器:ik_max_word 使用時機:建立索引(Index)時 特性:最細粒度拆分,窮舉所有可能組合,提升搜尋召回率 分析器:ik_smart 使用時機:搜尋查詢(Search)時 特性:最粗粒度拆分,符合語意的最少詞彙,提升精確率 斷詞效果示例(文字「中文論壇搜尋測試」): ik_max_word:中文 / 文論 / 論壇 / 搜尋 / 測試 ……(細粒度) ik_smart:中文 / 論壇 / 搜尋 / 測試(語意粒度) ---------------------------------- 下載 IK 分詞器 ---------------------------------- IK 版本必須與 Elasticsearch 完全相同(含 patch 版號)。 方法一:手動下載(推薦) cd /root wget https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-8.17.4.zip 方法二:透過 elasticsearch-plugin CLI 線上安裝 /usr/share/elasticsearch/bin/elasticsearch-plugin install \ https://get.infini.cloud/elasticsearch/analysis-ik/8.17.4 方法二需要 VPS 能存取外部網路,且伺服器與遠端的連線品質須穩定。 若網路環境受限,請使用方法一。 ---------------------------------------- 驗證下載完整性(方法一適用) ---------------------------------------- cd /root md5sum elasticsearch-analysis-ik-8.17.4.zip 取得輸出的 雜湊值後,至 infinilabs releases 頁面比對官方提供的值: https://release.infinilabs.com/analysis-ik/stable/ Md5 Hash ab1d88870a533be0defc62a5b1d82a7e elasticsearch-analysis-ik-8.17.4.zip --------------------------------------- 安裝 IK 外掛(方法一適用) --------------------------------------- 必須在啟動 Elasticsearch 之前安裝外掛,或在安裝後重啟。 /usr/share/elasticsearch/bin/elasticsearch-plugin install \ file:///root/elasticsearch-analysis-ik-8.17.4.zip Continue with installation? [y/N] 出現提示時 輸入 y 確認繼續 -> Installed analysis-ik -> Please restart Elasticsearch to activate any plugins installed 看到 Installed analysis-ik 即代表安裝成功 ------------------------------------- 確認 Java 環境 ------------------------------------- Elasticsearch 8.x 已內建 OpenJDK,一般情況下不需要額外安裝 Java 確認內建 JDK 路徑存在 dpkg -L elasticsearch | grep jdk 驗證內建 JDK 版本 /usr/share/elasticsearch/jdk/bin/java -version 預期輸出範例 openjdk version "23" 2024-09-17 OpenJDK Runtime Environment (build 23+37-2369) OpenJDK 64-Bit Server VM (build 23+37-2369, mixed mode, sharing) --------------------------------------- 調整設定檔 --------------------------------------- 修改 vi /etc/elasticsearch/elasticsearch.yml 貼上以下內容 # ===================================================== # Elasticsearch 設定檔 # 適用:IPS論壇 / 單節點 / 僅限 localhost 存取 # VPS規格:2 vCPU / 2GB RAM # ===================================================== # 叢集名稱 cluster.name: myforum-es # 節點名稱 node.name: ips-node-1 # 資料與日誌路徑 path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch # 網路綁定:僅允許 localhost 存取,嚴禁對外開放 network.host: 127.0.0.1 # HTTP 連接埠 http.port: 9200 # 單節點模式(不需要多節點) discovery.type: single-node # 資料保護 # 防止誤刪索引:DELETE 操作必須指定具體索引名稱 # 禁止使用萬用字元刪除(如 DELETE /*),生產環境必備 action.destructive_requires_name: true # 安全性設定 # 關閉 Security 安全認證(僅限 localhost 綁定時才可這樣設定) # 警告:若 network.host 改為 0.0.0.0 對外開放,必須重新啟用 Security 並設定密碼,否則任何人皆可存取 xpack.security.enabled: false xpack.security.enrollment.enabled: false # 關閉 SSL(本機通訊不需要) xpack.security.http.ssl.enabled: false xpack.security.transport.ssl.enabled: false # 效能保護 # 搜尋逾時保護:避免慢查詢無限期佔用資源 search.default_search_timeout: 60s # 功能精簡(節省記憶體) # 關閉機器學習功能(小論壇節省RAM) xpack.ml.enabled: false 儲存檔案並離開vi編輯器 按 Esc,輸入 :wq,按 Enter 說明: cluster.name 叢集名稱,自訂即可,但日後多節點時必須一致 action.destructive_requires_name: true 防止手滑執行 DELETE * 刪除所有索引,生產環境必備 xpack.security.enabled: false 僅限 127.0.0.1 綁定的本機場景適用;若對外開放必須啟用 xpack.ml.enabled: false 機器學習模組預設耗用大量 RAM,2GB VPS 務必關閉 --------------------------------- 調整 JVM 記憶體 --------------------------------- Elasticsearch 預設 JVM 堆疊記憶體設定對 2GB RAM 的 VPS 而言過大,若不手動調小, 系統容易因記憶體耗盡而觸發 OOM(Out Of Memory),導致服務被強制終止。 建立目錄 mkdir -p /etc/elasticsearch/jvm.options.d 建立 JVM 調整檔 vi /etc/elasticsearch/jvm.options.d/custom-ram.options 貼上以下內容 # ===================================================== # JVM 堆疊記憶體設定 # VPS規格:2 vCPU / 2GB RAM # ===================================================== # Xms(初始堆疊)與 Xmx(最大堆疊)必須設為相同值 # 設為相同值可避免 JVM 在執行期間動態調整堆疊大小所造成的 GC 抖動 # 2GB RAM VPS 建議設定:256m ~ 512m # - 設太小(< 256m):GC 過於頻繁,搜尋效能明顯下降 # - 設太大(> 512m):Nginx、PHP-FPM、MariaDB 等服務記憶體不足 -Xms256m -Xmx256m 儲存檔案並離開vi編輯器 按 Esc,輸入 :wq,按 Enter --------------------------------- JVM 記憶體配置參考 --------------------------------- RAM 總量:2 GB Elasticsearch JVM:256m(推薦)~ 512m(上限) 剩餘給其他服務:約 1.5 ~ 1.75 GB RAM 總量:4 GB Elasticsearch JVM:512m ~ 1g 剩餘給其他服務:約 3 ~ 3.5 GB RAM 總量:8 GB Elasticsearch JVM:1g ~ 2g 剩餘給其他服務:約 6 ~ 7 GB Elasticsearch 官方建議 JVM 堆疊不超過實體記憶體的 50%,且不超過 30GB。 對 2GB VPS 而言,256m 是在搜尋效能與系統穩定之間的平衡點。 --------------------------------------------- 調整系統核心參數 --------------------------------------------- Elasticsearch 使用記憶體映射檔案(MMap)存取索引。 若系統允許的記憶體映射數量上限不足,會在日誌中出現錯誤,並導致效能下降甚至拒絕請求,官方要求最少 262144 確認目前的 vm.max_map_count sysctl vm.max_map_count 立即套用(臨時生效,重開機後失效) sysctl -w vm.max_map_count=262144 永久生效(寫入 sysctl 設定檔) cat > /etc/sysctl.d/99-elasticsearch.conf << 'EOF' # Elasticsearch 要求的最低記憶體映射數量 # 官方要求最少 262144 vm.max_map_count=262144 EOF 套用設定 sysctl --system 驗證生效,預期輸出 vm.max_map_count = 262144 sysctl vm.max_map_count 說明:vm.max_map_count 控制單一程序可建立的記憶體映射區段數量上限。此值調整不影響其他服務,可安全設定。 --------------------------------------- 啟動並驗證 --------------------------------------- 啟用並啟動服務 systemctl daemon-reload systemctl enable elasticsearch systemctl start elasticsearch 說明:Elasticsearch 首次啟動需要 1~3 分鐘,請耐心等待。 ----------------------- 確認服務狀態 ----------------------- 確認服務狀態,應顯示 active (running) systemctl status elasticsearch 若顯示 failed,請查看錯誤日誌 journalctl -u elasticsearch -n 50 --no-pager ------------------------------------ 重開機驗證 ------------------------------------ 重開機 reboot 重開機後,再次確認服務是否正常,應顯示 active (running) systemctl status elasticsearch 驗證 Elasticsearch 安裝完整性 /usr/share/elasticsearch/bin/elasticsearch-keystore list 確認 IK 外掛已安裝,應輸出:analysis-ik /usr/share/elasticsearch/bin/elasticsearch-plugin list 確認 analysis-ik 版本 8.17.4 curl http://127.0.0.1:9200/_nodes/plugins?pretty 驗證 REST API 正常回應(應回傳包含 "You Know, for Search" 字串的 JSON,以及版本資訊。) curl http://127.0.0.1:9200 驗證 IK 分詞器已載入 curl http://127.0.0.1:9200/_cat/plugins?v 應顯示 name component version ips-node-1 analysis-ik 8.17.4 若 _cat/plugins 無輸出或未顯示 analysis-ik 代表 IK 未正確安裝。 -------------------------------- 驗證 IK 分詞效果 -------------------------------- 測試 ik_max_word(索引分詞模式) curl -X POST \ "http://127.0.0.1:9200/_analyze" \ -H 'Content-Type: application/json' \ -d '{ "analyzer":"ik_max_word", "text":"中文論壇搜尋測試" }' 測試 ik_smart(搜尋分詞模式) curl -X POST "http://127.0.0.1:9200/_analyze" \ -H 'Content-Type: application/json' \ -d '{ "analyzer": "ik_smart", "text": "中文論壇搜尋測試" }' 比對兩者的斷詞差異: ik_max_word 應輸出較多 token(細粒度) ik_smart 應輸出較少 token(語意粒度) 兩者都不應出現逐字切割的結果(例如:`中`、`文`、`論`、`壇`……) 若分詞結果是逐字切割(每個漢字各自成一個 token),代表 IK 未正確載入,Elasticsearch 使用了 standard analyzer 作為後備。 -------------------------------------- 驗證叢集健康狀態 -------------------------------------- curl http://127.0.0.1:9200/_cluster/health?pretty 應顯示 green 或 yellow(單節點環境正常) 說明: 單節點環境預期為 green,若顯示 yellow,通常代表部分索引的副本分片無法分配(單節點無法分配副本),這是正常現象; 若顯示 red,代表有主分片遺失,需要進一步排查。 ------------------------ 安全性強化 ------------------------ 確認 Elasticsearch 未對外開放 ss -tlnp | grep 9200 正確輸出(127.0.0.1:9200 僅綁定 localhost) 說明:若出現 0.0.0.0:9200,請立即修改 /etc/elasticsearch/elasticsearch.yml 中的 network.host 為 127.0.0.1,並重啟服務。 ------------------------------------ 防火牆確認(nftables) ------------------------------------ 若已依照本系列教學設定 nftables 防火牆,9200 port 不應對外開放。確認防火牆規則 nft list ruleset | grep 9200 若無任何輸出,表示 nftables 並未開放 9200,符合預期 防禦縱深原則:即使 Elasticsearch 已綁定 127.0.0.1,防火牆也不應開放 9200 port,形成雙重防護。 ------------------------------------ 設定檔權限 ------------------------------------ chmod 640 /etc/elasticsearch/elasticsearch.yml chown root:elasticsearch /etc/elasticsearch/elasticsearch.yml 驗證 ls -la /etc/elasticsearch/elasticsearch.yml 應顯示:-rw-r----- 1 root elasticsearch ... ------------------------------------------- 資料目錄權限確認 ------------------------------------------- 資料目錄權限確認 ls -la /var/lib/elasticsearch ls -la /var/log/elasticsearch 兩個目錄的屬主應為 elasticsearch:elasticsearch。 若安裝後遭到誤改,執行: chown -R elasticsearch:elasticsearch /var/lib/elasticsearch chown -R elasticsearch:elasticsearch /var/log/elasticsearch --------------------------------------- 資源監控 --------------------------------------- 查詢RAM占用情況 free -h 2 vCPU / 2GB RAM VPS 的正常參考值(搭配 Nginx、PHP-FPM、MariaDB 同時運行): Mem: 1.2G used available: 597M 說明: used 約 1.2 ~ 1.4 GB 為正常範圍 available 應保持在 300MB 以上,否則有 OOM 風險 若 available 過低,請考慮: 1. 確認 JVM 設定是否已生效 2. 將 JVM 記憶體降至 256m 3. 確認 xpack.ml.enabled: false 已正確設定 -------------------------------------------- 確認 JVM 記憶體設定是否生效 -------------------------------------------- curl -s http://127.0.0.1:9200/_nodes/jvm?pretty | grep -E "heap_init|heap_max" 預期顯示 "heap_init_in_bytes" : 268435456, "heap_max_in_bytes" : 268435456 268435456 = 256MB 代表目前 Heap 已經是: -Xms256m -Xmx256m 若無輸出或數值不符, 請確認 /etc/elasticsearch/jvm.options.d/custom-ram.options 內容,並重啟 Elasticsearch ------------------------------ 查看日誌 ------------------------------ 即時查看最新日誌 journalctl -u elasticsearch -f 查看最近 50 行日誌 journalctl -u elasticsearch -n 50 --no-pager 查看啟動錯誤 journalctl -u elasticsearch --since "5 minutes ago" --no-pager --------------------------------------------------------- 內建的 Log4j2 RollingFile 日誌輪轉機制 --------------------------------------------------------- Elasticsearch 8 已經使用內建的 Log4j2 RollingFile 日誌輪轉機制,而不是依賴 /etc/logrotate.d/elasticsearch。 grep -nE "RollingFile|Policies|Delete|IfAccumulatedFileSize|IfLastModified" \ /etc/elasticsearch/log4j2.properties ----------------------------------------------------------- 移除 Elasticsearch (更換版本用) ----------------------------------------------------------- 以下操作會永久刪除所有索引資料,請確認已備份或準備好重建索引。 停止並停用服務 systemctl stop elasticsearch systemctl disable elasticsearch 徹底移除套件(含設定檔) dpkg --purge elasticsearch 刪除索引資料目錄 rm -rf /var/lib/elasticsearch 刪除設定目錄 rm -rf /etc/elasticsearch 刪除日誌目錄 rm -rf /var/log/elasticsearch 重新載入systemd systemctl daemon-reload 確認套件已完整移除(應無輸出) dpkg -l | grep elasticsearch 確認目錄已刪除 ls /var/lib/elasticsearch 應顯示 No such file or directory ls /etc/elasticsearch 應顯示 No such file or directory 完成後,重開機再依照本教學重新安裝所需版本 reboot Edited June 19Jun 19 by Jack
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.