Зачастую многие, кто сидит на TBDev не знают, как спастись от нагрузки на сайт, когда пришла пора посетителей посетить ваш чудесный сайт. И то не всегда. Нагрузка может появиться в любой неудобный момент, когда вы в отпуске, на разъезде или вообще по делам.
Как вариант, переход на XBT Tracker (но многие ли будут заниматься им, в судьбоносный час, когда рушится надежда всех посетителей?) решит проблемы, согласен, но это ответственное дело требует не 10 минут вашего внимания. Смотря, под какие задачи заточен ваш ресурс…

Проблема решается просто (если у вас стоит только nginx и php5-fpm):

1) Начнем с конфига определенного домена в nginx:
где some — это ваш ip или домен, смотря по ситуации.
его можно создать по пути здесь : /etc/nginx/sites-available/

назовите some.ru(или some.com,some.net — смотря, что у вас за домен) и вносите конфиг такой, как на примере:

server {
        listen someip:80;#где, someip - ваш ip адрес
        server_name some.ru;# ваш домен полностью
        root /home/some/data/www/some.ru;
        index index.php index.html index.htm;
        client_max_body_size 10M;

location  /home/some/data/www/some.ru/announce.php {
        fastcgi_pass unix:/var/run/announce.sock; # Сокет php-fpm
        include fastcgi_params;
                fastcgi_param   SCRIPT_FILENAME    /home/some/data/www/some.ru/announce.php;
                fastcgi_param   SCRIPT_NAME        announce.php;
                                    }
location /home/some/data/www/some.ru/scrape.php {
        fastcgi_pass unix:/var/run/scrape.sock; # Сокет php-fpm
        include fastcgi_params;
                fastcgi_param   SCRIPT_FILENAME    /home/some/data/www/some.ru/scrape.php;
                fastcgi_param   SCRIPT_NAME        scrape.php;
                                    }

location /home/some/data/www/some.ru/shoutbox.php {
        fastcgi_pass unix:/var/run/shoutbox.sock; # Сокет php-fpm
        include fastcgi_params;
                fastcgi_param   SCRIPT_FILENAME    /home/some/data/www/some.ru/shoutbox.php;
                fastcgi_param   SCRIPT_NAME        shoutbox.php;
                                    }

        location / {
                     limit_req zone=one burst=3;
                       }

# закрываем доступ
  location ~ /(admin|admin/links|admin/modules|blocks|themes/great/html|torrents|torrents/images|include|include/captcha_backs|include/captcha_fonts)
   {
   deny all;
   return 404;
   }
        access_log off;
        error_page 502 = http://some.ru/502.html;
        error_log  /var/log/error_some.log crit;

        location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/some.ru.sock; # Сокет php-fpm
        fastcgi_index index.php;
        include fastcgi_params;
                fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
                fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
        }


        location ~ .+(?<!\.php)$ {
                access_log        off;
                log_not_found     off;
                expires           360d;
	 }
}


не забудьте сделать команду в командной строке, чтобы создать символическую ссылку в папке /etc/nginx/sites-enabled (иначе, ваш сайт просто не заработает):
ln -s /etc/nginx/sites-{available,enabled}/some.ru


Как видите, самыми ресурсоемкими являются файлы: announce.php(анонсер, который бесконечно жрет ваше процессорное время в зависимости от жаждущих что-то скачать), scrape.php и shoutbox.php (чат, где горлопанят все, кому не лень — еще и при такой нагрузке. Боже, как нелегко..)

2) Создаем в папке etc/php5/fpm/pool следующее:

для announce.php создаем файл announce.conf со следующим содержимым:

[announce]
listen = /var/run/announce.sock
user = some # реальный юзер (смотрите у себя, кто владелец)
group = some # реальную группу (аналогично)
listen.mode = 0666
chdir = /home/some/data/www/some.ru/
rlimit_core = unlimited
pm = dynamic
pm.max_children = 50
pm.start_servers = 16
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 200
request_terminate_timeout = 30s



3) для scrape.php создаем файл scrape.conf со следующим содержимым:

[scrape]
listen = /var/run/scrape.sock
user = some # реальный юзер (смотрите у себя, кто владелец)
group = some # реальную группу (аналогично)
listen.mode = 0666
chdir = /home/some/data/www/some.ru/
rlimit_core = unlimited
pm = dynamic
pm.max_children = 50
pm.start_servers = 16
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 100
request_terminate_timeout = 10s


3) и для shoutbox.php (чертового чата) # если у вас его нет, можете смело забыть про него и перейти к последним пунктам;)
создаем файл shoutbox.conf со следующим содержимым:

