自己架設圖床聽起來很簡單,不就是找個主機、裝個程式、把圖片丟上去嘛,但實際踩過坑的人都知道,魔鬼全藏在細節裡。尤其是當你打算長期使用、甚至開放給別人上傳時,很多環節稍不注意,不是圖片載入慢到讓人抓狂,就是儲存成本莫名暴增,更別提那些遊走在灰色地帶的內容風險了。我曾經幫社群架過一個小圖床,一開始也是興沖沖地用開源程式搭起來,結果沒幾天就被濫用上傳了一堆違規圖片,差點把主機商帳號都給停掉,那之後才開始認真研究「自製圖床到底該注意什麼」。
儲存位置的選擇比你想像中更關鍵
很多人直覺會把圖片存在網站主機的硬碟裡,這在流量極小的時候勉強可行,但只要同時閱覽的人一多,伺服器的 I/O 和頻寬很快就會瓶頸。比較穩妥的做法是把儲存層剝離出來,接上物件儲存服務。目前主流的自架圖床程式多半都支援阿里雲 OSS、騰訊雲 COS、AWS S3,或是透過 S3 兼容協定去對接 MinIO、Cloudflare R2、Backblaze B2 這些平台。我自己後來偏好用 Cloudflare R2,因為它沒有流出流量費用,對於圖片這種「讀取遠多於寫入」的場景來說,成本控制非常有感。不過有一點要特別留意:如果選擇 S3 兼容儲存,Endpoint 和 Region 的填寫必須完全正確,而且 CORS 規則要設定好,否則瀏覽器直傳功能會直接報錯,用戶上傳到一半就卡住,體驗很差。
上傳安全和內容審核不能賭運氣
一旦圖床開放公開上傳,就等於把一個免費的檔案託管窗口送給陌生人。你永遠不知道下一秒上傳的會是正常的螢幕截圖,還是盜版資源、成人內容,甚至是惡意腳本偽裝成的圖片。現在比較完善的圖床程式都有內建圖片違規檢測功能,通常會串接第三方 API 去做自動化掃描,這筆錢千萬不要省。除此之外,後台的使用者權限管理也很重要,像我之前用的那套二開系統,可以區分普通用戶和高級用戶,還能針對單一用戶設定每日上傳數量、檔案大小上限和權限有效期,這樣就算帳號被濫用,損害也能控制在一個範圍內,不至於整台機器被拖垮。
效能與成本之間的平衡是長期功課
圖片外鏈最怕的就是打開網頁時,圖片像拼圖一樣一格一格慢慢出現。要避免這種情況,CDN 幾乎是必備的,但如果你用的物件儲存本身就自帶 CDN 能力(例如 Cloudflare R2 搭配 Cloudflare CDN),那設定上會省事很多。另外,有些圖床程式支援「簽名下載」和「斷點下載」,這對於大檔案的分享很有幫助,但要注意簽名產生的下載鏈接會綁定 Endpoint 域名,不能事後自己隨意替換成自訂網域,否則簽名校驗會失敗,這點在調試時很容易被忽略。還有一個小細節是,如果允許使用者線上編輯文字類檔案(像 .md、.json、.html 這些),務必要限制可編輯的副檔名白名單,並且做好權限隔離,免得被人拿來當作免費的程式碼編輯器,甚至植入奇怪的東西。
總之,自製圖床要穩定、安全又不燒錢,關鍵就在於「儲存分離、上傳審核、權限控管、CDN 加速」這幾個環節有沒有認真規劃。把這些地基打好,後續不管是要當作個人圖床、團隊素材庫,還是對外服務,才不會三不五時就得忙著救火。

評論(13)
用 Cloudflare R2 真的省心,流量不用钱,搭配自家 CDN 速度也稳
CORS 规则设定那边我踩过好几次坑,只要 endpoint 写错就是一片红
我之前用 MinIO 自建存储,跟 S3 协议兼容性还不错,但维护还是有点麻烦
违规内容审核的 API 费用大概多少?怕小图床撑不住这笔开销
开放上传真的心脏要够大,我朋友就是没设审核,一天就被塞爆盗版图
使用者权限管理那里能详细讲讲吗?我目前是全部开放,有点怕
图片压缩也很重要,客户端的压缩能省很多带宽,上传前先压一下
签名下载绑定 endpoint 域名这点容易忽略,我之前换域名签名全失效
加了 CDN 速度确实好很多,但要是流量爆了额外费用会不会也很惊人
现在比较稳定的开源图床程序有哪些推荐?想从零开始搭一个
个人用不开放上传的话,是不是直接放主机硬盘加个 nginx 就够了
热链接防盗一定要设,不然被人外链直接拖垮服务器
看到这篇才发现自己当初少设了审核,庆幸还没出事,赶紧补上