Я столкнулся с ошибкой выделения памяти в nginx.Я настроил обратный прокси-сервер для нескольких сайтов на моем nginx, которые я использую как простой балансировщик нагрузки между двумя внутренними узлами.Типичная конфигурация для сайта выглядит следующим образом:
upstream backend {
ip_hash;
server <node-ip>;
server <another-node-ip>;
}
server {
server_name domain.subdomain.com;
# a HUGE bunch of redirection rules
include /etc/nginx/sites-available/root;
location / {
proxy_pass http://backend ;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
У меня 12 сайтов с конфигурацией, как указано выше.Как видите, конфиг содержит include
другого файла - sites-available/root
.Этот файл состоит из ряда unclude
директив к другим файлам:
include /etc/nginx/sites-available/rules1;
include /etc/nginx/sites-available/rules2;
include /etc/nginx/sites-available/rules3;
...
include /etc/nginx/sites-available/rules16;
Каждый файл правил содержит ряд правил перенаправления, таких как:
if ($request_uri ~* ^/some-url$) {
return 302 /some-another-url/;
}
или
location ~ some-url {
return 302 "some-another-url";
}
Общее количество правил перенаправления составляет около 2300. Я включил файл root
в конфигурации всех 12 сайтов.После этого время от времени я получаю информационное сообщение в /var/log/nginx/error.log
:
[info] 23721 # 23721: Использование 32768 КБ общей памяти для push-модуля в /etc/nginx/nginx.conf:66
Основная проблема заключается в том, что иногда команда service nginx reload
завершается ошибкой с ошибками в журнале:
[alert] 22164 # 22164: fork () не запускается при порождении «рабочего процесса»(12: Невозможно выделить память) 2018/10/09 03:10:06
[alert] 22164 # 22164: ошибка sendmsg () (9: неверный дескриптор файла)
Проблема исчезнет, если я исключу правила перенаправления из конфига.Nginx настроен на простой экземпляр AWS t2.small с Ubuntu 16.04.Он имеет 1 ГБ оперативной памяти, и я вижу (с free -m
), что по крайней мере половина памяти свободна.У меня по умолчанию nginx.conf.Итак, вопрос в том, как избежать ошибки cannot allocate memory
, вызванной огромным количеством правил перенаправления?