Nginx: Como definir 'limit_conn' e 'limit_req'?

4

Estou usando o nginx versão 1.6.2 no ubuntu 14.04

Eu tentei inserir limit_conn e limit_req no arquivo de configuração com referência à documentação do nginx .

O Nginx está funcionando bem sem limit_conn e limit_req opção .

A seguir estão os casos de teste da configuração do nginx com mensagens de log.

Eu não sei o que há de errado com o meu código.

Caso 1 - configuração completa

/etc/nginx/nginx.conf

http {
    ...
    include /etc/nginx/sites-enabled/*;
    ...
    limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
    limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s;
    ...
}

/etc/nginx/sites-enabled/service.conf

server {
    ...
    location / {
        limit_conn conn_limit_per_ip 30;
        limit_req zone=req_limit_per_ip burst=5 nodelay;
        ...
    }        
    ...
}

log message

unknown limit_req_zone "req_limit_per_ip" in /etc/nginx/sites-enabled/service.conf

Caso 2 - remova limit_req do arquivo de configuração habilitado para sites

/etc/nginx/nginx.conf

http {
    ...
    include /etc/nginx/sites-enabled/*;
    ...
    limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
    limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s;
    ...
}

/etc/nginx/sites-enabled/service.conf

server {
    ...
    location / {
        limit_conn conn_limit_per_ip 30;
        ...
    }        
    ...
}

log message

the size 10485760 of shared memory zone "conn_limit_per_ip" conflicts with already declared size 0 in /etc/nginx/nginx.conf

Caso 3 - remova limit_conn do arquivo de configuração habilitado para sites

/etc/nginx/nginx.conf

http {
    ...
    include /etc/nginx/sites-enabled/*;
    ...
    limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
    limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s;
    ...
}

/etc/nginx/sites-enabled/service.conf

server {
    ...
    location / {
        limit_req zone=req_limit_per_ip burst=5 nodelay;
        ...
    }        
    ...
}

log message

unknown limit_req_zone "req_limit_per_ip" in /etc/nginx/sites-enabled/service.conf

Caso 4 - remova tudo do arquivo de configuração habilitado para sites

/etc/nginx/nginx.conf

http {
    ...
    include /etc/nginx/sites-enabled/*;
    ...
    limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
    limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s;
    ...
}

/etc/nginx/sites-enabled/service.conf

server {
    ...
    location / {
        ...
    }        
    ...
}

log message

[OK] - nginx reloaded well

Caso 5 - remova limit_req_zone e limit_req

/etc/nginx/nginx.conf

http {
    ...
    include /etc/nginx/sites-enabled/*;
    ...
    limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
    ...
}

/etc/nginx/sites-enabled/service.conf

server {
    ...
    location / {
        limit_conn conn_limit_per_ip 30;
        ...
    }        
    ...
}

log message

the size 10485760 of shared memory zone "conn_limit_per_ip" conflicts with already declared size 0 in /etc/nginx/nginx.conf

Caso 6 - remova limit_conn_zone e limit_conn

/etc/nginx/nginx.conf

http {
    ...
    include /etc/nginx/sites-enabled/*;
    ...
    limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s;
    ...
}

/etc/nginx/sites-enabled/service.conf

server {
    ...
    location / {
        limit_req zone=req_limit_per_ip burst=5 nodelay;
        ...
    }        
    ...
}

log message

unknown limit_req_zone "req_limit_per_ip" in /etc/nginx/sites-enabled/service.conf
    
por Chemical Programmer 17.01.2015 / 07:12

2 respostas

2

Solução

Mesclar /etc/nginx/sites-enabled/service.conf em /etc/nginx/nginx.conf . Em outras palavras, remova o arquivo service.conf e cole o bloco server no bloco nginx.conf do arquivo http . Aqui está o código.

/etc/nginx/nginx.conf

http {

    ..

    limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=2r/s;
    limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;

    ..

    server {

        ..

        location / {
            limit_req zone=req_limit_per_ip burst=5 nodelay;
            limit_conn conn_limit_per_ip 30;
        }

        ..
    }
}

Significado das variáveis e teste

  1. limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=2r/s + limit_req zone=req_limit_per_ip burst=5 nodelay

    • Definir memória compartilhada como 10 MB
    • Limitar solicitações por IP da seguinte forma
    • Definir solicitações máximas como rate * burst em burst segundos
    • Por exemplo, o valor máximo é 10 (= 2 * 5) solicitações em 5 segundos neste caso
    • Com nodelay opção: o Nginx retornaria a resposta 503 e não manipularia solicitações excessivas
    • Sem nodelay option: Nginx esperaria (sem resposta 503) e lidaria com solicitações excessivas com algum atraso
  2. limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m + limit_conn conn_limit_per_ip 30

    • Definir memória compartilhada como 10 MB
    • Limitar conexões por IP como 30 neste caso
    • Observe que o navegador normal faz de 2 a 8 conexões e o protocolo SPDY divide cada conexão
    • O Nginx retornaria a resposta 503 se a conexão exceder esse valor
por 12.06.2015 / 00:04
2

As diretivas limit_req_zone e limit_conn_zone só precisam preceder as diretivas correspondentes incluídas em /etc/nginx/sites-enabled/service.conf .

Portanto, no caso 1, só é necessário alterar /etc/nginx/nginx.conf para:

http {
    ...
    limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
    limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s;
    ...
    include /etc/nginx/sites-enabled/*;
    ...
}

Veja:

  1. link
  2. link
por 07.07.2015 / 20:00

Tags