首页 > 其他分享 >如何将微前端项目部署在同一台服务器同一个端口下

如何将微前端项目部署在同一台服务器同一个端口下

时间:2023-04-13 10:33:45浏览次数:36  
标签:header 前端 端口 nginx html proxy 应用 服务器 打包

作者:京东科技 高飞

前言

本文旨在通过部署微前端项目的实践过程中沉淀出一套部署方案,现就一些重点步骤、碰到的问题做了一些总结。

部署顺序

因为线上部署主应用时需要用到子应用的线上可访问地址,因此部署顺序应该是先部署子应用,保证子应用能够线上可访问后,再将子应用的线上可访问地址配置到主应用,最后再将主应用部署到线上环境。

部署分支

线上环境部署统一用master分支的代码

应用构建打包

主应用构建打包

主应用csd-tech-main-app基于ant-design-pro,需要在config目录中配置微前端项目的访问地址。

在config目录下配置config.test.ts用于测试环境的打包配置,生产环境打包配置放在在config.prod.ts中。如果部署到测试环境,或者生产环境,可以换成对应的访问地址。

测试环境打包配置:

// config/config.test.ts  用于本地或者测试环境构建测试
export default defineConfig({
  define: {
    DATALINK_MICRO_APP_HOST: '/dlink/',  // 本地环境调度系统访问地址
    DATAX_MICRO_APP_HOST: '/dx2/',     // 本地环境数据迁移系统访问地址
    LABEL_SYSTEM_MICRO_APP_HOST: '/ls/', // 本地环境标签系统访问地址
    KINESISLINK_MICRO_APP_HOST: '/ksl/', // 本地环境监控系统访问地址
  },
});

生产环境配置打包配置:

// config/config.prod.ts  用于生产环境构建测试
export default defineConfig({
  define: {
    DATALINK_MICRO_APP_HOST: '/dlink/',  // 本地环境调度系统访问地址
    DATAX_MICRO_APP_HOST: '/dx2/',     // 本地环境数据迁移系统访问地址
    LABEL_SYSTEM_MICRO_APP_HOST: '/ls/', // 本地环境标签系统访问地址
    KINESISLINK_MICRO_APP_HOST: '/ksl/', // 本地环境监控系统访问地址
  },
});

然后,我们需要在微应用注册信息中,将我们加载微应用的地址换成我们配置的地址,代码实现如下:

// src/app.tsx

const microAppsOptions = [
  {
    name: 'datalink',
    entry: DATALINK_MICRO_APP_HOST,
    container: '#subapp-container',
    loader,
    activeRule: '/datalink',
    className: 'data-link-child-app',
  },
  {
    name: 'datax',
    entry: DATAX_MICRO_APP_HOST,
    container: '#subapp-container',
    loader,
    activeRule: '/datax',
    className: 'datax-child-app',
  },
  {
    name: 'subls',
    entry: LABEL_SYSTEM_MICRO_APP_HOST,
    container: '#subapp-container',
    loader,
    activeRule: '/subls',
    className: 'label-child-app',
  },
  {
    name: 'subksl',
    entry: KINESISLINK_MICRO_APP_HOST,
    container: '#subapp-container',
    loader,
    activeRule: '/subksl',
    className: 'kinesislink-child-app',
  },
];

最后,我们在 package.json 中,通过不同的命令区分不同环境,代码实现如下:

"scripts": {
// ....其他配置
// 生产环境打包命令
    "build": "cross-env REACT_APP_ENV=prod UMI_ENV=prod umi build",
// 测试环境打包命令
    "build:test": "cross-env REACT_APP_ENV=test UMI_ENV=test umi build",
// 生产环境打包命令
  "build:prod": "cross-env REACT_APP_ENV=prod UMI_ENV=prod umi build",
// ...其他配置
}

在配置完成后,我们在命令行运行如下命令,将主应用构建打包:

rm -f -r node_modules // 如果部署到真实环境,删除旧的依赖包

yarn install  // 或者 npm install

// 本地测试部署,用测试环境命令打包, 如果是生产环境打包,直接用yarn build 或者 npm run build
yarn build:test  // 或者 npm run build:test

