다중 호스트명 문제점
일반적인 Rails 애플리케이션은 bin/rails s 또는 bin/dev 실행 시 localhost:127.0.0.1에 바인딩되어 localhost:3000으로만 접근 가능합니다. 다중 서브도메인 테스트를 위해서는 다음의 전통적인 방식들이 사용되었습니다:
- /etc/hosts 편집:
127.0.0.1 myapp-site1과 같이/etc/hosts파일을 수동으로 편집하고 DNS 캐시를 지워야 합니다.- Puma 서버는
bind "tcp://0.0.0.0:3000"으로 모든 요청을 수신하도록 설정해야 합니다. - 단점: 수동 설정의 번거로움,
.local,.home,.exampleTLD와의 충돌 가능성, 앱이 실행되는 머신에서만 이름이 확인되어 모바일 기기 테스트 불가.
- .lvh.me 사용:
127.0.0.1로 DNS 확인을 제공하여/etc/hosts편집이 불필요합니다.- 단점: 일부 ISP의 DNS 재바인딩 보호 기능으로 인해
127.0.0.1로 확인되는 DNS 응답이 필터링되어 심각한 DNS 시간 초과가 발생할 수 있습니다.
mDNS 활용하기
.local 도메인이 길게 확인되는 이유는 해당 TLD가 Zeroconf DNS(멀티캐스트 DNS, mDNS)를 위해 예약되었기 때문입니다. Apple이 개발하고 업계 전반에 걸쳐 지원되는 mDNS는 중앙 DNS 서버 없이 로컬 네트워크 내의 기기들이 DNS 항목을 브로드캐스트할 수 있게 합니다.
-
mDNS 작동 방식: 기기가 자신의 서비스(예: 프린터)를 IP 주소와 함께 네트워크에 알립니다.
-
서비스 확인:
dns-sd -B _services._dns-sd._udp또는dns-sd -B _http._tcp명령을 통해 로컬 네트워크의 mDNS 서비스를 확인할 수 있습니다.
zeroconf Gem을 통한 구현
Ruby 개발 환경에서 mDNS를 활용하기 위해 zeroconf Ruby Gem을 사용할 수 있습니다. 이 Gem은 Git 리포지토리를 로컬 네트워크에 광고하던 gitjour와 같은 과거의 유산에서 비롯되었습니다.
-
목표:
jane.cms.jakemac.local,peter.cms.jakemac.local등과 같은 서브도메인을 로컬 네트워크의 모든 기기에서 접근 가능하게 만듭니다. 여기서jakemac.local은 개발 머신의 Bonjour 호스트명입니다. -
기본 사용법:
ruby require "zeroconf" ZeroConf.service "_http._tcp.local.", 8080, "test-hostname" -
인스턴스명(Instance name) 처리: mDNS 서비스명(인스턴스명)에는 점(.)을 포함할 수 없으므로,
hostname과instance_name을 분리하여 설정해야 합니다.ruby ZeroConf.service("_http._tcp.local.", 3000, "jane.cms.jakemac.local", instance_name: "auto-website-1") -
네트워크 가용성: 이렇게 설정된 서브도메인은 개발 머신뿐만 아니라 동일 네트워크에 연결된 모든 모바일 기기에서도 접근 가능하여 모바일 테스트에 매우 유용합니다.
애플리케이션에 적용하기
Rack 애플리케이션에 zeroconf를 통합하는 예시는 다음과 같습니다:
-
Gemfile:
rack,rackup,zeroconf,puma추가. - config.ru:
subdomains,app_name,machine변수 정의.ZeroConf.service호출을 각 서브도메인에 대해 별도의 스레드로 실행하여 호스트명과 인스턴스명을 광고합니다.hostname = [subdomain, app_name, machine].join(".")instance_name_without_dots = [subdomain, app_name, machine].join("-")
-
실행:
bundle exec rackup --host 0.0.0.0명령으로 웹 서버를 시작하여 외부 요청을 수신하도록 합니다. - 결과: Discovery 앱이나 모바일 기기에서 광고된 서브도메인에 성공적으로 접근할 수 있습니다.
주의사항
-
네트워크 환경: 멀티캐스트 패킷이 통과해야 하며, 유선/Wi-Fi 네트워크가 동일한 네트워크의 일부여야 합니다.
-
인터페이스 선택:
zeroconf는 시스템이 반환하는 첫 번째 인터페이스를 사용하므로, 올바른 네트워크 인터페이스가 선택되었는지 확인해야 합니다. -
라우터: 일부 라우터는 Wi-Fi와 이더넷 간 멀티캐스트 패킷을 재브로드캐스트하지 않을 수 있습니다.
-
.local TLD 충돌: Windows 시스템에서
.local이 회사 네트워크 TLD로 사용되는 경우 Zeroconf와 충돌할 수 있습니다. -
Rails 설정: Rails의
config.hosts설정에 광고된 호스트를 추가해야 합니다.