Tenho vários serviços que estou colocando atrás de um proxy reverso NGINX, que foi bastante simples de configurar, mas tive um problema com websockets. Um único endpoint é simples o suficiente para ser especificado com um local que inclui
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
O problema é que existem muitos endpoints com websockets. E continuamos encontrando coisas novas que não funcionam porque há outro endpoint de websocket que não conhecíamos.
Existe uma maneira de definir o cabeçalho Upgrade
e apenas Connection
se o cliente passar por ele? Se eu incluir essas duas linhas para todo o serviço, ele tentará atualizartodoconexão, não apenas os websockets.
Responder1
Acabei de ter o mesmo problema e estava lutando contra instruções if na configuração do nginx e percebi estas diretivas:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
Não faça nadaa menos queo cliente definiu um Upgrade
cabeçalho.
Portanto, em vez de adicionar uma diretiva específica Location
para cada endpoint do websocket, você pode simplesmente criar uma diretiva global:
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";
}
}
Este proxy atende a qualquer solicitação HTTP e também faz com que os websockets funcionem para todo o namespace. A razão pela qual funciona é porque $http_upgrade
está vazio para solicitações que não sejam de websocket.