保持简单:
在普通 VPS(例如 Digital Ocean、Linode、Vultr 或 Scaleway)上,其中磁盘是持久的,使用“setcap”。这将允许非 root 用户绑定到特权端口。
sudo setcap 'cap_net_bind_service=+ep' $(which node)
多田!现在你可以以普通用户的身份运行node ./server.js --port 80了!
旁白:
您也可以使用systemd 来停止和启动您的服务。因为systemd 有时是一个 p.i.t.a.,所以我写了一个 wrapper script in Go,它使得部署节点项目变得非常容易:
# Install
curl https://webinstall.dev/serviceman | bash
# Use
cd ./my/node/project
sudo serviceman --username $(whoami) add npm start
或者,如果您的服务器不称为“server.js”(事实上的标准),或者额外的选项:
cd ./my/node/project
sudo serviceman --username $(whoami) add node ./my-server-thing.js -- --my-options
所要做的就是为您创建systemd 文件,并使用合理的默认值。我建议您也查看systemd 文档,但它有点难以理解,而且可能比简单而好的教程更令人困惑和糟糕的教程。
临时实例(即 EC2)不适用于长时间运行的服务器
一般来说,当人们使用 EC2 时,这是因为他们不关心单个实例正常运行时间的可靠性 - 他们想要“可扩展”架构,而不是持久架构。
在大多数情况下,实际上并不打算让虚拟化服务器以任何方式持续存在。在这些类型的“临时”(临时)环境中,“重新启动”的目的与从头开始重新安装大致相同。
您不是“设置服务器”而是“部署映像”。您登录此类服务器的唯一原因是对您正在创建的图像进行原型制作或调试。
“磁盘”是易变的,IP 地址是浮动的,映像在每次启动时都表现相同。您通常也不会使用传统意义上的用户帐户概念。
因此:虽然您确实不应该以 root 身份运行服务,但您通常使用 volatile 虚拟化的情况类型...没关系那么多。您只有一个服务,一个用户帐户,并且一旦实例失败或以其他方式“重新启动”(或者您启动映像的新实例),您就会重新拥有一个全新的系统(这确实意味着任何漏洞仍然存在)。
防火墙:临时 vs VPS
像 EC2 这样的东西通常是专用于私有的,而不是面向公众的。这些是“云服务”系统。您需要使用十几种不同的服务和自动缩放。因此,您将使用负载均衡器服务将端口转发到您的 EC2 组。通常,实例的默认防火墙将拒绝所有公共网络流量。您必须进入防火墙管理并确保您打算使用的端口实际上是打开的。
有时 VPS 提供商有“企业级”防火墙配置器,但更常见的情况是,您只能获得对虚拟机的原始访问权限,因为首先只有您实际监听的端口才能访问外部世界(默认情况下,它们通常没有运行随机服务),您可能不会从防火墙中获得任何额外的好处。当然是个好主意,但不是做你需要做的事情的必要条件。
不要将 EC2 用作 VPS
您上面的用例可能更适合传统 VPS 服务(如上所述:Digital Ocean、Linode、Vultr、Scaleway 等),它们更容易使用,而且上手时的管理麻烦也少得多。您只需要一点 bash CLI 知识即可。
而且,作为额外的奖励,您不必猜测成本是多少。他们用简单的 $/month 告诉你,而不是 ¢/cpu/hour/gb/internal-network/external-network/etc - 所以当出现问题时,你会通过电子邮件或管理员收到警告控制台而不是意外的 6,527 美元账单。
底线:如果您选择使用 EC2,并且您不是“DevOps”专家,并且有会计人员......您将很难过。