Зачем это нужно?


Долгое время все проекты нашей компании работали на PHP5, и вот возникло желание их ускорить путём перехода на PHP7, попутно обновиви всё окружение, необходимое для работы. Сразу возник вопрос: «Как заставить разные проекты работать на разных версиях PHP?»

Что пришло в голову:

  1. Содержать 2 разных сервера
  2. Использовать виртуальную машину
  3. Применить 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;
	}
}

Наглядно рассмотреть структуру системы можно на схеме:

image

Оптимизация системы


Большинство наших проектов работают на платформе 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. Там же приведено более подробное описание файловой структуры проекта и описано как начать работу.

Комментарии (8)


  1. Vamp
    15.03.2018 20:16

    А где Dockerfile образа serkyron/apache2-nginx-php7.0 и прочих версий?


    1. serkyron Автор
      17.03.2018 14:48

      Я сохранил их, вы правы, я добавлю их в репозиторий.


  1. skymal4ik
    15.03.2018 21:07

    Как вариант, можно было благодаря php-fpm держать на одном сервере несколько версий php. И для каждого виртуального сайта использовать разные сокеты для разных fpm.

    У нас так на одном nginx десяток сайтов с разными версиями php5/7.


    1. serkyron Автор
      17.03.2018 14:46

      Спасибо, действительно это удобно. Но ведь чтобы иметь поддержку .htaccess другого выхода нет?


  1. Andrey_Perelygin
    16.03.2018 11:10

    Могу вам посоветовать в качестве прокси-сервера взять dockercloud/haproxy. Очень хорошо работает в swarm режиме.
    Основная фишка — автоматическое обновление конфига в случае если один из сервисов перезапустился: вшитые в образ скрипты мониторят состояние связанных с ним сервисов обращаясь напрямую к сокету docker. Следовательно вам не нужно будет держать cron, который отслеживает подобные события. Nginx нечто подобное умеет, но в версии Plus, которая стоит денег. Сам использую этот образ в проектах, использующих SOA дизайн.


    1. serkyron Автор
      17.03.2018 14:49

      Спасибо, приму к сведению.


  1. vitaly_keng
    17.03.2018 14:34

    Apache тут нужен только для .htaccess файлов? В чем его преимущество перед связкой nginx + php_fpm?


    1. serkyron Автор
      17.03.2018 14:36

      Да. Других преимуществ нет, связка nginx + php_fpm обладает лучшими показателями.