В нескольких словах, решение, вообще говоря, заключается в следующем:
- Есть несколько серверов PHP
- Иметь другой сервер балансировки нагрузки перед
- Если у вас есть 3 PHP-сервера, то этот балансировщик нагрузки будет отправлять 33% запросов, которые он получает на каждом PHP-сервере.
Сервер балансировки нагрузки может быть специализированным оборудованием; или обратный прокси-сервер, используя Apache (см., например, mod_proxy_balancer
) , nginx (см., например, Балансировка нагрузки с помощью Nginx ) , лак, ...
Наиболее важные проблемы, с которыми вы обычно сталкиваетесь при использовании нескольких серверов PHP вместо серверов, связаны с файловой системой: при наличии нескольких серверов каждый сервер имеет свои собственные диски и файловую систему.
Например, если пользователь случайно сбалансирован на сервере 1 для одной страницы и на сервере 2 для другой страницы, вы не можете использовать файловые сеансы: сеанс будет создан на сервере 1, но не будет найден на сервере 2, позже.
В этом конкретном случае вам придется использовать другой механизм для хранения сеансов - хранить их в базе данных или, например, в memcached.
То же самое с изображениями (загруженные пользователями, например) : вам придется либо:
- Синхронизируйте их между серверами
- Или используйте какой-нибудь сетевой диск
Редактировать после комментария: Для развертывания с несколькими серверами я обычно делаю то же самое, что и с одним сервером.
Для получения дополнительной информации о типе процесса, который я часто использую, вы можете взглянуть на ответ, который я давал некоторое время назад на этот вопрос: Обновление веб-приложения без простоев .
Объяснение, приведенное здесь, для одного сервера, но сделать то же самое на нескольких серверах вы можете:
- Загрузить архив на каждый из ваших серверов
- Извлеките его
- И почти в одно и то же время переключите символическую ссылку на все серверы.
- В худшем случае, у вас будет 2 или 3 секунды задержки между каждым сервером, что означает 10 секунд, если у вас есть 5 серверов? Это, вероятно, не большая проблема: -)
(я сделал это с 7 серверами для одного приложения, и у меня никогда не было проблем)