Nginx 部署多个 VUE 项目(相同IP、相同端口、不同上下文路径)

本文介绍了在前后端分离的开发环境中,如何在同一IP相同端口下通过上下文路径区分不同前端项目。主要涉及前端Vue项目的配置,包括修改vue.config.js的publicPath和router的index.js,以及使用Nginx进行代理服务配置,通过location规则和try_files指令解决404问题,实现多个项目在同一服务器不同上下文路径的部署。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、场景描述

  在前后分离的项目开发中,前端项目开发人员对 vue 项目的打包一般都是采用默认根目录访问的。如果多个前端项目都采用根目录的方式访问,分别部署在不同的服务器或者同一个服务器的不同端口,那通过 Nginx 代理的方式还很好解决。但是如果必须在同一个 IP 相同端口下,通过访问的上下文路径来区分,那么就是一个比较棘手的问题。

  接下来的操作就是带领有以上困惑的开发人员来处理此类问题。

二、解决方案
1、前端项目配置
  1. 修改 vue.config.js 配置文件的公共路径配置,修改为我们前端项目服务的名称,这里以 admin 为例

    1

  2. 修改 router 目录下的 index.js 文件,指定 Vue 项目的固定路由路径,这里还是以 admin 为例(当然也可以和 publicPath 不相同)

    2

  3. Vue 项目打包成静态资源文件

    npm run build  
    
  4. 将打包完成的 dist 文件夹重命名为任意合规的项目文件夹名称,这里以 admin-web 为例

  5. admin 文件夹传入到服务器的指定目录中

