
我正在嘗試找出向伺服器上的靜態資產請求添加身份驗證檢查的最佳方法。
我正在運行 Apache2.4 和 PHP/Laravel,它透過直接從 提供靜態內容來運行,DocumentRoot
並在 處輸入index.php
來處理動態路由。
我一直在搜尋並找到了幾個選項,但我不確定關於最佳實踐和最有效的共識是什麼:
1) 在 Apache 中建立並設定 ActionHandler 以呼叫 CGI 腳本來提供靜態內容。該腳本將為每個請求打開一個資料庫連接,檢查訪問控制權限,並返回 301 或提供內容。我對此的想法是,由於為每個請求打開一個新的資料庫連接,效能將受到巨大影響。
我嘗試添加:
Action serve-static /var/www/file-server.py
AddHandler serve-static .js .css
到<Directory>
區塊,但這導致所有 css/js 返回 404。
mod_rewrite
2) 使用和的組合mod_proxy
將靜態文件的所有請求代理到另一個已經具有打開的資料庫連接的應用程式伺服器(或負載平衡到多個),執行身份驗證檢查並適當地返回文件。我對這種方法的擔憂是,我認為 Apache 可能會成為返回客戶端的下行鏈路的瓶頸?
<Directory /var/www/html/app/public>
我從包含整個應用程式的區塊開始
我不太熟悉mod_rewrite
and mod_proxy
,所以我想我可以創建類似的東西
<Directory /var/www/html/app/public/static>
RewriteEngine on
RewriteRule "(.*)$" "http://fileserver/$1" [P]
ProxyPassReverse "/public/static" "http://fileserver/"
</Directory>
但我無法讓它代理對文件伺服器層的請求,甚至無法測試效率。
任何見解這裡將不勝感激!
答案1
如果靜態內容已在 Web 伺服器上,則從簡單開始。 (暫時)跳過 CGI 腳本、代理、URL 重寫和快取。
在靜態目錄指令中,使用httpd 的身份驗證模組鎖定它。您暗示資料庫連接,這意味著 mod_authn_dbd 和 mod_authz_dbm,並要求您的資料庫具有模組支援的密碼雜湊。
您最終會需要緩存,每個文件的多個資料庫查詢效能不佳。 Apache 的實作是mod_authn_socache,並且它可以將身份驗證填充到其共享物件快取中,該快取可以由共享記憶體、memcached 等支援。
您可以在 Web 應用程式的框架中執行類似的快取。這是對讀者的練習,因為它比配置 Web 伺服器更多的是開發。