Executando um servidor WebSocket e um servidor HTTP no mesmo servidor

8

Estou usando o nginx para servir uma instância do aplicativo PHP e, ao mesmo tempo, executando um aplicativo Ratchet para ouvir uma conexão de websocket. O problema é que ambas as instâncias estão usando a mesma porta (80).

Como faço para configurar o servidor para poder servir aos dois?

Edit: Acabei de voltar para ver que a pergunta foi rebaixada várias vezes, compreensivelmente, eu realmente não a fiz de maneira clara. Me desculpe por isso. Eu fiz a minha diligência embora. Tentarei esclarecer o que estava perguntando; talvez eu tenha entendido mal alguns aspectos do protocolo websocket; nesse caso, corrija-me:

Sei bem que só pode haver um processo ouvindo uma porta específica. O que estou realmente tendo algum problema é a coisa toda sobre websocket. Pelo que entendi, uma solicitação de websocket começa com um handshake HTTP, após o qual haverá mecanismo para 'atualizar' essa sessão para a porta específica.

Pelo que li, parece que esse mecanismo de atualização é tratado pelo servidor da web. Então, como faço para configurar o nginx para lidar com esse processo?

Em suma, a única coisa que me preocupa em executar o servidor websocket em uma porta diferente de 80 é a possibilidade de a porta estar bloqueada. Esta preocupação é infundada? Algum conselho sobre como eu deveria estar configurando isso?

hndr
fonte
that_guy - consulte serverfault.com/help/how-to-ask - certifique-se de fazer sua devida diligência antes de postar. Enquanto gostamos de pessoas fazendo perguntas, também gostamos de fazer o dever de casa.
ETL

Respostas:

16

Uma pergunta terrivelmente escrita, mas o termo que eu procurava era proxy reverso.

Basicamente, assim como o nginx pode encaminhar solicitações diferentes para várias instâncias do aplicativo Web com base no caminho ou no nome do host, ele também pode ser configurado para "encaminhar" a solicitação para uma instância do servidor Websocket. por exemplo:

location /socket {
    proxy_pass http://websocket;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
}

upstream websocket{
    server localhost:8000;
}

map $http_upgrade $connection_upgrade {
    default Upgrade;
    '' close;
}

As solicitações HTTP http://hostnameserão veiculadas na página html usual, enquanto a conexão com o websocket wss://hostname/socketserá encaminhada para a instância do websocket no mesmo servidor que está atendendo na porta 8000.

hndr
fonte
Ajuda enorme !! Thanxx
gunjot singh
Outras opções úteis dentro desse bloco de localização seriam proxy_read_timeoute proxy_write_timeoutevitar desconexões por inatividade.
Vi.
Não resolveu o problema, ajuda necessária!
Nɪsʜᴀɴᴛʜ
2

Um servidor não pode ter dois softwares diferentes escutando na mesma porta / endereço IP. Caso contrário, como o tráfego seria roteado para o Aplicativo XYZ se vários aplicativos pudessem ser vinculados à mesma porta?

Você pode aprender mais sobre portas em Port (rede de computadores)

O que você precisa fazer é uma das seguintes opções:

  1. Use uma porta diferente para um dos dois aplicativos e permita isso através do seu firewall.
  2. Use dois endereços IP diferentes - e vincule cada aplicativo aos respectivos endereços IP.

Seu firewall só precisa ser configurado de acordo com o que você configurou.

ETL
fonte
Voce pode fornecer mais informação? isso causaria problemas com o firewall? não é uma das vantagens do websocket evitar isso?
hndr
5
A porta de compartilhamento é possível, pois você pode ter o servidor HTTP e o servidor Websocket em um processo.
Pacerier
0

Você tem duas opções:

  1. Ligue um a uma porta diferente (por exemplo, 8000)
  2. (se possível) adicione um endereço IP adicional ao servidor e vincule o servidor web e o servidor websocket a IPs diferentes
Teun Vink
fonte