Мы используем HttpLimitReqModule nginx для регулирования скорости и обнаружили, что он конфликтует с нашим "Режим технического обслуживания"потому что оба компонента используют код состояния http 503.
Когда дросселирование активировано (через limit_req Директива), nginx обычно обслуживает 503, но, к сожалению, используется наше местоположение режима обслуживания, что приводит к 302 на нашей странице обслуживания, размещенной на Amazon S3. 302 для регулируемого запроса - не лучший результат.
Мне было интересно, как другие люди решают эту проблему? Должен ли я, например, использовать другой код состояния для нашей страницы обслуживания, но если да, то что?
В идеале для регулируемых запросов я не хочу, чтобы обслуживалась какая-либо страница, только заголовок ответа 503 - он должен быть как можно более легким, потому что весь смысл состоит в том, чтобы предотвратить перегрузку сервера.
Для справки, это конфигурация nginx, которую мы используем для «Режима обслуживания»:
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;
}
...
Для «режима обслуживания» используйте код состояния, отличный от 503.
Как мы можем ясно видеть, пользователи на самом деле не получают 503, когда вы все равно используете «режим обслуживания», поэтому нет никакой пользы от использования этого кода состояния внутри вашей конфигурации. Придумайте другой код (593?) И используйте его.
Или еще лучше, пропустите лишнее location
и просто отправьте rewrite
непосредственно при наличии файла обслуживания.
if (-f /var/www/mysite/shared/maintenanceON) {
rewrite ^(.*)$ http://mysite.s3-website-us-east-1.amazonaws.com/ redirect;
}
Начиная с nginx 1.3.15 есть значок "limit_req_status"директива, которая позволяет указать код ответа HTTP, который будет возвращать регулятор.
# 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;
http статус 429 означает "Too Many Requests
"- Этот код был принят в RFC 6585 Дополнительные коды состояния HTTP. Используется, например, на Ограничитель скорости Twitter REST API.
(Ответ Майкла также работает, потому что в моей конфигурации 503 используется только внутри nginx).