Graylog启动失败的三大主因是Java版本错配、Elasticsearch未禁用xpack.security且未设single-node模式、mongodb_uri缺数据库名或root_password_sha2未生成;须严格按依赖链逐层验证:4.x用JDK11、5.x用JDK17;ES配置必须显式设xpack.security.enabled: false、discovery.type: single-node、network.host: 0.0.0.0;mongodb_uri须含/graylog,web_listen_uri须为http://0.0.0.0:9000/并每次修改后执行daemon-reload与restart。

Graylog 不是装完就能跑的服务,版本错配、配置漏项、监听地址写死——三者任一出问题,systemctl start graylog-server 就会静默退出,journalctl -u graylog-server 里只留一句模糊的 Failed to connect to MongoDB 或 Connection refused by Elasticsearch。别试错,直接按依赖链逐层动手。
Java 版本必须严格匹配 Graylog 大版本
Graylog 4.x 和 5.x 对 JDK 要求完全不同:graylog 4.1–4.5 必须用 openjdk-11;graylog 5.0+(含当前最新 5.2)强制要求 java 17。混用会导致 JVM 启动失败,日志里只有 UnsupportedClassVersionError。
- 先卸载所有旧 JDK:
sudo apt remove openjdk-* -y(Ubuntu/Debian)或sudo yum remove java-* -y(RHEL/CentOS) - 从 Adoptium 下载
temurin-17-jdktar.gz,解压后设为默认:sudo update-alternatives --install /usr/bin/java java /opt/temurin-17-jdk/bin/java 1 - 验证:
java -version输出必须含17.,且不能出现openjdk version "11."
Elasticsearch 必须关闭 xpack.security 并设为 single-node 模式
Graylog OSS 版不支持 Elasticsearch 内置安全模块。若 xpack.security.enabled: true(默认值),Graylog 启动时会卡在 Waiting for Elasticsearch cluster to become ready,最终报 Unable to parse response body。
- 编辑
/etc/elasticsearch/elasticsearch.yml,确保以下三项显式赋值(不能只取消注释):xpack.security.enabled: falsediscovery.type: single-nodenetwork.host: 0.0.0.0 - 重启服务:
sudo systemctl restart elasticsearch - 验证连通性:
curl -s http://localhost:9200/_cat/health?v应返回green状态
mongodb_uri 必须带数据库名,root_password_sha2 必须提前生成
Graylog 不读取系统级 MongoDB 配置。mongodb_uri = mongodb://localhost:27017 会连上但无法建库,报 Unauthorized;漏写 root_password_sha2 则服务启动后立刻退出,日志显示 No root user configured。
- 确认 MongoDB 已运行:
sudo systemctl status mongod - 修改
/etc/graylog/server/server.conf中的mongodb_uri:必须写成mongodb://localhost:27017/graylog(末尾/graylog数据库名不可省略) - 生成 SHA256 密码哈希:
echo -n "your_password_here" | sha256sum | cut -d" " -f1,结果填入root_password_sha2配置项 -
password_secret也必须设置,至少 16 字符,例如:SomeThingVerySecretWhichYouShouldChange123!
web_listen_uri 必须设为 0.0.0.0:9000,且每次改配置后 reload
Graylog 默认监听 http://127.0.0.1:9000,不绑定 0.0.0.0,也不开 HTTPS。直接浏览器访问服务器 IP:9000 必然失败——这不是 Web 服务没起,而是监听地址没改。
- 在
/etc/graylog/server/server.conf中设置:web_listen_uri = http://0.0.0.0:9000/(注意结尾斜杠) - 同时设置
rest_listen_uri = http://0.0.0.0:9000/api/,否则 API 请求会 404 - 每次改完配置必须执行:
sudo systemctl daemon-reload && sudo systemctl restart graylog-server - 验证健康状态:
curl -s http://localhost:9000/api/system/health返回 JSON 中各组件状态应全为up
防火墙端口、Docker Compose 部署、OpenSearch 替代方案这些都只是变体,核心永远是 Java/Elasticsearch/MongoDB 三者的版本对齐与配置显式化。最容易被跳过的其实是 web_listen_uri 结尾那个斜杠,以及 mongodb_uri 里那个看似多余的 /graylog ——它们不是可选项,是 Graylog 启动时解析配置的硬性分隔符。


















