教程 搜索 / 发布与基础设施 / 在 AWS Lightsail 上运行 Node API
📝 文字 ● 中级 更新于 2026-05-13

在 AWS Lightsail 上运行 Node API

Lightsail 是 AWS 中简洁的一角。固定月费,一键创建 Linux 服务器,SSH 登录即可运行代码。没有 EC2 的附加费用,没有繁琐的 IAM 配置。这是在不承受 AWS 复杂性代价的前提下使用 AWS 的最佳选择。

大多数想用小型 Linux 服务器运行 Node API 的人其实并不需要 AWS。DigitalOcean droplets、Hetzner Cloud、Fly machines——这些选择都更简单、更便宜、上手更快。选择 Lightsail 的理由通常只有两种:要么你已经有 AWS 基础设施(S3 存储桶、RDS 数据库、SES 邮件)需要与这台服务器集成;要么你公司有"只用 AWS"的规定。除此之外,Lightsail 不错,但并无突出优势。

Lightsail 之所以存在,是因为 EC2 对于"我只想要一台 $5 的 Linux 服务器"这个需求来说实在太复杂了。EC2 每个实例有六七项计费条目;Lightsail 只收一笔费用。EC2 的公网 IP 藏在弹性 IP 后面——附加时免费,一旦解绑就开始收费;Lightsail 的静态 IP 是包含在内的。EC2 有安全组、网络 ACL、VPC、子网和路由表;Lightsail 只有一个防火墙开关。代价是 Lightsail 的配置选项较少——如果你的工作负载需要更多控制,就该从 Lightsail 迁移到 EC2 了。

本教程将带你完成以下步骤:使用 Node.js 蓝图创建 Lightsail 实例、部署应用、用进程管理器持续运行它、开放防火墙端口、绑定域名,以及申请免费 TLS 证书。最终目标:让 https://api.mybrand.com 指向你的 Node API。实例创建我们会用 AWS 控制台(CLI 也可以,但控制台在这里更直观),其余步骤都在命令行完成。

你将学到

前提条件:一个 AWS 账号、本地 SSH 密钥(或愿意使用浏览器内置 SSH)、一个托管在 git 仓库中的可用 Node API,以及一个你能管理 DNS 的域名(Route 53 或其他 DNS 服务商均可)。完成第 2 步(首次 SSH 登录)后,在部署任何代码之前,请先阅读为生产环境准备一台全新 Linux 服务器——Bitnami 蓝图只加固了 Bitnami 服务本身,OS 层(系统更新、ufw、fail2ban、swap、unattended-upgrades)仍需手动配置。

第 1 步:创建实例

1

选择蓝图、规格和区域

在 AWS 控制台中打开 Lightsail(注意:它有独立的控制台地址 lightsail.aws.amazon.com,与主 AWS 控制台分开——功能相同,URL 不同)。点击 Create instance(创建实例):

  • Instance location(实例位置):选择离你用户最近的区域。如果不确定,us-east-1 是个稳妥的默认选项。
  • Platform(平台):Linux/Unix。
  • Blueprint(蓝图):有两个合理选项。"Node.js" 预装了 Node、npm、nginx 和 PM2。"OS Only → Ubuntu 22.04" 是干净的裸系统,需要你自行安装 Node。追求速度就选 Node.js 蓝图;想要干净的起点就选 Ubuntu。
  • Instance plan(实例套餐):$5/月(512 MB 内存、1 vCPU、20 GB SSD、1 TB 流量)足以应对小型 Node API。如果觉得不放心,$10/月可以翻倍资源。
  • Name(名称):类似 mybrand-api-prod 这样的命名。

点击 Create。实例在 60–90 秒内启动完毕。Lightsail 会分配一个公网 IP 和内部名称。新账号在 AWS 免费套餐下,第一个月免费。

第 2 步:SSH 登录

2

浏览器 SSH 或本地密钥,任选其一

两种方式:

  • 浏览器 SSH:进入实例页面 → 点击 Connect using SSH。终端会在新标签页打开。无需配置,能穿透企业防火墙,但不保留滚动历史,复制粘贴也不方便。
  • 本地 SSH:下载默认密钥(Account → SSH keys → Default → Download)。保存到 ~/.ssh/lightsail.pem,执行 chmod 600 ~/.ssh/lightsail.pem,然后:
    ssh -i ~/.ssh/lightsail.pem bitnami@<PUBLIC_IP>
    # Node.js 蓝图的用户名是 bitnami,Ubuntu 蓝图的用户名是 ubuntu。

登录成功后,Node.js 蓝图的主目录下会有 /opt/bitnami/,里面包含 nginx 和预置的 Node 示例应用。

第 3 步:部署代码

3

git clone 或 rsync,两种方式都可以

# 方式 A:git clone(公开仓库或使用 deploy key)
cd ~
git clone https://github.com/you/your-api.git
cd your-api
npm ci --production
# 在 /etc/environment 或应用读取的 .env 文件中设置环境变量。

# 方式 B:从本地用 rsync 推送(服务器无法访问 git)
# 在本地执行:
rsync -avz --exclude node_modules \
  -e "ssh -i ~/.ssh/lightsail.pem" \
  ./ bitnami@<PUBLIC_IP>:/home/bitnami/your-api/
# 然后在服务器上执行:
cd ~/your-api
npm ci --production

先手动测试一下:执行 node server.js(或你的入口文件),确认应用能正常启动并监听端口——通常是 3000 或 8080。停止它(Ctrl+C);下一步我们会让它持续运行。

第 4 步:通过 PM2 持续运行

