【问题标题】:using sudo with ExecStart (systemd)使用 sudo 和 ExecStart (systemd)
【发布时间】:2016-08-25 21:16:21
【问题描述】:

我正在尝试在端口 80 上运行 node.js 站点(我正在使用 Digital Ocean)。我在服务文件中使用 systemd 来做到这一点

...
ExecStart=/usr/bin/nodejs /var/www/bin/app.js
...

在本地主机上,如果我使用 sudo 启动站点,这在端口 80 上可以正常工作,但如果没有 sudo 则不能。显然您需要以 root 身份运行低于 1024 的端口。

如何在 ExecStart 中允许 sudo?还是我在这里完全走错了路,如果是这样,我如何在端口 80 上获取 express 应用程序?

干杯,迈克

【问题讨论】:

    标签: node.js express digital-ocean production systemd


    【解决方案1】:

    Systemd 默认以 root 身份启动ExecStart= 中所述的可执行文件。

    但是,如果您在服务文件中指定了 User=Group= 以覆盖该默认值,并且仍需要运行需要 sudo 的可执行文件,请在命令前面加上您的 sudo 位置的绝对路径:

    ...
    ExecStart=/usr/bin/sudo /usr/bin/nodejs /var/www/bin/app.js
    ...
    

    【讨论】:

      【解决方案2】:

      Systemd 默认以root 身份启动ExecStart= 中所述的可执行文件。这意味着,如果您没有在我们的服务文件中指定 User= 或 Group=,您的二进制文件将以特权启动。

      您可以通过启动 id 或 whoami 程序来验证这一点。例如:ExecStart=/usr/bin/idExecStart=/usr/bin/whoami(请注意程序的路径可能因您而异)

      【讨论】:

      • 我确实指定了一个组(非 root),但我想保持这种状态,因为最好不要以 root 运行网站。我该如何解决我的问题?
      • 您需要有一个 .socket 单元用于作为特权用户侦听它的端口。然后 systemd 将您的服务传递给套接字。它需要在 nodejs 上修改代码以使其激活 systemd 套接字。
      • 我试过 require('systemd'); var port = process.env.LISTEN_PID > 0 ? “系统”:3050; app.set('端口', 端口);但到目前为止还没有运气。
      • 最后我使用了 sudo setcap cap_net_bind_service=+ep /usr/bin/nodejs 来允许nodejs在1024以下的端口上发布
      猜你喜欢
      • 1970-01-01
      • 2018-06-20
      • 2016-01-10
      • 2019-11-17
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多