【问题标题】:Systemd service for Node server can't connect to MongoDBNode 服务器的 Systemd 服务无法连接到 MongoDB
【发布时间】:2017-03-19 13:28:49
【问题描述】:

我创建了一个 Systemd 单元文件来在系统启动时运行 Mongodb。我还创建了一个 systemd 服务来在 mongodb 启动后在启动时运行我的节点应用程序。 mongodb 的服务工作正常,但由于某种原因,我的 Node 应用程序服务尝试运行,然后出现错误:“MongoError:首次连接时无法连接到服务器 [localhost:27017]”。如果我使用$systemctl start mongodb 启动mongodb 服务,然后使用$/usr/bin/node /node_app_slot/server.js 启动我的Node 应用程序,它似乎工作正常。所以问题似乎出在我的 Node 服务器的 systemd 单元文件上。

我将它用于 mongodb systemd 服务https://gist.github.com/jwilm/5842956

这是我的 node_server.service:

[Unit]
Wants=network.target mongodb.service
After=network.target mongodb.service

[Service]
ExecStart=/usr/bin/node /node_app_slot/server.js

[Install]
WantedBy=multi-user.target

我在使用 hostapd 以接入点模式设置的英特尔 edison 上执行此操作。操作系统是 Yocto,并且是最新版本。

我看不出哪里出错了。如果有人能引导我朝着正确的方向前进,我将不胜感激!

谢谢!

【问题讨论】:

  • 我想知道 MongoDB 服务器是否需要一段时间才能真正开始接受传入连接。你能在某处插入一个 sleep 看看它是否在 10 秒左右后接受它们吗?
  • 你看过你的 mongodb 日志了吗?如果 mongodb 准备好接受连接,你必须看到你的 nodejs 请求。
  • 另外,重试连接而不是失败是有意义的(也许通过指数级地退出连接尝试)

标签: node.js mongodb boot systemd intel-edison


【解决方案1】:

您的systemd 语法是正确的,尽管您可能希望使用network-online.target 而不是network.target

要考虑的解决方法是在 MongoDB 应用启动之前添加 5 秒睡眠。由于这发生在服务器启动时,额外的 5 秒不太可能产生实际影响,但可能会解决您的问题。

 ExecStartPre=/bin/sleep 5

奇怪的是,当 MongoDB 附带自己的 systemd 服务文件时,您正在从 Internet 复制/粘贴 MongoDB systemd 服务文件。您没有提及您的操作系统版本、systemd 版本或 MongoDB 版本,但如果不使用文件随附的 MongoDB 版本,我仍然建议参考官方的MongoDB systemd 配置文件。

【讨论】:

    【解决方案2】:

    我有类似的问题。问题可能是您在网络服务完成启动之前尝试连接。你可以看看这里,看看它是否能解决你的问题:

    https://unix.stackexchange.com/questions/126009/cause-a-script-to-execute-after-networking-has-started

    【讨论】:

      猜你喜欢
      • 2019-03-02
      • 2014-02-04
      • 2021-10-03
      • 2020-11-03
      • 2019-02-26
      • 2020-10-23
      • 1970-01-01
      • 2013-03-25
      相关资源
      最近更新 更多