Debian.pro

Блог для пользователей и администраторов Debian


Повесть о войне с nginx, о том, какой я дурак, и о том, какие #freebsd умные.

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

Имеем пачку VDS серверов (ну и физических машин), которые выполняют одну и ту же задачу — раздают .exe/.rar/.zip/.tar файлы террабайтами. Серьёзно, бывает и по несколько террабайт в сутки. Канал на всё это дело больше гигабита.
Когда трафика стало действительно много — стала проявляться тенденция. Те серверы, которые были настроены не моими ручками, а через ispmanager — начинают люто-бешено кушать дисковое io. В итоге тормозит всё. Да ещё и очень сильно тормозит — качать невозможно, не говоря о том, чтобы ещё и сайты держать на этих серверах.

Меняли всё — версии nginx, параметры конфига nginx (и виртуальных хостов, но как оказалось позже — хреново я их менял). Последней инстанцией стала установка FreeBSD. Но и оно не помогло. И пересборка nginx из портов (и из исходников в дебиянах) не помогла. И потопал я на #freebsd руснетовский. Сразу скажу, если вы не любите читать мануалы и не умеете пользоваться гуглом — не ходите туда. А тем более, если не умеете коротко и ясно излагать проблему.

Сидели мы там с бсдшниками, посмеивались надо мной. Описал я им ситуацию. И тут высказали они гениальную вещь. В du/dh не отображаются временные файлы (в том числе и nginx’a, само собой). И задумался я крепко. И потом ещё крепче. И начал сравнивать построчно свой же мануал и конфиг nginx’a, генерируемый в ispmanager. gzip, kqueue/epoll и прочее не помогло. Но дальше интереснее. По сути есть одно важное отличие:

location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ { — вот так, по утверждению парней из ispsystem, выглядит location для статических файлов.

location ~* ^.+\.(jpg|jpeg|gif|png|rar|txt|tar|wav|bz2|exe|pdf|doc|xls|ppt|bmp|rtf|js|ico|css|zip|tgz|gz)$ — а вот так он выглядит на мой взгляд.

Дальше читать необязательно, все уже должны понять, что я невнимательный идиот.

Оказалось всё очень просто — упрямый nginx куда-то и зачем-то перекладывал 60 гигабайта exe и tarов. Что и вызывало адский io. Научного объяснения я пока не придумал, да и не хочу — стыдно.

Проблемку я решил таким костылем:
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.old && sed -e s/avi\|zip/avi\|exe\|tar\|zip/g /etc/nginx/nginx.conf.old > /etc/nginx/nginx.conf && /etc/init.d/nginx restart && date > /var/log/syslog

Для надежности положил это в /etc/crontab еженощно (серверы с ispmanager не мои, а реселлеров).
Да, по идее нужно бы подправить шаблоны ispmanager. Но с другой стороны — старые вхосты тоже нужно было как-то исправить, поэтому запустить строчку выше нужно было в любом случае.
Мораль сей басни такова — внимательнее нужно быть и умных дядек слушать чаще.
Посыпаю голову пеплом, всем до свидания.


Комментарии (7):

  1. name :

    Ну по сути ребята из ISPManager накосячили. Они часто косячат :) Причем манагер, это ещё один из самых отлаженный продуктов ихних (имхо). А вот остальные продукты, тот же биллинг — вообще дрова.

  2. dmitry :

    Ничего не понял. Где коренные отличия? Не было расширений необходимых и все отдавалось апачем? Это отнюдь не проблема ispmanager’а. Ради чего пост? Или я чего не понял?

  3. Это пост о невнимательности.
    А проблема то как раз ispmanager’a. Вряд ли существует вселенная, в которой .exe — не статика.

  4. Serj :

    Когда то в свое время сталкивался с таким и очкеь плевался в сторону исп системс, и это еще только начало любви к этой компани…. Там ад на аде

  5. Ну по сравнению с каким-нибудь плеском там рай)
    А вообще они пытаются слишком многим людям угодить, нужно просто как то пересмотреть приоритеты.

  6. Max :

    Парни, а вы документацию читать пробовали прежде чем гадить кирпичами в сторону ISPmanager?

    http://ru.ispdoc.com/index.php/Файл_конфигурации_ISPmanager_(ISPmanager)

    NgStaticRegexp — регулярное выражение, позволяющее задать файлы, которые будет отдавать Nginx, например, NgStaticRegexp «~* ^.+\\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$».

    Так что все настраивается так как нужно, форматы по дефолту туда добавлены самые что есть популярные.

  7. Дело не только в «настраивается». Дело в том, как всё это заработало.

Написать комментарий