Похоже, мы столкнулись с ошибкой из-за того, что Amazon ELB усекает длинный (более 1000 символов) URL-адрес.
Я просмотрел обычных подозреваемых, но не нашел обсуждения ограничений длины URL для Amazon ELB.
Есть ли ограничение на длину URL-адресов Amazon? Если да, то есть ли способ увеличить этот лимит?
Я протестировал это с помощью простого сценария bash на домене, который у меня работает за ELB:
S='a';
URL='http://example.com/?foo=';
while true;
do
echo $URL$S | wc -c;
curl -I "$URL$S";
S=$S$S;
done
Некоторое время это работало нормально:
2081
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Date: Tue, 05 Feb 2013 15:01:44 GMT
Server: Apache/2.2.22 (Ubuntu)
Vary: Accept-Encoding
Connection: keep-alive
4129
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Date: Tue, 05 Feb 2013 15:01:46 GMT
Server: Apache/2.2.22 (Ubuntu)
Vary: Accept-Encoding
Connection: keep-alive
Но потерпел неудачу, когда преодолел барьер в 8192 длины:
8225
HTTP/1.1 414 Request-URI Too Large
Content-length: 337
Content-Type: text/html; charset=iso-8859-1
Date: Tue, 05 Feb 2013 15:01:47 GMT
Server: Apache/2.2.22 (Ubuntu)
Vary: Accept-Encoding
Connection: keep-alive
16417
HTTP/1.1 414 Request-URI Too Large
Content-length: 337
Content-Type: text/html; charset=iso-8859-1
Date: Tue, 05 Feb 2013 15:01:47 GMT
Server: Apache/2.2.22 (Ubuntu)
Vary: Accept-Encoding
Connection: keep-alive
Неудачные запросы были зарегистрированы Apache в другом файле, поскольку GET
строка идет до Host:
заголовок и, следовательно, Apache никогда не определял, какой виртуальный хост использовать.
Тем не менее, это был все еще отвечает Apache, а не ELB, даже до более 128 КБ за один GET
строка. Полный запрос 128 КБ был зарегистрирован в файле журнала Apache по умолчанию. После 256 КБ curl
не удалось обработать запрос.
Не похоже, что в Amazon ELB есть ограничение на длину URL.
Мы получили следующий ответ от AWS Support (форматирование мое):
Обратите внимание, что существует ограничение на длину URI для всех балансировщиков нагрузки, и, поскольку вы получаете ошибку 414, ваш запрос GET должен превышать указанный ниже предел.
Для ALB существует разница в ограничениях заголовков HTTP для заголовков HTTP / 1.x и заголовков HTTP / 2. См. Документацию по Ограничения заголовка HTTP.
Заголовки HTTP / 1.x для балансировщиков нагрузки приложений имеют следующие ограничения по размеру:
Заголовки HTTP / 2 для балансировщиков нагрузки приложений имеют следующие ограничения по размеру:
Единственное ограничение, которое накладывает CLB, - это длина HTTP-команды (GET, POST и т. Д.), И она должна быть 127 байтов или меньше, любой глагол, больший, чем это, приведет к тому, что CLB вернет HTTP-ошибку 405 «METHOD_NOT_ALLOWED» .
Поскольку NLB функционирует на четвертом уровне модели взаимодействия открытых систем (OSI), ограничений для HTTP-заголовка нет. Он пытается открыть TCP-соединение с выбранной целью на порту, указанном в конфигурации приемника.