前言
WordPress和宝塔面板解决了大多数建站需求,但越来越多的开发者和团队需要部署自定义的Node.js或Python应用——可能是REST API服务、爬虫程序、AI推理接口,或者用Next.js、FastAPI搭建的现代Web应用。
这类应用的部署方式与传统PHP建站完全不同,很多开发者在本地跑得好好的项目,部署到服务器后遇到各种问题:进程挂掉了、端口冲突、Nginx配置不对、日志找不到……
本文提供Node.js和Python两个技术栈的完整生产环境部署教程,覆盖从环境安装到稳定运行的每一个步骤。
一、部署前的服务器准备
安装基础工具
bash
# Ubuntu 22.04
apt update && apt upgrade -y
apt install -y git curl wget vim build-essential
# CentOS 7
yum update -y
yum groupinstall -y "Development Tools"
yum install -y git curl wget vim
确认防火墙配置
bash
# 开放必要端口(80、443、SSH端口)
# Ubuntu (ufw)
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 你的SSH端口/tcp
# CentOS (firewalld)
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
二、Node.js项目部署
步骤一:安装Node.js
推荐使用nvm(Node Version Manager)管理Node.js版本:
bash
# 安装nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
# 加载nvm配置
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
# 安装Node.js LTS版本(推荐)
nvm install --lts
nvm use --lts
# 验证安装
node --version
npm --version
步骤二:上传项目代码
方法一:Git克隆(推荐)
bash
# 生成SSH密钥,添加到GitHub/GitLab
ssh-keygen -t ed25519 -C "server@yourcompany.com"
cat ~/.ssh/id_ed25519.pub # 复制公钥添加到代码仓库
# 克隆项目
cd /www/wwwroot
git clone git@github.com:yourname/yourproject.git
cd yourproject
方法二:scp上传
bash
# 从本地上传项目(在本地执行)
scp -P SSH端口 -r ./yourproject root@服务器IP:/www/wwwroot/
步骤三:安装依赖并配置环境变量
bash
cd /www/wwwroot/yourproject
# 安装生产依赖(不包含devDependencies)
npm install --production
# 创建生产环境配置文件
cp .env.example .env
vi .env
# 填写生产环境的配置(数据库地址、API密钥等)
# NODE_ENV=production
# PORT=3000
# DATABASE_URL=mysql://user:pass@localhost:3306/dbname
# REDIS_URL=redis://localhost:6379
步骤四:测试项目能否正常运行
bash
# 临时启动项目测试
node app.js # 或 npm start
# 用另一个终端测试接口
curl http://localhost:3000/
确认项目正常运行后,Ctrl+C停止,接下来用PM2管理进程。
步骤五:使用PM2进行进程管理
PM2是Node.js生产环境最流行的进程管理工具,提供:
- 进程异常崩溃后自动重启
- 服务器重启后自动启动应用
- 多进程负载均衡(Cluster模式)
- 日志管理和轮转
bash
# 全局安装PM2
npm install -g pm2
# 使用PM2启动应用
pm2 start app.js --name "myapp"
# 或者通过ecosystem配置文件启动(推荐)
创建PM2配置文件 ecosystem.config.js:
javascript
module.exports = {
apps: [{
name: 'myapp',
script: 'app.js',
instances: 'max', // 使用所有CPU核心
exec_mode: 'cluster', // 集群模式
env: {
NODE_ENV: 'development',
PORT: 3000
},
env_production: {
NODE_ENV: 'production',
PORT: 3000
},
// 日志配置
out_file: '/www/wwwlogs/myapp-out.log',
error_file: '/www/wwwlogs/myapp-error.log',
log_date_format: 'YYYY-MM-DD HH:mm:ss',
// 自动重启配置
watch: false, // 生产环境不开启文件监控
max_memory_restart: '500M', // 内存超过500M自动重启
restart_delay: 3000, // 重启前等待3秒
}]
}
bash
# 使用配置文件启动
pm2 start ecosystem.config.js --env production
# 设置开机自启
pm2 startup systemd
pm2 save
# 常用PM2命令
pm2 status # 查看所有进程状态
pm2 logs myapp # 查看实时日志
pm2 restart myapp # 重启应用
pm2 reload myapp # 零停机热更新
pm2 stop myapp # 停止应用
pm2 delete myapp # 删除应用
pm2 monit # 实时监控面板
步骤六:配置Nginx反向代理
Node.js应用监听在本地端口(如3000),通过Nginx反向代理对外提供80/443端口服务:
bash
vi /etc/nginx/sites-available/myapp # Ubuntu
# 或
vi /etc/nginx/conf.d/myapp.conf # CentOS
nginx
# HTTP重定向到HTTPS
server {
listen 80;
server_name api.yourcompany.com;
return 301 https://$server_name$request_uri;
}
# HTTPS反向代理
server {
listen 443 ssl http2;
server_name api.yourcompany.com;
# SSL证书(Let's Encrypt)
ssl_certificate /etc/letsencrypt/live/api.yourcompany.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.yourcompany.com/privkey.pem;
# SSL优化
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_session_cache shared:SSL:10m;
# 反向代理到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;
# 超时设置
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
}
# WebSocket支持(如果需要)
location /ws {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connecti