Rocky Linux 9.6×Graylog 7.0.3×Elasticsearch 7.12 完整安裝與升級實戰:從 6.1.7 平滑升級+Java 21 避坑指南

📝 終極維運手冊 [實戰] Graylog 終極筆記:打破 ES 7.12 限制,從 6.1.7 完美升級至 7.0.3 (含 Java 21 避坑指南)

這是一份從 0 到 100 的完整實戰紀錄。我們將從標準的 Graylog 6.1.7 安裝開始,示範如何正規升級至 6.3.8,最後展示如何透過「相容性黑科技」,在不更換 Elasticsearch 7.12 的情況下,強制攻頂最新的 Graylog 7.0.3

  • Stage 1: 標準安裝 (Graylog 6.1.7 + ES 7.12)
  • Stage 2: 穩定升級 (Graylog 6.3.8)
  • Stage 3: 極限挑戰 (Graylog 7.0.3 + Java 21)

架構決策 為什麼選擇 Elasticsearch 7.12.0?

在本次的 Graylog 6.1 架構中,我們選擇使用 Elasticsearch 7.12.0

雖然 Graylog 官方文件指出最後支援版本為 7.10.2,但經過實測,7.12.0 在效能與功能上表現更佳。本腳本已內建 忽略版本檢查Watcher 權限修正,並使用 versionlock 鎖定版本,是目前最穩定的實戰配置。

選型評估 為何選擇 Graylog 而非主流的 ELK Stack?

在日誌系統的選型上,ELK (Elasticsearch, Logstash, Kibana) 雖然是業界標準,但對於「系統維運 (Ops)」而言,Graylog 提供了更開箱即用的體驗。以下是我們最終選擇 Graylog 的關鍵考量:

  • 管理維護成本低: ELK 的 Logstash 需編寫複雜的 Config 檔來處理 Pipeline;而 Graylog 提供 Web GUI 即可輕鬆設定 Inputs、Extractors 與 Streams,除錯與接管門檻大幅降低。
  • 內建多租戶權限 (RBAC): Graylog 原生支援強大的角色權限控管,可以針對不同團隊 (Streams) 開放特定日誌檢視權限;這在 ELK 免費版中設定相對繁瑣。
  • 專注於日誌場景: Kibana 是一個通用的數據視覺化工具,功能強大但也複雜;Graylog 則專注於「Log Management」,搜尋語法更直覺,且內建的 Alerting (告警) 機制比 ELK 更易於設定與整合。

Step 1: 更新系統與基本設定

timedatectl set-timezone Asia/Taipei sudo dnf update -y sudo dnf install epel-release nginx -y sudo dnf install pwgen perl-Digest-SHA -y

Step 2: 設定防火牆與 SELinux

# 設定防火牆規則 sudo firewall-cmd --permanent --add-port={1514,514}/tcp sudo firewall-cmd --permanent --add-port={1514,514}/udp sudo firewall-cmd --permanent --add-service={http,https} sudo firewall-cmd --permanent --add-port={9000,9200,27017,8514,1514,514,12201}/tcp sudo firewall-cmd --permanent --add-port={514,12201}/udp sudo firewall-cmd --reload # 設定 SELinux sudo setsebool -P httpd_can_network_connect 1 sudo semanage port -a -t http_port_t -p tcp 514 sudo semanage port -a -t http_port_t -p udp 514 sudo semanage port -a -t http_port_t -p tcp 1514 sudo semanage port -a -t http_port_t -p udp 1514 sudo semanage port -a -t http_port_t -p tcp 9000 sudo semanage port -a -t http_port_t -p tcp 9200 sudo semanage port -a -t mongod_port_t -p tcp 27017

Step 3: 安裝 OpenJDK 17

sudo yum install -y java-17-openjdk-headless java -version

Step 4: 安裝 MongoDB 7.0

# 新增 MongoDB 7.0 Repo sudo tee /etc/yum.repos.d/mongodb-org-7.0.repo <<EOF [mongodb-org-7.0] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/9/mongodb-org/7.0/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-7.0.asc EOF # 安裝與啟動 sudo yum clean all sudo yum makecache sudo dnf install -y mongodb-org sudo systemctl daemon-reload sudo systemctl enable mongod.service sudo systemctl start mongod.service # 修改 SELinux 權限 sudo ausearch -c 'ftdc' --raw | audit2allow -M my-ftdc sudo semodule -X 300 -i my-ftdc.pp

Step 5: 安裝 Elasticsearch 7.12.0 (鎖定版本)

