Nginx Error 414: Request-URI Too Large — Настройка буферов URL
При отправке запроса с длинной строкой параметров (GET query parameters, сложные аналитические фильтры, длинные OpenID/OAuth токены в URL) сервер возвращает 414 Request-URI Too Large. В /var/log/nginx/error.log фиксируется: client sent too long URI in request line.
| Буфер Nginx | Размер по умолчанию | Назначение |
|---|---|---|
client_header_buffer_size | 1k | Базовый буфер для чтения строки запроса и стандартных заголовков |
large_client_header_buffers | 4 8k (4 буфера по 8 КБ) | Пул буферов для чтения сверхдлинных URI и объемных Cookie |
| Максимальная длина URI | 8 КБ (размер 1 буфера) | Превышение вызывает моментальный возврат статуса 414 |
- Ошибка возникает при интеграции с системами авторизации (SAML/OAuth/SSO) или при экспорте сложных фильтров поисковых систем.
- Обычные короткие запросы обрабатываются сервером без сбоев.
- Откройте конфигурационный файл
/etc/nginx/nginx.conf. - В блоке
httpили конкретном блокеserverувеличьте размер буферов для обработки больших заголовков и длинных URI:# Увеличиваем размер одного буфера до 16k или 32k: client_header_buffer_size 4k; large_client_header_buffers 4 32k; - Убедитесь, что суммарный размер одного буфера из
large_client_header_buffersпревышает максимальную предполагаемую длину вашего URL со всеми параметрами. - Проверьте валидность файла конфигурации:
sudo nginx -t - Перезагрузите веб-сервер для применения изменений:
sudo systemctl reload nginx.
POST с передачей параметров в теле запроса (JSON body).Частые вопросы (FAQ)
Почему нельзя сделать large_client_header_buffers бесконечно большим?
Выделение гигантских буферов на каждое соединение делает сервер уязвимым к DoS-атакам по исчерпанию оперативной памяти при массовом открытии сокетов злоумышленниками.
Может ли длина URI превышать размер одного буфера из large_client_header_buffers?
Нет. Строка URI обязана целиком помещаться в один буфер. Если длина URL больше размера одного буфера (например, 32k), Nginx вернет 414 даже при наличии 4 таких буферов.
В чем разница между 414 Request-URI Too Large и 400 Bad Request при переполнении заголовков?
Если переполняется строка самого URL запроса (Request-Line), отдается код 414. Если переполняются последующие HTTP-заголовки (например, огромные Cookie), Nginx отдает код 400.
Как проверить размер отправляемого URL в консоли?
Используйте команду: echo -n 'https://example.com/api?params...' | wc -c.