在VPS上部署JavaScript应用:高级分步指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:从本地服务器到生产就绪的解决方案

您已经创建了一个强大的基于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 systemd

pm2 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 服务

博客

书籍推荐