HAProxy 백엔드 - 원격 서버에 연결하는 방법은 무엇입니까?

HAProxy 백엔드 - 원격 서버에 연결하는 방법은 무엇입니까?

여러분 좋은 오후입니다,

저는 웹호스팅 초보인데 아직도 바다 한가운데에서 수영하는 법을 배우는 기분이에요. 내가 원하는 것은 백엔드의 원격 서버로 요청을 전달하도록 HAproxy를 설정하는 것입니다. 이 서버는 SSL이며 Cloudflare 뒤에 있습니다.

인터넷 전체를 검색했지만 지금까지 내 질문에 대한 명확한 답변을 찾을 수 없습니다. haproxy 이미지를 가져와서 외부 haproxy.cfg 파일이 있는 컨테이너에서 사용합니다. 백엔드에서 서버로 사용할 수 있는지, 네트워크에서 떨어진 서버(로컬 아님)를 사용할 수 있는지, 그리고 이 통신에 SSL을 사용하는 방법에 대해 자세히 설명하는 사람은 아무도 없습니다. 혹시 이에 대해 아시는 분이 계시다면, 이것이 가능하고 방법에 대해 답변해 주시면 감사하겠습니다.

저는 현재 서버 NginxProxyManager 컨테이너를 사용하고 있으며 HAProxy의 로드 밸런싱 기능을 연구하고 있습니다. 지금까지 로컬 컨테이너 주위에서 성공적으로 라운드 로빈을 수행했지만 서버가 떨어져 있는 경우 항상 "Down for Maintenance" 통계에서 응답을 받습니다. 또한 ha-proxy 컨테이너의 터미널에서 wget 명령을 실행했는데 외부 세계를 볼 수 있습니다. HAProxy 컨테이너 Google 내부에서 핑하면 핑됩니다. 모든 컨테이너는 브리지 네트워크와 docker의 사용자 생성 네트워크(브리지 드라이버) 모두에 연결됩니다. 그래서 나는 완전히 혼란스러워졌습니다. 따라서 주요 질문은 이것이 가능합니까? 그리고 가능하다면 다음 시나리오가 가능합니까(?):

  1. 클라이언트가 HAProxy에 https 요청을 합니다.
  2. 라운드 로빈을 사용하면 로컬 컨테이너와 원격 서버 간을 롤링하고 싶습니다.
  3. "원격 서버" 라운드에 도달하면 이것이 SSL 요청이라는 정보와 함께 백엔드에서 올바른 서버의 호스트(재작성됨 - 로컬 컨테이너에 대해 이미 수행할 수 있음)를 보내고 싶습니다.
  4. 그런 다음 NginxProxyManager 또는 다른 HAProxy는 이를 연결된 컨테이너로 전환하고 응답을 받아 (첫 번째) HAProxy로 다시 보내고 후자는 클라이언트로 보냅니다.

이것이 가능한지조차 확실하지 않습니다. 다음을 살펴보십시오. 로컬 컨테이너에서는 작동하지만 원격 서버에서는 작동하지 않습니다. 요청을 보내고 Host 헤더의 이름을 다시 씁니다. 다음은 haproxy.cfg입니다.

global
        maxconn     4000
        daemon

defaults
        mode    http
        default-server init-addr last,libc,none
        option  http-keep-alive
        option  redispatch
        retries 3
        timeout connect 10s
        timeout client  1m
        timeout server  1m
        option forwardfor 


resolvers mynameservers
   nameserver ns2 8.8.8.8:853


frontend stats
        bind *:8500
        stats enable
        stats uri /
        stats refresh 10s


frontend ft
        bind 0.0.0.0:443 ssl crt /usr/local/etc/haproxy/ha_trial.pem  
        default_backend bt2

backend bt2
        balance roundrobin
        http-send-name-header Host        
        server web1 web1:8080 check
        server web2 web2:8080 check
        server web3 web3:8080 check        
        server myback.mysite.com myback.mysite.com:443 ssl verify none resolvers mynameservers
## the latter does not work - it ends at down for maintenance in statistics and in logs it says: Layer6 invalid response, info: "SSL handshake failure" while it is "verify none"

저와 특히 저와 같은 모든 사람들이 알고 있는 답변 및/또는 참고 자료가 있으면 도움을 주시면 매우 감사하겠습니다.

감사합니다

답변1

이 사례는 HAProxy docker 이미지가 QUIC를 활성화하지 않았고 백엔드가 기본적으로 QUIC를 지원하는 Cloudflare 뒤에 있기 때문에 정확히 SSL 핸드셰이크 실패 사례입니다. https 통신 프로토콜에서 QUIC가 활성화되지 않은 다른 도메인을 사용하면 모든 것이 매력적으로 작동합니다. 도대체 왜 프론트엔드와 백엔드를 다르게 처리하는지 궁금합니다??? 프런트 엔드에서는 QUIC를 이해합니다(? - 또는 귀하와 cloudflare 사이의 QUIC이고 서버에 대한 cloudflare는 다른 암호화입니까?). 하지만 백엔드에서 연결하는 것은 불가능합니까?

간단히 말해서:

  1. HAProxy 도커 이미지가 QUIC를 활성화하지 않았습니다. 적어도 제가 가지고 있는 것(알파인)
  2. Cloudflare는 기본적으로 QUIC를 통신 프로토콜로 활성화했으며 이를 변경할 수 없습니다.
  3. 이 두 가지를 협력하는 것은 분명히 불가능하며 "SSL 핸드셰이크 실패"가 발생합니다.
  4. 이 문제를 해결하려면 최신 기술 통신 프로토콜을 지원하지 않는 공급자를 사용하세요. 현재로서는 이것은 완화일 뿐이며 해결책은 없습니다.
  5. HAProxy 사이트는 QUIC 지원을 통해 github에서 HAProxy를 다시 컴파일하는 방법을 제공하며 나중에 연구하겠습니다...

관련 정보