У меня есть несколько сервисов, которые я размещаю за обратным прокси NGINX, который был достаточно прост в настройке, но я столкнулся с проблемой с веб-сокетами. Достаточно просто указать одну конечную точку с местоположением, которое включает
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
Проблема в том, что есть много конечных точек с веб-сокетами. И мы продолжаем находить новые вещи, которые не работают, потому что есть еще одна конечная точка веб-сокетов, о которой мы не знали.
Есть ли способ установить заголовок Upgrade
и только Connection
если клиент его передает? Если я включу эти две строки для всей службы, она попытается обновитьсякаждыйсоединение, а не только веб-сокеты.
решение1
Только что возникла та же проблема, боролся с операторами if в конфигурации nginx и реализовал следующие директивы:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
Ничего не делайпока неклиент установил Upgrade
заголовок.
Поэтому вместо добавления отдельной Location
директивы для каждой конечной точки веб-сокета, вы можете просто создать глобальную:
server {
listen 443 ssl;
server_name my-server.example
location / {
proxy_pass http://local-service.example/;
proxy_http_version 1.1;
proxy_read_timeout 86400s;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Этот прокси-сервер обрабатывает любой HTTP-запрос, а также позволяет веб-сокетам работать для всего пространства имен. Причина, по которой он работает, заключается в том, что $http_upgrade
он пуст для не-веб-сокетных запросов.