Executando um servidor websocket e um servidor http no mesmo servidor

7

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 configuro o servidor para que eu possa atender a ambos?

Edit: Acabei de voltar a viu que a pergunta foi downvoted várias vezes, compreensivelmente, eu realmente não fiz a pergunta de forma clara. Me desculpe por isso. Eu fiz o meu due diligence embora. Vou tentar esclarecer o que eu estava perguntando, eu posso ter entendido mal alguns aspectos do protocolo websocket, nesse caso, por favor me corrija:

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

Pelo que li por aí, parece que esse mecanismo de atualização é gerenciado pelo servidor da web. Então, como eu configuro o nginx para lidar com esse processo?

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

    
por hndr 13.02.2014 / 23:28

3 respostas

15

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

Basicamente, assim como o nginx pode encaminhar solicitações diferentes para várias instâncias do aplicativo da 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 do 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 para http://hostname serão exibidas na página html usual, enquanto a conexão websocket para wss://hostname/socket será encaminhada para a instância websocket no mesmo servidor que estiver escutando na porta 8000.

    
por 31.01.2015 / 15:03
2

Um servidor não pode ter dois softwares diferentes ouvindo 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 saber mais sobre portas em Porta (redes 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 por meio do seu firewall.
  2. Use dois endereços IP diferentes - e vincule cada aplicativo aos seus respectivos endereços IP.

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

    
por 13.02.2014 / 23:30
0

Você tem duas opções:

  1. Vincule um a uma porta diferente (por exemplo, 8000)
  2. (se possível) adicione um endereço IP adicional ao servidor e ligue o servidor da web e o servidor websocket a IPs diferentes
por 13.02.2014 / 23:33