у меня есть сервис, который называется image-api
. image-api доступен в модуле, но nginx возвращает код состояния 426
после запуска этой команды вернуть ожидаемые данные
curl image-api.gateways.svc.cluster.local:8000
но nginx возвращает код состояния 426.
если заменить собственный URL-адрес image-api на URL-адрес istio, тогда nginx вернет код состояния 200.
/etc/nginx.nginx.conf
worker_processes 8;
events {
worker_connections 1024;
}
http {
resolver kube-dns.kube-system valid=10s;
server_tokens off;
server {
listen 8080;
location ~ ^/(\w+) {
# ISTIO URL
proxy_pass http://image-api.gateways.svc.cluster.local:8000$request_uri;
# MAIN URL
# proxy_pass http://image-api.main.svc.cluster.local:8000$request_uri;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
Как указано в документе:
Код состояния 426 возникает, когда клиент пытается обновить подключение к более новой версии протокола, но сервер отказываясь сделать это.
Это может произойти по нескольким причинам, в том числе:
Несовместимость между клиентской и серверной версиями протокола.
Сервер может не поддерживать запрошенную версию протокола.
Сервер может быть настроен на разрешение использования только определенных версий протокола.
Возможно, на сервере возникли технические проблемы или проводятся работы по техническому обслуживанию, из-за которых он не может обновить соединение.
Вам необходимо обновить версию протокола HTTP в конфигурации NGINX, как показано здесь:
Этот маршрут предназначен для устаревшего API, который включил кэш NGINX по соображениям производительности, но в конфигурации прокси этого маршрута отсутствует общая конфигурация proxy_http_version 1.1, которая по умолчанию использует HTTP 1.0 для всех восходящих потоков NGINX.
И Envoy вернет HTTP 426, если запрос HTTP 1.0.
Спасибо @fariya-rahmat. его ответ помогает мне найти ответ.
добавить proxy_http_version 1.1
необходимо, но этого недостаточно.
основная проблема в том, что proxy_set_header Host $host;
envoy proxy
обнаруживает целевую службу по имени хоста, и это неправильно. если удалить proxy_set_header
, имя хоста устанавливается автоматически на основе proxy_pass
.