Gately v0.5.2 출시
2026년 10월 20일
공인 IP에는 443 포트가 하나뿐인데 VPN, 웹사이트, 각종 프록시가 모두 이 포트를 쓰고 싶어 합니다. 흔한 해법은 앞단에 haproxy나 nginx stream을 두어 도메인별로 나누고, 뒤에 nginx를 두어 리버스 프록시를 맡기는 것입니다. 프로그램 세 개에 설정도 세 벌입니다. v0.5.2에서는 Gately 하나로 도메인별 라우팅, 리버스 프록시, TOTP 로그인을 모두 처리하며, 속도도 haproxy + nginx에 뒤지지 않습니다.
SNI 라우팅: 여러 서비스가 443 포트 공유
포트 포워딩에 「SNI 라우팅」 모드가 추가되었습니다(Telegram 그룹 사용자의 요청, #3).
- TLS 핸드셰이크에서 도메인을 읽고 도메인별로 고른 백엔드에 연결 전체를 그대로 전달합니다. 여기서는 TLS를 복호화하지 않으므로 인증서는 백엔드에 그대로 둡니다.
- 도메인은 정확한 이름,
*.example.com와일드카드,*를 쓸 수 있습니다. 일치하는 항목이 없거나 SNI가 없거나 TLS가 아닌 연결은 기본 대상으로 가고, 기본 대상이 없으면 연결을 닫습니다. - PROXY 프로토콜 v1 / v2를 라우트마다 설정하므로 백엔드가 실제 클라이언트 주소를 받습니다.
- 규칙 카드에 각 라우트와 기본 대상이 받은 연결 수가 표시됩니다.
haproxy를 대체하는 전체 예시는 포트 포워딩을 참고하세요.
웹 서비스로 nginx 대체
- 경로별 백엔드: 경로 접두사를 다른 백엔드 그룹으로 보내거나 그 경로에만 요청 헤더를 추가합니다. nginx의
location과 같습니다. - 포워드 인증: 인증을 Authelia 같은 서비스에 맡깁니다.
auth_request와 같으며/admin같은 경로만 보호할 수 있습니다. - HTTPS 백엔드에 접속 도메인을 SNI로 전달: 백엔드가 SNI로 라우팅할 때 필요합니다. 예: frp의
vhost_https. - 리다이렉트의
{host}:https://{host}규칙 하나로 모든 도메인의 HTTP를 HTTPS로 보냅니다. - 정적 사이트: 확장자 없는 URL(VitePress 등), 사용자 정의 404 페이지, 응답 헤더.
- 사이트를 수정해도 리스너를 재시작하지 않음: 열린 연결(WebSocket 포함)이 유지되고 통계도 보존되며, 새 설정이 잘못되었으면 기존 설정으로 계속 서비스합니다.
nginx 설정을 옮기는 방법은 웹 서비스의 「haproxy와 nginx 대체」를 참고하세요.
공유 사용자: TOTP와 통합 로그인
「웹 서비스 → 전역 설정」에서 공유 사용자를 추가하고 사용자마다 TOTP를 켠 뒤(QR 코드 스캔), example.com 같은 통합 로그인 도메인을 설정하면 한 사이트에서 로그인할 때 그 아래 모든 사이트에 로그인됩니다. 사이트에서는 「공유 사용자 사용」만 체크하면 됩니다. 이것 때문에 Authelia를 따로 운영하고 싶지 않다면 내장 기능을 쓰면 됩니다.
성능
한 대의 기기에서 각각 CPU 2코어로 제한하고 실제 서버의 설정(도메인 90개, PROXY 프로토콜 v2)으로 haproxy + nginx와 Gately를 비교했습니다.
| 시나리오 | haproxy + nginx | Gately |
|---|---|---|
| HTTPS 리버스 프록시, keep-alive, 1 KB 응답 | 14,767 req/s | 26,434 req/s |
| 요청마다 새 TLS 연결 | 2,557 req/s | 3,448 req/s |
| 1 MB 응답 | 1,053 MB/s | 1,585 MB/s |
| TLS 스트림 SNI 패스스루 | 2,927 MB/s | 4,962 MB/s |
| SNI 패스스루, 초당 새 연결 수 | 6,334 /s | 6,266 /s |
메모리는 Gately가 약 110 MB, haproxy와 nginx가 합쳐서 약 42 MB를 사용합니다. 측정 방법, 전체 수치, 주의 사항은 README에 있습니다.
업그레이드 참고 사항
- Docker: 새 이미지를 받은 뒤 컨테이너를 다시 만듭니다. 바이너리: 실행 파일을 교체한 뒤 재시작합니다.
- v0.5.2 이전 버전은 SNI 라우팅 규칙을 인식하지 못합니다. 다운그레이드하기 전에 이런 규칙을 비활성화하거나 삭제하세요. 이전 버전은 이를 일반 포워딩으로 처리하며, 기본 대상이 없는 규칙은 첫 연결이 들어올 때 프로그램을 중단시킵니다.
- haproxy에서 넘어올 때는 Gately 규칙을 켜기 전에 haproxy를 먼저 멈추세요. 한 포트는 한 프로그램만 수신할 수 있습니다.
질문과 의견은 GitHub Issues나 Telegram 그룹에 남겨 주세요.