[shoutbox]
listen = /var/run/shoutbox.sock
user = some # реальный юзер (смотрите у себя, кто владелец)
group = some # реальную группу (аналогично)
listen.mode = 0666
chdir = /home/some/data/www/some.ru/
rlimit_core = unlimited
pm = dynamic
pm.max_children = 50
pm.start_servers = 16
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 100
request_terminate_timeout = 30s

далее, применяем в командной строке магические:
service nginx restart

и
service php5-fpm restart


Надеюсь, я помог кому-то… на первое время.

За сим откланиваюсь.

p.s. обновлены конфиги

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


  1. gto
    30.07.2015 10:58

    Сдаётся мне, джентльмены, это была комедия. О чём вообще пост? (не повернулся язык назвать статьёй)


    1. dxpsite Автор
      30.07.2015 11:26

      Суть поста — быстрое решение проблемы, поставить захлебывающийся сервер на ноги.


      1. ibKpoxa
        30.07.2015 12:21

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


      1. gto
        30.07.2015 12:52

        И как добавление пула решит проблему? За счёт чего?


        1. dxpsite Автор
          30.07.2015 13:05

          переносим нагрузку по пулам, если хотите так назвать… и это работает


          1. gto
            30.07.2015 14:14

            Они же все на одном сервере. Почему бы просто не увеличить ресурсы для основного пула?


            1. dxpsite Автор
              30.07.2015 14:32
              -1

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


              1. gto
                30.07.2015 15:01
                +1

                Боттлнек? В чём? imho, вот это error_log /var/log/nginx/some.ru_errors.log debug; гораздо больший боттлнек.


  1. BuriK666
    30.07.2015 11:56

    listen.mode = 0666
    Зачем 666 если можно сделать 600 и указать владельца сокета?

    php_admin_value[info_tmp_dir] = /usr/share/tmp
    Откуда у Вас tmp в /usr/share


    1. dxpsite Автор
      30.07.2015 12:33

      Признаюсь, часть параметров лишняя — она просто не работает


  1. mayorovp
    30.07.2015 13:27
    +2

    1. Зачем при указании конкретных файлов, таких как announce.php, использовать конструкцию try_files $uri =404? Тут надо передавать сразу в fast_cgi, а там уже разберутся: php5-fpm тоже умеет обрабатывать ошибку отсутствия файла.

    Но даже если очень хочется возложить эту обязанность на веб-сервер — то почему 404-то? Тут бы больше подошло 503 или 500, поскольку отсутствие самого главного для трекера файла — это серверная ошибка, а не клиентская.

    2. Кстати, зачем в этих блоках делается fastcgi_param SCRIPT_NAME $fastcgi_script_name;? Ведь всем понятно, чему должна быть равна эта переменная. Зачем давать хакерам лишнюю лазейку?

    3. Особенно смешно выглядит конструкция fastcgi_index index.php внутри блока location ~\announce.php$.

    4. Кстати, почему ~\announce.php$, а не =/путь/к/announce.php? У вас этот скрипт может лежать в нескольких разных местах?

    5. В исходниках TBDev я нашел кучу файлов .htaccess с содержимым deny from all. Почему в конфиге nginx эти запреты никак не отражены?

    6. Что там за ужасная строчка с расширениями файлов? Неужели нельзя написать «все, кроме php»? А еще лучше — перенести этот тихий ужас в location / и перекрыть что надо в location ~ \.php$

    7. Вижу, у вас используется две разные корневые директории для разных целей — /var/www/some/data/www/some.ru и /home/some/data/www/some.ru Но это же означает, что исходные файлы надо также поделить пополам, часть положить в одну директорию, часть — в другую. Где хоть слово об этом в инструкции?

    PS Я понимаю, статья предполагает, что nginx настраиваться будет быстро и второпях. Но зачем в такой же спешке было писать саму статью-то?


    1. dxpsite Автор
      30.07.2015 14:33

      Признаюсь, все было написано в спешке и необдуманно. Учту ваши замечания, спасибо!


    1. dxpsite Автор
      31.07.2015 10:43

      обновил конфиги с учетом ваших критических замечаний.


      1. mayorovp
        31.07.2015 10:57

        Мда, все стало еще смешнее. Вы конфиги-то хоть проверяли? :)


        1. dxpsite Автор
          31.07.2015 11:00

          да


          1. mayorovp
            31.07.2015 11:44

            Проверьте, в каком пуле у вас теперь обрабатывается announce.php :)