Начинайте думать

e62c79490299d564eac4f4b5f205f9a4.pngДоброго времени суток дорогой %username%! Хотелось бы поздравить с праздником всех админов и в честь этого накатило на меня написать пост. По роду своей деятельности (*nix админ), ко мне обращаются знакомые с различными просьбами о помощи по серверам. Обычно просьбы в духе — у нас стал тормозить сайт, или что-то у нас повисло и т.п. Очень часто, проблемы возникают из-за действий программистов, которые не всегда понимают что делают, либо не понимают последствий того, что они делают. Посмотрев на это все, я решил поделиться с вами некоторыми случаями и наставлениями.

Изначально, думал назвать пост «прекратите админить» и собрать в нем типичные ошибки программистов админов, однако мысль пошла немного иначе, поэтому заголовок получился такой. Заранее хочу извиниться за сумбурность поста, просто накатило что-то написать и как мысль пошла, так и написал.

Случай 1.— «Антон, у нас стал тормозить сайт. Посмотри? «Формулировка достаточно стандартная, поэтому для получения какого-либо понимания о происходящем лезу по ssh на сервер.Заглядывая в top, вижу php процесс, съедающий кучу ресурсов. Что же это? Никакого криминала лишь — remove_old_thumbs.php. Как можно догадаться, он удаляет старые миниатюры изображений. И все бы ничего, но делает это он очень активно.iotop рассказывает о том, что скрипт очень активно мучает жесткий диск. Оно и понятно, шерстить по папкам и удалять тысячи файлов дело ресурсоемкое, особенно на виртуалках. Решение? ionice -c3 php remove_old_thumbs.phpТак-как процедура удаления старых миниатюр не критичная, и не требует высокого приоритета, можно ее запустить с низким I/O приоритетом. Запускаем — процесс пошел более тихо, сайт перестал тормозить, миниатюрки потихоньку удаляются — все счастливы.Случай 2.  — «Антон, мы тут миниатюры начали делать, но что-то все тормозит«Чтож, посмотрим. Вот те на. Ссылки на миниатюры выглядят таким образом. thumb.php? image=images/12311.jpg. Чтож, тут приходится поковыряться в коде.— Картинки для миниатюр лежат в одной папке, а их под миллион. Незачем насиловать fs.— Скрипт не сохраняет сгенерированные миниатюры. На каждое обращение он генерирует новую миниатюру — не комильфо господа! — Генерация миниатюр для всех картинок займет продолжительное время.

Разбираем случай. Для начала, хорошо бы разложить все картинки по папкам. Предложено раскладывать по дате, дату брать из публикации. С этим особых проблем нет, все прозрачно и понятно. И получилось у нас как-то так: images/2013/08/12311.jpg.Чтобы убить последние 2 пункта, было предложено сделать адреса миниатюр такими thumbs/2013/08/12311.jpg, а в nginx настроить правило, проверяющее наличие файла по указанному url и в случае отсутствия перенаправлять запрос на thump.php. В свою очередь thumb.php генерирует миниатюру, показывает ее клиенту и складывает на диск по нужному адресу. Таким образом мы разгрузили cpu и fs, а сайт залетал.

Случай 3.  — «Антон, у нас стал тормозить сайт. Посмотри? «В процессах висит 10 процессов remove_old_thumbs.php. Ребят, ну давайте в скриптах, запущенных про крону, делать проверку на запущенность? Хотябы создавая lock-файл в /tmp, а при завершении скрипта с помощью register_shutdown_function вызывать функцию, удаляющую этот файл. Быстро и просто.Случай 4. Сильно подробно я не буду на этом останавливаться, тема хоть и очень актуальна, но каждый случай строго индивидуален. На память я пример не воспроизведу, но если коротко то: «SELECT * FROM posts» — мы вытянули всю базу постов, со всеми описаниями и почим мусором и активно работаем с этим массивом данных, хотя из всего массива нужен лишь id и poster_url.«SELECT description FROM posts WHERE post_time > '2013–01–01' AND post_moderated = '1' ORDER BY name DESC» — Представьте этот запрос с кучей join’ов и весьма массивным. И почему он вдруг тормозит? А все потому что нет индекса по полю name, а про EXPLAIN новые программисты не слыхали.Чтож. Приведенные случаи тянут на ошибки программистов. В чем же можно упрекнуть админов? Для начала вот этим: ssh://root: om7ooS3righoob4Xe7ri@hostname

В 90% случаев, удаленный доступ к серверам осуществляется от пользователя root и практически сразу, эти сервера начинают брутфорсить. Это не есть правильно.Что можно сделать? Для начала создать пользователя, под которым потом заходить по ssh. А затем, запретить авторизацию от рута (PermitRootLogin yes) в sshd_config. Чтобы получить права рута под юзером, можно набрать «su -» или настроить sudo. Не сложно же? Что можно сделать еще? Можно запретить доступ к ssh с неизвестных IP и не обязательно писать пачку правил для iptables, достаточно подправить пару файлов.

hosts.denysshd: all

hosts.allowsshd: 123.231.132.213

И все! Мы запретили ходить на сервер по ssh всем, кроме 123.231.132.213.

Ок, что еще?[root@localhost ~]# ps auwx | grep phproot 795 0.0 0.5 321152 9948? Ss июл22 0:10 php-fpm: master process (/etc/php-fpm.conf)root 884 0.0 0.3 321696 6724? S июл22 0:00 php-fpm: pool wwwroot 885 0.0 0.3 321696 6644? S июл22 0:00 php-fpm: pool wwwroot 886 0.0 0.3 321696 6720? S июл22 0:00 php-fpm: pool wwwroot 887 0.0 0.3 321728 6720? S июл22 0:00 php-fpm: pool wwwroot 888 0.0 0.3 321728 6728? S июл22 0:00 php-fpm: pool www

Зачем php скриптам выполняться от рута? Зачем?! Все равно что оставлять ключи от машины, в самой машине. Решение в каждом случае будет разное, в данном случае в конфиге php-fpm.conf юезер меняется на нужного.

Те, кто не стал запускать скрипты от рута, грешит другим — chmod 777. Не буду расписывать последствия и способы лечения, скажу лишь одно. Выставляйте права на файлы обдумав свои действия. И никогда не выставляйте их подобным образом«chmod 777 -R.». Волею судьбы, вы можете поломать ОС, запустив команду не в той папке.

Множество админов грешат тем, что компилят софт и ставят его в систему. Не возьмусь сказать, что это огромное зло, но все же это зло. Знакомо ./configure && make && make install? Ребят, не поленитесь найти пакет. Если нет пакета, попробуйте воспользоваться тем же checkinstall.

На самом деле, различных случаев очень много. Разбирать их можно долго и упорно, однако я бы хотел обратиться к программистам. Ребят, если вы поддерживаете сайт с серьезной посещаемостью, занимаетесь оптимизациями и создаете какой-либо суровый функционал, обратитесь за советом к опытным коллегам (особенно админам). Они вам помогут советом и спасут от страшных и не очень ошибок.

© Habrahabr.ru