开发完成的应用最终需要部署到服务器上才能被用户访问。云平台提供了便捷的基础设施,让开发者可以快速上线应用。本章将介绍 Node.js 应用部署到主流云平台的方法,包括准备工作、环境配置、进程管理以及安全考虑,帮助你将应用顺利发布到生产环境。
在部署之前,确保你的 Node.js 应用满足以下基本要求:
process.env.PORT),因为云平台通常动态分配端口。package.json 完整,node_modules 不包含在版本控制中,部署时会自动安装。package.json 中定义 start 脚本,例如 "start": "node server.js",云平台会执行此命令。在前面的章节中我们已经学习了环境变量的重要性。部署时,你需要将本地 .env 文件中的变量迁移到云平台的环境变量配置中。不同平台设置方式不同,但原理一致。
// 示例:从环境变量读取端口
const port = process.env.PORT || 3000;
app.listen(port);
如果你将应用部署到虚拟机(如 AWS EC2、阿里云 ECS),建议使用 PM2 管理进程。PM2 可以保持应用永久运行,并提供负载均衡和监控。安装 PM2:
npm install -g pm2
启动应用:
pm2 start server.js --name my-app
设置开机自启:
pm2 startup
pm2 save
Heroku 是一个流行的 PaaS 平台,支持 Node.js 一键部署。步骤如下:
Procfile 文件(无扩展名),内容为:web: npm start。package.json 中指定了 Node 版本(可选):"engines": { "node": "16.x" }。git init; git add .; git commit -m "init"。heroku create your-app-name。heroku config:set JWT_SECRET=your-secret DB_URL=mongodb://...git push heroku main。https://your-app-name.herokuapp.com 查看应用。Heroku 会自动检测 Node.js 应用,运行 npm install 和 npm start。
这种方式给你更多的控制权,适合复杂的应用。以下是基本步骤:
使用 SSH 登录到服务器:
ssh user@your-server-ip
推荐使用 NVM 安装:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
source ~/.bashrc
nvm install 18
nvm use 18
可以使用 git clone 或 scp 将代码传到服务器。例如:
git clone your-repo-url
cd your-repo
npm install
创建 .env 文件或直接在系统环境变量中设置。例如:
echo "DB_URL=mongodb://..." >> .env
pm2 start server.js --name my-app
pm2 save
pm2 startup
为了让外界通过域名访问,并处理 SSL,通常使用 Nginx 反向代理。安装 Nginx:
sudo apt update && sudo apt install nginx
创建 Nginx 配置文件(/etc/nginx/sites-available/my-app):
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
启用配置并重启 Nginx:
sudo ln -s /etc/nginx/sites-available/my-app /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
Docker 可以打包应用及其环境,确保在不同平台运行一致。首先编写 Dockerfile:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
然后构建镜像并运行容器:
docker build -t my-app .
docker run -p 3000:3000 -e DB_URL=mongodb://... --name my-app -d my-app
可以使用 Docker Compose 管理多容器应用(如应用 + 数据库)。之后可以将镜像推送到容器注册中心(如 Docker Hub),并在云主机上拉取运行,或使用容器托管服务(如 AWS ECS、阿里云容器服务)。
自动化部署可以提高效率,减少人为错误。GitHub Actions 是一个常用工具。以下是一个将应用部署到阿里云 ECS 的示例工作流:
# .github/workflows/deploy.yml
name: Deploy to Server
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Deploy via SSH
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /path/to/app
git pull origin main
npm install
pm2 reload my-app
将服务器的 SSH 私钥和主机信息保存在 GitHub Secrets 中,即可实现代码推送后自动部署。
npm audit 检查漏洞。部署后需要监控应用状态。PM2 自带监控命令 pm2 monit,也可以集成第三方服务如 Sentry、Logtail 等。日志管理也很重要,可以使用 PM2 日志模块或集中式日志系统(如 ELK)。
本章介绍了将 Node.js 应用部署到云平台的多种方式,从 Heroku 的简单部署到 Linux 服务器的手动配置,再到 Docker 容器化和 CI/CD 自动化。选择哪种方式取决于你的应用复杂性、团队规模和运维能力。遵循安全最佳实践,结合监控和日志,可以让你的应用在生产环境中稳定运行。下一章我们将讨论性能优化策略。