getfromcode

nextjs mysql nginx pm2 部署方案

后端开发
文章摘要

Next.js 生产部署的常见痛点与这份资料的定位 很多开发者把 Next.js 项目在本地跑通后,一到生产环境就卡壳:要么是 Node 版本不对导致构建失败,要么是 Nginx 反向代理配错导致静态资源 404,要么是 PM2 进程挂了不会自动重启,要么是 MySQL 连接池、环境变量、端口映射、HTTPS 证书这些细节堆在一起无从下手。网上的零散教程要…

已有 296 人浏览 发布 2026-01-12 更新 2026-09-17

Next.js 生产部署的常见痛点与这份资料的定位

很多开发者把 Next.js 项目在本地跑通后,一到生产环境就卡壳:要么是 Node 版本不对导致构建失败,要么是 Nginx 反向代理配错导致静态资源 404,要么是 PM2 进程挂了不会自动重启,要么是 MySQL 连接池、环境变量、端口映射、HTTPS 证书这些细节堆在一起无从下手。网上的零散教程要么只讲 Next.js 构建,要么只讲 Nginx 配置,很少把从裸机服务器初始化到最终可对外访问的整条链路串起来,而且不同 Ubuntu 版本的命令还可能有差异,踩坑成本极高。

这份资料的核心价值,就是把 Next.js + MySQL + Nginx + PM2 这套经典的全栈部署方案,按 Ubuntu 22.04/24.04 的实际环境拆成可一步步验证的操作流程,每一步都有明确的命令和验证方式,不需要你自己去拼凑不同博客里的碎片信息。它不是讲 Next.js 开发语法的入门课,而是专门解决「代码写完了怎么稳定放到服务器上跑」这个工程化问题,适合已经能写出基础 Next.js 全栈项目、但缺乏生产部署经验的开发者拿来直接对照操作。

资料的技术栈覆盖与结构逻辑

整套部署流程是按服务器从裸机到可用的顺序推进的,第一阶段先做系统初始化和基础环境安装,包括系统包更新、Node.js 20.x LTS 版本的安装与验证,这一步是所有后续操作的基础——很多人部署失败的根源就是 Node 版本用了最新的非 LTS 版,或者用系统默认源装了老版本的 Node,导致 Next.js 构建时出现兼容性报错。资料里明确指定了 20.x LTS 这个当前生产环境最稳妥的版本,并且给出了官方源的安装方式,避免用第三方源带来的安全和版本问题。

环境准备完成后,才会进入项目部署的核心环节:Next.js 项目的构建与生产启动、PM2 进程守护配置、MySQL 数据库的安装与连接配置、Nginx 反向代理与静态资源缓存配置。每个模块之间不是孤立的,比如配置 Nginx 时会对应到 Next.js 的监听端口,配置 PM2 时会对应到 Next.js 的生产启动命令和环境变量,配置 MySQL 时会对应到 Next.js 项目里的数据库连接参数。你能清晰看到每一层配置是怎么和上下层关联的,而不是只会复制粘贴命令却不知道为什么要这么写。

不同基础的开发者该怎么用这份资料

如果你是第一次接触服务器部署,建议从第一阶段的系统初始化开始逐行跟着做,每执行完一步就按资料里的验证方法检查结果,比如装完 Node 就用 version 命令确认版本号,不要跳步。很多新手喜欢一次性复制好几条命令一起跑,中间某一步报错了也没发现,后面排查问题要花十倍的时间。你可以把每一步的输出结果和资料里的预期结果做对比,确保环境完全符合要求后再进入下一个模块,这样整个流程走下来基本不会出大问题。

如果你已经有基础的 Linux 操作经验,只是想快速搭出一套 Next.js 生产环境,可以先跳着看 PM2 进程配置和 Nginx 反向代理这两块,这是 Next.js 部署和纯静态页面部署最大的区别:Next.js 有服务端渲染和 API 路由,不能像纯静态站点那样直接扔到 Nginx 根目录就行,必须用 Node 进程跑服务,再用 Nginx 做反向代理,还要处理好静态资源的缓存策略来提升性能。另外 MySQL 连接配置部分也可以重点看,尤其是生产环境下数据库的权限控制、连接池配置,这些细节直接影响项目的稳定性和安全性。

学完之后能独立落地的成果

完整走一遍流程后,你能独立把任何一个带 MySQL 数据库的 Next.js 全栈项目,部署到一台全新的 Ubuntu 云服务器上,实现外网可访问、进程异常自动重启、静态资源高效缓存、数据库稳定连接的生产级运行状态。你不需要再依赖各种一键部署面板,也能看懂面板背后每一层配置的作用,以后遇到部署问题能自己定位是 Node 进程的问题、Nginx 配置的问题还是数据库连接的问题。

