Node.js是构建Web应用和API服务的流行运行时。在搬瓦工VPS上部署Node.js应用,需要安装Node.js环境、配置进程管理工具PM2保证应用持久运行,并通过Nginx反向代理提供域名和HTTPS访问。本文介绍从零开始的完整部署流程。
NVM(Node Version Manager)可以方便地安装和切换多个Node.js版本:
# 安装NVM
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
# 加载NVM(或重新打开终端)
source ~/.bashrc
# 查看可用的LTS版本
nvm ls-remote --lts
# 安装最新LTS版本
nvm install --lts
# 验证安装
node -v
npm -v
# 设置默认版本
nvm alias default 20
Tip: 生产环境建议使用LTS(长期支持)版本,稳定性更好。
# 创建项目目录
mkdir -p /var/www/myapp
cd /var/www/myapp
# 初始化项目
npm init -y
# 安装Express
npm install express
创建应用入口文件 app.js:
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;
app.get('/', (req, res) => {
res.json({ message: 'Hello from Node.js!', time: new Date() });
});
app.get('/health', (req, res) => {
res.json({ status: 'ok' });
});
app.listen(PORT, '127.0.0.1', () => {
console.log(`Server running on port ${PORT}`);
});
# 测试运行
node app.js
# 另一个终端测试
curl http://127.0.0.1:3000
PM2是Node.js应用的生产级进程管理器,提供进程守护、自动重启、日志管理等功能:
# 全局安装PM2
npm install -g pm2
# 启动应用
pm2 start app.js --name myapp
# 查看运行状态
pm2 status
# 查看日志
pm2 logs myapp
# 设置开机自启
pm2 startup
pm2 save
创建PM2生态配置文件 ecosystem.config.js:
module.exports = {
apps: [{
name: 'myapp',
script: 'app.js',
cwd: '/var/www/myapp',
instances: 'max', // 根据CPU核心数启动多个实例
exec_mode: 'cluster', // 集群模式
env: {
NODE_ENV: 'production',
PORT: 3000
},
max_memory_restart: '300M',
log_date_format: 'YYYY-MM-DD HH:mm:ss',
error_file: '/var/log/pm2/myapp-error.log',
out_file: '/var/log/pm2/myapp-out.log',
merge_logs: true
}]
};
# 使用配置文件启动
pm2 start ecosystem.config.js
# 重载应用(零停机)
pm2 reload myapp
# 停止和删除
pm2 stop myapp
pm2 delete myapp
sudo nano /etc/nginx/conf.d/myapp.conf
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# 静态文件直接由Nginx处理
location /public/ {
alias /var/www/myapp/public/;
expires 30d;
access_log off;
}
# 其他请求代理到Node.js
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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;
proxy_cache_bypass $http_upgrade;
}
}
sudo nginx -t
sudo nginx -s reload
使用 .env 文件管理敏感配置:
# 安装dotenv
npm install dotenv
# 创建.env文件
nano /var/www/myapp/.env
NODE_ENV=production
PORT=3000
DB_HOST=localhost
DB_NAME=myapp
SECRET_KEY=your-secret-key-here
// 在app.js开头加载
require('dotenv').config();
const PORT = process.env.PORT || 3000;
const DB_HOST = process.env.DB_HOST;
Tip: .env 文件包含敏感信息,不要提交到Git仓库,在 .gitignore 中排除。
日常代码更新的标准流程:
# 进入项目目录
cd /var/www/myapp
# 拉取最新代码
git pull origin main
# 安装新依赖
npm install --production
# 零停机重载
pm2 reload myapp
# 查看运行状态
pm2 status
pm2 logs myapp --lines 20
lsof -i :3000,查看PM2错误日志 pm2 logs myapp --errmax_memory_restartTip: PM2详细用法请参考 PM2管理教程。更多教程请查看新手教程。