Зачем это нужно?
Долгое время все проекты нашей компании работали на PHP5, и вот возникло желание их ускорить путём перехода на PHP7, попутно обновиви всё окружение, необходимое для работы. Сразу возник вопрос: «Как заставить разные проекты работать на разных версиях PHP?»
Что пришло в голову:
- Содержать 2 разных сервера
- Использовать виртуальную машину
- Применить Docker
Вариант 1, очевидно экономически не выгоден. Вариант 2 мы посчитали сложным в настройке и слишком ресурсоёмким. С этим многие, наверное, не согласятся, однако, мы приняли решение использовать технологию Docker, ввиду её легковесности и простоты переноса приложений. Главным критерием выбора стало то, что Docker решает проблему «works on my machine».
Подбор окружения
Из СУБД выбрали Maria DB, так как во всех наших проектах важно быстрое чтение данных, необходимости одновременной записи данных нет.
Решили использовать связку Apache2 + Nginx, где Nginx обслуживает статические файлы а Apache2 берёт ответственность за динамику.
В будущем, в систему легко добавить, при необходимости, такие вещи как Redis, Memcached и т.п.
Структура окружения
Все наши проекты имеют копии на боевом сервере, используемые для тестирования изменений перед релизом. Поэтому мы условно разделили окружение на 2 части: demo и prod
Каждая из частей иммеют собственный контейнер с б/д. Т.е. базы данных demo и prod разделены. Так же demo и prod и включают в себя котейнер с PHP5 и контейнер с PHP7.
Во главе всего стоит Nginx proxy, направляя запросы именнно в тот контейнер который указан в конфигурационном файле. Это даёт возможность легко переключать версии PHP, просто перенаправив запрос в требуемый контейнер, так как файлы проектов доступны в каждом из них. Разница лишь в том, в какой среде они исполняются.
Пример конфигурации сайта для Nginx proxy:
server {
listen 80;
server_name example.ru www.example.ru;
location / {
proxy_pass http://demo_php7_web;
}
}
Наглядно рассмотреть структуру системы можно на схеме:
Оптимизация системы
Большинство наших проектов работают на платформе 1С-Битрикс, поэтому мы настроили Apache2 и Nginx с учётом требований скипта bitrix_server_test, предоставляемого компанией 1С-Битрикс.
В контейнеры с веб-серверами установлены все необходимые расширения PHP, а также curl, rsyslog, htop, xvfb, libfontconfig, wkhtmltopdf, jpegoptim, optipng. Кроме того, настроено серверное сжатие файлов.
Особенности
- На кроне стоит проверка конфигурационных файлов Apache2 и Nginx на изменение, с периодичностью 1 минута. Нет необходимости заходить в контейнер чтобы сделать reload после изменения настроек.
- Контейнеры в веб-сервером имееют пользователя developer, от имени которого выполняются Apache2, Cron и Nginx
- Поддерживается SSL, описание по настройке дано в примерах конфигурационных файлов
Использование
В настоящее время данная система, в которой запущено более 30 проектов, исправно работает на нашем сервере.
Проект доступен на GitHub. Там же приведено более подробное описание файловой структуры проекта и описано как начать работу.
Автор: serkyron