在构建打包完成后,我们将构建好的 dist 目录移动到nginx配置根目录下的 html 目录下,并重命名为 main,目录结构如下(见下图)

如何将微前端项目部署在同一台服务器同一个端口下_微前端

到这里,我们的主应用就构建打包好了,接下来我们介绍各个微应用构建打包过程。

调度系统(dlink)微应用构建打包

进入项目目录,直接使用打包命令构建打包即可,在命令行运行:

rm -f -r node_modules  // 如果部署到真实环境,删除旧的依赖包

yarn install   // 或者 npm install

yarn build     // 或者 npm run build

在构建打包完成后,我们将构建好的 dist 目录移动到nginx配置目录下的 html 目录下,并重命名为 dlink ,目录结构如下(见下图)

如何将微前端项目部署在同一台服务器同一个端口下_微前端_02

数据迁移系统(datax)微应用构建打包

进入项目目录,直接使用打包命令构建打包即可,在命令行运行:

rm -f -r node_modules  // 如果部署到真实环境,删除旧的依赖包

yarn install   // 或者 npm install

yarn build     // 或者 npm run build

在构建打包完成后,我们将构建好的 dist 目录移动到nginx配置目录下的 html 目录下,并重命名名为dx2 ,目录结构如下(见下图)

如何将微前端项目部署在同一台服务器同一个端口下_服务器_03

标签系统微应用构建打包

进入项目目录,直接使用打包命令构建打包即可,在命令行运行:

rm -f -r node_modules  // 如果部署到真实环境,删除旧的依赖包

yarn install   // 或者 npm install

yarn build     // 或者 npm run build

在构建打包完成后,我们将构建好的 dist 目录移动到nginx配置目录下的 html 目录下,并重命名名为ls ,目录结构如下(见下图)

如何将微前端项目部署在同一台服务器同一个端口下_服务器_04

监控系统(kinesis-link)微应用构建打包

进入项目目录,直接使用打包命令构建打包即可,在命令行运行:

rm -f -r node_modules  // 如果部署到真实环境,删除旧的依赖包

yarn install   // 或者 npm install

yarn build     // 或者 npm run build

在构建打包完成后,我们将构建好的 dist 目录移动到nginx配置目录下的 html 目录下,并重命名名为ksl ,目录结构如下(见下图)

如何将微前端项目部署在同一台服务器同一个端口下_nginx_05

Nginx 服务器部署方案

在将我们的主应用和微应用全部打包完成后,我们将介绍如何使用 Nginx 完成微前端架构的部署。

Nginx 部署方案是可以作为生产方案使用的。

配置时有四点注意事项:

•搭建nginx服务之前,保证所用到的端口是空闲

•子应用和主应用配置在同一台服务器下的同一个端口下,主应用配置在根路径下/,子应用的配置路径需要主应用里配置的字应用的入口地址和子应用自身的根路径一致

•子应用和主应用所用到接口地址都需要在nginx 配置代理

•配置nginx软连接,将/etc/nginx/html/main/子应用访问路径 指向 /etc/nginx/html/子应用访问路径

配置nginx软连接方式:ln -s /etc/nginx/html/子应用访问路径 /etc/nginx/html/main/子应用访问路径

本地测试nginx服务配置如下:

nginx.conf

worker_processes  1;   # Nginx 进程数,一般设置为和 CPU 核数一样

events {
  worker_connections  1024;   # 每个进程允许最大并发数
}

error_log  /usr/local/etc/nginx/logs/error.log;
error_log  /usr/local/etc/nginx/logs/error.log  notice;
error_log  /usr/local/etc/nginx/logs/error.log  info;

