minio+ nginx rewrite 實現saas租戶的個性化管理
阿新 • • 發佈:2020-07-18
這個是一個基於minio+nginx的rewrite 實現的一個功能(類似micro frontend 模式)
參考架構
- 一張架構圖
- 說明
因為當前大家主流的還是基於前後端分離的模式開發軟體,元件+api 實現功能,但是很多時候好多租戶對於功能有個性化需求,但是
系統在設計的時候因為時間問題+早期設計問題造成業務擴充套件能力有點差,還需要支援個性化需求開發,所以我們可以拆分標準版本
以及自定型版本,同時基於minio 提供的s3 管理模式,對於不同的租戶建立不同的bucket,標準的使用標準版,這樣客戶化開發就很簡單
了(特殊場景需要個性化),此方案的缺點也比較明確:空間的佔用,但是還好因為前後端分離的模式。每個租戶佔用的靜態資源也不是
個人感覺好處也是很明顯的,如果我們的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