架構決策
為什麼選擇 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
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
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
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,並預先配置好所有必要的系統參數。
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
sudo dnf install elasticsearch-7.12.0 -y
sudo dnf install 'dnf-command(versionlock)' -y
sudo dnf versionlock elasticsearch-7.12.0
sysctl -w vm.max_map_count=262144
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
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
sudo mkdir -p /etc/elasticsearch/jvm.options.d
sudo tee /etc/elasticsearch/jvm.options.d/heap.options <<EOF
-Xms10g
-Xmx10g
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now elasticsearch
curl -X GET http://localhost:9200
Step 6: 安裝 Graylog 6.1.7
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
SECRET=$(pwgen -s 96 1)
sudo sed -i -e "s/^password_secret =.*/password_secret = $SECRET/" /etc/graylog/server/server.conf
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
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
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
sudo systemctl start graylog-server.service
sudo systemctl enable --now graylog-server
Step 7: 設定 Rsyslog
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 反向代理
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
sudo systemctl enable --now nginx
sudo systemctl restart nginx
sudo systemctl status nginx
Step 9: 設定 JVM 記憶體
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)
圖 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 以獲取最新版本。
rpm -Uvh https://packages.graylog2.org/repo/packages/graylog-6.3-repository_latest.rpm
dnf clean all
dnf check-update | grep graylog
Step 2: 執行升級
使用套件管理員進行升級。
dnf upgrade graylog-server -y
Step 3: 重啟與驗證
升級完成後,重啟服務讓新程式碼生效。
systemctl restart graylog-server
tail -f /var/log/graylog-server/server.log
圖 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 快照備份!
systemctl stop graylog-server
systemctl stop elasticsearch
systemctl stop mongod
Graylog 7.0 強制要求 Java 21,使用 Java 17 會無法啟動。
dnf install -y java-21-openjdk-headless
alternatives --config java
java -version
rpm -Uvh https://packages.graylog2.org/repo/packages/graylog-7.0-repository_latest.rpm
dnf clean all
dnf check-update | grep graylog
dnf upgrade graylog-server -y
這是最關鍵的一步,強制 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
systemctl daemon-reload
systemctl start mongod
systemctl start elasticsearch
sleep 15
systemctl start graylog-server
tail -f /var/log/graylog-server/server.log
🎉 成功指標: 若日誌顯示 Graylog server up and running 且網頁能正常登入搜尋,代表攻頂成功!
以下終端機輸出證實:系統已成功在 Rocky Linux 9.6 上運行 Graylog 7.0.3 (Java 21),並透過相容模式對接 Elasticsearch 7.12.0。
====== [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",
▲ 鐵證:Rocky 9.6 + Java 21 + Graylog 7.0 + ES 7.12 同時在線
▲ 驗收:Graylog 7.0 網頁介面正常運作,搜尋功能完全相容
📚 完整參考文獻庫 (References)
Graylog 安裝與設定
架構評估 (Graylog vs ELK)
Elasticsearch 相關
Nginx 反向代理與 Web 介面
日誌收集與轉發 (Rsyslog, NxLog)
進階應用與除錯
☕ 感謝您的閱讀!
寫技術文章不容易,若這篇教學對您有幫助:
- 分享 給您的同事或社群
- 留言 讓我知道這篇文有用
- 回報 任何操作上的問題
最完整,說明詳細,零錯的說明,作者非常用心。大推!! by charlie hsia
回覆刪除謝謝 !!
刪除