為了確保環境穩定,我們將直接安裝並鎖定 Elasticsearch 7.12.0,並預先配置好所有必要的系統參數。

# 1. 設定 Elasticsearch 儲存庫 sudo tee /etc/yum.repos.d/elasticsearch.repo <<EOF [elasticsearch] name=Elasticsearch Repository baseurl=https://artifacts.elastic.co/packages/7.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md EOF # 2. 安裝 7.12.0 版本 sudo dnf install elasticsearch-7.12.0 -y # 3. 安裝 Version Lock 插件並鎖定版本 (防止自動升級) sudo dnf install 'dnf-command(versionlock)' -y sudo dnf versionlock elasticsearch-7.12.0 # 4. 設定系統虛擬記憶體 (Elasticsearch 啟動必要條件) sysctl -w vm.max_map_count=262144 echo "vm.max_map_count=262144" >> /etc/sysctl.conf # 5. 寫入設定檔 (已包含 7.12.0 專用修正) # 關鍵修正:action.auto_create_index 必須允許 Watcher 建立索引 sudo tee /etc/elasticsearch/elasticsearch.yml <<EOF cluster.name: graylog discovery.type: single-node action.auto_create_index: .watches,.triggered_watches,.watcher-history-* xpack.security.enabled: false path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch network.host: 127.0.0.1 http.port: 9200 EOF # 6. 設定 JVM 記憶體為 10GB (依據 32GB 總記憶體最佳化) sudo mkdir -p /etc/elasticsearch/jvm.options.d sudo tee /etc/elasticsearch/jvm.options.d/heap.options <<EOF -Xms10g -Xmx10g EOF # 7. 啟動並驗證 sudo systemctl daemon-reload sudo systemctl enable --now elasticsearch # 測試 Elasticsearch (預期版本:7.12.0) curl -X GET http://localhost:9200

Step 6: 安裝 Graylog 6.1.7

# 匯入 Graylog Repo sudo rpm --import /tmp/GPG-KEY-graylog sudo rpm -Uvh https://packages.graylog2.org/repo/packages/graylog-6.1-repository_latest.rpm sudo yum install -y graylog-server # 設定 password_secret SECRET=$(pwgen -s 96 1) sudo sed -i -e "s/^password_secret =.*/password_secret = $SECRET/" /etc/graylog/server/server.conf # 設定 admin 密碼 (請依提示輸入) echo -n "Enter Password: " password_hash=$(head -1 </dev/stdin | tr -d '\n' | sha256sum | cut -d" " -f1) sudo sed -i -e "s/^root_password_sha2 =.*/root_password_sha2 = $password_hash/" /etc/graylog/server/server.conf # 設定時區與連線 sudo sed -i -e "s/^#root_username = admin/root_username = admin/" /etc/graylog/server/server.conf sudo sed -i -e 's/^#root_timezone = UTC/root_timezone = Asia\/Taipei/' /etc/graylog/server/server.conf sudo sed -i -e 's/^#elasticsearch_hosts =.*/elasticsearch_hosts = http:\/\/127.0.0.1:9200/' /etc/graylog/server/server.conf # 設定索引前綴 sed -i 's|^#elasticsearch_index_prefix.*|elasticsearch_index_prefix = graylog|' /etc/graylog/server/server.conf sed -i 's|^#elasticsearch_index_template_name.*|elasticsearch_index_template_name = graylog_template|' /etc/graylog/server/server.conf # 【關鍵】強制略過版本檢查 (允許連線到 7.12.0) sed -i 's|^#elasticsearch_disable_version_check.*|elasticsearch_disable_version_check = true|' /etc/graylog/server/server.conf sed -i 's|^#elasticsearch_mute_deprecation_warnings.*|elasticsearch_mute_deprecation_warnings = true|' /etc/graylog/server/server.conf # 設定 Web 介面 sudo sed -i -e "s/^#http_bind_address = 127.0.0.1:9000/http_bind_address = 0.0.0.0:9000/" /etc/graylog/server/server.conf sudo sed -i -e "s/^#http_enable_tls = true/http_enable_tls = false/" /etc/graylog/server/server.conf # 啟動 Graylog sudo systemctl start graylog-server.service sudo systemctl enable --now graylog-server

Step 7: 設定 Rsyslog

