Кэширование файла PHP-запроса в серверной среде с балансировкой нагрузки
Я ищу написать основной драйвер кэширования файлов PHP в приложении PHP, которое направляет весь трафик на фронт-контроллер. Для примера предположим следующую упрощенную настройку с использованием apache mod_proxy_balancer:
В среде с одним сервером я бы кэшировал ответы на запросы на диске в структуре каталогов, соответствующей URI запроса. Затем простые правила перезаписи apache, подобные приведенным ниже, могут позволить apache возвращать статические файлы кэша (если они существуют) и вообще избегать процесса PHP:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /front_controller.php [L]
Очевидно, что это проблематично в среде с балансировкой нагрузки, поскольку файл кэша будет записываться только на диск на конкретном PHP-сервере, где обрабатывался запрос и результаты кэшировались.
Решение проблемы...
Итак, чтобы решить эту проблему, я подумал, что могу выбить некоторый код, чтобы отдельные внутренние PHP-серверы записывали / удаляли данные кэша в балансировщик нагрузки. Однако, поскольку я в основном не осведомлен о возможностях mod_proxy_balancer (и о любых других опциях балансировки нагрузки), мне нужна некоторая внешняя проверка для следующих вопросов:
И вопросы...
- Можно ли выполнить какую-либо форму проверки, например, описанную выше, в RewriteRules, чтобы балансировщик нагрузки, обращенный вперед, обслуживал статический файл перед отправкой запросов на один из внутренних серверов?
- Это даже желательно? Следует ли разрешать балансировщику нагрузки только для маршрутизации трафика и не беспокоиться о предоставлении статического контента?
- Было бы лучше просто использовать приемлемый TTL для кэшированных файлов на уровне сервера PHP и иметь дело с принятым уровнем перекрытия устаревшего кэша?
Наконец, извинения, если это слишком широко или уже был дан ответ; Я не совсем уверен, что искать в результате моего вышеупомянутого невежества на тему балансировки нагрузки.
2 ответа
Для простейшего решения вы можете использовать NFS. Смонтируйте файловую систему через NFS на всех серверах PHP, и она действует как локальное хранилище, но одинакова для всех серверов. Чтобы стать немного сложнее, используйте что-то вроде Nginx или Varnish, которые могут кэшировать то, что находится в файловой системе NFS.
Использование memcache также является жизнеспособной альтернативой - системой хранения на основе распределенной памяти. Хорошая вещь в memcache заключается в том, что вам не нужно управлять очисткой или очисткой кэша, если вы этого не хотите. Вы можете установить TTL для каждого кэшируемого элемента, или, если memcache заполняется, он автоматически удаляет кэшированные элементы.
Это звучит как то, что Nginx может легко сделать, и избавит от необходимости записи в файлы на диске.
Nginx может выполнять балансировку нагрузки и кэширование, вот руководство по нему:
http://nathanvangheem.com/news/nginx-with-built-in-load-balancing-and-caching