На сервере установлена связка Django-UWSGI-Nginx. Иногда приходится обрабатывать GET запросы в которых количество символов ~ 40000 штук.
При таких запросах Nginx отдаёт 414 Request-URI Too Large. В настройки сервера внёс строчку large_client_header_buffers 4 6000k
Вроде как должно хватать. Но нет, стал получать ошибку 400 (Bad Request), что согласно документации Nginx означает "поле заголовка запроса превышает размер одного буфера".
Подскажите, пожалуйста, что нужно донастроить, чтобы проблема исчезла?
upstream django {
server unix:///home/***/*****.ru/***.sock;
}
server {
listen 123.430.123.249;
server_name 123.430.123.249;
charset utf-8;
large_client_header_buffers 4 6000k;
# максимальный размер загружаемых на сервер данных
client_max_body_size 75M;
# путь err лога
error_log /var/log/nginx/123.error.log;
# обслуживание медиа файлов и статики
location /media {
alias /home/***/****.ru/media; # расположение медиафайлов (при необходимости измените)
}
location /static {
alias /home/***/****.ru/static; # расположение статики (при необходимости измените)
}
location / {
uwsgi_pass django;
include /etc/nginx/uwsgi_params; # файл uwsgi_params, который мы только что взяли с github
uwsgi_read_timeout 3600s;
uwsgi_send_timeout 400s;
uwsgi_buffering on;
uwsgi_buffers 100 32k;
uwsgi_buffer_size 400k;
uwsgi_busy_buffers_size 400k;
uwsgi_max_temp_file_size 1024m;
}
}
Закомментил везде инструкцию large_client_header_buffers, почему-то перестал выдавать 414 Request-URI Too Large. Теперь при таких запросах только 400 (Bad Request).
Дампить трафик в бэкенд, к сожалению не умею. Попробовал tcpdump port 80. Какие-то ответы появляются, но что они означают, не знаю. Визуально выглядят так же, как и при обычном запросе.
Но если это вопрос про работает ли при стандартных get запросах, то ответ - да, работает.
Radren:
for i in {3000..40000}; do if [ $(curl http://КУДА/"$(seq 1 $i | sed '{:q;N;s/\n//g;t q}')" -w %{http_code} -so /dev/null) != '404' ]; then echo $i; fi; done
Ну и 404 замените на 200, если оно будет 200-кой отвечать на такие запросы.
Radren: писал же:
"
for i in {3000..40000}; do if [ $(curl http://КУДА/"$(seq 1 $i | sed '{:q;N;s/\n//g;t q}')" -w %{http_code} -so /dev/null) != '404' ]; then echo $i; fi; done
Ну и 404 замените на 200, если оно будет 200-кой отвечать на такие запросы.
"
с какой цифры начнет писать - там буфер и закончился.
for i in {3000..40000}; do if [ $(curl http://www.yandex.ru/"$(seq 1 $i | sed '{:q;N;s/\n//g;t q}')" -w %{http_code} -so /dev/null) != '404' ]; then echo $i;
По этому скрипту ничего не происходит. Указатель '>' ожидает ввода.
Влад Животнев: пробую так (копипаста из ssh):
for i in {3000..40000}; do if [ $(curl www.ya.ru"$(seq 1 $i | sed '{:q;N;s/\n//g;t q}')" -w %{http_code} -so /dev/null) != '404' ]; then echo $i; fi; done
Прощу прощения за некропост, но.. какие есть лимиты в 2318+32 символов? (-:
Сейчас столкнулся с 414 (nginx 1.10.0, php-fpm 7.0). До рефакторинга на post надо починить "чтобы работало".
Прошёлся скриптом – на 2318 ещё 200, на 2319 уже 414.
Изменения client_header_buffer_size и large_client_header_buffers вообще не меняют ситуацию. Весь остальной конфиг не изменённый из коробки (ubuntu 16 lts).
В какие ещё конфиги стоит посмотреть? При 414 в access логах пусто так что я предполагаю, что это всё-таки nginx.