Оптимизация nginx

absurdo

Участник
Регистрация
22 Мар 2007
Сообщения
317
Реакции
9
На VDS связка Apache+nginx 0.7.67.
При предельной нагрузке на сервер вижу сообщение:
Код:
404 Not Found
nginx/0.7.67
мол сервак не справляется.
Хотя наблюдается более 200 Мб свободной оперативной памяти. Судя по "top" процессор тоже не загружен на 100%.

Подскажите какие параметры подкорректировать в конфигах Apache и nginx, чтобы более эффективно использовать оперативную память сервера.
 
При предельной загрузке 404я ошибка - это что-то новенькое. Это не "сервак не справляется", это не найдена запрашиваемая страница.
В указанной связке, когда не справляется бэкенд, фронтенд выдает 503 (после таймаута, указанного в proxy_read_timeout)
Чем и как создавалась "предельная загрузка"?
 
Точно, отсутствовала страница, которая должна показываться при 503.

Нагружал сайт при помощи Вопрос по прежнему в том как заставить Apache+Nginx эффективнее использовать все доступные ресурсы?
 
Какой размер форков апача?
Конфиги обоих серверов без строк комментариев тоже желательно посмотреть.
Если охота загрузить свободную оперативку, можно увеличить количество MaxSpareServers из расчета чтоб оставалось свободной оперативки меньше, чем на запуск еще одного форка, но это чревато тем, что в случае превышения количества используемой памяти, сервер начнет жить в свопе и эффективность только ухудшиться.
Опять же, 200мб для сервера у которого всего 256мб - это много неиспользуемой памяти, а для сервера у которого 16384мб 200мб уже практически deadline :)
 
1. Отключаем загрузку неиспользуемых модулей apache, можно отталкиваться от такого списка и по мере необходимости включать дополнительные:
LoadModule authn_file_module
LoadModule authz_host_module
LoadModule authz_user_module
LoadModule auth_basic_module
LoadModule auth_digest_module
LoadModule include_module
LoadModule filter_module
LoadModule log_config_module
LoadModule mime_module
LoadModule status_module
LoadModule info_module
LoadModule vhost_alias_module
LoadModule dir_module
LoadModule alias_module
LoadModule rewrite_module
LoadModule rpaf_module
LoadModule cgi_module
LoadModule geoip_module
LoadModule php5_module
LoadModule authz_groupfile_module

Еще нужен вывод команд:
Код:
httpd -V
httpd -M

2.Для nginx добавляем:
worker_priority -5;
reset_timedout_connection on;
postpone_output 1460;

keepalive_timeout 20;
client_header_timeout 30;
client_body_timeout 60;
send_timeout 30;

worker_rlimit_nofile рассчитываем как worker_processes*worker_connections

worker_connections в конфиге, ИМХО завышен сильно.

Все proxy_..._timeout я б уменьшил с 300 до 90 где-то, если отдельные директории требуют действительно такой долго обработки можно переопределять эти значения у нужного location.

Не помешало бы ограничение на количество подключений с одного IP и количество запросов в единицу времени, смотреть в строну limit_zone, limit_req_zone, limit_conn, limit_req

Проксировать такое:
Код:
Location ~ /favicon.ico {
proxy_pass http://127.0.0.1:8888;
}
на бекэнд - моветон, статика должна отдаваться nginx'ом. В location'ах такого плана "~" не нужна тут не проверок на содержимое части в запроси, тут просто location для полного запроса.
Код:
if ($request_method = OPTIONS ) {
proxy_pass http://127.0.0.1:8888;
}
if ($request_method = PROPFIND ) {
proxy_pass http://127.0.0.1:8888;
}
if ($request_method = PROPPATCH ) { 
proxy_pass http://127.0.0.1:8888;
}
if ($request_method = MKCOL ) {
proxy_pass http://127.0.0.1:8888;
}
if ($request_method = COPY ) {
proxy_pass http://127.0.0.1:8888;
}
if ($request_method = MOVE ) {
proxy_pass http://127.0.0.1:8888;
}
if ($request_method = LOCK ) {
proxy_pass http://127.0.0.1:8888;
}
if ($request_method = UNLOCK ) {
proxy_pass http://127.0.0.1:8888;
}
if ($request_method = PUT ) {
proxy_pass http://127.0.0.1:8888;
}

Зачем куча отдельных if'ов?
Код:
 if ($request_method ~ ^(OPTIONS|PROPFIND|и т.п.)$ ) {
  proxy_pass http://127.0.0.1:8888;
 }

Опять же насколько реально нужны все эти методы?
Мб хватит такого:
Код:
if ($request_method !~ ^(GET|HEAD|PUT)$ ) {
            return 444;
}
proxy_pass http://127.0.0.1:8888;

Если юзаем проверки вида:
f (-d $request_filename)

Не помешают такие опции:
open_file_cache max=5000 inactive=300s;
open_file_cache_valid 360s;
open_file_cache_min_uses 2;
open_file_cache_errors on;

Вообще по всем best practice использование большого количества if для nginx'а очень плохая практика он и работать может начать не так, как от него ожидают прописывая линейные каскады if'ов, и производительность из-за кучи ненужных проверок падает. Нужно стараться описать все свои проверки через соответствующие location.
 
Этот конфиг настраивали Битриксовцы. Например через favicon.ico там как-то считается кол-во добавивших в избранное, на сколько я понял. В общем нюансы есть. Спасибо за подробный анализ.
 
nginx.conf от битрикса это бред ...
worker_processes 8; у Вас что 8 процессоров или 8 дисков ?
Все эти ифы ... они реально ненужны. Тот кто напосал это конфиг явно не в теме.
if (-f /home/bitrix/www/.htsecure) {
rewrite ^(.*)$ https://$host$1 permanent;
}

Для просмотра ссылки Войди или Зарегистрируйся
 
конфиг действительно лучше переписать, т.к. 404 вероятнее всего изза конфига выпадает.
см. в сторону try_files - более эффективно для proxy_pass
 
Назад
Сверху