
サーバー上の静的アセットのリクエストに認証チェックを追加する最善の方法を模索しています。
私は Apache2.4 と PHP/Laravel を実行しています。これらは、 から直接静的コンテンツを提供することで実行されDocumentRoot
、 で入力されてindex.php
動的ルートを処理します。
検索していくつかのオプションを見つけましたが、ベストプラクティスと最も効率的なものについてのコンセンサスが何であるかはわかりません。
1) Apache で ActionHandler を作成して設定し、CGI スクリプトを呼び出して静的コンテンツを提供します。このスクリプトは、リクエストごとに DB 接続を開き、アクセス制御権限をチェックして、301 を返すか、コンテンツを提供します。これに関する私の考えでは、リクエストごとに新しい DB 接続を開くため、パフォーマンスに大きな影響が出ると思われます。
以下を追加してみました:
Action serve-static /var/www/file-server.py
AddHandler serve-static .js .css
ブロックに追加し<Directory>
ましたが、すべての CSS/JS が 404 を返すようになりました。
2) と の組み合わせを使用してmod_rewrite
、mod_proxy
静的ファイルに対するすべてのリクエストを、すでにオープンな DB 接続を持つ別のアプリケーション サーバー (または複数のサーバーに負荷分散) にプロキシし、認証チェックを実行して、ファイルを適切に返します。このアプローチに関して私が懸念しているのは、Apache がクライアントへのダウンリンクのボトルネックになる可能性があるのではないかということです。
<Directory /var/www/html/app/public>
アプリケーション全体を含んだブロックから始めます
mod_rewrite
私はとにあまり詳しくないので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 の認証モジュールそれをロックダウンします。DB 接続 (mod_authn_dbd および mod_authz_dbm を意味する) を意味し、データベースにモジュールによってサポートされるパスワード ハッシュが必要です。
最終的にはキャッシュが必要になりますが、ドキュメントごとに複数のDBクエリを実行するとパフォーマンスが低下します。Apacheの実装はmod_authn_socacheまた、共有オブジェクト キャッシュに認証情報を詰め込むことができ、共有メモリ、memcached などでバックアップできます。
同様のキャッシュを Web アプリのフレームワークで実行できます。これは Web サーバーを構成するよりも開発作業が多いため、読者にとっては練習になります。