2、代理服务配置
  • 整体配置文件信息如下

    server {
        # 自定义访问端口
        listen       8013;
        # 服务名称
        server_name  localhost;
    
        # 响应日志文件名称定义
        access_log  logs/admin-web.access.log  main;
    
        # 设置客户端最大请求体
        client_max_body_size 10m;
    
        # 设置路由变量转发
        location @router {
            rewrite ^.*$ /index.html last;
        }
    
        # admin 管理平台前端界面
        location /admin/ {
            # 前端打包后静态文件所在位置,可以和上下文路径不一致,注意 root 和 alias 的用法
            alias   /opt/java/frontend/admin-web/;
            # 处理 Vue 单页面应用 路由模式为 history 模式刷新页面 404 的问题
        	try_files $uri $uri/ @router;
            index  index.html index.htm;
        }
    
        # xxxx 管理平台前端界面
        location /xxxx/ {
            # 前端打包后静态文件所在位置,可以和上下文路径不一致,注意 root 和 alias 的用法
            alias   /opt/java/frontend/xxxx-web/;
            # 处理 Vue 单页面应用 路由模式为 history 模式刷新页面 404 的问题
    	    try_files $uri $uri/ @router;
            index  index.html index.htm;
        }
    
        #error_page  404              /404.html;
        error_page  404              /404.html;
        location = /404.html {
    	root   html;
        }
    
        # redirect server error pages to the static page /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    
  • 重启 nginx 服务

    # 验证语法
    /usr/local/nginx/sbin/./nginx -t
    
    # 重启 Nginx 服务
    /usr/local/nginx/sbin/./nginx -s reload
    
  • 前端访问示例

    http://127.0.0.1:8013/admin/#
    
<think>我们正在使用Docker安装Nginx部署Vue应用。根据引用[4]和[5],我们知道需要先安装Docker,然后使用Docker拉取Nginx镜像,并通过配置文件和挂载卷来部署Vue项目。步骤:1.安装Docker Engine(根据操作系统参考官方文档:https://docs.docker.com/engine/install/)2.构建Vue项目(生产环境构建,生成dist目录)3.创建Dockerfile(用于构建自定义Nginx镜像,将dist目录复制到镜像中)4.创建nginx配置文件(可自定义,例如处理Vue路由的配置)5.使用docker-compose.yml(可选,但推荐)或直接运行docker命令来启动容器详细步骤:1.安装Docker根据你的操作系统,按照官方文档安装DockerEngine。2.构建Vue项目Vue项目根目录下运行:```bashnpm runbuild```这会生成一个`dist`目录,里面是静态文件。3.准备Docker相关文件在项目根目录下创建一个`docker`文件夹(或其他名称),用于存放Dockerfile和nginx配置文件。-创建Dockerfile(在docker目录下,或者项目根目录下,这里假设放在项目根目录下):```Dockerfile#使用官方Nginx镜像FROMnginx:stable-alpine#将dist目录下的文件复制到容器中的nginx默认静态文件目录COPYdist /usr/share/nginx/html#用自定义的nginx配置文件覆盖默认配置COPYdocker/nginx.conf /etc/nginx/nginx.conf#暴露80端口EXPOSE80```-创建nginx配置文件(在docker目录下,例如nginx.conf):```nginxusernginx;worker_processesauto;error_log/var/log/nginx/error.lognotice;pid/var/run/nginx.pid;events {worker_connections1024;}http{include/etc/nginx/mime.types;default_typeapplication/octet-stream;log_formatmain'$remote_addr -$remote_user [$time_local] "$request"''$status$body_bytes_sent "$http_referer" ''"$http_user_agent""$http_x_forwarded_for"';access_log/var/log/nginx/access.logmain;sendfileon;#tcp_nopushon;keepalive_timeout65;#gzipon;server{listen80;server_namelocalhost;location /{root/usr/share/nginx/html;indexindex.htmlindex.htm;#解决Vue路由history模式404问题try_files $uri $uri//index.html;}error_page500502503504/50x.html;location =/50x.html{root/usr/share/nginx/html;}}}```注意:上面的nginx配置中,我们添加了`try_files $uri $uri//index.html;`以支持Vue的history模式。4.构建Docker镜像并运行容器有两种方式:使用docker-compose或直接使用docker命令。-使用docker-compose(推荐):在项目根目录创建`docker-compose.yml`文件:```yamlversion:"3.7"services:web:build:context: .#指定构建上下文为当前目录dockerfile: Dockerfile#指定Dockerfile路径image: my-vue-app#构建的镜像名称container_name:vue-app-containerports:- "8080:80"#将宿主机的8080端口映射到容器的80端口restart:always```然后运行:```bashdocker-compose up-d```-使用docker命令:构建镜像:```bashdocker build-tmy-vue-app.```运行容器:```bashdocker run--namevue-app-container -p8080:80-dmy-vue-app```5.访问应用在浏览器中访问:http://localhost:8080注意事项:-确保构建Vue项目时使用的是生产环境配置。-如果使用自定义nginx配置,请确保配置文件路径正确。-如果Vue项目使用history模式,nginx配置中的`try_files`指令是必要的,否则刷新页面会出现404。引用说明:[^4]提到了在服务器上安装Docker并部署Vue项目的过程。[^5]提供了Docker Engine和Docker Desktop的区别,并建议参考官方安装文档。根据引用[3],我们也可以使用多路径映射的方式运行容器,但这里我们使用Dockerfile构建镜像的方式,将dist目录直接打包进镜像,这样更利于分发和部署。如果希望使用挂载卷的方式(适用于开发调试,避免每次构建镜像),可以参考引用[3]的命令,但注意生产部署通常将静态文件打包进镜像。因此,我们提供了两种构建方式(docker-compose和docker命令),并推荐使用docker-compose管理。</think>### 使用 Docker 部署 Nginx 并托管 Vue 应用 #### 完整步骤指南(基于最佳实践) 1. **安装 Docker** 参考[官方文档](https://docs.docker.com/engine/install/)安装 Docker Engine。 ```bash # Ubuntu 示例 sudo apt update sudo apt install docker.io sudo systemctl enable --now docker ``` 2. **构建 Vue 应用** 在 Vue 项目根目录生成生产环境构建文件: ```bash npm run build # 生成 dist 目录 ``` 3. **准备 Docker 配置文件** - **项目结构**: ``` project-root/ ├── docker/ │ ├── nginx.conf # Nginx 配置文件 │ └── Dockerfile # Docker 构建文件 ├── dist/ # Vue 构建产物 └── docker-compose.yml # 容器编排 ``` - **Nginx 配置** (`docker/nginx.conf`)[^3]: ```nginx server { listen 80; server_name localhost; root /usr/share/nginx/html; location / { try_files $uri $uri/ /index.html; # 支持 Vue Router history 模式 } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } ``` - **Dockerfile** (`docker/Dockerfile`)[^1][^5]: ```dockerfile FROM nginx:1.25-alpine COPY nginx.conf /etc/nginx/conf.d/default.conf COPY ../dist /usr/share/nginx/html # 复制 Vue 构建文件 EXPOSE 80 ``` 4. **容器编排** (`docker-compose.yml`)[^2]: ```yaml version: "3.8" services: vue-app: build: context: . dockerfile: docker/Dockerfile ports: - "8080:80" # 宿主机端口:容器端口 restart: always ``` 5. **启动服务** ```bash docker-compose up -d --build ``` 6. **验证部署** 访问 `http://localhost:8080` 查看 Vue 应用。 #### 关键配置说明 1. **路由 History 模式** Nginx 配置中的 `try_files $uri $uri/ /index.html` 是支持 Vue Router history 模式的关键[^3]。 2. **镜像优化** 使用 `nginx:alpine` 镜像(约 10MB)减小体积。 3. **热更新方案**(开发阶段) 添加卷映射实现代码实时更新: ```yaml # docker-compose.yml 附加配置 volumes: - ./dist:/usr/share/nginx/html - ./docker/nginx.conf:/etc/nginx/conf.d/default.conf ``` #### 常见问题解决 - **403 Forbidden 错误**: 确保 `dist` 目录权限:`chmod -R 755 dist` - **路由刷新 404**: 确认 Nginx 配置包含 `try_files` 指令 - **端口冲突**: 修改 `docker-compose.yml` 的端口映射为 `- "新端口:80"` > 部署成功后,可通过 `docker ps` 查看运行状态,`docker logs <容器ID>` 检查日志。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值