Vue3前端项目部署到Linux服务器的实战指南
作者:染翰
前言
在现代 Web 开发流程中,前端项目的部署是连接开发与生产环境的关键环节。一个规范、高效的部署方案不仅能保证项目稳定运行,还能提升用户访问体验、降低运维成本。Vue3 作为当前最主流的前端框架之一,其部署方式相较于传统页面有着显著差异 —— 特别是单页应用(SPA)的路由机制、静态资源管理等方面,对运维配置提出了特殊要求。
本文将以专业运维工程师的视角,从环境准备、本地构建、服务器配置、容器化部署到自动化运维,全方位讲解 Vue3 项目在 Linux 服务器上的部署实战。无论你是前端开发者希望掌握部署技能,还是运维工程师需要标准化前端项目部署流程,本文都将为你提供可直接落地的完整方案。
本文适用人群:
- 前端开发者需要掌握项目部署技能
- 运维工程师负责前端项目的生产环境部署
- 全栈开发者需要独立完成项目上线
- DevOps 工程师搭建自动化部署流水线
环境准备
本地开发环境
必备软件:
软件 | 版本要求 | 说明 |
Node.js | ≥ 16.0.0 | Vue3 官方推荐最低版本,建议使用 LTS 版本 |
包管理器 | npm ≥ 8.x / yarn ≥ 1.22 / pnpm ≥ 7.x | 推荐使用 pnpm 以获得更快的安装速度 |
Git | ≥ 2.0 | 用于代码版本管理 |
SSH 客户端 | OpenSSH / Xshell / FinalShell | 用于远程服务器连接 |
Node.js 版本检查与安装(本地):
# 检查版本 node -v npm -v # 如未安装,推荐使用 nvm 管理 Node.js 版本 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash source ~/.bashrc nvm install 18-lts nvm use 18-lts
服务器环境要求
服务器配置建议:
部署规模 | CPU | 内存 | 硬盘 | 系统 |
小型项目(PV < 1 万 / 天) | 1 核 | 2GB | 40GB SSD | CentOS 7+/Ubuntu 20.04+ |
中型项目(PV 1-10 万 / 天) | 2 核 | 4GB | 80GB SSD | CentOS 7+/Ubuntu 20.04+ |
大型项目(PV > 10 万 / 天) | 4 核 + | 8GB+ | 200GB+ SSD | CentOS 7+/Ubuntu 20.04+ |
服务器必备软件:
- Nginx ≥ 1.18(Web 服务器)
- Docker ≥ 20.0(容器化部署可选)
- OpenSSH Server(远程连接)
工具推荐
- SSH 连接工具:FinalShell、Xshell、MobaXterm
- 文件传输工具:FileZilla、WinSCP
- 服务器监控:htop、iftop、nmon
- 域名与证书:阿里云 / 腾讯云域名、Let's Encrypt 免费 SSL 证书
本地打包构建
Vue3 项目打包流程
1. 安装依赖
# 使用 npm npm install # 使用 yarn yarn install # 使用 pnpm(推荐) pnpm install
2. 环境变量配置
在项目根目录创建不同环境的配置文件:
\.env\.production(生产环境):
# 生产环境API地址 VITE_API_BASE_URL = https://api.yourdomain.com # 应用标题 VITE_APP_TITLE = 生产环境 # 公共路径 VITE_PUBLIC_PATH = /
3. 执行打包命令
# Vite 项目(Vue3 默认) npm run build # Webpack 项目(Vue CLI 创建) npm run build
打包成功后,会在项目根目录生成 dist 文件夹。
Vite 配置说明
vite\.config\.js 关键配置:
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [vue()],
// 生产环境基础路径,部署到子目录时需要修改
base: '/',
build: {
// 输出目录
outDir: 'dist',
// 静态资源目录
assetsDir: 'assets',
// 小于此阈值的资源内联为 base64
assetsInlineLimit: 4096,
// 构建后是否生成 source map
sourcemap: false,
// 代码压缩配置
minify: 'terser',
terserOptions: {
compress: {
// 生产环境移除 console
drop_console: true,
// 生产环境移除 debugger
drop_debugger: true
}
},
// 拆包策略优化
rollupOptions: {
output: {
chunkFileNames: 'js/[name]-[hash].js',
entryFileNames: 'js/[name]-[hash].js',
assetFileNames: '[ext]/[name]-[hash].[ext]',
manualChunks(id) {
// 将 node_modules 单独打包
if (id.includes('node_modules')) {
return 'vendor'
}
}
}
}
},
// 开发服务器配置(仅开发时使用)
server: {
port: 3000,
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true
}
}
}
})Webpack 配置说明(Vue CLI)
vue\.config\.js 配置:
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
transpileDependencies: true,
// 生产环境路径
publicPath: '/',
// 输出目录
outputDir: 'dist',
// 静态资源目录
assetsDir: 'assets',
// 生产环境不生成 sourceMap
productionSourceMap: false,
// Webpack 配置
configureWebpack: {
optimization: {
minimizer: [
require('terser-webpack-plugin')({
terserOptions: {
compress: {
drop_console: true,
drop_debugger: true
}
}
})
]
}
},
// 开发代理
devServer: {
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true
}
}
}
})打包产物分析
dist 目录结构说明:
dist/ ├── index.html # 入口HTML文件 ├── favicon.ico # 网站图标 ├── assets/ # 静态资源目录 │ ├── css/ │ │ └── index-[hash].css # 样式文件 │ ├── js/ │ │ ├── index-[hash].js # 入口JS │ │ └── vendor-[hash].js # 第三方依赖 │ └── img/ # 图片资源 └── robots.txt # 搜索引擎规则(可选)
打包后验证:
# 本地预览打包结果 npm run preview # 或使用 http-server npm install -g http-server cd dist http-server -p 8080
上传服务器
方式一:SCP(推荐,简单直接)
SCP 是基于 SSH 的文件传输协议,简单高效。
完整上传命令:
# 基本语法:scp [参数] 本地文件 远程用户@远程IP:远程路径 # 上传整个 dist 目录到服务器 scp -r ./dist/* root@192.168.1.100:/var/www/vue3-project/ # 指定端口(如果SSH端口不是22) scp -P 2222 -r ./dist/* root@192.168.1.100:/var/www/vue3-project/ # 显示传输进度 scp -rv ./dist/* root@192.168.1.100:/var/www/vue3-project/
优点:简单直接,无需额外软件
缺点:不支持增量传输,每次全量传输
方式二:Rsync(推荐生产环境)
Rsync 支持增量同步,只传输修改过的文件,速度快,支持断点续传。
服务器安装 Rsync:
# CentOS yum install -y rsync # Ubuntu apt install -y rsync
Rsync 上传命令:
# 增量同步 dist 目录到服务器(推荐) rsync -avzP --delete ./dist/ root@192.168.1.100:/var/www/vue3-project/ # 参数说明: # -a: 归档模式,保留权限、时间等属性 # -v: 显示详细信息 # -z: 传输时压缩 # -P: 显示进度 + 断点续传 # --delete: 删除目标目录中源目录不存在的文件(重要!) # 指定SSH端口 rsync -avzP -e "ssh -p 2222" ./dist/ root@192.168.1.100:/var/www/vue3-project/ # 排除某些文件 rsync -avzP --exclude="*.map" ./dist/ root@192.168.1.100:/var/www/vue3-project/
优点:增量传输、速度快、支持断点续传
缺点:服务器需要安装 rsync
方式三:SFTP(图形化工具)
使用 FileZilla、WinSCP 等图形化工具:
- 连接信息:协议选 SFTP,主机填 IP,端口 22
- 本地选择 dist 目录
- 远程导航到 /var/www/vue3-project
- 拖拽上传
三种方式对比
方式 | 优点 | 缺点 | 适用场景 |
SCP | 简单、无需额外安装 | 全量传输、无断点 | 小型项目、首次部署 |
Rsync | 增量、压缩、断点续传 | 需服务器安装 rsync | 生产环境、频繁更新 |
SFTP | 图形化、易操作 | 速度慢、无增量 | 不熟悉命令行的用户 |
Nginx 安装配置(重点章节)
Nginx 安装
方式一:YUM 安装(CentOS)
# 安装 EPEL 源 yum install -y epel-release # 安装 Nginx yum install -y nginx # 启动并设置开机自启 systemctl start nginx systemctl enable nginx # 检查状态 systemctl status nginx
方式二:APT 安装(Ubuntu)
apt update apt install -y nginx systemctl start nginx systemctl enable nginx
方式三:源码编译安装(推荐生产环境)
# 安装依赖 yum install -y gcc gcc-c++ make zlib-devel pcre-devel openssl-devel # 下载源码 cd /usr/local/src wget http://nginx.org/download/nginx-1.24.0.tar.gz tar zxf nginx-1.24.0.tar.gz cd nginx-1.24.0 # 编译配置(包含常用模块) ./configure \ --prefix=/usr/local/nginx \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_gzip_static_module \ --with-http_stub_status_module \ --with-stream # 编译安装 make && make install # 创建 systemd 服务 # (略,可参考官方文档)
完整 Nginx 配置文件
*主配置文件 /etc/nginx/nginx\.conf:*
user nginx;
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 65535;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
use epoll;
worker_connections 65535;
multi_accept on;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'$request_time $upstream_response_time';
access_log /var/log/nginx/access.log main;
# 核心优化
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 1000;
types_hash_max_size 2048;
server_names_hash_bucket_size 128;
client_max_body_size 50M;
# Gzip 压缩配置
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/xml+rss
application/xhtml+xml
application/x-font-ttf
font/opentype
image/svg+xml
image/x-icon;
gzip_min_length 1k;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_disable "MSIE [1-6]\.";
# 虚拟主机配置
include /etc/nginx/conf.d/*.conf;
}Vue3 项目站点配置
*站点配置文件 /etc/nginx/conf\.d/vue3\-project\.conf:*
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
root /var/www/vue3-project;
index index.html;
# 字符集
charset utf-8;
# ==========================================
# 【关键配置】Vue Router History 模式支持
# ==========================================
# 原理:所有请求都重定向到 index.html,由前端路由处理
# 如果不配置,刷新页面会出现 404 错误
location / {
try_files $uri $uri/ /index.html;
}
# ==========================================
# 静态资源缓存策略
# ==========================================
# 带 hash 的资源(js、css)永久缓存
location ~* \.(js|css)$ {
expires 1y;
add_header Cache-Control "public, immutable";
add_header Vary Accept-Encoding;
}
# 图片、字体、媒体资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public";
}
# html 不缓存(每次都检查更新)
location ~* \.html$ {
expires -1;
add_header Cache-Control "no-cache, no-store, must-revalidate";
}
# ==========================================
# 反向代理解决跨域问题
# ==========================================
location /api/ {
proxy_pass http://127.0.0.1:8080/; # 后端服务地址
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;
# WebSocket 支持(如需要)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# ==========================================
# 安全头配置
# ==========================================
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# ==========================================
# 隐藏敏感文件
# ==========================================
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
location ~ ~$ {
deny all;
access_log off;
log_not_found off;
}
}HTTPS 配置(SSL 证书部署)
完整 HTTPS 配置:
# HTTP 强制跳转 HTTPS
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$server_name$request_uri;
}
# HTTPS 服务
server {
listen 443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
root /var/www/vue3-project;
index index.html;
# SSL 证书配置
ssl_certificate /etc/nginx/ssl/yourdomain.com.pem;
ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key;
# SSL 优化配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
# HSTS(开启后用户浏览器强制使用HTTPS)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
charset utf-8;
# History 模式支持
location / {
try_files $uri $uri/ /index.html;
}
# 静态资源缓存(同上,省略)
# 反向代理(同上,省略)
# 安全头(同上,省略)
}Nginx 配置验证与重载
# 检查配置文件语法 nginx -t # 重载配置(不中断服务) nginx -s reload # 重启 Nginx systemctl restart nginx # 查看运行状态 systemctl status nginx # 查看错误日志 tail -f /var/log/nginx/error.log # 查看访问日志 tail -f /var/log/nginx/access.log
Docker 部署方式
Docker 环境安装
# CentOS 安装 Docker yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y docker-ce docker-ce-cli containerd.io # 启动 Docker systemctl start docker systemctl enable docker # 安装 docker-compose curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
Dockerfile 编写(多阶段构建优化)
*项目根目录创建 Dockerfile:*
# ==========================================
# 第一阶段:构建阶段(仅用于编译打包)
# ==========================================
FROM node:18-alpine AS builder
# 设置工作目录
WORKDIR /app
# 先复制依赖文件,利用 Docker 缓存
COPY package*.json ./
COPY pnpm-lock.yaml* ./
COPY yarn.lock* ./
# 安装依赖(根据项目使用的包管理器选择)
RUN npm config set registry https://registry.npmmirror.com && \
npm install
# 复制项目源码
COPY . .
# 执行构建
RUN npm run build
# ==========================================
# 第二阶段:运行阶段(仅包含 Nginx 和构建产物)
# ==========================================
FROM nginx:1.24-alpine
# 设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone
# 从构建阶段复制打包产物
COPY --from=builder /app/dist /usr/share/nginx/html
# 复制自定义 Nginx 配置
COPY nginx.conf /etc/nginx/conf.d/default.conf
# 暴露端口
EXPOSE 80
# 启动 Nginx
CMD ["nginx", "-g", "daemon off;"]Nginx 配置文件(容器内使用)
项目根目录创建 nginx\.conf:
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html;
charset utf-8;
# History 模式支持
location / {
try_files $uri $uri/ /index.html;
}
# 静态资源缓存
location ~* \.(js|css)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
location ~* \.(jpg|jpeg|png|gif|ico|svg|woff|woff2|ttf)$ {
expires 30d;
add_header Cache-Control "public";
}
location ~* \.html$ {
expires -1;
add_header Cache-Control "no-cache, no-store, must-revalidate";
}
# 反向代理(如需要)
location /api/ {
proxy_pass http://backend:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# Gzip 压缩
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/javascript application/json application/javascript;
}docker-compose.yml 配置
项目根目录创建 docker\-compose\.yml:
version: '3.8'
services:
# Vue3 前端服务
web:
build: .
container_name: vue3-web
restart: always
ports:
- "80:80"
- "443:443" # 如需HTTPS
volumes:
# 挂载 SSL 证书(如需HTTPS)
- ./ssl:/etc/nginx/ssl
# 挂载日志目录
- ./logs/nginx:/var/log/nginx
networks:
- app-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
# 后端服务(如需要)
backend:
image: your-backend-image:latest
container_name: vue3-backend
restart: always
ports:
- "8080:8080"
networks:
- app-network
networks:
app-network:
driver: bridgeDocker 部署命令
# 构建并启动 docker-compose up -d --build # 查看日志 docker-compose logs -f web # 查看运行状态 docker-compose ps # 停止服务 docker-compose down # 重启服务 docker-compose restart web # 进入容器 docker exec -it vue3-web sh
自动化部署脚本
完整自动化部署 Shell 脚本
在项目根目录创建 deploy\.sh:
#!/bin/bash
set -e
# ==========================================
# Vue3 项目自动化部署脚本
# 功能:本地构建 -> 备份 -> 上传 -> 部署 -> 回滚支持
# ==========================================
# ==================== 配置项 ====================
PROJECT_NAME="vue3-project"
LOCAL_DIST_PATH="./dist"
REMOTE_USER="root"
REMOTE_HOST="192.168.1.100"
REMOTE_PORT="22"
REMOTE_BASE_PATH="/var/www/${PROJECT_NAME}"
BACKUP_KEEP_COUNT=5 # 保留备份数量
# ================================================
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 步骤1:本地构建
build() {
log_info "开始本地构建..."
npm run build
if [ ! -d "$LOCAL_DIST_PATH" ]; then
log_error "构建失败,dist 目录不存在"
exit 1
fi
log_info "构建完成"
}
# 步骤2:备份当前版本
backup() {
log_info "备份当前版本..."
local timestamp=$(date +%Y%m%d_%H%M%S)
local backup_path="${REMOTE_BASE_PATH}/backup/${timestamp}"
ssh -p $REMOTE_PORT $REMOTE_USER@$REMOTE_HOST << EOF
mkdir -p ${REMOTE_BASE_PATH}/backup
if [ -d "${REMOTE_BASE_PATH}/current" ]; then
cp -r ${REMOTE_BASE_PATH}/current $backup_path
log_info "备份完成: $backup_path"
fi
EOF
}
# 步骤3:清理旧备份
cleanup_backups() {
log_info "清理旧备份,保留最近 ${BACKUP_KEEP_COUNT} 个..."
ssh -p $REMOTE_PORT $REMOTE_USER@$REMOTE_HOST << EOF
cd ${REMOTE_BASE_PATH}/backup
ls -t | tail -n +\$((BACKUP_KEEP_COUNT + 1)) | xargs rm -rf
EOF
}
# 步骤4:上传新文件
upload() {
log_info "上传新文件到服务器..."
ssh -p $REMOTE_PORT $REMOTE_USER@$REMOTE_HOST "mkdir -p ${REMOTE_BASE_PATH}/releases"
local release_name=$(date +%Y%m%d_%H%M%S)
local remote_release_path="${REMOTE_BASE_PATH}/releases/${release_name}"
ssh -p $REMOTE_PORT $REMOTE_USER@$REMOTE_HOST "mkdir -p $remote_release_path"
rsync -avzP --delete \
-e "ssh -p $REMOTE_PORT" \
${LOCAL_DIST_PATH}/ \
${REMOTE_USER}@${REMOTE_HOST}:${remote_release_path}/
echo $release_name
}
# 步骤5:切换到新版本
switch_version() {
local release_name=$1
log_info "切换到新版本: $release_name"
ssh -p $REMOTE_PORT $REMOTE_USER@$REMOTE_HOST << EOF
# 创建软链接指向新版本
ln -sfn ${REMOTE_BASE_PATH}/releases/${release_name} ${REMOTE_BASE_PATH}/current
echo "版本切换完成"
EOF
}
# 回滚功能
rollback() {
log_info "开始回滚..."
local previous_version=$(ssh -p $REMOTE_PORT $REMOTE_USER@$REMOTE_HOST "
ls -t ${REMOTE_BASE_PATH}/releases | sed -n '2p'
")
if [ -z "$previous_version" ]; then
log_error "没有可回滚的版本"
exit 1
fi
log_warn "回滚到版本: $previous_version"
switch_version $previous_version
log_info "回滚完成"
}
# 主流程
main() {
case "${1:-deploy}" in
deploy)
log_info "========== 开始部署 =========="
build
backup
local release_name=$(upload)
switch_version $release_name
cleanup_backups
log_info "========== 部署成功 =========="
;;
rollback)
rollback
;;
build)
build
;;
*)
echo "用法: $0 [deploy|rollback|build]"
exit 1
;;
esac
}
main "$@"脚本使用方法
# 添加执行权限 chmod +x deploy.sh # 完整部署 ./deploy.sh deploy # 回滚到上一个版本 ./deploy.sh rollback # 仅本地构建 ./deploy.sh build
CI/CD 思路(GitHub Actions 示例)
项目根目录创建 \.github/workflows/deploy\.yml:
name: Deploy to Production
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build
run: npm run build
- name: Deploy to server
uses: easingthemes/ssh-deploy@main
with:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
ARGS: "-avzP --delete"
SOURCE: "dist/"
REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
REMOTE_USER: ${{ secrets.REMOTE_USER }}
TARGET: /var/www/vue3-project/current/常见问题排查
1. 刷新页面出现 404 错误
问题原因:Vue Router 使用 history 模式时,Nginx 没有配置 try_files
解决方案:在 Nginx 配置中添加:
location / {
try_files $uri $uri/ /index.html;
}验证:nginx \-t \&\& nginx \-s reload
2. 跨域问题(CORS Error)
问题原因:前端域名和后端接口域名不一致
解决方案:
- 方案 A:Nginx 反向代理(推荐)
location /api/ {
proxy_pass http://backend-server:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}- 方案 B:后端配置 CORS
// Spring Boot 示例 @CrossOrigin(origins = "https://yourdomain.com")
3. 静态资源加载失败(404)
问题原因:
- base 路径配置错误
- 资源路径大小写问题(Linux 区分大小写)
- 文件权限问题
排查步骤:
# 1. 检查文件是否存在 ls -la /var/www/vue3-project/assets/ # 2. 检查文件权限 chown -R nginx:nginx /var/www/vue3-project/ chmod -R 755 /var/www/vue3-project/ # 3. 检查 Nginx 配置的 root 路径是否正确 # 4. 检查 vite.config.js 中的 base 配置
4. 页面白屏
排查步骤:
- F12 查看 Console 是否有 JS 报错
- 检查 Network 是否有资源加载失败
- 检查是否开启了 CSP(内容安全策略)
- 检查是否是浏览器缓存问题(Ctrl+F5 强制刷新)
- 查看 Nginx 错误日志:
tail \-f /var/log/nginx/error\.log
5. HTTPS 不生效或证书错误
排查命令:
# 检查证书是否匹配 openssl x509 -noout -subject -in /etc/nginx/ssl/cert.pem openssl rsa -noout -check -in /etc/nginx/ssl/key.pem # 检查证书有效期 openssl x509 -noout -dates -in /etc/nginx/ssl/cert.pem # 测试 HTTPS 连接 curl -v https://yourdomain.com
6. Gzip 压缩不生效
验证方法:
# 检查响应头是否包含 Content-Encoding: gzip curl -I -H "Accept-Encoding: gzip" https://yourdomain.com/assets/index.js
性能优化建议
1. 构建层面优化
- 开启代码压缩:生产环境移除 console、debugger
- 代码分割:路由懒加载、第三方库单独打包
- Tree Shaking:移除未使用的代码
- 图片优化:使用 WebP 格式、压缩图片大小
2. Nginx 层面优化
- 开启 Gzip/Brotli 压缩:减少传输体积 60%+
- 配置浏览器缓存:带 hash 的资源永久缓存
- 开启 HTTP/2:多路复用提升加载速度
- 静态资源 CDN 加速:将 js/css/ 图片托管到 CDN
3. 服务器层面优化
# 系统参数优化(/etc/sysctl.conf) net.core.somaxconn = 65535 net.core.netdev_max_backlog = 5000 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_tw_reuse = 1 # 文件句柄限制(/etc/security/limits.conf) nginx soft nofile 65535 nginx hard nofile 65535
4. 前端层面优化
- 路由懒加载:
const Home = \(\) =\> import\(\&\#39;\./views/Home\.vue\&\#39;\) - 组件懒加载:
defineAsyncComponent - 图片懒加载:使用
v\-lazy或原生loading=\&\#34;lazy\&\#34; - 使用 CDN:Vue、VueRouter 等大库使用 CDN 引入
生产环境最佳实践
1. 目录结构规范
推荐目录结构:
/var/www/vue3-project/ ├── current -> releases/20240101_120000/ # 当前版本软链接 ├── releases/ # 历史版本目录 │ ├── 20240101_120000/ │ ├── 20240102_153000/ │ └── ... ├── backup/ # 备份目录 ├── shared/ # 共享文件(如配置) └── logs/ # 日志目录
2. 权限配置
# 创建专用运行用户 useradd -r -s /sbin/nologin www # 设置目录权限 chown -R www:www /var/www/vue3-project/ chmod -R 755 /var/www/vue3-project/ chmod 644 /var/www/vue3-project/current/index.html # Nginx 运行用户改为 www # 修改 /etc/nginx/nginx.conf: user www;
3. 日志管理
配置日志轮转(/etc/logrotate.d/nginx):
/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0640 www adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}4. 安全加固
- 隐藏 Nginx 版本号
# nginx.conf http 块中添加 server_tokens off;
- 防火墙配置
# 只开放必要端口 firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https firewall-cmd --permanent --add-service=ssh firewall-cmd --reload
- Fail2ban 防暴力 破解
yum install -y fail2ban systemctl start fail2ban systemctl enable fail2ban
- 定期安全更新
yum update -y # 或 apt update && apt upgrade -y
5. 监控与告警
基础监控脚本示例:
#!/bin/bash
# check_nginx.sh
NGINX_STATUS=$(systemctl is-active nginx)
if [ "$NGINX_STATUS" != "active" ]; then
echo "Nginx 服务异常!" | mail -s "告警:Nginx 服务停止" admin@yourdomain.com
systemctl restart nginx
fi
# 检查磁盘使用率
DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $DISK_USAGE -gt 80 ]; then
echo "磁盘使用率超过 80%,当前:${DISK_USAGE}%" | mail -s "告警:磁盘空间不足" admin@yourdomain.com
fi推荐监控工具:Prometheus + Grafana、Zabbix、云监控
6. 版本管理与回滚方案
蓝绿部署:
- 同时运行两个版本(蓝版、绿版)
- 新版本验证通过后,Nginx 切换 upstream
灰度发布:
- Nginx 根据权重分配流量
- 逐步将流量从旧版本切换到新版本
# 灰度发布配置示例
upstream web_servers {
server 127.0.0.1:8081 weight=9; # 旧版本 90% 流量
server 127.0.0.1:8082 weight=1; # 新版本 10% 流量
}总结
本文系统地讲解了 Vue3 前端项目部署到 Linux 服务器的完整流程,涵盖了从本地构建、文件传输、Nginx 配置、容器化部署到自动化运维的各个环节。以下是核心要点回顾:
核心要点总结
- History 模式是关键:务必配置
try\_files $uri $uri/ /index\.html;,这是 SPA 部署的核心 - 缓存策略要合理:带 hash 的资源永久缓存,html 不缓存
- HTTPS 是标配:生产环境必须部署 SSL 证书
- 反向代理解跨域:Nginx 反向代理是解决跨域的最佳方案
- Rsync 增量部署:生产环境推荐使用 Rsync 而非 SCP
- Docker 标准化:容器化部署保证环境一致性
- 自动化 + 回滚:部署脚本必须包含回滚功能
- 监控不能少:生产环境必须有完善的监控告警
部署流程速查
本地开发 → npm run build → rsync 增量上传 → Nginx 配置 → 测试验证 → 监控告警
Vue3 项目的部署并不复杂,但细节决定成败。一个好的部署方案不仅要能让项目跑起来,更要保证稳定、安全、高效。希望本文能帮助你建立标准化的前端部署流程,让每次部署都成为一个可靠、可重复、可回滚的自动化过程。
以上就是Vue3前端项目部署到Linux服务器的实战指南的详细内容,更多关于Vue3前端项目部署到Linux的资料请关注脚本之家其它相关文章!
