Как мы переводили сервер на php 7

    php 7 вышел почти год назад, на носу уже версия 7.1, которая находится в стадии релиз кандидата. Интернет полон положительных отзывов, что же — пора использовать его в продакшене. Об опыте переезда на него боевого сервера с тридцатью проектами и пойдет речь в этой статье.

    Седьмая версия открывает нам много новых возможностей, но основным убийственным нововведением php7, я считаю, увеличение производительности и уменьшение потребления памяти. Во внутренних проектах мы его давно попробовали, убедились, что он дает прирост не только в синтетических тестах, было принято решение переводить на него весь продакшен.

    Сервер и проекты


    Наш продакшен сервер — это сервер от HP с четырех-ядерным процессором Xeon X3430 на 2.40GHz и 16GB оперативной памяти. На сервере хостится около 30-ти сайтов, около половины из них — это средние интернет магазины, на 10-20 тыс. товаров с посещаемостью около 1-2 тыс. уникальных посетителей в сутки. Все проекты написаны на yii framework 1.1 разных версий, начиная от 14-й и до 17. Все работает на связке nginx-php-fpm.

    Переезд мы затеяли не от хорошей жизни. Серверу было туговато справляться с запросами и в пиковые часы нагрузки пришедший робот какого-нибудь нескромного поисковика или парсер какого-то школьника если не роняли сервер, то доставляли заметное количество проблем.

    Как переходили


    Решили, что разом переключить все мы не можем, нужно переводить по одному-двум проектам. Подняли вторую версию демона php-fpm для семерки. Для сайта, для которого планировался переезд, поднимался второй отдельный сокет. Далее сокет подменялся в конфигурации nginx. Это позволяло нам в случае обнаружения каких-либо проблем быстро менять сокет обратно и одной командой service nginx reload возвращать сайт в работоспособное состояние.

    Что происходило с сервером


    В день х была выбрана жертва, которую не жалко, конфиги были изменены, процесс начался. На сайте переход сразу почувствовался. Страницы стали отдаваться за 400-500 мс. вместо 600-800 мс. Вот картинка со временем отдачи главной страницы первой жертвы. Обращаем внимание на начало сентября.

    image

    К сожалению, нагиосом мы мониторим только главные страницы, они достаточно хорошо оптимизированы, поэтому прирост там заметный, но не максимальный. Максимальный виден на тяжелых страницах с большим количеством товаров, там она еще существеннее, но графиков у меня нет.

    После перевода двух-трех проектов стала меняться картина в общем на сервере. Каждый последующий переезд еще больше его разгружал. На этой картинке видно динамику за последние четыре недели.

    image

    Серверу становилось легче, видно это было даже на тех сайтах, которые стояли в очереди последними и работали на php 5.6 до последнего момента (смотрим на сентябрь, октябрь)

    image

    И вот к такому состоянию мы пришли сейчас, октябрь и ноябрь на графике в комментариях не нуждается.

    image

    Упала и нагрузка на дисковую подсистему

    image

    Какие были проблемы


    Как мы и ожидали, больших проблем новая версия не принесла (иначе мы бы просто не осилили переезд)

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

    В семерке поменялось поведение функции substr, в yii сломался один из методов разбора http запроса, но Александр Макаров с коллегами его уже давно поправили, поэтому все решилось обновлением версии фреймворка на этих проектах.

    Из интересного. Один из сайтов сразу не запустился, оказалось в его коде был метод, в котором два входных параметра имели одинаковое имя. 5.6 спокойно работал и глючил, а 7.0. выругался и упал.

    Ну и не обошлось без раздолбайства. Два сайта работали на одном сокете, для первого сменили название сокета, про второй сайт никто не вспомнил и именно его не оказалось в мониторинге, в итоге он пролежал всю ночь, пока маркетологи не увидели на следующий день ошибки в метрике и не прибежали.

    Напоследок


    По опыту, хороший код легко переносить на новую версию php. С половиной из этих проектов мы перешли с 5.4 на 5.6 вообще без единой правки и всей пачкой сразу. Так что пишите хороший код, используйте хорошие фреймворки и, самое главное, не бойтесь перемен — они всегда в лучшему ;)
    Поделиться публикацией
    Комментарии 38
      +2
      Полсекунды на страницу, реально?
        +2
        В среднем да, реально.
          +1
          Боюсь, это не удивление вашему «достижению», скорее эдакий facepalm.jpg
            +5
            Я понял, что это был не восторг. Данные привел исходя из мониторинга. На данный момент главная страница загружается за 140 мс. Я не хотел обсуждать конкретные цифры, в статье я хотел показать общую динамику.
        0
        Подскажите, за счет чего упала нагрузка на дисковую подсистему?
          0
          Предполагаю что opcache помогает, но не уверен.
            +5
            Это может быть следствием того, что PHP7 потребляет меньше памяти — больше остаётся на кеши.
            0
            У меня нет точного ответа на этот вопрос. Наибольшую загрузку на диски у нас дает mysql, версия «больше остается на кеши» хорошая, но количество памяти под мускул мы не меняли.
              +2
              Тоже скоро будем переводить громадный проект с 5.6 на 7, и тоже Yii 1
                +3

                И снова графики не от нуля… Страницы стали отдаваться быстрее на треть, а нарисовано как будто в два раза.

                  0
                  Странно, зачем было подменять сокет?
                  У себя делал так:
                  Поднимал php-fpm 7-ку например на 127.0.0.1:9900
                  Делал поддомен например beta.site.com, прописывал ему fastcgi_proxy 27.0.0.1:9900;
                  И уже на бете тестировал.
                  Да и проблем с переездом очень и очень мало.
                    +1
                    Отдельный сокет для того, чтобы перезапуском одного из двух сервисов (nginx) можно было вернуться в исходное состояние. Это не принципиально, решений тут можно придумать десяток.
                      +1
                      Я как раз про перезагрузки и говорил, делается поддомен ему прописывается php-fpm 7 и дальше тесты, как все тесты пройдены в основном домене подменяется сокет и в продакшен.
                        +1
                        И на реальных пользователях оказывается, что в тестах что-то упустили…
                          +1
                          То есть лучше каждый раз из-за ошибки дергать демона nginx?
                            –1
                            Из-за ошибки, не замеченной на стадии тестирования, лучше дернуть nginx, чем менять версию php-fpm на лету. В общем случае.
                              +1
                              Я все равно не понимаю чем это лучше.
                              В моем варианте два сайта
                              1 — полностью рабочий сайт (nginx + php-fpm 5)
                              2 — этот же сайт только (nginx + php-fpm 7)
                              2 сайт тестируется, не только автоматическими тестами но и ручками, как только все готово меняется сокет и все.
                                0
                                Так и в варианте автора то же самое — переключение на php7 в продакшене переходит путём изменения сокета в конфигах nginx. Если достаточно долгое время проблем от смены версии не обнаруживается, то первый (php5) сокет гасится навсегда, а если проблемы появились, то практически моментально на него переключаются снова. Чем ваш вариант ввода php7 в продакшен отличается от авторского?
                                  0

                                  Тем, что во время первичного тестирования новой версии основной сайт не гасится, тестовая версия видна только тому кто тестирует.

                                    0
                                    Кто вам сказал, что у автора первичное тестирование проводится на продакшене?
                                      0

                                      Автор и сказал.


                                      Подняли вторую версию демона php-fpm для семерки. Для сайта, для которого планировался переезд, поднимался второй отдельный сокет. Далее сокет подменялся в конфигурации nginx.

                                      Тут написано про поднятие второго php-fpm — но ничего не сказано о поднятии второго nginx или заведении второго сайта на старом, лишь о подмене сокета.

                                        0
                                        Автор такого не говорил, вы что ) Для первичных тестов у нас отдельный сервер разработки, но это не имеет отношения к статье.
                                          0

                                          Этот ваш комментарий должен был быть десятью уровнями выше. И он должен был звучать "так мы примерно так и сделали, только публичного доступа ко второму серверу не давали".

                                          +1
                                          Как по мне тут сказано о стратегии переключения на php7 на продакшене с возможностью практически моментального отката, а про фазу предварительного тестирования не сказано ничего, из чего можно было бы сделать вывод, что тестирования не было вообще. Слава богу, сейчас такое тестирование, хотя бы ручное, предполагается по умолчанию.
                        0
                        А чего не UDS?
                          0
                          Мне так было привычнее.
                            0
                            Ну а автору было проще (привычнее) UDS.
                              0
                              Вы не поняли сути ответа.
                              Суть в том что не на живом сайте меняем сокет, а создается поддомен ссылкой на ту же папке где лежит рабочий сайт (или делается форк) и вот там уже ведется адаптация под 7 версию.
                        0
                        .
                          +4
                          Нужна ли кому-то пошаговая инструкция по миграции php5.x на php7.0 с миграцией Laravel5.2 на Laravel5.3?
                          Пару недель назад переехали на beastgaming.club этим стэком, есть бесценные шишки.
                            +2
                            Про бесценные шишки всегда интересно почитать
                              +1
                              Да, хотелось бы. Особенно, если что-нибудь нетривиальное где-то пряталось.
                                0
                                Это всегда полезно. Даже тем, кто не работает с Laravel.
                                  0
                                  Угу. Не люблю Ларавел, но с удовольствием почитал бы.
                                0
                                Почти без проблем запустил приложение на symfony1.4, которое до этого на 5.3 работало. Впечатления только положительное. Причём много его сразу :)
                                  0

                                  Столкнулся с такой же задачей, сейчас новый релиз уже пакуем в Docker контейнер. По началу хотели сделать как вы. Интересно просто насколько наше решение лучше.

                                    0
                                    Чем вызван выбор докера? Какие-то специфические задачи?
                                      0
                                      Вместе с nginx?

                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                    Самое читаемое