
Я пытаюсь найти наилучший способ добавить проверку подлинности к запросам статических ресурсов на моем сервере.
Я использую Apache2.4 и PHP/Laravel, которые работают, обслуживая статический контент непосредственно из DocumentRoot
и входя в index.php
для обработки динамических маршрутов.
Я искал и нашел несколько вариантов, но не уверен, какой консенсус будет достигнут относительно лучших практик и наиболее эффективных:
1) Создайте и установите ActionHandler в Apache для вызова скрипта CGI для обслуживания статического контента. Этот скрипт будет открывать соединение с БД для каждого запроса, проверять права доступа и возвращать 301 или обслуживать контент. Я думаю, что производительность сильно снизится из-за открытия нового соединения с БД для каждого запроса.
Я попытался добавить:
Action serve-static /var/www/file-server.py
AddHandler serve-static .js .css
к <Directory>
блоку, но это привело к тому, что все css/js возвращали 404.
2) Используйте комбинацию mod_rewrite
и mod_proxy
для проксирования всех запросов на статические файлы на другой сервер приложений (или балансировки нагрузки на несколько), который уже будет иметь открытое соединение с БД, выполните проверку подлинности и соответствующим образом обработайте файл. Меня беспокоит этот подход, что 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
Если статический контент уже находится на веб-сервере, начните с простого. Пропустите (пока) скрипт CGI, прокси, перезапись URL и кэширование.
В директиве Directory для static используйтеМодули аутентификации httpdчтобы заблокировать это. Вы подразумеваете подключение к БД, что означает mod_authn_dbd и mod_authz_dbm, и требуете, чтобы ваша база данных имела хэши паролей, поддерживаемые модулями.
В конце концов вам понадобится кэширование, многократные запросы к базе данных на документ не работают хорошо. Реализация Apachemod_authn_socacheи он может помещать аутентификации в свой общий кэш объектов, который может поддерживаться общей памятью, memcached и т. д.
Вы могли бы сделать подобное кэширование в рамках вашего веб-приложения. Это упражнение для читателя, поскольку это больше разработка, чем настройка веб-сервера.