Отделить логи от limit_req_zone в nginx
Здесь у нас есть фрагмент текущей конфигурации nginx:
limit_req_zone $binary_remote_addr zone=one:32m rate=2r/s;
limit_req zone=one burst=10;
error_page 500 501 502 503 504 =503 /offline.html;
location = /offline.html {
root /path/to;
add_header Cache-Control no-cache;
add_header Retry-After 3600;
}
Есть ли способ отделить "запускающую" зону limit_req (которая вызывает код ошибки 503, который может быть вызван, например, и с помощью apache backend) к другому файлу журнала (скорее по умолчанию /var/log/nginx/error.log).
Да, в 1.3.15 появилась новая функция
limit_req_status xxx;
Но это было реализовано несколько дней назад в ветке trunc, и, похоже, не слишком помогает. Или я что-то упустил? Наличие nginx 1.2.7 атм.
2 ответа
Я сделал что-то подобное:
limit_req_zone $binary_remote_addr zone=one:32m rate=2r/s;
error_page 500 501 502 504 =503 @offline50x;
error_page 503 =503 @offline503;
error_page 404 =503 @offline404;
server {
listen 80;
root /usr/share/nginx/html;
index index.html index.htm;
server_name localhost;
location / {
limit_req zone=one burst=10;
}
location @offline404 {
access_log /tmp/404;
try_files /offline.html =503;
}
location @offline50x {
access_log /tmp/50x;
try_files /offline.html =503;
}
location @offline503 {
access_log /tmp/ddos;
try_files /offline.html =503;
}
Похоже, 503 генерируется limit_req. Так, когда особенность
limit_req_status xxx;
будет реализован в стабильном, будет проще разделить ошибки такого рода на отдельный файл.
Я не вижу как limit_req_status
связано с вашим вопросом вообще - это не так.
Вы можете попробовать выполнить то, что вам нужно, с помощью следующих директив:
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
http://nginx.org/en/docs/ngx_core_module.html
Вы бы поднять log_level
для лимитных запросов, и будет указывать желаемый уровень журнала с error_log
, Обратите внимание, что если вы сделаете это, вероятно, будут сброшены другие сообщения об ошибках Если это произойдет, и эффект нежелателен, то вы можете попробовать два error_log
директивы на том же уровне (например, в том же location
), с разными уровнями журнала.