http {
  include mime.types;   # 文件扩展名与类型映射表
  default_type application/octet-stream;   # 默认文件类型

  # nginx开启gzip服务
  gzip on;
  gzip_disable "msie6";
  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;
  gzip_buffers 16 8k;
  gzip_http_version 1.1;
  
  # 需要开启gzip的格式
  gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml 
    application/xml application/xml+rss text/javascript;
  
  server {
    set $root "/usr/local/etc/nginx/html/main";   # 设置静态文件目录的绝对路径,该变量根据个人的项目配置有所不同
    listen       8000;   # 配置监听的端口
    server_name  localhost;    # 配置的域名,目前是本地测试,所以直接使用 localhost
    include api.conf; #接口代理

    # location ~*\.(js|css|png|jpg|jpeg|gif|ico)$ {
    #     add_header Access-Control-Allow-Origin *;
    #     add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    #     add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';

    #     root   $root;
    #     expires 30d;
    # }
  
    location / {
      root   $root;  # 网站根目录,这里选用主应用构建后的文件目录
      index  index.html;   # 默认首页文件
      try_files  $uri $uri/ /index.html;   # 兼容 history 路由模式,找不到的文件直接重定向到 index.html 

      expires -1;                          # 首页一般没有强制缓存
      add_header Cache-Control no-cache;
    }

    location /dlink {
      root   $root;  # 网站根目录,这里选用主应用构建后的文件目录
      index  index.html;   # 默认首页文件
      try_files  $uri $uri/ /dlink/index.html;   # 兼容 history 路由模式,找不到的文件直接重定向到 index.html 

      expires -1;                          # 首页一般没有强制缓存
      add_header Cache-Control no-cache;
    }

    location /dx2 {
      root   $root;  # 网站根目录,这里选用主应用构建后的文件目录
      index  index.html;   # 默认首页文件
      try_files  $uri $uri/ /dx2/index.html;   # 兼容 history 路由模式,找不到的文件直接重定向到 index.html 

      expires -1;                          # 首页一般没有强制缓存
      add_header Cache-Control no-cache;
    }

    location /ls {
      root   $root;  # 网站根目录,这里选用主应用构建后的文件目录
      index  index.html;   # 默认首页文件
      try_files  $uri $uri/ /ls/index.html;   # 兼容 history 路由模式,找不到的文件直接重定向到 index.html 

      expires -1;                          # 首页一般没有强制缓存
      add_header Cache-Control no-cache;
    }

    location /ksl {
      root   $root;  # 网站根目录,这里选用主应用构建后的文件目录
      index  index.html;   # 默认首页文件
      try_files  $uri $uri/ /ksl/index.html;   # 兼容 history 路由模式,找不到的文件直接重定向到 index.html 

      expires -1;                          # 首页一般没有强制缓存
      add_header Cache-Control no-cache;
    }

  }
}

api.conf

location /api {
    proxy_pass http://xxxxxxxxx;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;
}

location /dolphinscheduler {
    proxy_pass http://xxxxxxxxx;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;
}

location /labelapi {
    proxy_pass http://xxxxxxxx;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;
    rewrite ^/labelapi/(.*)$ /api/$1 break; 
}

location /webhdfs {
    proxy_pass http://xxxxxxx;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;
}

location /ksapi {
    proxy_pass http://xxxxxxx;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;
    rewrite ^/ksapi/(.*)$ /api/$1 break; 
}

location /2.0 {
    proxy_pass http://xxxxxxx;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;
}

location /3.0 {
    proxy_pass http://xxxxxxx;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;
}

在配置完成后,我们需要重启一下 nginx 服务。

输入nginx启动命令启动nginx

在浏览器中访问主应用测试地址localhost:8000 ,登录后如下图:

如何将微前端项目部署在同一台服务器同一个端口下_nginx_06

在浏览器中访问调度系统(dlink)子应用测试地址 http://localhost:8000/dlink , 登录后如下图:

如何将微前端项目部署在同一台服务器同一个端口下_服务器_07

在浏览器中访问数据迁移系统(dx2)子应用测试地址 http://localhost:8000/dx2 , 登录后如下图:

如何将微前端项目部署在同一台服务器同一个端口下_nginx_08

在浏览器中访问标签管理系统(ls) 子应用测试地址:http://localhost:8000/ls ,登录后如下:

如何将微前端项目部署在同一台服务器同一个端口下_微前端_09

至此,nginx 服务部署大功告成!

扩展

