...
문서의 도메인과 IP 주소는 모두 예시다. 실제 환경에 맞게 아래 변수를 먼저 정한 뒤 명령과 설정에 일관되게 적용한다.
0. 환경 변수 정리
| 항목 | 예시 | 설명 |
|---|---|---|
| 대표 도메인 | example.com | 사용자가 접속할 기본 주소 |
| 추가 도메인 | example.net | 같은 서버에서 운영할 다른 도메인 |
| 서비스 서브도메인 | app.example.com | 서비스별 주소가 필요할 때 사용 |
| 공인 IPv4 주소 | 203.0.113.10 | 인터넷에서 보이는 공유기 또는 방화벽 주소 |
| 리버스 프록시 주소 | 192.168.10.10 | 80·443 요청을 받는 내부 서버 |
| 백엔드 주소 | 192.168.10.20 | 실제 애플리케이션 또는 NAS 주소 |
| 백엔드 포트 | 30060 | 애플리케이션이 수신하는 내부 포트 |
| ACME webroot | /var/www/example-com-acme | HTTP-01 검증 파일을 둘 디렉터리 |
| 인증서 경로 | /etc/ssl/example.com | 인증서와 개인 키를 설치할 디렉터리 |
203.0.113.0/24는 문서 예시에 사용하는 주소 대역이다. 실제 설정에는 ISP나 네트워크 관리자가 제공한 공인 주소를 사용한다.
...
flowchart TB
U["사용자 브라우저<br/>https://example.com"]
DNS["Route 53<br/>A 레코드 → 203.0.113.10"]
GW["공유기 또는 방화벽<br/>80·443 포트 전달"]
RP["192.168.10.10<br/>TLS 종료 및 리버스 프록시"]
APP1["192.168.10.20:30060<br/>서비스 A"]
APP2["192.168.10.20:30061<br/>서비스 B"]
U -->|① 이름을 IP로 조회| DNS
U -->|② 공인 IP의 443에 연결| GW
GW -->|③ 내부 프록시로 전달| RP
RP -->|④ Host 이름에 따라 분기| APP1
RP -->|④ Host 이름에 따라 분기| APP2
| 구간 | 대표 증상 |
|---|---|
| DNS | NXDOMAIN, 조회 결과 없음, 잘못된 IP 반환 |
| 공인 회선·포트 전달 | 연결 시간 초과 |
| 리버스 프록시 | 연결 거부, TLS 오류, 기본 사이트 표시 |
| 백엔드 연결 | 502 Bad Gateway, 503 Service Unavailable |
| 애플리케이션 설정 | 화면은 열리지만 로그인·CORS·리다이렉트 실패 |
문제가 생기면 위에서 아래 순서로 확인한다.
2. 사전 확인
...
정점 도메인과 www를 함께 운영하는 일반적인 예시는 다음과 같다.
| 이름 | 타입 | 값 | TTL |
|---|---|---|---|
example.com | A | 203.0.113.10 | 300 |
www.example.com | CNAME | example.com | 300 |
app.example.com | A 또는 CNAME | 공인 IP 또는 대표 도메인 | 300 |
- 정점(apex) 도메인에는 일반 CNAME을 사용할 수 없으므로 공인 IPv4를 가리킬 때는 A 레코드를 사용한다.
www나 서비스 서브도메인은 대표 도메인을 가리키는 CNAME으로 관리할 수 있다.- 변경이 잦은 환경에서는 TTL을 300초 정도로 시작하고, 공인 IP가 안정적이면 늘린다.
- 공인 IP가 주기적으로 바뀌는 회선은 Route 53 API를 이용한 DDNS 갱신을 검토한다.
- 사용하지 않는
AAAA레코드는 만들지 않는다.
...
공인 IP로 들어온 요청을 리버스 프록시 서버에 전달한다.
| 외부 포트 | 내부 목적지 | 용도 |
|---|---|---|
| 80/TCP | 192.168.10.10:80 | HTTP-01 검증 및 HTTPS 리다이렉트 |
| 443/TCP | 192.168.10.10:443 | HTTPS 서비스 |
- 리버스 프록시의 사설 IP는 고정 IP 또는 DHCP 예약으로 유지한다.
- 백엔드 포트는 인터넷에 직접 전달하지 않는다.
- 서버 자체 방화벽에서도 80·443을 허용한다.
- 관리용 SSH 포트는 필요하더라도 전체 인터넷에 그대로 노출하지 말고 VPN, 접근 허용 목록 또는 별도의 보안 통제를 사용한다.
...
각 도메인 또는 서브도메인마다 별도의 가상호스트를 만들고 다른 백엔드로 전달한다.
| 공개 주소 | 내부 목적지 예시 |
|---|---|
example.com | 192.168.10.20:30060 |
example.net | 192.168.10.20:30061 |
app.example.com | 192.168.10.30:8080 |
모든 서비스는 같은 외부 443 포트를 사용할 수 있다. Apache가 TLS SNI와 Host 헤더를 기준으로 올바른 인증서와 백엔드를 선택하므로 서비스마다 공유기 포트를 추가로 열 필요가 없다.
...
리버스 프록시 설정만으로 애플리케이션의 공개 주소가 자동 변경되지는 않는다. 프레임워크와 서비스에 따라 다음 값을 실제 HTTPS 주소로 맞춘다.
| 설정 종류 | 예시 | 잘못되었을 때의 증상 |
|---|---|---|
| 공개 웹 Origin | https://example.com | 절대 URL이나 리다이렉트가 내부 주소를 사용 |
| CORS 허용 Origin | https://example.com | 브라우저의 API 요청 거부 |
| OAuth 기본 URL | https://example.com | 로그인 후 잘못된 주소로 이동 |
| 허용 리다이렉트 목록 | https://example.com | redirect_uri 검증 실패 |
| Secure Cookie 설정 | HTTPS 및 프록시 인식 | 로그인 세션이 유지되지 않음 |
| Trusted Proxy | 리버스 프록시 주소만 | IP·스킴 인식 오류 또는 헤더 위조 위험 |
환경 변수 파일을 변경한 뒤에는 애플리케이션의 배포 방식에 맞게 컨테이너나 서비스를 재생성한다. 단순 재시작만으로 새 환경 변수가 반영되지 않는 플랫폼도 있다.
...
- 사용할 도메인, 공개 URL, 내부 백엔드 주소와 포트를 정한다.
- 새 독립 도메인이면 등록기관의 NS를 Route 53 호스팅 영역으로 위임한다.
- 기존 도메인의 서브도메인이면 기존 호스팅 영역에 A 또는 CNAME 레코드를 추가한다.
- DNS가 외부 리졸버에서 올바른 공인 IP로 조회되는지 확인한다.
- 최초 구성이라면 공유기에서 80·443을 리버스 프록시로 전달한다. 기존 프록시를 함께 쓰는 경우 보통 추가 포트 전달은 필요 없다.
- 백엔드 서비스를 시작하고 LAN에서 직접 응답을 확인한다.
- 리버스 프록시 설정을 백업한다.
- HTTP 가상호스트와 ACME webroot를 추가한다.
- 설정 검사를 통과시킨 뒤 HTTP 설정을 적용하고 챌린지 URL을 확인한다.
- 인증서를 발급하고 자동 갱신 후 재적재 명령을 설정한다.
- HTTPS 가상호스트와 백엔드 프록시 설정을 추가한다.
- 애플리케이션의 공개 URL, CORS, 쿠키, trusted proxy 설정을 바꾸고 재배포한다.
- OAuth, 웹훅 등 외부 공급자 콘솔의 URL을 변경한다.
- DNS부터 백엔드까지 전 구간을 외부 회선에서 검사한다.
- 함께 운영되는 기존 도메인과 인증서 자동 갱신도 회귀 검사한다.
11. 자주 발생하는 문제
| 증상 | 가능한 원인과 확인 사항 |
|---|---|
| Route 53에 레코드를 넣었지만 조회되지 않음 | 등록기관의 NS 위임 누락, 잘못된 호스팅 영역 수정, DNS 전파 또는 캐시 |
| 일부 사용자만 접속 실패 | 잘못된 AAAA 레코드, IPv6 방화벽·라우팅 미구성, 지역별 DNS 캐시 |
| 외부 연결이 시간 초과됨 | ISP 포트 차단, CGNAT, 이중 NAT, 공유기 또는 서버 방화벽, 잘못된 포트 전달 |
| 외부에서는 되지만 내부에서만 실패 | 헤어핀 NAT 미지원. 내부 DNS에서 사설 IP를 반환하는 split-horizon DNS 검토 |
| 갑자기 도메인이 접속되지 않음 | 유동 공인 IP 변경. 현재 공인 IP와 A 레코드를 대조하고 DDNS 검토 |
| 인증서 발급 실패 | DNS가 다른 IP를 가리킴, 80 포트 미도달, 챌린지 경로까지 리다이렉트·차단 |
| 인증서 설치 대상을 찾지 못함 | EC 발급 후 --ecc 누락 또는 인증서의 주 도메인 불일치 |
| 인증서 파일은 갱신됐지만 서비스 인증서는 만료됨 | 갱신 후 Apache 재적재 명령 누락 또는 재적재 실패 |
| 새 가상호스트 추가 후 전체 재적재 실패 | 문법 오류, 존재하지 않는 인증서 파일, 모듈 누락 |
| 예상과 다른 사이트가 표시됨 | ServerName·ServerAlias 오류, 요청 Host 불일치, 기본 가상호스트 순서 |
502 Bad Gateway | 백엔드 중지, 주소·포트 오류, 내부 방화벽, 컨테이너 포트 미게시 |
| 화면은 열리지만 로그인 실패 | 공개 URL·CORS·쿠키·trusted proxy 설정 또는 공급자 콜백 URL 불일치 |
| 환경 변수 변경이 반영되지 않음 | 서비스가 환경을 시작 시에만 읽음. 컨테이너 또는 서비스를 재생성해야 함 |
| 변경 후에도 브라우저가 이전 주소로 이동 | 301 또는 HSTS 캐시. 시크릿 창과 명령줄 요청으로 분리 확인 |
12. 운영 권장 사항
- 공인 IP 변경 감지와 Route 53 A 레코드 갱신을 자동화한다.
- 인증서 만료일뿐 아니라 자동 갱신 명령의 성공 여부도 모니터링한다.
- 리버스 프록시 설정 변경은 백업, 문법 검사, 무중단 재적재 순서로 적용한다.
- 외부에는 80·443만 노출하고 백엔드와 관리 포트는 사설망 또는 VPN으로 제한한다.
- 도메인별 백엔드 주소, 인증서 경로, 담당자, 외부 콘솔 등록 항목을 운영 문서에 기록한다.
- 정기적으로 외부 DNS, TLS, HTTP 상태와 기존 서비스의 회귀 여부를 함께 검사한다.