更重要的是,你会掌握一套可复用的部署思路:不管以后换成 NestJS、Express 还是其他 Node 全栈框架,PM2 做进程守护、Nginx 做反向代理和负载均衡、MySQL 做数据存储这套架构逻辑都是通用的,你只需要调整对应框架的构建命令和启动参数就行。你还可以基于这套方案继续扩展,比如加 HTTPS 证书配置、加日志收集、加 CI/CD 自动部署,这些扩展都建立在你已经理解基础部署链路的前提之上,而这份资料就是帮你把这条基础链路彻底走通。

资料配合练习的正确方式

不要只看不动手,建议准备一台最低配置的云服务器,或者本地用虚拟机装一个 Ubuntu 22.04/24.04 系统,拿自己写的一个简单 Next.js + MySQL 项目跟着练。每配置完一个模块就做一次验证:装完 PM2 就故意杀一下 Node 进程看会不会自动拉起,配完 Nginx 就用浏览器访问不同路径看有没有正常代理到 Next.js 服务,连完 MySQL 就跑一下项目里的数据库查询接口看能不能正常返回数据。只有每一层都验证通过,最后出来的结果才是稳定的。

练习过程中可以把每一步的命令和自己的配置记下来,做成属于自己的部署 checklist,以后再做新项目部署的时候直接照着 checklist 走,能节省大量重复查资料的时间。遇到和资料里不一致的报错也不用慌,先看自己的系统版本、Node 版本、项目依赖版本是不是和资料里的一致,大部分部署问题都是版本不匹配或者路径写错导致的,顺着链路从前往后排查,很快就能定位到问题根源。

f1b9fe6a-c497-49c1-bdde-b526a8d1fbbe.png

