引言:从本地服务器到生产就绪的解决方案
您已经创建了一个强大的基于Node.js的JavaScript应用,并在本地进行了测试,现在是时候将其展示给世界了。仅仅将文件上传到VPS并运行node app.js是新手的方法。在高级水平上,部署包括配置反向代理服务器、进程管理器、自动续期SSL证书、持续集成和交付(CI/CD)系统,以及合理的监控和日志记录。
在本文中,我们将逐步讲解在VPS(Ubuntu 22.04)上高级部署Node.js应用的过程。我们将配置Nginx作为反向代理,PM2用于进程管理,Let's Encrypt用于HTTPS,GitHub Actions用于在推送代码到仓库时自动部署,并添加基本的监控功能。
前提条件
- 一台可通过SSH访问的VPS服务器(Ubuntu 22.04)。
- 一个绑定到服务器IP的域名(例如,
myapp.example.com)。 - 服务器上已安装Node.js (v18+) 和 npm。
- 服务器上已安装Git。
- 您的应用代码仓库托管在GitHub上。
1. 配置服务器和进程管理器PM2
我们从基础环境准备开始。通过SSH连接到服务器后,更新软件包并安装必要的工具:
sudo apt update && sudo apt upgrade -ysudo apt install nginx git curl -y确保Node.js已安装。如果没有,通过NodeSource安装:
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -sudo apt install -y nodejsnode -vnpm -v现在全局安装PM2——一个高级的Node.js进程管理器,它可以在应用崩溃时自动重启、管理日志和集群:
sudo npm install -g pm2克隆您的应用仓库并安装依赖:
git clone https://github.com/your-username/your-repository.git /var/www/myappcd /var/www/myappnpm install --production创建一个PM2生态系统文件(ecosystem.config.js)进行精细配置:
// ecosystem.config.jsmodule.exports = { apps: [{ name: 'myapp', script: 'app.js', // 或 server.js instances: 'max', // 使用所有CPU核心 exec_mode: 'cluster', env: { NODE_ENV: 'production', PORT: 3000 }, error_file: '/var/log/node-app/err.log', out_file: '/var/log/node-app/out.log', log_date_format: 'YYYY-MM-DD HH:mm Z' }]};创建日志目录并通过PM2启动应用:
sudo mkdir -p /var/log/node-appsudo chown -R $USER:$USER /var/log/node-apppm2 start ecosystem.config.jspm2 savepm2 startup systemdpm2 startup命令会创建一个systemd服务,在系统启动时自动运行PM2。现在您的应用运行在3000端口,但直接访问它并不安全。接下来配置Nginx。
2. 配置Nginx作为反向代理并通过Let's Encrypt配置SSL
Nginx将接收来自80端口(HTTP)和443端口(HTTPS)的传入请求,将它们代理到运行在3000端口的Node.js进程,并直接提供静态文件服务——这减轻了Node.js的负载。
为我们的域名创建一个配置文件:
sudo nano /etc/nginx/sites-available/myapp粘贴以下配置(将myapp.example.com替换为您的域名):
server { listen 80; server_name myapp.example.com; return 301 https://$server_name$request_uri; # 重定向到HTTPS}
server { listen 443 ssl http2; server_name myapp.example.com;
# SSL 服务