Como evitar que a limitação do nginx entre em conflito com o modo de manutenção?

1

Usamos a HttpLimitReqModule mplule nginx para limitar a taxa e descobrimos que ela entra em conflito com o nosso " modo de manutenção "porque os dois componentes estão usando o link .

Quando a aceleração é ativada (por meio da diretiva limit_req ), o nginx normalmente teria um 503, mas infelizmente nosso local do modo de manutenção é usado, o que resulta em um 302 para nossa página de manutenção hospedada no Amazon S3. Um 302 para um pedido limitado não é um bom resultado .

Eu queria saber como as outras pessoas lidam com esse problema? Devo, por exemplo, usar um código de status diferente para nossa página de manutenção, mas, em caso afirmativo, o que?

Idealmente, para solicitações limitadas, não quero que nenhuma página seja veiculada, apenas um cabeçalho de resposta 503 - ela precisa ser a mais leve possível, pois o objetivo é impedir que o servidor fique sobrecarregado.

Para referência, esta é a configuração do nginx que usamos para o "Modo de Manutenção":

server {
    ...

    # Redirect processing of 503 error pages into a named location:
    error_page 503 @maintenance;

    # "Maintenance Mode" is off by default - Use a nginx variable to track state.
    set $maintenance off;

    # Switch on "Maintenance Mode" if a certain file exists.
    if (-f /var/www/mysite/shared/maintenanceON) {
        set $maintenance on;
    }

    if ($maintenance = on) {
        return 503; # 503 - Service unavailable
    }

    location @maintenance {
        # Redirect the request to our maintenance page in Amazon S3.
        rewrite ^(.*)$ http://mysite.s3-website-us-east-1.amazonaws.com/ break;
    }
    ...
    # Process the php files - pass to php-fpm.
    location ~ \.php {
        # Limit aggressive bots and crawlers to 30 requests per minute.
        limit_req zone=bots;

        fastcgi_pass 127.0.0.1:$fastcgi_port;
    }
    ...
    
por Tom 13.11.2013 / 13:06

2 respostas

2

Desde o nginx 1.3.15 existe uma diretiva " limit_req_status " que permite especificar o código de resposta http que o throttler retornará.

# Define a limit request zone called "bots" that will track requests by IP.
limit_req_zone $binary_remote_addr zone=bots:20m rate=15r/s;

# 429 = Too Many Requests
limit_req_status 429;

link RFC 6585 Códigos de status HTTP adicionais . Ele é usado, por exemplo, no Limitador de taxa da API REST do Twitter .

( A resposta de Michael também funciona porque na minha configuração o 503 é usado apenas internamente pelo nginx).

    
por 12.06.2014 / 13:11
4

Use um código de status diferente de 503 para o seu "modo de manutenção".

Como podemos ver claramente, os usuários não recebem um 503 quando você está usando o "modo de manutenção", então não há benefício em usar esse código de status internamente na sua configuração. Invente outro código (593?) E use isso.

Ou melhor ainda, pule o location extra e envie o rewrite diretamente quando o arquivo de manutenção existir.

    if (-f /var/www/mysite/shared/maintenanceON) {
        rewrite ^(.*)$ http://mysite.s3-website-us-east-1.amazonaws.com/ redirect;
    }
    
por 13.11.2013 / 17:08