Хочу поделиться некоторыми впечатлениями о нужности или ненужности такой вещи, как контрольная панель для коммерческого односерверного веб-проекта при наличии очень part time админа. История началась пару лет назад, когда знакомые знакомых попросили меня сопроводить покупку бизнеса — новостного сайта — с технической точки зрения. Нужно было слегка вникнуть, что на чем работает, проследить, чтобы все необходимые реквизиты были переданы в надлежащем виде и объеме, и стратегически прикинуть, что можно улучшить.
Сделка состоялась, скрипач стал не нужен. Конец. На самом деле нет.
Сайт крутился на двухъядерной 4х-гиговой ВМке на Linode, на каком-то замшелом Debian5 с аптаймом дней в 400 и воооот таким списком необновленных пакетов. Веб-часть на самописной ЦМСке, nginx, php5.3 FPM, mysql тюненая Percona. В принципе, работало.
Параллельно с разговорами со мной новый владелец искал программиста для приведения проекта к ожиданиям. Нашел. Программист оценил трафик и объемы и решил, что умеет в оптимизацию и cost management. Он смигрировал весь сайт на 700-рублевый шаред хостинг под управлением привычного ему IS****er. Через несколько дней снова звонок от владельца: «все тормозит и кажется нас поломали». Я пытался исправить ситуацию через панель, но после некоторого времени бесплодных попыток поменять версию ПХП или хендлер с fcgi на fpm, сдался, и полез в шелл. Там я нашел включенный дебаг, который светил на весь интернет паролем от мускуля, 777 на некоторые папки, которые к тому моменту трещали от залитой малвари и подобную дичь. Владелец осознал и решил, что экономить на хостинге, программисте, и админе, который бы посматривал одним глазком, как идут дела — неправильно.
Едем на RuVDS. Чуть ближе, чем британская Linode, и если вдруг захочется хранить персональные данные и все вот это, не придется больше никуда переезжать. Так как проект планировалось расширять, взяли ВМку «на вырост»: 4 ядра, 8 гиг памяти, 80ГБ диска. Не то чтобы я не умею в конфиги nginx руками, просто энтузиазма заниматься этим проектом настолько интимно у меня не было (см.выше про part time). Потому — поставил Plesk (тут я опущу подробности установки, потому что их по большому счету нет: запустил инсталлер, поставил пароль на админа, ввел ключ –всё), в то время это был 17.0. Базовые настройки сносно работают из коробки, есть fail2ban и последние доступные версии PHP, nginx.
Наверно, стоит остановиться и объяснить, почему его. Так как занимаюсь я такими вещами редко, и никакого особенного инструментария и набора заготовок на каждый случай у меня нет, понятно было, что нужна какая-то автоматизация базовых вещей, чтобы во-первых быстро, во-вторых безопасно, в третьих все best practices кто-то уже внедрил.
Итак, поставил. Времени сэкономил прилично, перезапуск сайта на новом сервере получился практически моментальным. Оставалось пильнуть конфиг мускуля, выдав ему половину памяти и увеличив число buffer pools, и отдать nginx половину ядер (Плеск не трогает глобальные конфиги), и в течение пары дней позаходить в шелл посмотреть на статы mysqltuner. Да, и купил платный ImunifyAV из каталога расширений, чтобы избавиться от залитой малвари. Нашлись что-то 11000 зараженных файлов. Мерзость в том, что в статику вливались обфусцированные куски кода, и чистить это руками было бы совсем уныло. Сначала я попробовал ClamAV, но он, как оказалось, такие штуки не берет, а ImunifyAV смог. Причем вылеченные файлы остаются в рабочем состоянии, просто удаляется кусок с малварью.
Арифметика простая: 50$ в месяц за ВМку, 10$ за Плеск (на самом деле меньше, потому что купили сразу на год со скидкой в два месяца) и 3$ за антивирус. Либо много чемоданов денег за мое время, которое я бы провел на сервере на первых порах разгребая эти конюшни вручную. Владельца такой расклад вполне устроил.
Тем временем нашли нового программиста. Договорились с ним о распределении ответственности, сделали поддомен для тестовой версии, и пошла работа. Он пилил новую версию сайта на Laravel, а я посматривал на fail2ban%).
Интересно, что поток любопытствующих не прекращается и в списке забаненных всегда около сотни адресов. Эффект интересный: в частности, обычно, если я захожу в шелл, на приветствии вижу около 20000-30000 неудачных попыток захода по SSH. С включенным fail2ban около 70. Вложенных усилий: 0. Без капельки дегтя, к сожалению, не обошлось. По умолчанию был «полувключен» WAF (modsecurity): в режиме обнаружения. То есть он писал подозрительную активность в лог, но фактически никаких действий не предпринимал. А fail2ban без разбора читал все логи, согласно включенным jails, и мочил все, что шевелится. Таким образом мы забанили половину редакции :D. Пришлось отключить этот jail, а нужные IP-адреса для надежности внести в белый список. Усилий вложено: два раза мышкой потыкать и научить редакторов сказать свой IP-адрес.
Что сразу пришлось по вкусу программисту — возможность заливать базы данных прямо в панели и быстрый доступ к phpMyAdmin
Что понравилось мне — логи и бэкапы. Логи пишутся и ротируются сами из коробки; бэкапы настраиваются очень просто. В самое вялое время делается полный бэкап, где-то на 10 гигов, и потом каждый день по инкрементальному, мегабайт по 200, в течение недели. Восстановление гранулярное, до конкретного файла или базы данных. Если нужно восстановить из инкрементального, то не нужно корячиться сначала с полным и рестором всей цепочки, Плеск делает все сам. Заливать бэкапы можно куда угодно: на фтп, на dropbox, s3 bucket, google drive и прочая.
День Ж: программист наконец додедал новый движок, мы его залили в прод, импортировали старые данные и сели выбирать цвет своих будущих Мазерати. До сих пор сидим выбираем.
Начались первые проблемы. Новый сайт был ожидаемо тяжелее старого, но реальная грабля была в том, что для привлечения трафика пользовались среди прочего Yandex.Zen, который нагонял посетителей пачками. Сайт загибался при 150 одновременных подключениях (я не говорю про RPS, потому что не замеряли). Начали тыкать кнопки и крутить ручки в области настроек php_fpm:
Оп, уже держит 500 коннектов. По мере приложения кредитки к средствам продвижения волны трафика стали больше. Следующий milestone 1000 одновременных подключений. Здесь пришлось уже порефайнить код и посмотреть в душу мускулю. Плеск в этом не помог, но этого особо и не ждали. Включили slow queries log, навешали индексов на базу, убрали лишние запросы из кода, еще раз причесали конфиг mysql по советам mysqltuner.
Новый челлендж — 2000 коннектов. Как раз успела выйти версия Plesk 17.8, в которой помимо прочего прикрутили nginx caching. Обновились (на удивление легко). Пробуем. Работает! И тут же наступили в мягкое, перестал работать фид Яндекс.дзена. Сайт работает, фид не работает. Не работает фид, нет трафика. Атмосфера накаляется. Под давлением обстоятельств и от недостатка фантазии полез сразу straceить nginx и нашел, что искал. Оказывается, в какой-то момент глупый nginx закэшировал залетную 500-ю ошибку в качестве ответа на яндексовый get feed.xml. Исправили, добавив исключения в настройки кэша:
Понятное дело, что владельцу нужно ЕЩО, волны потихоньку увеличиваются. Пока справляемся, но заблаговременно начали экспериментировать с memcached, благо Laravel поддерживает его почти из коробки. Ставить memcached руками для «поиграться» как-то не хотелось, поэтому поставили докер образ. Прямо из панели.
Ну ладно, вру, пришлось зайти в шелл и поставить модуль через pecl. Прямо по инструкции. Сказать о приросте пропускной способности пока нечего, достаточно больших наплывов не было. Движок сайта подцепился на localhost:11211, статы показываются, память жрется. Если понравится, посмотрим, что делать дальше. Либо так и оставим, либо поставим «настоящий» прямо в Ось. Либо таким же образом попробуем redis
Потом понадобилось приделать почтовую рассылку. Никаких релеев, только smtp authentication. Завел почтовый адрес, через его реквизиты через PHP делаем рассылку.
Не так давно вышел Plesk Obsidian (18.0), обновились по прошлому опыту без страха. Все прошло очень гладко, даже рассказать не о чем. Из приятного — сильно подтянулся по качеству интерфейс, осовременился и стал в некоторых местах удобнее. Прикольная штука Advanced Monitoring на Grafana.
Пока подробно с ней не разбирался, но можно, например, настроить алерты по любому параметру в почту. Владельцу, лол.
Раз уж я говорю об интерфейсе, он адаптивный и реально неплохо работает на телефоне. На ранних стадиях, пока мы пытались нащупать оптимальные настройки PHP и прочего, это сильно выручало. И особенно когда программист в приступе рабочего энтузиазма что-то делает в 23 часа, а я в приступе рабочего энтузиазма пью водку в бане, и СРОЧНО нужно что-то переключить.
О, кстати. На картинке видно, появился PHP Composer. Пока не игрались с ним, но, скажем, для того же Laravel он может сэконоимить пару логинов в шелл и какое-то время на установку зависимостей. Такая же система есть для Node.JS и Ruby.
С SSL все просто. Если домен резолвится куда положено, Let’s Encrypt делается одним кликом и обновляется дальше сам, причем как на сам домен, так и на субдомены, и даже почтовые сервисы.
Сам Plesk как софтина на текущее время довольно приятен и стабилен. Обновляет сам себя и Ось тихо, ресурсов потребляет мало, работает ровно. Даже не помню, что где-то на что-то наступил, что бы было явным дефектом продукта. Проблемы конечно были, но они либо от несовершенства конфигурации, либо где-то на стыке, так что придраться особо не к чему. Впечатления от работы с Плеском в целом приятные. Чего в нем нет, и надо это понимать, так это всякой (любой) кластеризации. Ни LB, ни HA. Пытаться можно, но вложенных усилий будет столько, что лучше делать изначально что-то по-другому.
Думаю, можно подытожить. Для случая, когда админа нет, или его мало, когда цена хостинга и крутящегося на нем сайта(ов) превышает, ну, скажем, 100у.е., когда речь не идет о скотском шареде по 1500 сайтов на сервере, когда перед принимающим решение стоит выбор нанять админа на полставки, либо купить софт и завести админа на «полшишки», либо вообще его не заводить — смысл определенно есть. С точки зрения удаленного админа — то же самое. 10$ в месяц, а экономит времени и придает гибкости в работе на очень большую сумму. Если, к примеру, меня сильно попросят взять аналогичный проект под крылышко, я буду настаивать на перевозе на Plesk.
Сделка состоялась, скрипач стал не нужен. Конец. На самом деле нет.
Сайт крутился на двухъядерной 4х-гиговой ВМке на Linode, на каком-то замшелом Debian5 с аптаймом дней в 400 и воооот таким списком необновленных пакетов. Веб-часть на самописной ЦМСке, nginx, php5.3 FPM, mysql тюненая Percona. В принципе, работало.
Параллельно с разговорами со мной новый владелец искал программиста для приведения проекта к ожиданиям. Нашел. Программист оценил трафик и объемы и решил, что умеет в оптимизацию и cost management. Он смигрировал весь сайт на 700-рублевый шаред хостинг под управлением привычного ему IS****er. Через несколько дней снова звонок от владельца: «все тормозит и кажется нас поломали». Я пытался исправить ситуацию через панель, но после некоторого времени бесплодных попыток поменять версию ПХП или хендлер с fcgi на fpm, сдался, и полез в шелл. Там я нашел включенный дебаг, который светил на весь интернет паролем от мускуля, 777 на некоторые папки, которые к тому моменту трещали от залитой малвари и подобную дичь. Владелец осознал и решил, что экономить на хостинге, программисте, и админе, который бы посматривал одним глазком, как идут дела — неправильно.
Едем на RuVDS. Чуть ближе, чем британская Linode, и если вдруг захочется хранить персональные данные и все вот это, не придется больше никуда переезжать. Так как проект планировалось расширять, взяли ВМку «на вырост»: 4 ядра, 8 гиг памяти, 80ГБ диска. Не то чтобы я не умею в конфиги nginx руками, просто энтузиазма заниматься этим проектом настолько интимно у меня не было (см.выше про part time). Потому — поставил Plesk (тут я опущу подробности установки, потому что их по большому счету нет: запустил инсталлер, поставил пароль на админа, ввел ключ –всё), в то время это был 17.0. Базовые настройки сносно работают из коробки, есть fail2ban и последние доступные версии PHP, nginx.
Наверно, стоит остановиться и объяснить, почему его. Так как занимаюсь я такими вещами редко, и никакого особенного инструментария и набора заготовок на каждый случай у меня нет, понятно было, что нужна какая-то автоматизация базовых вещей, чтобы во-первых быстро, во-вторых безопасно, в третьих все best practices кто-то уже внедрил.
Итак, поставил. Времени сэкономил прилично, перезапуск сайта на новом сервере получился практически моментальным. Оставалось пильнуть конфиг мускуля, выдав ему половину памяти и увеличив число buffer pools, и отдать nginx половину ядер (Плеск не трогает глобальные конфиги), и в течение пары дней позаходить в шелл посмотреть на статы mysqltuner. Да, и купил платный ImunifyAV из каталога расширений, чтобы избавиться от залитой малвари. Нашлись что-то 11000 зараженных файлов. Мерзость в том, что в статику вливались обфусцированные куски кода, и чистить это руками было бы совсем уныло. Сначала я попробовал ClamAV, но он, как оказалось, такие штуки не берет, а ImunifyAV смог. Причем вылеченные файлы остаются в рабочем состоянии, просто удаляется кусок с малварью.
Арифметика простая: 50$ в месяц за ВМку, 10$ за Плеск (на самом деле меньше, потому что купили сразу на год со скидкой в два месяца) и 3$ за антивирус. Либо много чемоданов денег за мое время, которое я бы провел на сервере на первых порах разгребая эти конюшни вручную. Владельца такой расклад вполне устроил.
Тем временем нашли нового программиста. Договорились с ним о распределении ответственности, сделали поддомен для тестовой версии, и пошла работа. Он пилил новую версию сайта на Laravel, а я посматривал на fail2ban%).
Интересно, что поток любопытствующих не прекращается и в списке забаненных всегда около сотни адресов. Эффект интересный: в частности, обычно, если я захожу в шелл, на приветствии вижу около 20000-30000 неудачных попыток захода по SSH. С включенным fail2ban около 70. Вложенных усилий: 0. Без капельки дегтя, к сожалению, не обошлось. По умолчанию был «полувключен» WAF (modsecurity): в режиме обнаружения. То есть он писал подозрительную активность в лог, но фактически никаких действий не предпринимал. А fail2ban без разбора читал все логи, согласно включенным jails, и мочил все, что шевелится. Таким образом мы забанили половину редакции :D. Пришлось отключить этот jail, а нужные IP-адреса для надежности внести в белый список. Усилий вложено: два раза мышкой потыкать и научить редакторов сказать свой IP-адрес.
Что сразу пришлось по вкусу программисту — возможность заливать базы данных прямо в панели и быстрый доступ к phpMyAdmin
Что понравилось мне — логи и бэкапы. Логи пишутся и ротируются сами из коробки; бэкапы настраиваются очень просто. В самое вялое время делается полный бэкап, где-то на 10 гигов, и потом каждый день по инкрементальному, мегабайт по 200, в течение недели. Восстановление гранулярное, до конкретного файла или базы данных. Если нужно восстановить из инкрементального, то не нужно корячиться сначала с полным и рестором всей цепочки, Плеск делает все сам. Заливать бэкапы можно куда угодно: на фтп, на dropbox, s3 bucket, google drive и прочая.
День Ж: программист наконец додедал новый движок, мы его залили в прод, импортировали старые данные и сели выбирать цвет своих будущих Мазерати. До сих пор сидим выбираем.
Начались первые проблемы. Новый сайт был ожидаемо тяжелее старого, но реальная грабля была в том, что для привлечения трафика пользовались среди прочего Yandex.Zen, который нагонял посетителей пачками. Сайт загибался при 150 одновременных подключениях (я не говорю про RPS, потому что не замеряли). Начали тыкать кнопки и крутить ручки в области настроек php_fpm:
Оп, уже держит 500 коннектов. По мере приложения кредитки к средствам продвижения волны трафика стали больше. Следующий milestone 1000 одновременных подключений. Здесь пришлось уже порефайнить код и посмотреть в душу мускулю. Плеск в этом не помог, но этого особо и не ждали. Включили slow queries log, навешали индексов на базу, убрали лишние запросы из кода, еще раз причесали конфиг mysql по советам mysqltuner.
Новый челлендж — 2000 коннектов. Как раз успела выйти версия Plesk 17.8, в которой помимо прочего прикрутили nginx caching. Обновились (на удивление легко). Пробуем. Работает! И тут же наступили в мягкое, перестал работать фид Яндекс.дзена. Сайт работает, фид не работает. Не работает фид, нет трафика. Атмосфера накаляется. Под давлением обстоятельств и от недостатка фантазии полез сразу straceить nginx и нашел, что искал. Оказывается, в какой-то момент глупый nginx закэшировал залетную 500-ю ошибку в качестве ответа на яндексовый get feed.xml. Исправили, добавив исключения в настройки кэша:
Понятное дело, что владельцу нужно ЕЩО, волны потихоньку увеличиваются. Пока справляемся, но заблаговременно начали экспериментировать с memcached, благо Laravel поддерживает его почти из коробки. Ставить memcached руками для «поиграться» как-то не хотелось, поэтому поставили докер образ. Прямо из панели.
Ну ладно, вру, пришлось зайти в шелл и поставить модуль через pecl. Прямо по инструкции. Сказать о приросте пропускной способности пока нечего, достаточно больших наплывов не было. Движок сайта подцепился на localhost:11211, статы показываются, память жрется. Если понравится, посмотрим, что делать дальше. Либо так и оставим, либо поставим «настоящий» прямо в Ось. Либо таким же образом попробуем redis
Потом понадобилось приделать почтовую рассылку. Никаких релеев, только smtp authentication. Завел почтовый адрес, через его реквизиты через PHP делаем рассылку.
Не так давно вышел Plesk Obsidian (18.0), обновились по прошлому опыту без страха. Все прошло очень гладко, даже рассказать не о чем. Из приятного — сильно подтянулся по качеству интерфейс, осовременился и стал в некоторых местах удобнее. Прикольная штука Advanced Monitoring на Grafana.
Пока подробно с ней не разбирался, но можно, например, настроить алерты по любому параметру в почту. Владельцу, лол.
Раз уж я говорю об интерфейсе, он адаптивный и реально неплохо работает на телефоне. На ранних стадиях, пока мы пытались нащупать оптимальные настройки PHP и прочего, это сильно выручало. И особенно когда программист в приступе рабочего энтузиазма что-то делает в 23 часа, а я в приступе рабочего энтузиазма пью водку в бане, и СРОЧНО нужно что-то переключить.
О, кстати. На картинке видно, появился PHP Composer. Пока не игрались с ним, но, скажем, для того же Laravel он может сэконоимить пару логинов в шелл и какое-то время на установку зависимостей. Такая же система есть для Node.JS и Ruby.
С SSL все просто. Если домен резолвится куда положено, Let’s Encrypt делается одним кликом и обновляется дальше сам, причем как на сам домен, так и на субдомены, и даже почтовые сервисы.
Сам Plesk как софтина на текущее время довольно приятен и стабилен. Обновляет сам себя и Ось тихо, ресурсов потребляет мало, работает ровно. Даже не помню, что где-то на что-то наступил, что бы было явным дефектом продукта. Проблемы конечно были, но они либо от несовершенства конфигурации, либо где-то на стыке, так что придраться особо не к чему. Впечатления от работы с Плеском в целом приятные. Чего в нем нет, и надо это понимать, так это всякой (любой) кластеризации. Ни LB, ни HA. Пытаться можно, но вложенных усилий будет столько, что лучше делать изначально что-то по-другому.
Думаю, можно подытожить. Для случая, когда админа нет, или его мало, когда цена хостинга и крутящегося на нем сайта(ов) превышает, ну, скажем, 100у.е., когда речь не идет о скотском шареде по 1500 сайтов на сервере, когда перед принимающим решение стоит выбор нанять админа на полставки, либо купить софт и завести админа на «полшишки», либо вообще его не заводить — смысл определенно есть. С точки зрения удаленного админа — то же самое. 10$ в месяц, а экономит времени и придает гибкости в работе на очень большую сумму. Если, к примеру, меня сильно попросят взять аналогичный проект под крылышко, я буду настаивать на перевозе на Plesk.