Como fazer proxy de vários fluxos de tcp em uma porta com nginx

3

Com a diretiva nginx http, você pode ter vários servidores na mesma porta com nomes diferentes:

server {
    listen       80;
    server_name server1.example.com;
    location / {
      proxy_pass http://server1.example.com;
    }
}
server {
    listen       80;
    server_name server2.example.com;
    location / {
      proxy_pass http://server2.example.com;
    }
}

É possível ter nginx proxy vários servidores mysql na mesma porta com nomes diferentes, como você pode com http? Eles não fazem parte de um cluster nem nada. As tabelas são diferentes e não relacionadas.

stream {
  upstream db1.example.com {
    server db1.example.com:3306;
    #server_name db1.example.com; "server_name" directive is not allowed here
  }
  upstream db2.example.com {
    server db2.example.com:3306;
  }

  server {
    listen 3306;
    proxy_pass db1.example.com;
  }
  #duplicate "3306" address and port pair
  #server { listen 3306; proxy_pass db2.example.com; }


}
    
por joels 13.12.2016 / 23:24

2 respostas

3

Sim, se o nginx foi compilado com --with-stream . link

Aqui está um dos exemplos com a mesma porta:

upstream stream_backend {
    hash $remote_addr;

    server backend1.example.com:12345;
    server backend2.example.com:12345;
    server backend3.example.com:12346;
}

Segunda atualização:

Você obviamente não pode fazer algo assim:

stream {
  upstream db1.example.com {    
    server db1.example.com:3306;
    #server_name db1.example.com; "server_name" directive is not allowed here
  }
  upstream db2.example.com {
    server db2.example.com:3306;
  }

  server {
    listen 3306;
    proxy_pass db1.example.com;
  }
  #duplicate "3306" address and port pair
  #server { listen 3306; proxy_pass db2.example.com; }    
}

Como o proxy nginx para upstream db1.example.com está competindo com db2.example.com para pacotes na porta 3306. Portanto, você precisa ter o proxy para db1.example.com listen ing em outro port do que o proxy para %código%. Caso contrário, o nginx não saberia rotear os pacotes de e para os dois upstreams. Desculpas por entender mal sua postagem original. db2.example.com não é permitido nas definições de fluxo porque, diferentemente dos cabeçalhos http, não há metadados adicionais no pacote tcp / udp que identifiquem qual DNS foi usado para endereçar o pacote ao nginx.

    
por 14.12.2016 / 05:26
0

Eu tenho feito uma grande pesquisa, infelizmente, isso não é possível, já que o TCP não tem nenhum conceito de nomes de servidores, então isso não é possível. Ele só funciona em HTTP porque o cliente envia o nome do host que ele está tentando acessar como parte da solicitação, permitindo que o NGINX faça a correspondência com um bloco de servidor específico.

Muito perturbador, pois eu realmente gostaria de direcionar o tráfego TCP com base na URL

    
por 21.10.2018 / 11:57