2017-11-26 1 views
0

개인 네트워크에 일부 MySQL 호스트가 있으며 리버스 프록시 서버를 통해 mysql-mysql 클라이언트에 연결하기 위해 리버스 프록시 서버 (예 : nginx)를 사용하려고합니다.여러 개의 mysql 호스트에 대해 DNS를 기반으로하는 역방향 프록시

예 더 나은 내 대답을 이해하기 :

내가했습니다 가정 :

  • 의 IP yyy.1와 MySQL 서버
  • 의 IP yyy.2와 MySQL 서버

둘 다 ip XXX 인 프록시 서버의 네트워크에 있으며, XXX에 DNS mysql-server1.com 및 mysql-server2.com을 연결합니다.

내 목표는 내가 포트 3306mysql-server1.com를 호출하여 XXX에 연결하는 MySQL의 클라이언트를 사용할 때 MySQL 서버에 yyy.1를 연결하고, similare 때 시도 mysql을 - 서버 2. com에 포트 3306.

nginx의 문제는 서버 이름에 의해 TCP 요청을 구분할 수 없다는 것입니다. 따라서 XXX 서버에서 하나의 포트를 foreach mysql 서버와 연결해야합니다. 그러나 이것은 포트를 변경해야 할 때마다 또한 mysql 클라이언트 설정에서, 그리고 나는 이것을 원하지 않는다!

이를 수행 할 수있는 프록시 서버가 있습니까? 요청을 라우팅하기 위해 IP 테이블을 사용할 수 있습니까? mysql-server1.com:3306 to localhost : [일부 포트], 여기서 프록시 설정에서 [some port]를 사용하여 서버에 요청을 전달할 수 있습니다. yyy. 1?

답변

1

이것은 불가능합니다.

MySQL 클라이언트/서버 프로토콜에서 클라이언트는 연결하려는 호스트 이름을 절대로 식별하지 않습니다. HTTP (Host 헤더 포함)와 같은 다른 프로토콜과 달리 클라이언트가 DNS에서 IP 주소를 확인하는 데 사용한 원래 이름은 보존되지 않습니다. 서버가 TLS를 지원하는지 여부를 알아 내기 위해 클라이언트가 서버 기능 플래그를 읽을 때까지 MySQL 연결의 TLS 협상이 시작되지 않기 때문에 TLS SNI도 사용할 수 없습니다. 클라이언트가 TLS로 연결을 전환하라는 메시지가 표시되면이 물론, 이미 연결이 이루어진 후입니다.

MySQL 클라이언트/서버 프로토콜에서 서버는 항상 먼저 대화합니다.

유일한 옵션은 프록시 시스템이 각 IP를 가리키는 DNS 호스트 이름으로 여러 IP 주소에서 수신 대기하고 클라이언트가 연결된 주소를 사용하여 사용할 서버를 결정하는 것입니다.

또는 각 프록시 인스턴스는 별도의 포트에서 수신 대기합니다.

프로토콜 디자인은 이름 기반 가상 호스팅을 방지합니다.

+0

감사합니다. 난 문제가 프로토콜에있을 수 있다고 생각하고 당신의 확인은 매우 소중합니다! –