海外云服务器搭建Node.js应用环境完整教程(PM2进程管理+Nginx反向代理,2026最新版)
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以上。
配置档位表
| 场景 | 推荐配置 | 适用项目 | 预算参考 |
|---|---|---|---|
| 个人博客/小型API | 1核2G | Express API、Hexo部署 | $3-5/月 |
| 中型Web应用 | 2核4G | NestJS后端+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运行PM2 | su - deploy && pm2 start | 用普通用户运行应用 |
| 文件权限最小化 | chmod 700 /home/deploy | 防止其他用户读取 |
| .env文件保护 | chmod 600 .env | 只有部署用户可读 |
| Nginx隐藏版本号 | server_tokens off; | 防止版本信息泄露 |
| 限制Node.js端口暴露 | 防火墙只放80/443 | 3000端口不对外 |
| 定期更新依赖 | 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。