
最近在将一个 Vue3 Nuxt4 的 SSR 项目部署到 Ubuntu 服务器时发现从环境配置到服务上线每一步都可能遇到意想不到的坑。网上的资料要么过于零散要么版本老旧很难找到一套完整、可复现的流程。本文将整合一套从零开始的部署闭环方案涵盖服务器初始化、Node.js环境搭建、Nuxt4项目构建、进程守护以及Nginx反向代理配置并提供完整的代码示例和线上避坑指南。无论你是刚接触服务器部署的新手还是希望优化现有部署流程的开发者都能从中获得可直接复用的实践经验。1. 背景与核心概念在开始动手之前我们有必要厘清几个关键概念这有助于理解整个部署流程的设计思路。1.1 什么是 SSR (Server-Side Rendering)SSR即服务端渲染是一种网页渲染技术。与传统的客户端渲染CSR不同SSR 是在服务器端将 Vue 组件渲染成完整的 HTML 字符串然后直接发送给浏览器。浏览器接收到的是已经包含内容的 HTML可以立即进行解析和展示。SSR 的核心优势更快的首屏加载速度用户无需等待所有 JavaScript 下载并执行完毕才能看到内容提升了用户体验和核心 Web 指标如 LCP。更好的 SEO搜索引擎爬虫能够直接抓取到服务器返回的完整 HTML 内容对内容索引更友好。更佳的首屏性能对于内容密集型或对初始加载速度要求高的应用如新闻、电商详情页尤其重要。1.2 Nuxt.js 在 SSR 中的角色Nuxt.js 是一个基于 Vue.js 的通用应用框架。它抽象了 SSR 的复杂配置提供了开箱即用的服务端渲染能力、自动路由生成、静态站点生成等多种渲染模式。使用 Nuxt4基于 Vue3开发者可以更专注于业务逻辑而无需从零搭建复杂的 Webpack/Vite 和 Node.js 服务端渲染环境。1.3 为什么选择 Ubuntu 服务器Ubuntu 是当前最流行的 Linux 发行版之一尤其在云服务器领域占据主导地位。它拥有庞大的社区支持、丰富的软件包仓库、稳定的长期支持LTS版本以及完善的文档使得环境配置、软件安装和问题排查都相对容易是部署 Web 应用的理想选择。1.4 部署架构概览一个典型的 Vue3 Nuxt4 SSR 应用在 Ubuntu 服务器上的部署架构通常包含以下组件操作系统Ubuntu Server (如 20.04 LTS 或 22.04 LTS)。运行环境Node.js (推荐 LTS 版本如 18.x, 20.x)。应用服务器Nuxt 应用本身通过node或pm2启动的 Node.js 进程。Web 服务器/反向代理Nginx负责处理静态文件、SSL/TLS、负载均衡并将动态请求转发给后端的 Nuxt 应用。进程管理PM2用于保持 Node.js 应用在后台持续运行并在崩溃时自动重启。2. 环境准备与版本说明在开始部署前请确保你拥有以下资源并了解本文示例所使用的软件版本。请注意版本需根据你的项目实际情况调整本文重点演示配置思路和通用流程。服务器一台安装了 Ubuntu Server 的云服务器或虚拟机。本文以Ubuntu 22.04 LTS为例。本地开发机用于连接和操作服务器的终端如 macOS 的 Terminal Windows 的 PowerShell 或 WSL 或使用 SSH 客户端如 PuTTY。项目代码一个完整的、可在本地正常npm run build和npm run preview的 Vue3 Nuxt4 项目。域名可选如果你希望通过域名访问需要准备一个已解析到服务器 IP 的域名。本文演示环境版本操作系统Ubuntu 22.04.4 LTSNode.jsv20.11.0 (LTS)npm10.2.4Nuxt^4.0.0PM2^5.3.0Nginx1.18.03. 服务器初始化与基础环境配置首先我们需要通过 SSH 连接到服务器并进行一系列基础配置。3.1 连接服务器与系统更新使用 SSH 命令连接到你的服务器。将your_server_ip替换为你的服务器公网 IP 地址username通常为root或ubuntu云服务商提供的默认用户。ssh usernameyour_server_ip连接成功后首先更新系统软件包列表并升级现有软件这是一个好习惯。# 更新软件包列表 sudo apt update # 升级已安装的软件包 sudo apt upgrade -y3.2 安装 Node.js 与 npmUbuntu 默认的软件仓库中的 Node.js 版本可能较旧。我们推荐使用 NodeSource 提供的仓库来安装最新的 LTS 版本。安装 NodeSource 仓库脚本并安装 Node.js 20.x# 下载并执行 NodeSource 安装脚本 curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - # 安装 Node.js 和 npm sudo apt install -y nodejs验证安装node --version npm --version如果安装成功将分别输出 Node.js 和 npm 的版本号。3.3 安装并配置 Git用于拉取代码虽然你也可以通过 SCP 或 SFTP 上传代码但使用 Git 更便于后续的持续集成和部署。sudo apt install -y git配置 Git 用户信息可选但在提交时可能需要git config --global user.name Your Name git config --global user.email youremailexample.com3.4 安装 PM2进程管理工具PM2 是一个带有负载均衡功能的 Node.js 应用进程管理器。它能保持应用常驻管理日志并支持监控。# 全局安装 PM2 sudo npm install -g pm2安装后可以设置 PM2 开机自启动这样即使服务器重启应用也能自动运行。# 生成开机启动脚本根据提示选择你的系统通常是 systemd pm2 startup # 保存当前 PM2 进程列表以便开机时恢复 pm2 save注意pm2 startup命令会输出一行需要你执行的命令类似sudo env PATH$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u ubuntu --hp /home/ubuntu请复制并执行它。3.5 安装 NginxWeb 服务器/反向代理Nginx 将作为我们应用的入口处理 HTTPS、静态文件并将请求代理给后端的 Nuxt 应用。sudo apt install -y nginx安装完成后启动 Nginx 并设置开机自启sudo systemctl start nginx sudo systemctl enable nginx此时在浏览器中访问你的服务器 IP 地址如http://your_server_ip应该能看到 Nginx 的默认欢迎页面这证明 Nginx 已成功安装并运行。4. 部署 Nuxt4 应用环境准备就绪后开始部署我们的核心应用。4.1 上传项目代码到服务器假设你的项目代码托管在 Git 仓库如 GitHub, GitLab, Gitee。在服务器上选择一个目录克隆你的项目。这里我们选择/var/www/目录。# 进入 /var/www 目录 cd /var/www # 克隆你的项目仓库 (替换为你的仓库地址) sudo git clone https://github.com/your-username/your-nuxt-project.git # 进入项目目录 cd your-nuxt-project权限问题如果克隆时提示权限错误你可能需要更改/var/www目录的所有者或者使用sudo克隆。更安全的方式是创建一个专用用户来管理应用。4.2 安装项目依赖并构建在项目根目录下安装依赖并执行构建。构建过程会生成用于 SSR 的客户端和服务端资源。# 安装项目依赖 npm install # 构建生产版本 npm run build重要提示npm run build是 Nuxt 生成生产包的命令。它会执行nuxt build。构建时间取决于项目复杂度。确保服务器内存足够建议 1GB 以上否则构建过程可能因内存不足而失败。检查package.json中的scripts确认build命令是否正确。4.3 使用 PM2 启动应用构建完成后我们不直接使用npm run preview而是用 PM2 来启动.output/server/index.mjs这个入口文件这是 Nuxt 构建后生成的 SSR 服务器文件。# 使用 PM2 启动 Nuxt 应用 pm2 start .output/server/index.mjs --name my-nuxt-app命令解释pm2 start: 启动一个应用。.output/server/index.mjs: Nuxt 构建后生成的服务器入口文件路径。--name “my-nuxt-app”: 为这个 PM2 进程指定一个名称方便管理。启动后你可以查看 PM2 进程状态pm2 status pm2 logs my-nuxt-app # 查看该应用的实时日志 pm2 monit # 进入监控面板默认情况下Nuxt SSR 服务器会监听http://localhost:3000。此时你可以通过在服务器本地测试来验证应用是否运行正常curl http://localhost:3000如果返回了 HTML 内容说明 Nuxt 应用本身已经成功启动。记住保存 PM2 进程列表pm2 save5. 配置 Nginx 反向代理现在 Nuxt 应用在 3000 端口运行但我们需要通过 80HTTP或 443HTTPS端口对外提供服务并利用 Nginx 处理静态文件等。这就需要配置 Nginx 作为反向代理。5.1 创建 Nginx 站点配置文件Nginx 的站点配置文件通常位于/etc/nginx/sites-available/。我们为我们的应用创建一个新的配置文件。sudo nano /etc/nginx/sites-available/my-nuxt-app将以下配置内容粘贴到文件中。请将your_domain.com替换为你的域名或者用服务器 IP 地址替换。同时确保proxy_pass的端口3000与 PM2 启动的应用端口一致。server { listen 80; listen [::]:80; server_name your_domain.com www.your_domain.com; # 替换为你的域名或 IP # 静态文件缓存优化 location /_nuxt/ { alias /var/www/your-nuxt-project/.output/public/_nuxt/; expires 1y; add_header Cache-Control public, immutable; } # 其他静态资源 location / { try_files $uri $uri/ proxy; } # 反向代理到 Nuxt 应用 location proxy { 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; # 增加超时时间避免长任务超时 proxy_read_timeout 300s; proxy_connect_timeout 75s; } # 禁止访问 .ht 或其他敏感文件 location ~ /\.(?!well-known).* { deny all; } }配置关键点说明server_name: 定义这个配置块响应的域名。location /_nuxt/: 这是一个非常重要的优化。它让 Nginx 直接服务构建生成的静态文件JS、CSS、图片等而不是通过 Node.js极大减轻了 Node 进程的压力并提升了文件传输速度。expires和Cache-Control头用于浏览器缓存。location proxy: 将所有非静态文件的请求转发给运行在localhost:3000的 Nuxt 应用。proxy_set_header系列指令确保了原始客户端信息如 IP、协议能正确传递给后端应用这对于 Nuxt 中获取用户真实 IP 或判断是否 HTTPS 至关重要。proxy_read_timeout: 如果你的应用有长时间运行的 API 请求如文件上传、复杂计算可能需要调大这个值。5.2 启用站点并测试配置创建符号链接以启用站点sudo ln -s /etc/nginx/sites-available/my-nuxt-app /etc/nginx/sites-enabled/测试 Nginx 配置语法是否正确sudo nginx -t如果输出syntax is ok和test is successful则说明配置无误。重新加载 Nginx 使配置生效sudo systemctl reload nginx现在你应该可以通过服务器的 IP 地址或你配置的域名如果已解析访问到你的 Nuxt4 SSR 应用了6. 配置 HTTPS使用 Let‘s Encrypt SSL 证书为了网站安全和更好的用户体验启用 HTTPS 是必须的。我们将使用免费的 Let’s Encrypt 证书并通过 Certbot 工具自动化获取和配置。6.1 安装 Certbotsudo apt install -y certbot python3-certbot-nginx6.2 获取并自动配置 SSL 证书运行以下命令Certbot 会自动读取你的 Nginx 配置server_name申请证书并修改 Nginx 配置以启用 HTTPS。sudo certbot --nginx -d your_domain.com -d www.your_domain.com按照提示操作输入你的邮箱用于接收证书到期提醒。同意服务条款。选择是否订阅电子前沿基金会的邮件可选。Certbot 会自动完成证书申请和 Nginx 配置更新。它会将你的 HTTP80端口配置重定向到 HTTPS443端口并配置好证书路径。6.3 设置证书自动续期Let‘s Encrypt 证书有效期为90天。Certbot 安装了一个定时任务cron job来自动续期但我们可以手动测试一下续期流程。sudo certbot renew --dry-run如果测试成功说明自动续期配置正常。至此你的 Vue3 Nuxt4 SSR 网站已经通过 HTTPS 安全地运行在 Ubuntu 服务器上了。7. 常见问题与排查思路部署过程中难免会遇到问题。下面是一些常见问题及其解决方法。问题现象可能原因排查步骤与解决方案访问服务器IP显示502 Bad Gateway1. Nuxt 应用未运行。2. Nginxproxy_pass端口错误。3. 服务器防火墙阻止了内部端口访问。1.pm2 status检查应用是否运行。未运行则用pm2 start ...启动。2. 检查 PM2 启动命令和 Nginx 配置中的端口是否一致默认3000。3. 在服务器上执行curl http://localhost:3000看 Nuxt 应用本身是否正常响应。静态资源JS/CSS加载 404Nginx 配置中location /_nuxt/的alias路径错误。1. 确认alias指向的路径是否存在ls -la /var/www/your-project/.output/public/_nuxt/。2. 确保路径拼写正确特别是.output/public这个目录。npm run build失败内存不足服务器内存尤其是虚拟内存/交换空间不足。1. 使用free -h查看内存。2. 创建交换空间bashbr sudo fallocate -l 2G /swapfilebr sudo chmod 600 /swapfilebr sudo mkswap /swapfilebr sudo swapon /swapfilebr # 永久生效编辑 /etc/fstab 添加: /swapfile swap swap defaults 0 0br3. 再次尝试构建。PM2 应用启动后自动停止1. 应用本身有未捕获的异常导致崩溃。2. 端口被占用。3. 环境变量缺失。1. 查看详细日志pm2 logs my-nuxt-app --lines 100根据错误信息修复代码。2. 检查端口占用sudo netstat -tlnp | grep :3000。3. 检查是否需要配置生产环境变量。可以在 PM2 启动时指定pm2 start ... --env production或在项目根目录创建.env文件。域名访问显示 Nginx 默认页Nginx 配置未正确启用或server_name不匹配。1. 确认站点配置已符号链接到sites-enabledls -la /etc/nginx/sites-enabled/。2. 确认配置文件中server_name与访问的域名一致。3. 执行sudo nginx -t和sudo systemctl reload nginx。HTTPS 证书申请失败1. 域名未正确解析到服务器 IP。2. 服务器 80 端口被防火墙拦截。1. 使用ping your_domain.com或在线工具检查 DNS 解析是否正确。2. 确保服务器安全组/防火墙规则允许 80 和 443 端口入站流量。3. 确保在运行certbot时Nginx 正在运行且server_name配置正确。通用排查命令sudo systemctl status nginx– 查看 Nginx 服务状态。sudo journalctl -u nginx -f– 实时查看 Nginx 日志。pm2 logs– 查看 PM2 管理的应用日志。sudo tail -f /var/log/nginx/error.log– 实时查看 Nginx 错误日志。8. 最佳实践与工程建议为了让你的生产环境部署更稳健、高效以下是一些进阶建议。8.1 使用非 root 用户运行应用出于安全考虑不建议使用root用户直接运行 Node.js 应用。应该创建一个专用的系统用户。# 创建一个名为 ‘deploy’ 的用户无登录shell sudo adduser --disabled-login --gecos deploy # 将项目目录的所有权赋予该用户 sudo chown -R deploy:deploy /var/www/your-nuxt-project # 切换到该用户进行后续操作如安装依赖、构建 sudo su - deploy cd /var/www/your-nuxt-project # 然后执行 npm install, build 等 # 注意PM2 的 startup 命令也需要以对应用户身份执行8.2 环境变量管理生产环境和开发环境的配置如 API 地址、密钥通常不同。务必使用环境变量。在项目根目录创建.env文件# .env.production NUXT_PUBLIC_API_BASEhttps://api.yourdomain.com SECRET_KEYyour_production_secret_here在 Nuxt 配置中读取在nuxt.config.ts中可以通过process.env访问。// nuxt.config.ts export default defineNuxtConfig({ runtimeConfig: { public: { apiBase: process.env.NUXT_PUBLIC_API_BASE || http://localhost:3000/api, }, secretKey: process.env.SECRET_KEY, // 仅服务端可访问 }, })PM2 指定环境启动时使用--env参数。pm2 start .output/server/index.mjs --name “my-nuxt-app” --env production或者更推荐使用 PM2 的生态系统配置文件ecosystem.config.js。8.3 使用 PM2 生态系统配置文件将 PM2 的配置写入文件便于版本管理和团队协作。在项目根目录创建ecosystem.config.js// ecosystem.config.js module.exports { apps: [{ name: my-nuxt-app, script: ./.output/server/index.mjs, instances: max, // 使用所有CPU核心实现集群模式Clustering exec_mode: cluster, // 集群模式 autorestart: true, watch: false, // 生产环境建议关闭 watch max_memory_restart: 1G, // 内存超过1G自动重启 env: { NODE_ENV: production, PORT: 3000, HOST: 0.0.0.0, }, env_production: { NODE_ENV: production, } }] };然后使用配置文件启动pm2 start ecosystem.config.js --env production8.4 日志管理与切割应用日志对于排查问题至关重要。PM2 和 Nginx 默认都会记录日志但需要定期清理和切割防止磁盘被占满。PM2 日志默认在~/.pm2/logs/。可以使用pm2 logs查看或配置logrotate进行切割。Nginx 日志在/var/log/nginx/。Ubuntu 默认通过logrotate管理配置在/etc/logrotate.d/nginx。8.5 性能监控与优化启用 Nuxt 构建分析在nuxt.config.ts中设置analyze: true或使用nuxi analyze来查看打包体积优化首屏加载。利用 Nginx 缓存对于不常变化的 API 响应可以在 Nginx 层设置代理缓存。启用 Gzip/Brotli 压缩在 Nginx 配置中启用压缩减少传输体积。gzip on; gzip_vary on; gzip_min_length 1024; gzip_types text/plain text/css text/xml text/javascript application/javascript application/xmlrss application/json;监控服务器资源使用htop,nmon或配置更专业的监控如PrometheusGrafana。8.6 自动化部署脚本对于频繁更新的项目可以编写简单的部署脚本。#!/bin/bash # deploy.sh set -e # 遇到错误则退出 echo “开始部署…” cd /var/www/your-nuxt-project echo “拉取最新代码…” git pull origin main echo “安装依赖…” npm install --production # 生产环境只安装 dependencies echo “构建项目…” npm run build echo “重启应用…” pm2 reload ecosystem.config.js --env production echo “部署完成”记得给脚本执行权限chmod x deploy.sh。然后可以通过./deploy.sh一键部署。从服务器初始化到 HTTPS 配置我们完成了一个 Vue3 Nuxt4 SSR 应用在 Ubuntu 服务器上的完整部署。核心在于理解 SSR 的运行机制并正确配置 Node.js 环境、PM2 进程守护以及 Nginx 反向代理这三者的协作关系。其中让 Nginx 直接服务/_nuxt/静态文件是性能优化的关键一步。部署完成后日常维护的重点是日志查看、资源监控和证书续期。对于更复杂的生产环境可以考虑引入 Docker 容器化部署以实现更好的环境一致性或者结合 CI/CD 工具如 GitHub Actions, Jenkins实现自动化部署流水线。