# 啟用 UDP/TCP 並轉發 sudo sed -i 's/^#module(load="imudp")/\$module(load="imudp")/' /etc/rsyslog.conf sudo sed -i 's/^#input(type="imudp" port="514")/\$input(type="imudp" port="514")/' /etc/rsyslog.conf sudo sed -i 's/^#module(load="imtcp")/\$module(load="imtcp")/' /etc/rsyslog.conf sudo sed -i 's/^#input(type="imtcp" port="514")/\$input(type="imtcp" port="514")/' /etc/rsyslog.conf sudo sed -i '$a *.* @127.0.0.1:1514;RSYSLOG_SyslogProtocol23Format' /etc/rsyslog.conf # 重啟並設定防火牆 sudo systemctl restart rsyslog sudo firewall-cmd --permanent --add-masquerade sudo firewall-cmd --permanent --add-forward-port=port=514:proto=udp:toport=1514 sudo firewall-cmd --reload

Step 8: 設定 Nginx 反向代理

# 安裝 Nginx sudo yum install -y nginx sudo tee /etc/nginx/conf.d/graylog.conf <<EOF server { listen 80; server_name 192.168.202.149; access_log /var/log/nginx/graylog_access.log; error_log /var/log/nginx/graylog_error.log; location / { proxy_set_header Host \$http_host; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto \$scheme; proxy_set_header X-Graylog-Server-URL http://\$server_name/; proxy_pass http://192.168.202.149:9000; proxy_read_timeout 90; proxy_connect_timeout 90; proxy_http_version 1.1; proxy_set_header Upgrade \$http_upgrade; proxy_set_header Connection "upgrade"; } } EOF # 啟動 Nginx sudo systemctl enable --now nginx sudo systemctl restart nginx sudo systemctl status nginx

Step 9: 設定 JVM 記憶體

# 設定 Graylog Server 記憶體 (設定為 8GB) sudo sed -i 's/-Xms1g -Xmx1g/-Xms8g -Xmx8g/' /etc/sysconfig/graylog-server sudo sed -i '$a GRAYLOG_SERVER_JAVA_OPTS="-Djava.net.preferIPv4Stack=true"' /etc/sysconfig/graylog-server

Step 10: 重啟所有服務

sudo systemctl restart mongod sudo systemctl restart elasticsearch sudo systemctl restart graylog-server sudo systemctl restart rsyslog sudo systemctl restart nginx # 檢查埠口狀態 sudo netstat -tulnp | grep 514

🔎 驗證安裝結果 (Stage 1)

Graylog Search Dashboard 圖 1:Graylog 6.1.7 成功運作畫面,已順利接收到本機 Syslog 日誌
🔧 疑難排解 救命!我忘記 Admin 密碼了怎麼辦?
別擔心,只要透過 SSH 即可重置。請執行以下指令產生新密碼 Hash:
echo -n "你的新密碼" | sha256sum
接著修改 /etc/graylog/server/server.conf 中的 root_password_sha2 欄位,並重啟 Graylog 服務即可。
✅ Stage 1 完成 系統安裝完成!

您的 Graylog 6.1.7 已成功對接 Elasticsearch 7.12.0
請等待約 1-2 分鐘讓 Graylog 服務完全啟動,接著訪問您的 IP 即可登入。

📈 維護手冊:從 Graylog 6.1.7 升級至 6.3.8

若您目前的環境為 Graylog 6.x 舊版,請依照以下標準作業程序 (SOP) 進行原地升級。此升級路徑保留了與 Elasticsearch 7.12 的相容性。

Step 1: 更換為 6.3 系列儲存庫

切換 Yum Repository 以獲取最新版本。

# 1. 安裝 Graylog 6.3 Repo rpm -Uvh https://packages.graylog2.org/repo/packages/graylog-6.3-repository_latest.rpm # 2. 清除快取並檢查新版本 dnf clean all dnf check-update | grep graylog # 預期結果:應顯示 graylog-server 6.3.x 版本可用
Step 2: 執行升級

使用套件管理員進行升級。

# 執行升級指令 dnf upgrade graylog-server -y
Step 3: 重啟與驗證

升級完成後,重啟服務讓新程式碼生效。

# 1. 重啟 Graylog systemctl restart graylog-server # 2. 觀察日誌 (確認出現 Server up and running) tail -f /var/log/graylog-server/server.log
Graylog 6.3.8 Status 圖 2:升級成功!系統已更新至 Graylog 6.3.8 且運作正常
⚠️ 未來升級警告 (Future Roadmap)

目前系統 (ES 7.12 + Java 17) 的版本上限為 Graylog 6.3.x

