Nginx обратные прокси-серверы
nginx теперь поддерживает прокси-серверы, но мне не удалось найти информацию о том, как это сделать, не имея отдельного блока location, который применяется к URI, на которых используются веб-сайты.
Я видел некоторых людей, рекомендующих некоторые варианты этого подхода:
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://host:port;
}
Будет ли это правильным способом для прокси-сервера стандартного HTTP, а также для websockets? Я не хочу, чтобы заголовок Upgrade или Connection был установлен на "upgrade", если только это не было отправлено браузером, но эти строки proxy_set_header необходимы для работы web-камер. Почему nginx просто пересылает исходные заголовки Upgrade/Connection?
Я экспериментировал с этим и обнаружил, что nginx не проксирует заголовок Upgrade и изменяет заголовок Connection на "close" из "upgrade", если он работает без двух строк proxy_set_header. С ними Connection является "обновлением" для запросов без websocket, что также плохо.
Спасибо:)
Ответы
Ответ 1
Почему nginx просто не пересылает исходные заголовки Upgrade/Connection?
Из официальной документации : поскольку "Upgrade" является заголовком "hop-by-hop" , он не передается от клиента к прокси-серверу сервер
См. RFC 2616.
Я не хочу, чтобы заголовок Upgrade или Connection был установлен на "upgrade", если только то, что отправил браузер,
Существует также пример:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
...
location /chat/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
Соединение - это "обновление" для запросов, отличных от websocket, что также плохо.
Знаете ли вы, что означает заголовок Connection
? Просто цитата из RFC: для каждого токена подключения в этом поле удалите все поля заголовка из сообщения с тем же именем, что и токен соединения.
Как это может быть плохо?