4

崩溃自动重启,重启后自动恢复

Node.js 蓝图已预装 PM2。若使用纯 Ubuntu 蓝图,执行:sudo npm i -g pm2

cd ~/your-api
pm2 start server.js --name api
pm2 save
pm2 startup
# pm2 startup 会打印一条命令——以 root 身份执行它,
# 将 PM2 注册为 systemd 服务,使其在重启后自动恢复。

现在你的 API 已在 http://<PUBLIC_IP>:3000(或你应用监听的端口)上运行。测试一下:

curl http://<PUBLIC_IP>:3000/health
# 目前会超时——防火墙还没放行。那是第 5 步的内容。

常用 PM2 命令:pm2 logs api(实时日志)、pm2 restart apipm2 monit(交互式监控面板)。

第 5 步:开放防火墙

5

两个端口:80 用于 HTTP,443 用于 HTTPS

Lightsail 防火墙默认只开放 SSH(22 端口),其余全部屏蔽。开放 Web 端口:

  1. 进入 Lightsail 控制台 → 你的实例 → Networking 标签页。
  2. IPv4 Firewall 下,点击 Add rule
  3. 添加:Application = HTTP,Port = 80。再添加:Application = HTTPS,Port = 443。
  4. 保存。

不要直接将 3000 端口暴露到公网——nginx 会在你的 Node 应用前面监听 80/443 端口(蓝图已预装并运行 nginx),并将请求代理转发给 Node 进程。从本地执行 curl http://<PUBLIC_IP>,应该能看到默认的 nginx 页面或蓝图示例应用。

第 6 步:配置 nginx 反向代理你的 API

6

编辑一个文件,重载 nginx

在 Node.js 蓝图上,nginx 配置位于 /opt/bitnami/nginx/conf/server_blocks/。在该目录创建一个文件:

sudo nano /opt/bitnami/nginx/conf/server_blocks/api.conf

粘贴以下内容:

server {
    listen 80;
    server_name api.mybrand.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

重载:sudo /opt/bitnami/ctlscript.sh restart nginx。现在 nginx 已将 api.mybrand.com:80 的请求代理到 127.0.0.1:3000 上的 Node 进程。

第 7 步:绑定静态 IP 和域名

7

没有静态 IP,停机重启后 IP 会变

Lightsail 的默认 IP 是"动态"的——重启能保留,但关机重开后会变。绑定真实域名需要一个固定不变的静态 IP:

  1. Lightsail → Networking(顶部标签页,不是实例内的那个)→ Create static IP
  2. 选择与实例相同的区域,然后附加到该实例。
  3. 附加期间免费;一旦解绑但未使用,则按 $0.005/小时(约 $3.65/月)计费。这是 Lightsail 唯一容易踩坑的计费项。

现在将你的域名指向静态 IP。在 Route 53(或你的 DNS 服务商)中:创建一条 A 记录,名称填 api,值填你的静态 IP。DNS 教程涵盖了各类 DNS 记录的通用说明;这里是最直接的 A 记录场景。

第 8 步:通过 Let's Encrypt 免费申请 TLS 证书

8

Bitnami 内置了一键申请脚本

在 Node.js 蓝图上,certbot 已预装。SSH 登录后执行:

sudo /opt/bitnami/bncert-tool

该工具会询问你的域名、邮箱,以及是否启用 HTTP 转 HTTPS 重定向。选择启用重定向。它会自动修改 nginx 配置、签发证书并设置自动续期。整个过程两分钟,无需手动编辑 nginx。

若使用纯 Ubuntu 蓝图(无 Bitnami):执行 sudo apt install certbot python3-certbot-nginx,然后 sudo certbot --nginx -d api.mybrand.com --redirect。效果相同,步骤稍多。

测试:curl -I https://api.mybrand.com/health。你应该看到 HTTP/2 200(或你的健康检查接口返回的状态码)。HTTP→HTTPS 重定向已生效;证书通过 cron 任务每 90 天自动续期。

搭建完成后的部署流程

每次推送更新代码时,常规工作流如下:

# 本地:推送到仓库
git push origin main

# 服务器:拉取并重启
ssh -i ~/.ssh/lightsail.pem bitnami@<STATIC_IP>
cd ~/your-api
git pull
npm ci --production  # 如果依赖有变化
pm2 restart api

想要更省事,可以在本地写一个 shell 脚本,通过 SSH 执行同样的命令:

#!/usr/bin/env bash
ssh -i ~/.ssh/lightsail.pem bitnami@<STATIC_IP> \
  'cd ~/your-api && git pull && npm ci --production && pm2 restart api'

如果想用真正的 CI/CD,一个 SSH 进服务器并执行相同命令的 GitHub Actions workflow 大约只需 15 行代码。要实现零停机部署(更进一步),可以考虑 PM2 的 reload 命令,或将 PM2 与轻量级反向代理切换方案配合使用。

何时该从 Lightsail 迁移出去

你需要自动扩缩容。Lightsail 是单实例方案。如果流量超过单台服务器的承载能力,你需要 EC2 + ALB + Auto Scaling Group,或者迁移到像 ECS Fargate 这样的容器编排平台。

你需要 VPC 对等连接或私有子网。Lightsail 实例运行在托管 VPC 中,无法与其他 VPC 对等互联。如果服务器需要访问 RDS、ElastiCache 或 AWS 侧的私有资源,EC2 才是正确选择。

你需要超过 $80/月套餐(32 GB 内存、8 vCPU)的配置。Lightsail 的最大规格是固定的;超过这个上限,只能选择 EC2。

下一步