保持愚蠢简单:
setcap
:设置特殊能力,允许非root用户绑定特权端口。
systemd
:系统和服务管理器,可用于启动应用程序和守护进程。
- VPS:虚拟专用服务器,通常作为云计算平台中的一种提供。
在普通的VPS(例如Digital Ocean、Linode、Vultr或Scaleway)上,磁盘是持久的,使用"setcap"。这将允许非root用户绑定到特权端口。
sudo setcap 'cap_net_bind_service=+ep' $(which node)
TADA!现在您可以作为普通用户运行node ./server.js --port 80
!
顺带一提:
您还可以使用systemd
停止和启动服务。 由于systemd
有时会让人感到糟心,所以我编写了一个Go语言的包装脚本,使部署Node项目变得非常容易:
curl https://webinstall.dev/serviceman | bash
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运行,但在您通常使用易失性虚拟化的情况下...这并不重要。您有一个单独的服务,一个单独的用户帐户,只要实例失败或以其他方式“重新启动”(或者您启动镜像的新实例),您就会再次获得一个全新的系统(这意味着任何漏洞都会持续存在)。
防火墙:临时 vs VPS
像EC2这样的东西通常是私有的,而不是面向公众的。这些是“云服务”系统。您可以使用十几种不同的服务和自动缩放。因此,您将使用负载均衡器服务将端口转发到EC2组。通常,实例的默认防火墙会拒绝所有公共网络流量。您必须进入防火墙管理,并确保您打算使用的端口实际上是开放的。
有时VPS提供商具有“企业”防火墙配置器,但更典型的情况是您只能访问虚拟机,因为默认情况下只有您实际侦听的端口才能访问外部世界(通常不会有随机服务运行),因此您可能无法从防火墙中获得任何额外的好处。当然是个好主意,但不是必需品。
不要将EC2用作VPS
您上述的用例可能更适合传统的VPS服务(如上所述:Digital Ocean、Linode、Vultr、Scaleway等),这些服务更易于使用,并且起步管理难度更小。你只需要一点bash CLI的知识。
作为额外的奖励,您不需要猜测成本是多少。他们用简单的每月美元告诉您,而不是每个CPU /小时/GB/内部网络/外部网络等的¢ - 因此,当出现问题时,您会通过电子邮件或管理控制台收到警告消息,而不是一张意外的6,527美元账单。
底线:如果您选择使用EC2,并且您不是拥有财务人员“DevOps”专家...您将会遇到困难。