minio+ nginx rewrite 實現saas租戶的個性化管理


這個是一個基於minio+nginx的rewrite 實現的一個功能(類似micro frontend 模式)

參考架構

  • 一張架構圖

 

 

 

  • 說明
    因為當前大家主流的還是基於前后端分離的模式開發軟件,組件+api 實現功能,但是很多時候好多租戶對於功能有個性化需求,但是
    系統在設計的時候因為時間問題+早期設計問題造成業務擴展能力有點差,還需要支持個性化需求開發,所以我們可以拆分標准版本
    以及自定型版本,同時基於minio 提供的s3 管理模式,對於不同的租戶創建不同的bucket,標准的使用標准版,這樣客戶化開發就很簡單
    了(特殊場景需要個性化),此方案的缺點也比較明確:空間的占用,但是還好因為前后端分離的模式。每個租戶占用的靜態資源也不是
    很大,核心問題是在系統更新的時候,我們可能需要引導客戶自己升級或者基於強大的ci/cd 系統進行所有租戶的系統升級(構建包的處理)
    個人感覺好處也是很明顯的,如果我們的api 以及website 已經做了比較好的版本管理,用戶切換版本也就是靜態資源的替換(直接基於s3 bucket)。
    saas 應用的功能主要基於單頁面的模式開發的應用,在s3 中的存儲就是css,js 以及靜態html 頁面。這樣管理起來也是比較靈活的

環境准備

  • docker-compose 文件
 
version: "3"
services: 
  minio: 
    image: minio/minio
    command: server /data
    volumes: 
    - "./data:/data"
    ports: 
    - "9000:9000"
    environment:
      - "MINIO_ACCESS_KEY=minio"
      - "MINIO_SECRET_KEY=minio123"
  api:
    image: openresty/openresty:alpine
    volumes:
    - "./nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf"
    - "./demoapps:/opt/demoapps"
    ports:
    - "80:80"
    - "8080:8080"
  • nginx 配置
worker_processes  1;
user root;  
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    gzip  on;
    rewrite_log on;
    real_ip_header     X-Forwarded-For;
    server {
       listen 80;
       charset utf-8;
       default_type text/html;
       location / {
            root /opt/demoapps/;
            index index.html index.htm index;
            # 不同規則的重寫(比如固定的幾個),注意last 與break 的區別,此處前綴使用了demo
            rewrite ^(.*?)(.html)?\/(\d+)$ /demo$3$1.html last;
            # rewrite ^(.*?)(.html)?\/2$ /demo2$1 last;
       }
       error_page 404 /404.html;
       # 不存在默認界面
       location = /404.html {
            root /opt/demoapps/;
       }
       location =/favicon.ico {
            root /opt/demoapps/;
       }
      # 基於nginx proxy minio 數據
       location ~* ^/demo {
           internal;
           proxy_set_header Host $http_host;
           proxy_set_header X-Forwarded-For $remote_addr;
           client_body_buffer_size 10M;
           client_max_body_size 10G;
           proxy_buffers 1024 4k;
           default_type text/html;
           index index.html index.htm index;
           proxy_read_timeout 300;
           proxy_next_upstream error timeout http_404;
           proxy_pass http://minio:9000;
       }
    }
}
 

nginx 配說明:
主要是參考上邊的架構圖,使用rewrite 基於正則解析請求,然后進行重寫,同時對於用戶的數據基於proxy 代理,為了安全使用了internal 模式

  • 啟動服務
 
docker-compose up -d
  • 創建租戶的website 數據

使用了前綴以及id 的格式,如下,具體html 代碼參考github https://github.com/rongfengliang/openresty_rewrite_static/tree/minio
注意需要配置bucket 的權限為* read only

 

 

效果

  • 訪問

租戶1首頁應用:
首頁

 

 


租戶1另外一個應用:

 

 


租戶2的首頁應用

 

 

說明

以上是一個minio+nginx rewrite 實現的一種多租戶個性化開發的實踐,希望對大家有用

參考資料

https://github.com/rongfengliang/openresty_rewrite_static/tree/minio


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM