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

如何,前端,项目,部署,同一,服务器,同一个,端口 · 浏览次数 : 94

小编点评

# Nginx 服务器部署方案 ## 配置步骤 1. 输入nginx启动命令启动nginx在浏览器中访问主应用测试地址localhost:8000 ,登录后如下图: ``` # 输入登录密码 # ... ``` 2. 输入nginx启动命令启动nginx在浏览器中访问调度系统(dlink)子应用测试地址 http://localhost:8000/dlink ,登录后如下图: ``` # 输入登录密码 # ... ``` 3. 输入nginx启动命令启动nginx在浏览器中访问数据迁移系统(dx2)子应用测试地址 http://localhost:8000/dx2 ,登录后如下图: ``` # 输入登录密码 # ... ``` 4. 输入nginx启动命令启动nginx在浏览器中访问标签管理系统(ls)子应用测试地址:http://localhost:8000/ls ,登录后如下: ``` # 输入登录密码 # ... ``` 5. 输入nginx启动命令启动nginx在浏览器中访问标签管理系统(ls)子应用测试地址:http://localhost:8000/ls ,登录后如下: ``` # 输入登录密码 # ... ``` 6. 至此,nginx 服务部署大功告成!扩展如果需要把服务部署到真实服务器,只需要把所有的 localhost 都换成真实注册的域名即可,其他配置都可以复用!

正文

作者:京东科技 高飞

前言

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

部署顺序

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

部署分支

线上环境部署统一用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 ,目录结构如下(见下图)

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

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

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

yarn install   // 或者 npm install

yarn build     // 或者 npm run build


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

标签系统微应用构建打包

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

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

yarn install   // 或者 npm install

yarn build     // 或者 npm run build


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

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

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

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

yarn install   // 或者 npm install

yarn build     // 或者 npm run build


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

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 ,登录后如下图:

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

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

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

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

扩展

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

与如何将微前端项目部署在同一台服务器同一个端口下相似的内容:

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

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

你想要的【微前端】都在这里了!

某次遇到一个从0到1的大型项目,该项目涉及两个端,除了鉴权和部分业务逻辑不同外,页面UI和其余逻辑几乎一致,遇到这种项目,该如何架构?既能保证项目顺利开发完成,又能保证后期的迭代、维护、可扩展?

中台框架模块开发实践-代码生成器的添加及使用

前言 之前已经分享过几篇关于中台项目框架的文章,相关介绍就不再赘述 所谓工欲善其事必先利其器,一个项目拥有一个代码生成器是很有必要的,能够大大的节省时间,减少手误,提供开发效率(ps:特别小团队搞微服务但是没有代码生成器,简直要了老命) 本文将分享如何在中台框架项目 Admin.Core 中添加代码

Vue微前端架构与Qiankun实践理论指南

这篇文章介绍了微前端架构概念,聚焦于如何在Vue.js项目中应用Qiankun框架实现模块化和组件化,以达到高效开发和维护的目的。讨论了Qiankun的原理、如何设置主应用与子应用的通信,以及如何解决跨域问题和优化集成过程,从而实现前端应用的灵活扩展与组织。

运行在容器中Postgres数据库数据损坏后如何恢复?

前言 在使用 K8S 部署 RSS 全套自托管解决方案- RssHub + Tiny Tiny Rss, 我介绍了将 RssHub + Tiny Tiny RSS 部署到 K8s 集群中的方案. 其中 TTRSS 会用到 Postgres 存储数据, 也一并部署到 K8s 容器中. 但是最近, 由于

国庆期间“头像+国旗”玩法是如何实现的?

前言 随着一年一度的国庆假期越来越近,身边的国庆氛围也越来越重,很多人也开始换上了渐变国旗头像,提前为祖国母亲庆生。那每年都很火的渐变国旗头像要如何制作呢?其实一点也不难!接下来就分享一种渐变国旗头像生成方法。 制作原理 上传原始微信或其他头像,将头像的Image对象用Graphics创建返回GDI

使用K8S进行蓝绿部署的简明实操指南

在之前的应用部署系列文章里,我们已经介绍过什么是蓝绿部署。如需回顾,点击下方文章链接即可重温。本文我们将会介绍如何使用 Kubernetes 实现蓝绿部署。 应用部署初探:3个主要阶段、4种常见模式 应用部署初探:微服务的3大部署模式 应用部署初探:6个保障安全的最佳实践 前期准备: Kuberne

Caddy-用Go写的新一代可扩展WebServer

前几天用 Netmaker 的时候发现它用 Caddy 替换掉了 Nginx,用了后发现确实简单好用,就安利一下。 Caddy 是一个强大的、可扩展的平台,用 Go 编写,可以为你的站点、服务和应用程序提供服务。如果你是 Caddy 的新手,你服务网络的方式将会改变。 引言 大多数人使用 Caddy

Postgresql使用触发器实现同步插入两张表

在有一个陈旧的系统的情况下,如果升级API可以优先使用微服务的形式,将数据库进行独立拆分,将原来的数据库原原本本地固定在旧系统中,然后在独立的微服务中运行与部署新系统。 如果原有的数据需要在更换结构的前提下在不同的版本的系统下进行共享,那可以使用数据库的卷影复制等功能。如果两个数据表的结构不完全一样

微前端框架single-spa子应用加载解析

本文主要通过对微前端框架single-spa的基座应用加载子应用的single-spa-vue函数库进行分析,通过代码维度分析让大家了解在single-spa加载子应用的时候都做了哪些事情。如何通过优化single-spa-vue函数库保持子应用的状态。