🚀 Next.js 自建部署全家桶:Docker + PM2 + Nginx

"程序员的人生就像发射火箭,不是点火就是爆炸。"

今天我们来聊聊如何把你的 Next.js 应用 从本地宠物,变成一只 真正在服务器跑得欢的野兽

工具箱包括:Docker (集装箱运输大队)、PM2 (工地管理员)、Nginx(门卫老大爷)。


🧩 背景故事

先别急着敲代码,带你从底层视角看看整个系统的运转逻辑。

  • Docker:想象你的 Next.js 项目是一辆四驱吉普车,Docker 就是你把它载进了"货运集装箱",这样无论运到海南还是北极,都能保证启动时配件齐全。

  • PM2:假设代码是一群猿猴,PM2 就是这群猴子的工头,负责喊:"崽子们,挂了?立刻给我爬起来!"

  • Nginx:所有来访的客人会先到大门口,Nginx 就是看门人,拿着小本子:

    • 80 端口进的是普通访客 👉 转去 PM2 管的场子
    • 443 走的是贵宾 VIP 通道 👉 还得顺带验证证书

⚙️ 环境准备

  1. 你的 Next.js 项目已经写好了(不写好没法部署啊喂)。
  2. 服务器一台(建议 Linux,别折腾 Windows,这活儿不合适)。
  3. Docker、Node.js、Nginx 提前装好。

检查环境命令如下:

复制代码
docker -v
pm2 -v
nginx -v

如果版本都蹦出来了,说明三兄弟已经在岗。🎉


🛠 第一步:用 Docker 打包 Next.js

先写个 Dockerfile(像一份食谱,教 Docker 厨师怎么煮你的应用):

bash 复制代码
# 基础镜像:带 node 的厨房
FROM node:18-alpine

# 工作目录
WORKDIR /app

# 复制依赖清单
COPY package.json package-lock.json* ./

# 安装依赖
RUN npm ci

# 复制全部代码
COPY . .

# 构建 Next.js
RUN npm run build

# 暴露 3000 端口
EXPOSE 3000

# 启动服务
CMD ["npm", "start"]

然后一顿操作猛如虎:

perl 复制代码
# 构建镜像(打包成你自定义的名字)
docker build -t my-next-app .

# 运行容器
docker run -d -p 3000:3000 my-next-app

此时打开 http://你的服务器IP:3000,你能看到 Next.js 的页面,说明这辆车已经在箱子里跑起来啦。🐒


🧙 第二步:PM2 上场

PM2 主要负责 进程守护,因为没有谁希望午夜十二点被用户电话吵醒:"哥们,你的服务挂了。"

安装:

复制代码
npm install pm2 -g

然后在容器里启动:

sql 复制代码
pm2 start npm --name "next-app" -- start

命令意思:

  • npm start 启动 Next.js 项目
  • --name "next-app" 给猴子工地取个名字

查看状态:

复制代码
pm2 list

PM2 会确保你的进程掉线了也自动原地满血。就像工头揪着猴子耳朵喊:"不许偷懒!" 🐵


🛡 第三步:Nginx 网关

现在问题是:你总不能让用户敲 http://ip:3000 吧,这也太掉价。应对之道:请出 Nginx

打开 /etc/nginx/sites-available/next.conf,写上配置:

ini 复制代码
server {
    listen 80;
    server_name your-domain.com;

    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_cache_bypass $http_upgrade;
    }
}

保存配置后:

bash 复制代码
ln -s /etc/nginx/sites-available/next.conf /etc/nginx/sites-enabled/
nginx -t   # 测试是否正确
systemctl reload nginx

此时只需访问 http://your-domain.com,你就能优雅地访问项目了。✨


🔥 Bonus:加一把 SSL 火

配个 HTTPS,不然浏览器会提醒"这网站是个野孩子"。推荐用 Certbot

css 复制代码
apt install certbot python3-certbot-nginx
certbot --nginx -d your-domain.com

然后......恭喜你,网站变"绿锁"了!🔒


🎨 全局架构小插画(ASCII 风格)

css 复制代码
 [ 用户浏览器 ]
        |
        v
   [ Nginx 门卫 ]
        |
        v
   [ PM2 工头 ]
        |
        v
[ Docker 集装箱里的 Next.js 程序 ]

📚 总结

  • Docker 保证环境统一,哪里跑都能跑。
  • PM2 负责守护进程,应用挂了立刻救命。
  • Nginx 扛得住流量,还能优雅地处理转发和证书。

一句话总结:

"前端搭房子,后端修水管,部署就是搬家打包和买小区保安。"

相关推荐
周航宇JoeZhou1 分钟前
JB2-7-HTML
java·前端·容器·html·h5·标签·表单
代码小库3 分钟前
【课程作业必备】Web开发技术HTML静态网站模板 - 校园动漫社团主题完整源码
前端·html
VT.馒头4 分钟前
【力扣】2722. 根据 ID 合并两个数组
javascript·算法·leetcode·职场和发展·typescript
珹洺10 分钟前
Bootstrap-HTML(二)深入探索容器,网格系统和排版
前端·css·bootstrap·html·dubbo
BillKu10 分钟前
VS Code HTML CSS Support 插件详解
前端·css·html
xixixin_16 分钟前
【React】中 Body 类限定法:优雅覆盖挂载到 body 的组件样式
前端·javascript·react.js
换日线°22 分钟前
NFC标签打开微信小程序
前端·微信小程序
张3蜂2 小时前
Python 四大 Web 框架对比解析:FastAPI、Django、Flask 与 Tornado
前端·python·fastapi
南风知我意9572 小时前
【前端面试5】手写Function原型方法
前端·面试·职场和发展
qq_12498707532 小时前
基于Java Web的城市花园小区维修管理系统的设计与实现(源码+论文+部署+安装)
java·开发语言·前端·spring boot·spring·毕业设计·计算机毕业设计