架構

最後更新

本頁以一張概覽圖說明 node-image-server 各層的關係與職責。

系統概覽

graph TB
    Client[用戶端] --> Worker[Cloudflare Worker<br>worker/index.js]
    Client --> Nginx[Nginx<br>config/nginx/nodejs.conf]
    Worker --> Nginx
    Nginx -->|/c/img/| App[Express cluster<br>app/app.ts]
    Nginx -->|/upload/ · /del/ · /| App
    App --> MW[Middlewares<br>app/src/middlewares]
    MW --> Router[Router<br>app/src/router]
    Router --> GET[GetFromPath<br>sharp]
    Router --> POST[PostToPath<br>multer]
    Router --> DEL[DeleteFromPath]
    GET --> Upload[(storage/image/upload)]
    GET --> Cache[(storage/image/cache)]
    POST --> Upload
    DEL --> Trash[(upload/.trash/YYYY-MM-DD)]

分層

層 位置 職責
CDN worker/index.js 以 URL+query string 為快取鍵快取 7 天,未命中時轉發至來源
反向代理 config/nginx/nodejs.conf /c/img/ 的 proxy_cache、安全標頭、拒絕 dotfile、限制 HTTP 方法與上傳大小
程序管理 app/app.json、app/app.ts PM2 以 ts-node 載入;主程序 fork worker 並在退出時補位
中介層 app/src/middlewares/ 解析、CORS、請求日誌、HTML 壓縮、拒絕無 User-Agent 的請求
路由 app/src/router/ 依 HTTP 方法分派至 GET/POST/DELETE 子路由
處理器 GetFromPath、PostToPath、DeleteFromPath 轉檔與快取、上傳、搬入垃圾桶
儲存 app/storage/image/ upload/ 原檔、cache/ 轉檔結果、upload/.trash/ 刪除項目

跨切原則

原則 實作
只處理一次 轉檔結果寫成快取檔,邊緣層再各自快取
不實體刪除 刪除一律 renameSync 搬入當日垃圾桶
不放大圖片 所有尺寸參數以原圖尺寸為上限

延伸閱讀

EN