React 实践项目 (五)Docker Nginx 部署 React

本文详细介绍如何使用create-react-app工具打包React应用,并借助Docker和Nginx将其部署到服务器的过程。文章还解决了部署后遇到的路由刷新404问题。

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

React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架。而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战!

React 实践项目 (一)
React 实践项目 (二)
React 实践项目 (三)
React 实践项目 (四)
React 实践项目 (五)

这次我们把应用部署到服务器上.

项目到现在麻雀虽小五脏俱全,为了提高我们写代码的积极性,自然是选择部署到服务器上在小伙伴面前秀一波了.部署 React 应用也是非常方便简单的.

  • 打包应用

我们是用Facebook官方的零配置命令行工具 create-react-app 创建的项目,create-react-app 内置了打包的npm 命令

在命令行里切换到项目目录,执行 npm run build 命令,代码会被编译到build目录。将整个应用打包发布,自动试用webpack进行压缩与优化。

tim 20170730103905

如上图所示,我们的应用已经打包完毕.

  • 安装 Nginx

Nginx 是一个高性能的HTTP和反向代理服务器.

在安装Nginx前需要先介绍下 Docker.

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

云计算、大数据,移动技术的快速发展,加之企业业务需求的不断变化,导致企业架构要随时更改以适合业务需求,跟上技术更新的步伐。毫无疑问,这些重担都将压在企业开发人员身上;团队之间如何高效协调,快速交付产品,快速部署应用,以及满足企业业务需求,是开发人员亟需解决的问题。Docker技术恰好可以帮助开发人员解决这些问题。
为了解决开发人员和运维人员之间的协作关系,加快应用交付速度,越来越多的企业引入了DevOps这一概念。但是,传统的开发过程中,开发、测试、运维是三个独立运作的团队,团队之间沟通不畅,开发运维之间冲突时有发生,导致协作效率低下,产品交付延迟, 影响了企业的业务运行。Docker技术将应用以集装箱的方式打包交付,使应用在不同的团队中共享,通过镜像的方式应用可以部署于任何环境中。这样避免了各团队之间的协作问题的出现,成为企业实现DevOps目标的重要工具。以容器方式交付的Docker技术支持不断地开发迭代,大大提升了产品开发和交付速度。
此外,与通过Hypervisor把底层设备虚拟化的虚拟机不同,Docker直接移植于Linux内核之上,通过运行Linux进程将底层设备虚拟隔离,这样系统性能的损耗也要比虚拟机低的多,几乎可以忽略。同时,Docker应用容器的启停非常高效,可以支持大规模的分布系统的水平扩展,真正给企业开发带来福音。

总之就是非常好用, linux windows mac上都可以安装,docker安装完成后我们先把nginx镜像下载到本地.

docker pull nginx

为了使用方便,我们用 docker-compose 管理容器.

  • 创建 docker-compose.yml
version: '2'
services:
  # 服务名称
  nginx:
    # 镜像:版本
    image: nginx:latest 
    # 映射容器80端口到本地80端口
    ports:
     - "80:80"
    # 数据卷 映射本地文件到容器
    volumes:
    # 映射nginx.conf文件到容器的/etc/nginx/conf.d目录并覆盖default.conf文件
    # - ./nginx.conf:/etc/nginx/conf.d/default.conf
    # 映射build文件夹到容器的/usr/share/nginx/html文件夹
     - ./build:/usr/share/nginx/html
    # 覆盖容器启动后默认执行的命令。
    command: /bin/bash -c "nginx -g 'daemon off;'"

完成后执行 docker-compose up -d 就会自动创建容器并在后台运行了

常用命令:
docker-compose down 关闭并删除容器
docker-compose ps 查看容器状态
docker-compose exec SERVICE COMMAND 可以用来进入容器内部进行一些操作,
比如 docker-compose exec nginx bash

  • 静态资源配置

我们先把打包好的build文件夹上传至服务器,和docker-compose.yml 放在一起
docker-compose.yml 文件已经配置了会把同目录的 build 文件夹映射到nginx容器的/usr/share/nginx/html文件夹 这个文件夹就是默认的静态资源文件夹

  • 配置 Nginx

nginx镜像有一个默认的配置文件 default.conf

default.conf

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

默认的配置有一个问题, 在非首页的路由页面刷新就会报404错误
我们使用 react-router 作为路由管理,在开发端的express服务器下运行和测试表现均正常,部署到线上的nginx服务器后,还需要对该应用在nginx的配置里作相应调整,否则浏览器将不能正常刷新,表现为页面不显示或页面跳转错误等异常。原因在于这些react应用在运行时会更改浏览器uri而又不真的希望服务器对这些uri去作响应,如果此时刷新浏览器,服务器收到浏览器发来的uri就去寻找资源,这个uri在服务器上是没有对应资源,结果服务器因找不到资源就发送403错误标志给浏览器。所以,我们要做的调整是:浏览器在使用这个react应用期间,无论uri更改与否,服务器都发回index.html这个页面就行。

创建 nginx.conf 文件

# gzip设置
gzip on;
gzip_vary on;

gzip_comp_level 6;
gzip_buffers 16 8k;

gzip_min_length 1000;
gzip_proxied any;
gzip_disable "msie6";
#gzip_http_version 1.0;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        # 其作用是按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有的文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。
        try_files $uri /index.html;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

