海外云服务器搭建Node.js应用环境完整教程(PM2进程管理+Nginx反向代理,2026最新版)

📅 · 海外云服务器自建服务教程 - ChengziCloud

一句话结论

Meta Description: 用海外云服务器从零搭建Node.

本文要点
  • 前言
  • 服务器配置推荐与价格对比
  • 第一步:服务器基础环境准备
  • 第二步:安装Node.js运行时
  • 第三步:部署Node.js应用
  • 第四步:安装配置PM2进程管理器
  • 第五步:安装Nginx并配置反向代理
  • 第六步:配置SSL证书(Let's Encrypt)

Meta Description: 用海外云服务器从零搭建Node.js生产环境,涵盖Node.js安装、PM2进程管理、Nginx反向代理配置、SSL证书部署、应用监控与自动重启,附服务器配置推荐与价格对比。

关键词:海外云服务器搭建Node.js、PM2进程管理、Nginx反向代理Node.js、Node.js部署教程、PM2配置

前言

如果你需要用海外云服务器部署Node.js应用——无论是API后端、Express/Koa/NestJS服务,还是Next.js/Nuxt.js前后端一体化项目——本教程提供从零到生产的完整方案。核心架构是:Node.js运行时 + PM2进程管理器 + Nginx反向代理 + Let's Encrypt SSL,所有命令均可直接复制执行,覆盖CentOS 7和Ubuntu 22.04双系统。

PM2是Node.js生态中最成熟的进程管理工具,支持自动重启、负载均衡、日志管理和零停机部署。配合Nginx反向代理,可以实现HTTPS终结、静态资源加速、负载分发和安全加固——这是目前业界最主流的Node.js生产部署方案。

服务器配置推荐与价格对比

Node.js应用对CPU和内存的要求因场景而异:轻量API后端1核2G足够,全栈SSR应用建议2核4G起步,高并发场景需要4核8G以上。

配置档位表

场景推荐配置适用项目预算参考
个人博客/小型API1核2GExpress API、Hexo部署$3-5/月
中型Web应用2核4GNestJS后端+MySQL、Next.js SSR$5-10/月
高并发微服务4核8G多实例负载均衡、WebSocket长连接$15-30/月
电商/SaaS平台8核16G集群部署、Redis缓存+PM2$40-80/月

服务商对比表

服务商月付年付(折扣后)数据中心优点
阿里云国际版 ECS$4.2$3.2/月新加坡/香港/硅谷中文面板、支持支付宝
AWS Lightsail$3.5$3.5/月全球20+区域新用户免费套餐、生态完善
腾讯云国际版 CVM$4.5$3.5/月香港/新加坡/东京低延迟到国内、微信支付
Vultr$6.0$6.0/月全球32个按小时计费、随时销毁
DigitalOcean$6.0$6.0/月全球14个文档最完善、社区教程多

🚀 还没有海外云服务器?通过 5.chengzicloud.cloud 选购阿里云/AWS/腾讯云国际版,享专属折扣和中文技术支持。

第一步:服务器基础环境准备

购买服务器后,先完成基础配置。以下以Ubuntu 22.04为例,CentOS 7命令在括号内标注。

更新系统软件包


// Ubuntu 22.04
sudo apt update && sudo apt upgrade -y

// CentOS 7
sudo yum update -y

创建专用部署用户

生产环境不建议用root运行应用。创建一个专用用户:


// 两个系统通用
sudo useradd -m -s /bin/bash deploy
sudo usermod -aG sudo deploy   // Ubuntu
sudo usermod -aG wheel deploy   // CentOS 7

配置防火墙放行端口


// Ubuntu 22.04 (ufw)
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

// CentOS 7 (firewalld)
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

安全提示:Node.js应用本身不需要暴露端口到公网,由Nginx统一入口。只放行22/80/443即可。

第二步:安装Node.js运行时

推荐使用NodeSource官方仓库安装LTS版本(当前为Node.js 20.x),而非系统自带的旧版本。

安装Node.js 20 LTS


// Ubuntu 22.04
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs

// CentOS 7
curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash -
sudo yum install -y nodejs

验证安装


node -v    // 应输出 v20.x.x
npm -v     // 应输出 10.x.x

配置npm国内镜像(加速依赖安装)


npm config set registry https://registry.npmmirror.com

为什么不用nvm? nvm适合开发环境切换多版本,生产服务器建议固定LTS版本,避免版本漂移导致的兼容问题。

第三步:部署Node.js应用

以一个Express.js API项目为例,展示从代码到运行的完整流程。

克隆或上传项目代码


sudo su - deploy
mkdir -p /home/deploy/apps && cd /home/deploy/apps

// 方式一:从Git仓库克隆
git clone https://github.com/your-username/your-app.git my-api

// 方式二:本地上传后scp到服务器
// scp -r ./your-app deploy@server-ip:/home/deploy/apps/my-api

安装项目依赖


cd /home/deploy/apps/my-api
npm install --production

配置环境变量

生产环境的敏感配置(数据库密码、API密钥等)不要写在代码里,用.env文件管理:


cat > .env << 'EOF'
NODE_ENV=production
PORT=3000
DB_HOST=localhost
DB_USER=myapp
DB_PASS=your_secure_password_here
DB_NAME=myapp_db
JWT_SECRET=your_random_secret_key_here
EOF

安全提示:.env文件不要提交到Git仓库。在.gitignore中添加 .env,并设置权限 chmod 600 .env。

测试应用能否正常启动


node app.js
// 或
npm start
// 看到 "Server running on port 3000" 说明正常,Ctrl+C 停止

第四步:安装配置PM2进程管理器

PM2是Node.js的生产级进程管理器,提供自动重启、日志管理、集群模式和零停机部署。

全局安装PM2


sudo npm install -g pm2

用PM2启动应用


cd /home/deploy/apps/my-api
pm2 start app.js --name my-api

常用PM2命令速查

命令说明
pm2 list查看所有进程状态
pm2 logs my-api实时查看应用日志
pm2 stop my-api停止应用
pm2 restart my-api重启应用
pm2 delete my-api删除进程
pm2 monit实时监控面板(CPU/内存)
pm2 save保存当前进程列表
pm2 startup设置开机自启动

配置PM2启动脚本(ecosystem.config.js)

对于复杂项目,用配置文件管理启动参数比命令行更清晰:


// ecosystem.config.js
module.exports = {
  apps: [{
    name: 'my-api',
    script: './app.js',
    instances: 'max',        // 按CPU核心数自动开启多实例
    exec_mode: 'cluster',    // 集群模式,充分利用多核
    env: {
      NODE_ENV: 'production',
      PORT: 3000
    },
    max_memory_restart: '500M',  // 内存超500M自动重启(防内存泄漏)
    log_date_format: 'YYYY-MM-DD HH:mm:ss',
    error_file: '/home/deploy/apps/my-api/logs/error.log',
    out_file: '/home/deploy/apps/my-api/logs/out.log',
    merge_logs: true,
    autorestart: true,
    watch: false,             // 生产环境关闭文件监听
    max_restarts: 10,         // 最大重启次数,防无限崩溃
    restart_delay: 3000       // 重启间隔3秒
  }]
};

// 使用配置文件启动
pm2 start ecosystem.config.js

// 保存并设置开机自启
pm2 save
pm2 startup
// 按提示执行输出的 sudo 命令

集群模式详解

instances: 'max' + exec_mode: 'cluster' 会让PM2按CPU核心数启动多个Worker进程。例如2核服务器会启动2个实例,PM2自动做负载均衡。对于CPU密集型应用(图片处理、数据计算),集群模式能显著提升吞吐量。

注意:如果你的应用使用了内存缓存(如node-cache),集群模式下每个Worker有独立内存空间,缓存不共享。需要共享缓存请用Redis。

第五步:安装Nginx并配置反向代理

Node.js应用默认监听3000端口,不适合直接对外暴露。用Nginx做反向代理,实现HTTPS终结、静态资源加速和安全加固。

安装Nginx


// Ubuntu 22.04
sudo apt install -y nginx

// CentOS 7
sudo yum install -y epel-release
sudo yum install -y nginx
sudo systemctl start nginx
sudo systemctl enable nginx

配置Nginx反向代理

创建站点配置文件(以example.com域名为例,请替换为你的实际域名):


sudo cat > /etc/nginx/conf.d/my-api.conf << 'EOF'
server {
    listen 80;
    server_name example.com www.example.com;

    // 安全响应头
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;

    // Gzip压缩
    gzip on;
    gzip_types text/plain application/json application/javascript text/css;
    gzip_min_length 1000;

    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;
        proxy_read_timeout 60s;
        proxy_send_timeout 60s;
    }

    // 静态资源缓存(如果有前端构建产物)
    location /static/ {
        alias /home/deploy/apps/my-api/public/static/;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    // 限制请求体大小(防大文件上传攻击)
    client_max_body_size 10M;
}
EOF

测试并重载Nginx


sudo nginx -t                // 检查配置语法
sudo systemctl reload nginx  // 重载配置(不中断服务)

WebSocket支持

如果你的应用使用WebSocket(如Socket.io),在location块中添加:


location /socket.io/ {
    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_read_timeout 86400s;   // WebSocket长连接超时设为24小时
}

第六步:配置SSL证书(Let's Encrypt)

HTTPS是生产环境的标配。使用Certbot自动申请和续期Let's Encrypt免费证书。

安装Certbot


// Ubuntu 22.04
sudo apt install -y certbot python3-certbot-nginx

// CentOS 7
sudo yum install -y certbot python3-certbot-nginx

申请证书


sudo certbot --nginx -d example.com -d www.example.com
// 按提示输入邮箱,选择是否强制HTTPS重定向(推荐选Yes)

验证自动续期


sudo certbot renew --dry-run
// 看到 "Congratulations, all simulated renewals succeeded" 说明续期正常

Certbot会自动配置systemd timer,每12小时检查一次证书有效期,到期前30天自动续期。

手动续期(如自动续期失败)


sudo certbot renew
sudo systemctl reload nginx

第七步:应用监控与日志管理

PM2日志管理


// 查看实时日志
pm2 logs my-api

// 查看错误日志
pm2 logs my-api --err --lines 50

// 日志轮转(防止日志文件无限增长)
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 30
pm2 set pm2-logrotate:compress true

基础系统监控


// 查看Node.js进程资源占用
pm2 monit

// 查看服务器整体状态
top -u deploy
free -h
df -h

PM2+Prometheus监控(进阶)

如果需要专业级监控,可以安装pm2-prometheus-exporter,配合Prometheus+Grafana实现可视化监控:


npm install -g pm2-prometheus-exporter
pm2-prometheus-exporter --port 9209

然后在Prometheus配置中添加scrape target 127.0.0.1:9209,即可在Grafana仪表盘中查看Node.js应用的CPU、内存、事件循环延迟等指标。

第八步:零停机部署与自动更新

PM2零停机重载

更新代码后,用reload替代restart实现零停机部署:


cd /home/deploy/apps/my-api
git pull origin main
npm install --production
pm2 reload my-api
// reload会逐个重启Worker,保证至少有一个Worker在服务,用户无感知

Git Hook自动部署

在服务器上配置post-receive钩子,每次git push后自动部署:


cat > /home/deploy/apps/my-api.git/hooks/post-receive << 'EOF'
#!/bin/bash
DEPLOY_DIR="/home/deploy/apps/my-api"
git --work-tree=$DEPLOY_DIR --git-dir=/home/deploy/apps/my-api.git checkout -f
cd $DEPLOY_DIR
npm install --production
pm2 reload my-api
echo "Deployment complete!"
EOF
chmod +x /home/deploy/apps/my-api.git/hooks/post-receive

定时健康检查脚本


cat > /home/deploy/health-check.sh << 'SCRIPT'
#!/bin/bash
RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:3000/health)
if [ "$RESPONSE" != "200" ]; then
    pm2 restart my-api
    echo "$(date): Application restarted due to health check failure" >> /home/deploy/health-check.log
fi
SCRIPT
chmod +x /home/deploy/health-check.sh

// 每5分钟检查一次
(crontab -l 2>/dev/null; echo "*/5 * * * * /home/deploy/health-check.sh") | crontab -

第九步:安全加固清单

Node.js生产环境的安全加固不可忽视,以下是必须完成的检查项:

加固项命令/操作说明
禁用root运行PM2su - deploy && pm2 start用普通用户运行应用
文件权限最小化chmod 700 /home/deploy防止其他用户读取
.env文件保护chmod 600 .env只有部署用户可读
Nginx隐藏版本号server_tokens off;防止版本信息泄露
限制Node.js端口暴露防火墙只放80/4433000端口不对外
定期更新依赖npm audit && npm update修复已知漏洞
SSH密钥登录禁用密码登录防暴力破解

// Nginx隐藏版本号
sudo sed -i 's/# server_tokens off;/server_tokens off;/' /etc/nginx/nginx.conf
sudo systemctl reload nginx

延伸阅读

总结

Node.js应用的生产部署核心就是三板斧:PM2管理进程、Nginx反向代理、Let's Encrypt提供HTTPS。PM2的集群模式让你的应用自动利用多核CPU,自动重启保证高可用,零停机reload让更新无感知。配合Nginx的Gzip压缩、静态资源缓存和安全响应头,整套方案既轻量又健壮。

选择海外云服务器部署Node.js应用时,优先考虑延迟和性价比。阿里云国际版和腾讯云国际版对中文用户最友好,AWS Lightsail适合需要全球分发的场景。通过 5.chengzicloud.cloud 购买以上平台均有额外折扣,点击首页查看最新优惠。

本文由 5.chengzicloud.cloud 提供,点击访问首页了解更多海外云服务器部署方案和专属优惠。

常见问题(FAQ)

PM2启动的应用过一会就挂了怎么办?

先查日志定位原因:pm2 logs my-api --err --lines 100。常见原因有:内存不足(用pm2 monit查看)、未捕获的异常(添加process.on('uncaughtException')处理)、数据库连接失败。PM2默认配置了自动重启,如果反复崩溃,检查max_restarts配置和错误日志。

Node.js应用和PHP应用可以在同一台服务器上共存吗?

完全可以。Nginx通过不同的server_name或端口区分流量。例如:域名A走PHP-FPM(:9000),域名B走Node.js(:3000)。两者使用不同的Nginx配置文件,互不干扰。

PM2集群模式下,应用状态(如session)怎么共享?

集群模式下每个Worker是独立进程,内存不共享。方案一:使用Redis存储session(推荐connect-redis);方案二:使用JWT无状态token,完全不依赖session;方案三:设置sticky sessions(IP Hash),同一用户的请求固定路由到同一Worker。

如何查看Node.js应用的实际内存占用?

pm2 monit实时查看;pm2 show my-api查看详细信息;也可以在应用代码中用process.memoryUsage()获取堆内存、RSS等详细数据。如果内存持续增长不释放,可能存在内存泄漏,用--max-memory-restart配置自动重启兜底。

npm install很慢甚至超时怎么办?

原因一:没有配置国内镜像,用npm config set registry https://registry.npmmirror.com解决。原因二:服务器在海外访问npm官方源反而更快,去掉国内镜像配置。原因三:依赖包本身很大(如node-gyp编译),可以用--production跳过devDependencies。

如何实现Node.js应用的数据库连接池?

推荐使用pg(PostgreSQL)或mysql2(MySQL)内置的连接池功能。以MySQL为例:const pool = mysql.createPool({host:'localhost', user:'root', password:'xxx', connectionLimit: 10})。连接池大小建议设为CPU核心数的2-4倍。不要在每次请求时新建连接——频繁创建销毁连接会严重影响性能。

生产环境需要关闭Node.js的调试端口吗?

必须关闭。生产服务器绝对不要使用node --inspect或node --debug启动应用,调试端口暴露在公网上等于把控制权交给攻击者。检查是否误开:pm2 show my-api | grep exec,确认启动参数中没有--inspect或--debug。