dockerfile解决nignx镜像部署vue刷新404

这篇博客介绍了在Docker环境下,如何通过配置Nginx解决Vue应用刷新页面出现404错误的问题。提供了三种不同的Nginx配置方案,包括设置try_files和rewrite规则来确保在history模式下正确重定向。

问题描述

由于安全问题,客户现场的同事部署的Docker环境,nginx部署vue刷新404,这个问题在nginx 修改配置文件很简单的问题,由于本人也没有真正的接触过docker,我们这个边提出让他修改nginx的config 配置,对方提出修改docker 去解决这个问题。
一下是解决方案,我也是刚接触docker文件,先模仿学习,等以后经验多一点在分享个人想法。
https://blog.youkuaiyun.com/qq1304530241/article/details/123820143

FROM nginx:latest
MAINTAINER iron.guo
VOLUME /tmp
ENV LANG en_US.UTF-8
RUN echo "server {  \
                    listen       80; \
                    #解决Router(mode: 'history')模式下,刷新路由地址不能找到页面的问题 \
                    location / { \
                        root   /var/www/html/; \
                        index  index.html index.htm; \
                        if (!-e \$request_filename) { \
                            rewrite ^(.*)\$ /index.html?s=\$1 last; \
                            break; \
                        } \
                    } \
                    access_log  /var/log/nginx/access.log ; \
                } " > /etc/nginx/conf.d/default.conf \
    &&  mkdir  -p  /var/www \
    &&  mkdir -p /var/www/html

ADD ./ /var/www/html/
EXPOSE 80

1.nginx解决刷新404


worker_processes auto;
events {
	worker_connections 1024;
}
http {
	include             mime.types;
	default_type        application/octet-stream;
	sendfile            on;
	keepalive_timeout 65;
	client_max_body_size 20m;
	server {
		listen       80;
		server_name  localhost;
		location / {
			root /usr/share/nginx/html; 		#配置Vue项目根路径
			index index.html index.html; 		#配置首页
			try_files $uri $uri/ /index.html; 	#防止刷新报404
		}
		error_page 500 502 503 504 /50x.html;
			location = /50x.html {
			root html;
		}
	}
}

2.nginx解决刷新404


server
{
    listen 80;
    server_name testwx.wangshibo.com;
 
    #vue-router配置
    location / {
        try_files $uri $uri/ @router;
        index index.html;
    }
    location @router {
        rewrite ^.*$ /index.html last;
    }

3.nginx解决刷新404

server {  
                    listen       80; 
                    #解决Router(mode: 'history')模式下,刷新路由地址不能找到页面的问题 
                    location / { 
                        root   /var/www/html/; 
                        index  index.html index.htm; 
                       	if (!-e $request_filename) {
          					rewrite ^(.*)$ /index.html?s=$1 last;
          					break;
      					}
                    } 
                    access_log  /var/log/nginx/access.log ; 
                }
<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`文件夹(或其他名称),用于存放Dockerfilenginx配置文件。-创建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>` 检查日志。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值