如果需要把服务部署到真实服务器,只需要把所有的 localhost 都换成真实注册的域名即可,其他配置都可以复用!

标签:header,前端,端口,nginx,html,proxy,应用,服务器,打包
From: https://blog.51cto.com/u_15714439/6182718

相关文章

  • 让 Spartacus 服务器端渲染引入 long API 调用超时机制的两种配置方法
    两种方法,使用config.backend.timeout={浏览器:...,服务器:...},或者可以更具体地配置,即基于Request粒度,通过将HTTP_TIMEOUT_CONFIGHttpContextToken传递给AngularHttpClient的方法来针对每个具体请求进行配置。在SSR(Node.js)中,超时处理耗时过长的外部http调用是一项尤为重......
  • 如何解决更新WordPress需要访问您网页服务器的权限
    今天更新wordpress版本时网站后台提示“要执行请求的操作,WordPress需要访问您网页服务器的权限”,更新插件也提示,更新主题也提示。后来百度查询了一下,找到了解决办法,只需要找到wp-config.php这个文件,在最后面加上如下代码就能解决问题,至于是什么原因造成的并不清楚。define(“FS_......
  • 前端自动化测试之葵花宝典
    作者:京东零售杜兴文首先聊一下概念,Web前端自动化测试是一种通过编写代码来自动化执行Web应用程序的测试任务的方法,它通常使用JavaScript和测试框架(如Selenium、Appium等)来实现。Web前端自动化测试的优点是可以提高测试效率、减少测试时间和测试成本,并且可以确保测......
  • layui 框架收藏 - 前端篇
    1. layuimini     最简洁、清爽、易用的layui后台框架模板。layui页面的风格,分为iframe多tab版本和单页版。   主要特性界面足够简洁清爽,响应式且适配手机端。一个接口几行代码而已直接初始化整个框架,无需复杂操作。页面支持多配色方案,可自行选择喜欢的配色......
  • 前端_发起axios请求,前端无法获取response的全部header
    问题描述使用vueaxios向python+flask搭建的服务端发起请求,请求成功后,前端无法拿到服务端添加到header中的token。问题原因前后端分离,默认reponseheader只能取到以下信息Content-LanguageContent-TypeExpiresLast-ModifiedPragma解决方法要获取其他的headers信息......
  • web前端开发理论解析
    在Linux下,()命令是只查询系统内存的使用情况。A.topB.vmstatC.free-mD.iostatC.`free-m`命令是用来查询Linux系统内存使用情况的命令,它会显示空闲内存、已使用内存、缓存等信息。而`top`、`vmstat`和`iostat`命令则不仅可以查询内存使用情况,还能查看CPU、磁盘和网......
  • Docker介绍下载安装、制作镜像及容器、做目录映射、做端口映射
    在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物......
  • ssh的基础使用与端口转发
    基础使用基本连接SSH基本的连接命令是:sshusername@hostname这里牵扯到了两台主机执行命令、运行SSH客户端的主机,我们称为本地主机A【HostA】;接收连接请求、运行SSH服务器的主机,我们称为远程主机B【HostB】。通过密码或密钥等方式验证后,SSH连接建立,主机A可以使用命令......
  • 面试官:服务器最大可以创建多少个tcp连接以及端口并解释下你对文件句柄的理解
    转载请注明出处:1.最大可以创建多少个tcp连接服务器最大可以创建多少个TCP连接取决于多个因素,例如服务器的硬件配置、网络带宽、操作系统设置等。一般来说,现代服务器的硬件资源和网络带宽都比较充足,因此可以创建大量的TCP连接。然而,服务器在创建TCP连接时也会有一些限制......
  • FTP下载远程服务器乱码文件夹以及文件夹下文件
    问题描述:需要读取远程服务器文件,但是远程服务器文件所在目录存在乱码,导致无法进入文件所在目录读取文件!实现思路:通过FTP下载并转码到本地服务器之后,解决掉乱码问题之后再读取文件夹下的文件。 packagecom.guli.edu.FTPDown;importcom.guli.edu.excel.ExcelUtils02;impor......