Como encaminhar pedidos não-http na porta 80 para outra porta?

1

Há um servidor da Web nginx ouvindo as portas 80 e 443. Eu gostaria de processar todas as solicitações do link como de costume e encaminhar todas as solicitações não-http para outra porta (digamos, 1234).

A minha pergunta é muito semelhante a uma já respondida em stackoverflow: É possível encaminhar o pedido de conexão NON-http para outra porta no nginx Talvez eu tenha entendido mal a resposta mais votada, mas quando adiciono algo assim ao nginx.conf:

stream {
    upstream backend {
        server example.com:1234;
    }

    server {
        listen 80;
        proxy_pass backend;
    }
}

Eu recebo o erro (esperado) bind() to 0.0.0.0:80 failed (98: Address already in use) .

    
por semyonfilippov 25.06.2017 / 16:57

2 respostas

0

Como @AlexeyTen mencionou em seu comentário, sslh é a ferramenta certa para essa finalidade. Ele tem suporte embutido para protocolos HTTP, SSL, SSH, OpenVPN, tinc e XMPP e também suporta testes de regex personalizados.

Por exemplo, para fazer sslh encaminhar solicitações http para nginx e solicitações não http para ejabberd, é suficiente substituir em todos os hosts virtuais do nginx

    listen 80;

com

    listen 127.0.0.1:88;

( também é possível usar listen 127.0.0.1:80 if sslh com escutar a porta 80 somente em ip específico, ou usar por exemplo listen 88 ), em seguida, instalar sslh e editar seu opções padrão:

RUN=yes
DAEMON_OPTS="--numeric --user sslh --listen 0.0.0.0:80 --http 127.0.0.1:88 --xmpp 127.0.0.1:5222 --pidfile /var/run/sslh/sslh.pid"

( /etc/default/sslh no debian). E, finalmente, apenas (re) inicie os serviços:

systemctl restart nginx
systemctl start sslh

Se a opção --transparent para sslh for necessária, haverá algumas etapas adicionais - elas são bem documentadas no github .

    
por 05.07.2017 / 17:35
0

O nginx só pode fornecer um tipo de serviço para uma porta ao mesmo tempo.

Então, essa configuração funcionará:

http {
    server {
        listen 80;

        server_name example.com;
        ...
    }
}

stream {
    server {
        listen 81;
        proxy_pass backend;
    }

    upstream backend {
        server 127.0.0.1:12345;
    }
}

Você não pode usar a mesma porta nos blocos stream e http , já que o nginx não tem como distinguir o tipo de tráfego.

    
por 26.06.2017 / 04:58