若未來要升級至 Graylog 7.0+,將面臨重大架構變更:

  • Java: 必須升級至 Java 21。
  • Search: 必須移除 Elasticsearch,遷移至 OpenSearch (ES 7.12 將不再支援)。

在未做好遷移準備前,請勿將 Repo 更新至 7.0。

💀 極限挑戰:Graylog 7.0 攻頂計畫

⚠️ 警告:非官方支援架構 (Non-Standard)

本段落示範如何在 不更換 Elasticsearch 7.12 的情況下,強制升級至最新的 Graylog 7.0.3。 此操作利用了 Graylog 內部的隱藏相容性,適合進階玩家。

前置作業: 請務必先執行 VM Snapshot 快照備份!

Step 1: 停止服務 (Safety Stop)
# 停止所有相關服務以確保資料完整性 systemctl stop graylog-server systemctl stop elasticsearch systemctl stop mongod
Step 2: 升級 Java 21 (Required)

Graylog 7.0 強制要求 Java 21,使用 Java 17 會無法啟動。

# 1. 安裝 OpenJDK 21 Headless dnf install -y java-21-openjdk-headless # 2. 切換系統預設 Java 版本 (請選擇 Java 21 對應的編號) alternatives --config java # 3. 驗證版本 (必須顯示 openjdk 21.x) java -version
Step 3: 執行版本升級 (Upgrade)
# 1. 更新為 7.0 儲存庫 rpm -Uvh https://packages.graylog2.org/repo/packages/graylog-7.0-repository_latest.rpm # 2. 清除快取並檢查 dnf clean all dnf check-update | grep graylog # 3. 執行升級指令 dnf upgrade graylog-server -y
Step 4: 注入相容性參數 (Magic Hack)

這是最關鍵的一步,強制 Graylog 忽略 Elasticsearch 版本檢查。

# 強制略過版本檢查 (必備) echo "elasticsearch_disable_version_check = true" >> /etc/graylog/server/server.conf # 隱藏過期警告 (選配,讓日誌乾淨點) echo "elasticsearch_mute_deprecation_warnings = true" >> /etc/graylog/server/server.conf # 檢查是否寫入成功 grep "elasticsearch_disable_version_check" /etc/graylog/server/server.conf
Step 5: 啟動與驗收 (Launch)
# 1. 依序啟動服務 (DB -> Search -> App) systemctl daemon-reload systemctl start mongod systemctl start elasticsearch # (建議等待 15 秒讓 ES 完成初始化) sleep 15 # 2. 啟動 Graylog 7.0 systemctl start graylog-server # 3. 監看日誌 (尋找 "Server up and running") tail -f /var/log/graylog-server/server.log

🎉 成功指標: 若日誌顯示 Graylog server up and running 且網頁能正常登入搜尋,代表攻頂成功!

Step 6: 系統驗證日誌 (Validation Log)

以下終端機輸出證實:系統已成功在 Rocky Linux 9.6 上運行 Graylog 7.0.3 (Java 21),並透過相容模式對接 Elasticsearch 7.12.0

[root@graylog ~]# # 系統完整規格檢查 ====== [System Spec] ====== Rocky Linux release 9.6 (Blue Onyx) ====== [Java Version (Must be 21)] ====== openjdk version "21.0.10" 2026-01-20 LTS OpenJDK Runtime Environment (Red_Hat-21.0.10.0.7-1) (build 21.0.10+7-LTS) OpenJDK 64-Bit Server VM (Red_Hat-21.0.10.0.7-1) (build 21.0.10+7-LTS, mixed mode, sharing) ====== [Graylog Version] ====== Name : graylog-server Version : 7.0.3 Release : 1 Install Date: 西元2026年01月27日 (週二) 11時13分27秒 ====== [Elasticsearch Version (Compatibility Mode)] ====== "name" : "graylog", "cluster_name" : "graylog", "number" : "7.12.0", "lucene_version" : "8.8.0",
Terminal Proof

▲ 鐵證:Rocky 9.6 + Java 21 + Graylog 7.0 + ES 7.12 同時在線

Web Interface Proof

▲ 驗收:Graylog 7.0 網頁介面正常運作,搜尋功能完全相容

☕ 感謝您的閱讀!

寫技術文章不容易,若這篇教學對您有幫助:

  • 分享 給您的同事或社群
  • 留言 讓我知道這篇文有用
  • 回報 任何操作上的問題

留言 ( 2 )

留言

  1. 最完整,說明詳細,零錯的說明,作者非常用心。大推!! by charlie hsia

    回覆刪除

張貼留言