# ============================================
# Next.js + Nginx 生产部署完整步骤
# 操作系统:Ubuntu 22.04/24.04 (Linux 6.8.0-90-generic)
# ============================================
# ============ 第一阶段:服务器初始化 ============
# 1.1 系统更新
sudo apt update && sudo apt upgrade -y
# 1.2 安装 Node.js 20.x LTS (推荐稳定版本)
curl -fsSL  | sudo -E bash -
sudo apt install -y nodejs
# 验证安装
node --version # 应该显示 v20.x.x
npm --version # 显示对应 npm 版本
# 1.3 安装 Nginx
sudo apt install -y nginx
# 1.4 安装 PM2 (进程管理)
sudo npm install -g pm2
# 1.5 配置防火墙
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full' # 开放 HTTP(80) 和 HTTPS(443)
sudo ufw --force enable
sudo ufw status
# ============ 第二阶段:上传项目并构建 ============
# 2.1 在服务器创建项目目录
sudo mkdir -p /var/www/my-nextjs-app
sudo chown -R $USER:$USER /var/www/my-nextjs-app
# 2.2 【在您本地电脑】上传项目文件到服务器
# 假设您本地项目目录是 ~/projects/my-nextjs-app
# 请替换 username 和 your-server-ip 为您的实际信息
# 本地终端执行:
# rsync -avz --exclude='node_modules' --exclude='.next' --exclude='.git' ~/projects/my-nextjs-app/ username@your-server-ip:/var/www/my-nextjs-app/
# 2.3 SSH登录服务器并进入项目目录
ssh username@your-server-ip
cd /var/www/my-nextjs-app
# 2.4 安装项目依赖并构建
npm ci # 或 npm install
# 2.5 创建生产环境变量 (根据您的项目需要)
cat > .env.production << EOF
NODE_ENV=production
# 添加您的生产环境变量,例如:
# DATABASE_URL=your_production_db_url
# NEXT_PUBLIC_API_URL=
EOF
# 2.6 构建 Next.js 应用
npm run build
# 注意:如果构建失败,请查看具体错误信息并修复
# 常见问题:内存不足、TypeScript错误、依赖缺失等
# ============ 第三阶段:配置 PM2 进程守护 ============
# 3.1 创建 PM2 配置文件
cat > ecosystem.config.js << 'EOF'
module.exports = {
apps: [{
name: 'my-nextjs-app',
script: 'npm',
args: 'start',
cwd: '/var/www/my-nextjs-app',
instances: 1,
exec_mode: 'fork',
autorestart: true,
watch: false,
max_memory_restart: '1G',
env: {
NODE_ENV: 'production',
PORT: 3000
},
error_file: '/var/log/pm2/my-nextjs-app-error.log',
out_file: '/var/log/pm2/my-nextjs-app-out.log',
log_file: '/var/log/pm2/my-nextjs-app-combined.log',
time: true
}]
}
EOF
# 3.2 创建日志目录
sudo mkdir -p /var/log/pm2
sudo chown -R $USER:$USER /var/log/pm2
# 3.3 启动应用
pm2 start ecosystem.config.js
# 3.4 设置 PM2 开机自启
pm2 startup
# 执行上述命令后,会显示一条需要以root身份运行的命令,复制并执行它
# 示例:sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u username --hp /home/username
# 3.5 保存当前进程列表
pm2 save
# 3.6 查看应用状态
pm2 status
pm2 logs my-nextjs-app --lines 50 # 查看最近50行日志
# ============ 第四阶段:配置 Nginx 反向代理 ============
# 4.1 创建 Nginx 站点配置文件
sudo vim /etc/nginx/sites-available/my-nextjs-app
# 将以下配置粘贴到文件中(按 i 进入插入模式,粘贴后按 Esc,输入 :wq 保存)
# --------------------------------------------------
server {
listen 80;
listen [::]:80;
# 您的域名(如果没有域名,用服务器IP地址)
server_name your-domain.com www.your-domain.com;
# 或 server_name 123.123.123.123; # 您的服务器IP
# 日志文件
access_log /var/log/nginx/my-nextjs-app.access.log;
error_log /var/log/nginx/my-nextjs-app.error.log;
# 反向代理配置
location / {
proxy_pass 
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_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# 可选:静态资源缓存(提升性能)
location /_next/static {
proxy_cache STATIC;
proxy_ignore_headers Cache-Control;
proxy_cache_valid 200 60d;
proxy_pass 
}
}
# --------------------------------------------------
# 4.2 启用站点配置
sudo ln -s /etc/nginx/sites-available/my-nextjs-app /etc/nginx/sites-enabled/
# 4.3 移除默认配置(如果存在)
sudo rm -f /etc/nginx/sites-enabled/default
# 4.4 测试 Nginx 配置语法
sudo nginx -t
# 应该显示:nginx: configuration file /etc/nginx/nginx.conf test is successful
# 4.5 重启 Nginx
sudo systemctl restart nginx
# ============ 第五阶段:验证部署 ============
# 5.1 检查所有服务状态
sudo systemctl status nginx
pm2 status
# 5.2 测试应用是否运行
curl -I 
curl -I 
# 5.3 查看实时日志
# 在一个终端窗口查看 PM2 日志
pm2 logs my-nextjs-app --lines 100
# 在另一个终端窗口查看 Nginx 日志
sudo tail -f /var/log/nginx/my-nextjs-app.access.log
# 或错误日志
sudo tail -f /var/log/nginx/my-nextjs-app.error.log
# 5.4 测试公网访问
# 打开浏览器访问: 或 
# ============ 第六阶段:HTTPS 配置(可选但推荐) ============
# 6.1 安装 Certbot (用于获取免费 SSL 证书)
sudo apt install -y certbot python3-certbot-nginx
# 6.2 获取 SSL 证书(需要有已解析到服务器的域名)
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
# 按照提示操作,Certbot 会自动配置 Nginx 支持 HTTPS
# 6.3 设置证书自动续期
sudo certbot renew --dry-run
# ============ 第七阶段:故障排除 ============
# 7.1 如果遇到 502 Bad Gateway
# 检查 Next.js 是否在运行
pm2 status
# 检查端口占用
sudo netstat -tulpn | grep :3000
sudo netstat -tulpn | grep :80
# 7.2 如果遇到权限问题
sudo chown -R www-data:www-data /var/log/nginx/
sudo chmod -R 755 /var/www/my-nextjs-app
# 7.3 重启所有服务
pm2 restart my-nextjs-app
sudo systemctl restart nginx
# 7.4 查看系统资源
htop
free -h
df -h
# ============ 第八阶段:创建部署脚本(简化后续更新) ============
# 8.1 创建部署脚本
cat > /var/www/my-nextjs-app/deploy.sh << 'EOF'
#!/bin/bash
echo "🚀 开始部署 Next.js 应用..."
cd /var/www/my-nextjs-app
echo "1. 拉取最新代码..."
git pull origin main
echo "2. 安装依赖..."
npm ci
echo "3. 构建应用..."
npm run build
echo "4. 重启应用..."
pm2 restart my-nextjs-app
echo "5. 检查状态..."
pm2 status
echo "✅ 部署完成!"
EOF
# 8.2 给脚本执行权限
chmod +x /var/www/my-nextjs-app/deploy.sh
# 以后更新应用只需运行:
# cd /var/www/my-nextjs-app && ./deploy.sh
# ============ 完成! ============
echo "========================================"
echo "部署完成!请访问您的服务器IP地址或域名"
echo "========================================"
echo "PM2 管理命令:"
echo " pm2 status # 查看状态"
echo " pm2 logs my-nextjs-app # 查看日志"
echo " pm2 restart my-nextjs-app # 重启应用"
echo " pm2 stop my-nextjs-app # 停止应用"
echo ""
echo "Nginx 管理命令:"
echo " sudo systemctl status nginx"
echo " sudo systemctl restart nginx"
echo " sudo nginx -t # 测试配置"