🗣 Wd提问: node服务器部署
🤖 Ai回答: 我来为您详细介绍Node.js服务器的部署方法,涵盖多种部署方案。
1、传统服务器部署
准备工作
bash
在服务器上安装Node.js
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
或者使用nvm
curl -ohttps://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
nvm install 18
nvm use 18
项目配置
json
// package.json
{
name: my-app,
version: 1.0.0,
scripts: {
start: node app.js,
dev: nodemon app.js,
test: jest
},
engines: {
node: =18.0.0
}
}
使用PM2进行进程管理
bash
安装PM2
npm install -g pm2
启动应用
pm2 start app.js name my-app
或者使用配置文件
pm2 ecosystem
javascript
// ecosystem.config.js
module.exports = {
apps: [{
name: 'my-app',
script: './app.js',
instances: 'max', // 使用所有CPU核心
exec_mode: 'cluster',
env: {
NODE_ENV: 'development',
PORT: 3000
},
env_production: {
NODE_ENV: 'production',
PORT: 80
}
}]
};
bash
PM2常用命令
pm2 start ecosystem.config.js env production
pm2 stop my-app
pm2 restart my-app
pm2 delete my-app
pm2 logs
pm2 monit
设置开机自启
pm2 startup
pm2 save
2、Docker部署
Dockerfile配置
dockerfile
使用官方Node.js镜像
FROM node:18-alpine
设置工作目录
WORKDIR /app
复制package文件
COPY package*.json ./
安装依赖
RUN npm ci only=production
复制源代码
COPY 、.
暴露端口
EXPOSE 3000
运行应用
USER node
CMD [node, app.js]
Docker Compose配置
yaml
docker-compose.yml
version: '3.8'
services:
app:
build: .
ports:
3000:3000
environment:
NODE_ENV=production
DATABASE_URL=your_database_url
volumes:
./logs:/app/logs
restart: unless-stopped
nginx:
image: nginx:alpine
ports:
80:80
volumes:
./nginx.conf:/etc/nginx/nginx.conf
depends_on:
app
构建和运行
bash
构建镜像
docker build -t my-node-app .
运行容器
docker run -d -p 3000:3000 name my-app my-node-app
使用docker-compose
docker-compose up -d
3、云平台部署
Vercel部署
json
// vercel.json
{
version: 2,
builds: [
{
src: app.js,
use: @vercel/node
}
],
routes: [
{
src: /(.*),
dest: app.js
}
]
}
Heroku部署
bash
创建Heroku应用
heroku create my-node-app
设置环境变量
heroku config:set NODE_ENV=production
部署
git push heroku main
4、使用Nginx反向代理
Nginx配置
nginx
/etc/nginx/sites-available/your-domain
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://localhost: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;
}
静态文件服务
location /static/ {
alias /var/www/your-app/static/;
expires 1y;
add_header Cache-Control public, immutable;
}
}
5、完整的部署脚本
bash
!/bin/bash
deploy.sh
set -e
echo 开始部署Node.js应用...
变量配置
APP_NAME=my-node-app
APP_DIR=/var/www/$APP_NAME
BACKUP_DIR=/var/backups/$APP_NAME
GIT_REPO=your-git-repo-url
创建目录
sudo mkdir -p $APP_DIR $BACKUP_DIR
备份现有应用
if [ -d $APP_DIR ]; then
echo 备份现有应用...
tar -czf $BACKUP_DIR/backup-$(date +%Y%m%d-%H%M%S).tar.gz -C $APP_DIR .
fi
拉取最新代码
echo 拉取最新代码...
cd $APP_DIR
git pull origin main
安装依赖
echo 安装依赖...
npm install production
运行数据库迁移(如果有)
npx sequelize db:migrate
重启应用
echo 重启应用...
pm2 restart $APP_NAME pm2 start ecosystem.config.js env production
健康检查
echo 执行健康检查...
sleep 5
curl -f http://localhost:3000/health exit 1
echo 部署完成!
6、环境配置和最佳实践
环境变量管理
javascript
// config.js
require('dotenv').config();
module.exports = {
port: process.env.PORT 3000,
nodeEnv: process.env.NODE_ENV 'development',
database: {
url: process.env.DATABASE_URL,
pool: {
max: parseInt(process.env.DB_POOL_MAX) 10,
min: parseInt(process.env.DB_POOL_MIN) 2
}
},
jwt: {
secret: process.env.JWT_SECRET,
expiresIn: process.env.JWT_EXPIRES_IN '7d'
}
};
安全配置
bash
使用HTTPS
sudo apt-get install certbot python3-certbot-nginx
sudo certbot nginx -d your-domain.com
防火墙配置
sudo ufw allow ssh
sudo ufw allow 'Nginx Full'
sudo ufw enable
7、监控和日志
日志配置
javascript
// logger.js
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
new winston.transports.File({ filename: 'logs/combined.log' })
]
});
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({
format: winston.format.simple()
}));
}
module.exports = logger;
选择适合您项目的部署方式,建议从PM2+传统服务器开始,随着业务增长再考虑Docker或云平台部署。
📣 商家广告:





0
IP地址: 52.14.173.55
搜索次数: 210
提问时间: 2025-12-05 14:33:29
本站所有
❓
问答
均由Ai自动分析整理,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。
本站由
🟢
豌豆Ai
提供技术支持,使用的最新版:
豌豆Ai站群搜索引擎系统 V.25.10.25
搭建本站。