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: для каждого токена подключения в этом поле удалите все поля заголовка из сообщения с тем же именем, что и токен соединения.

Как это может быть плохо?