일반적으로 서버 한 대에서 여러 도메인의 사이트를 운영하는 것이 일반적인 형태이다.
(도메인마다 별도의 서버를 두면 단순하지만 현실적으로 비용, 관리 효율 등의 다양한 이유로 서버 한 대에서 여러 도메인의 사이트를 운영한다.)
Nginx의 Server Block
여러 도메인 사이트 운영을 Nginx의 관점에서 보면, 클라이언트가 여러 도메인에 보내는 요청이 하나의 Nginx 서버에서 처리하고 응답 가능하도록 만드는 것이다. 이것이 Virtual Host 이며, Nginx에서는 server block 하나가 곧 하나의 가상 호스트에 해당한다.

위의 이미지 구조처럼 클라이언트가 example.com, blog.example.com, api.example.com 중 어느 도메인으로 요청을 보내더라도, 하나의 Nginx는 Host 헤더를 읽어서 각각에 해당하는 server block으로 요청을 라우팅한다.
Nginx의 server_name 매칭
하나의 Nginx에 여러 server block이 존재할 때, Nginx는 아래와 같은 원리로 server_name을 매칭한다.

1순위 — 정확한 일치
server_name에 명시된 값과 Host 헤더가 완전히 일치하는 경우다. 가장 높은 우선순위를 가진다.
server_name example.com www.example.com;
2순위 — 앞쪽 와일드카드
*가 앞에 붙은 형태로, 특정 도메인의 모든 서브도메인을 포괄할 때 사용한다.
server_name *.example.com;
3순위 — 뒤쪽 와일드카드
*가 뒤에 붙은 형태로, TLD(최상위 도메인)가 다양한 경우 등에 활용한다.
server_name www.example.*;
4순위 — 정규식
~로 시작하는 정규식 패턴이다. 가장 유연하지만 성능 비용이 가장 높다.
server_name ~^www\.example\..+$;
5순위 — default_server
위 어떤 조건에도 매칭되지 않으면 default_server로 지정된 server block이 요청을 받는다.
default_server의 역할
default_server는 매칭되는 server_name이 없는 요청을 처리하는 server block이다.
명시적으로 지정하지 않으면 설정 파일에서 가장 먼저 등장하는 server block이 default_server 역할을 하게 된다.
(따라서 만약 모든 디폴트의 요청을 첫번째 server block으로 보내도 괜찮다면, default_server를 만들지 않아도 된다.)
보안 관점에서는 의도하지 않은 도메인으로의 접근을 차단하기 위해 아래와 같이 명시적으로 설정하는 것이 권장된다.
server {
listen 80 default_server;
server_name _; # 어떤 도메인도 일치하지 않음을 의미
return 444; # NGINX 전용 코드: 응답 없이 연결 끊기
}
이를 실습하기 위해, 아래와 같은 간단한 예제로 nginx.conf를 설정하였다.

각 server block이 어떻게 예시 요청을 분리하는 지, 정리하자면 아래와 같은 표로 나타낼 수 있다.
| 요청 | 매칭 server block | 우선순위 |
| example.com | server_name example.com | 1순위 (정확한 일치) |
| www.example.com | server_name example.com www.example.com | 1순위 (정확한 일치) |
| blog.example.com | server_name blog.example.com | 1순위 (정확한 일치) |
| api.example.com | server_name *.example.com | 2순위 (앞쪽 와일드카드) |
| 그 외 모든 도메인 | default_server | 5순위 (fallback) |
포트로 server block 분리하기
listen 디렉티브에 포트를 다르게 지정하면, 같은 도메인이라도 포트에 따라 다른 server block으로 분리할 수 있다.
예를 들어 example.com:80은 메인 사이트로, example.com:8080은 API 서버로 각각 별도의 server block이 처리할 수 있다.
예시 )

이 방식은 하나의 서버에서 웹 서버와 API 서버를 포트로 구분하여 운영할 때 자주 활용된다.
로컬 테스트를 위한 /etc/hosts 설정
위 설정을 실제로 로컬 환경에 테스트하려면 한 가지 작업이 더 필요하다.
example.com, blog.example.com 같은 도메인은 실제 DNS에 등록된 게 아니기 때문에, 그냥 curl이나 브라우저로 요청을 보내면 어디로 가야 할지 알 수 없다.
이때 활용하는 것이 /etc/hosts 파일이다.
/etc/hosts란?
/etc/hosts는 DNS보다 먼저 참조하는 로컬 도메인 테이블이다.
OS는 도메인을 IP로 변환하는 기점에 DNS 서버에 질의하기 전 해당 파일을 먼저 확인한다.
따라서 해당 파일에 '이 도메인은 이 IP를 참조하라' 라고 직접 지정하면, DNS를 직접 설정하지 않아도 도메인으로 접근이 가능하게 된다.

이를 위해서 위의 이미지처럼 vi hosts 명령어를 통해 설정파일 내용을 추가해준다.

그리고 각 도메인이 올바른 server block으로 라우팅되는지 확인하면, 설정파일에 따른 내용이 출력되는 모습을 확인할 수 있다.
'Nginx' 카테고리의 다른 글
| HTTP1.0/HTTP1.1을 기반으로 하는 다이나믹 리버스 프록시 (0) | 2026.07.08 |
|---|---|
| Redirection과 Rewrite Directive (0) | 2026.06.18 |
| 정적 파일 서빙 Path Matching 기법 - root와 alias (0) | 2026.05.28 |
| 네트워크 전송 관점에서 최적화를 위한 압축 설정 템플릿 (0) | 2026.05.21 |
| Nginx 성능 최적화 설정과 기본 템플릿 (0) | 2026.05.16 |
댓글