Faça com que o NGINX atualize automaticamente as conexões de websocket no proxy reverso

Faça com que o NGINX atualize automaticamente as conexões de websocket no proxy reverso

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 Upgradee apenas Connectionse 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 Upgradecabeçalho.

Portanto, em vez de adicionar uma diretiva específica Locationpara 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_upgradeestá vazio para solicitações que não sejam de websocket.

informação relacionada