将 docker-compose.yml 里的 # - ./nginx.conf:/etc/nginx/conf.d/default.conf 注释去掉 用nginx.conf覆盖默认的配置

docker-compose down
docker-compose up -d

现在我们访问服务器的80端口就可以看到我们的应用了.比如我的服务器ip为 139.224.135.86 在浏览器输入 http://139.224.135.86 就可以访问了.

<think>好的,用户想了解如何使用DockerNginx部署前后端项目。首先,我需要整理出清晰的步骤,确保涵盖前端和后端的部署流程,同时结合用户提供的引用内容。 首先,用户提供的引用中提到了Docker部署Nginx前端项目以及Java的JAR包。引用1和引用3主要涉及前端部署,包括拉取Nginx镜像、挂载配置文件、访问项目页面等。引用2提到了查看挂载绑定和部署JAR包。这些信息需要整合到回答中。 接下来,需要分步骤说明。首先是环境准备,安装Docker和拉取Nginx镜像。然后前端部署部分,需要创建目录结构,挂载Nginx配置和静态资源,编写Dockerfile和Nginx配置文件,最后构建和运行容器。这里要注意路径的正确性,以及如何配置反向代理到后端。 后端部署部分,用户可能使用Java的Spring Boot,所以用JAR包示例。需要创建Dockerfile构建镜像,运行容器,并确保网络设置正确,以便前端能访问后端API。 然后,用户提到前后端联调,需要修改Nginx配置代理后端请求,可能需要设置跨域。这部分需要结合引用中的挂载和配置方法,确保Nginx正确转发请求。 最后,注意事项要包括网络设置、配置文件调试、版本管理和数据持久化。这些能帮助用户避免常见问题,比如端口冲突或配置错误。 生成的问题需要围绕部署中的优化、配置管理、HTTPS设置和容器通信,这些都是用户可能遇到的后续问题。要确保问题与教程内容相关,帮助用户深入理解。 现在,检查步骤是否正确,是否有遗漏。比如前端部分是否需要构建静态文件?用户提供的引用中前端项目可能已经构建好,所以Dockerfile可能只需要复制文件到Nginx目录。后端部分是否需要多阶段构建?用户示例中使用的是直接运行JAR,可能足够简单。 确保所有命令准确,比如docker run的参数是否正确,特别是挂载卷和端口映射。引用3中提到了拷贝默认配置,但在教程中可能建议直接挂载自定义配置,这样更方便。 最后,语言要口语化,但按照用户要求用中文,结构清晰,分步骤讲解,代码块正确使用格式,符合系统级指令的要求。</think>### 使用 DockerNginx 部署前后端项目教程 #### 一、环境准备 1. **安装 Docker** 确保系统中已安装 Docker,可通过以下命令验证: ```bash docker -v ``` 若未安装,参考 [Docker 官方文档](https://docs.docker.com/get-docker/)完成安装。 2. **拉取 Nginx 镜像** 用于前端项目部署和反向代理后端服务: ```bash docker pull nginx ``` --- #### 二、前端项目部署 1. **创建项目目录结构** ```bash mkdir -p /usr/local/docker/nginx/{conf.d,html,logs} ``` - `conf.d`: 存放 Nginx 配置文件 - `html`: 存放前端静态文件(如 Vue/React 编译后的 `dist` 目录) - `logs`: 存放 Nginx 日志[^3] 2. **配置 Nginx** 在 `conf.d` 目录下创建配置文件 `frontend.conf`: ```nginx server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; } } ``` 3. **挂载静态文件与配置** 将前端编译后的 `dist` 目录内容复制到 `html` 目录,并启动容器: ```bash docker run -d --name nginx-frontend \ -p 80:80 \ -v /usr/local/docker/nginx/html:/usr/share/nginx/html \ -v /usr/local/docker/nginx/conf.d:/etc/nginx/conf.d \ -v /usr/local/docker/nginx/logs:/var/log/nginx \ nginx ``` 访问 `http://服务器IP:80` 即可查看前端页面[^1]。 --- #### 三、后端项目部署(以 Spring Boot 为例) 1. **编写 Dockerfile** 在项目根目录创建 `Dockerfile`: ```dockerfile FROM openjdk:17 COPY target/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app.jar"] ``` 2. **构建镜像并运行容器** ```bash docker build -t backend-app . docker run -d --name backend \ -p 8080:8080 \ backend-app ``` 3. **配置 Nginx 反向代理** 修改 `conf.d/frontend.conf`,添加后端代理: ```nginx location /api { proxy_pass http://backend:8080; proxy_set_header Host $host; } ``` 重启 Nginx 容器使配置生效: ```bash docker restart nginx-frontend ``` --- #### 四、联调与验证 1. **网络配置** 若前后端容器需通信,建议创建自定义网络: ```bash docker network create app-network docker network connect app-network nginx-frontend docker network connect app-network backend ``` 2. **访问验证** - 前端页面:`http://服务器IP:80` - 后端 API:`http://服务器IP/api/endpoint` --- #### 、注意事项 1. **配置文件调试** 若启动失败,可通过 `docker logs nginx-frontend` 查看日志排查问题[^2]。 2. **数据持久化** 挂载目录(如 `html`、`logs`)确保容器重启后数据不丢失。 3. **安全优化** 生产环境建议配置 HTTPS 和防火墙规则。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值