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

    回覆刪除

張貼留言