Não é possível alocar erro de memória no nginx com um grande número de redirecionamentos

1

Eu enfrentei um erro de alocação de memória no nginx. Eu configurei um proxy reverso para um número de sites no meu nginx, que eu uso como um balanceador de carga simples entre dois nós de backend. A configuração típica do site é assim:

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;
  }
}

Eu tenho 12 sites com configuração como acima. Como você vê, a configuração contém include de outro arquivo - sites-available/root . Este arquivo consiste em um número de diretivas unclude para outros arquivos:

include /etc/nginx/sites-available/rules1;
include /etc/nginx/sites-available/rules2;
include /etc/nginx/sites-available/rules3;
...
include /etc/nginx/sites-available/rules16;

Todo arquivo de regras contém várias regras de redirecionamento, como:

if ($request_uri ~* ^/some-url$) {
  return 302 /some-another-url/;
}

ou

location ~ some-url {
  return 302 "some-another-url";
}

A contagem total de regras de redirecionamento é de aproximadamente 2300. Incluí root file em configurações de todos os 12 sites. Depois desse horário, recebo a mensagem informativa em /var/log/nginx/error.log :

[info] 23721#23721: Using 32768KiB of shared memory for push module in /etc/nginx/nginx.conf:66

O principal problema é que às vezes o comando service nginx reload falha com erros no log:

[alert] 22164#22164: fork() failed while spawning "worker process" (12: Cannot allocate memory) 2018/10/09 03:10:06

[alert] 22164#22164: sendmsg() failed (9: Bad file descriptor)

O problema desapareceu se eu excluir as regras de redirecionamento da configuração. O Nginx é configurado em uma instância simples do AWS t2.small com o Ubuntu 16.04. Ele tem 1GB de RAM e eu vejo (com free -m ) que pelo menos metade da memória é livre. Eu tenho nginx.conf padrão. Então a questão é como evitar o erro cannot allocate memory , que é causado pelo grande número de regras de redirecionamento?

Esta questão foi originalmente publicada here . Eu pensei que alguém aqui pode saber a resposta. Desculpe pela duplicação.

    
por KozhevnikovDmitry 10.10.2018 / 05:35

0 respostas

Tags