我认为这实际上是一个极其简单的问题,我只是不明白在 Linux 中通常是如何解决这个问题的。
我有一个简单的节点服务器,用于接收来自我网站的帖子请求。它需要我的 SSL 证书 ( /etc/letsencrypt/live/www.ditabase.io/privkey.pem
),这意味着它需要这些证书的权限。
我希望服务器能够从 bash 脚本启动,而无需我输入密码,因此它可以在启动时启动,并且 git post-receive 钩子可以在我推送到生产时停止旧服务器并启动新服务器。
以下所有方法都可以起作用,但显然在某种程度上是不安全的/不是自动的:
- 向所有人开放证书权限->
nodejs server.js
- 向组/用户开放证书权限,然后从那里运行节点 ->
su nodeuser -c "nodejs server.js"
- 在脚本中输入密码 ->
echo PASSWORD | sudo -Su nodeuser nodejs server.js
- 每次都要手动启动吗?我真的不明白如何解决这个问题。
答案1
权限
您不应以 root 身份运行节点服务器。如果您的节点应用程序被攻击者攻陷,他将拥有整个机器的 root 访问权限。您应该继续以权限较低的用户身份运行节点服务器。
通过更改 SSL 证书密钥文件的所有权和权限,可以解决 SSL 证书问题。例如,公钥的所有者是 user:usergroup,权限为 644 (-rw-r--r--)。私钥的所有者是 user:ssl-cert,权限为 640 (-rw-r-----)。为了实现这一点,请使用以下命令(并将“user”、“usergroup”和路径替换为您的机器的正确值):
sudo chown user:usergroup pathToPublicKey
sudo chmod 644 pathToPublicKey
sudo chown user:ssl-cert pathToPrivateKey
sudo chmod 640 pathToPrivateKey
这并不完美,但目前没有其他方法可以用节点来实现这一点(据我所知)。
启动节点服务器
通过在 rc.local 中设置执行脚本的命令,可以在启动时启动节点服务器。但是,如果节点崩溃,它将不会自动重新启动。
更好的解决方案是在 systemd 中创建一个服务。这样,您的脚本可以在启动时启动,由 systemd 守护程序保持活动状态,并且如果停止,它将自动重新启动。为了实现这一点,在 /lib/systemd/system 中创建一个名为 myservice.service 的文件(并将“myservice”替换为您选择的名称)。在文件中,放置以下内容(并将“myusername”替换为您机器上应运行脚本的用户的名称,注意不要使用 root 用户,并输入正确的路径):
[Unit]
Description=start my node server
After=network.target
[Service]
Environment=NODE_PORT=2999
Type=simple
User=myusername
ExecStart=/usr/bin/node server
WorkingDirectory=pathToTheDirectoryOfYourServerJsFile
Restart=on-failure
[Install]
WantedBy=multi-user.target
之后,重启你的机器。然后通过以下命令激活服务
systemctl start myservice
并通过命令在启动时启用它
systemctl enable myservice
可以使用 systemd 以外的其他守护进程,例如 pm2 或 forever,但它们会消耗计算机的额外资源,因此使用正在运行的默认守护进程 systemd 似乎是最合理的选择。