Как вариант, переход на 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)
BuriK666
30.07.2015 11:56listen.mode = 0666
Зачем 666 если можно сделать 600 и указать владельца сокета?
php_admin_value[info_tmp_dir] = /usr/share/tmp
Откуда у Вас tmp в /usr/share
mayorovp
30.07.2015 13:27+21. Зачем при указании конкретных файлов, таких как 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 настраиваться будет быстро и второпях. Но зачем в такой же спешке было писать саму статью-то?dxpsite Автор
30.07.2015 14:33Признаюсь, все было написано в спешке и необдуманно. Учту ваши замечания, спасибо!
gto
Сдаётся мне, джентльмены, это была комедия. О чём вообще пост? (не повернулся язык назвать статьёй)
dxpsite Автор
Суть поста — быстрое решение проблемы, поставить захлебывающийся сервер на ноги.
ibKpoxa
Расскажите грубо говоря на пальцах, алгоритм или методологию того, что вы делаете, у вас просто приведены конфиги и не ясно, что они делают.
gto
И как добавление пула решит проблему? За счёт чего?
dxpsite Автор
переносим нагрузку по пулам, если хотите так назвать… и это работает
gto
Они же все на одном сервере. Почему бы просто не увеличить ресурсы для основного пула?
dxpsite Автор
К сожалению, увеличение ресурсов не решает проблему, возникает как бы боттнэк — бутылочное горлышко. Разнос по разным пулам как раз снимает нагрузку. Это подтверждено экспериментально и работает по сей день.
gto
Боттлнек? В чём? imho, вот это error_log /var/log/nginx/some.ru_errors.log debug; гораздо больший боттлнек.