본문으로 건너뛰기
Advertisement

가상 호스트(Virtual Host) 설정

가상 호스트(Virtual Host)는 하나의 Nginx 서버가 여러 도메인 또는 포트를 동시에 처리 할 수 있게 하는 기능입니다. 실무에서는 한 서버에서 여러 웹사이트를 운영하거나, 서브도메인별로 다른 앱을 서빙할 때 반드시 필요합니다.


이름 기반 가상 호스트 (Name-Based Virtual Host)

동일한 IP·포트로 들어오는 요청을 Host 헤더의 도메인 이름으로 구분합니다. 가장 일반적인 방식입니다.

# /etc/nginx/conf.d/example.com.conf

server {
listen 80;
server_name example.com www.example.com;

root /var/www/example.com;
index index.html;

access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;

location / {
try_files $uri $uri/ =404;
}
}
# /etc/nginx/conf.d/another.com.conf

server {
listen 80;
server_name another.com www.another.com;

root /var/www/another.com;
index index.html;

location / {
try_files $uri $uri/ =404;
}
}

브라우저가 http://example.com 을 요청하면 Host: example.com 헤더가 붙고, Nginx는 해당 server_name이 일치하는 블록을 찾아 처리합니다.


포트 기반 가상 호스트 (Port-Based Virtual Host)

같은 IP이지만 다른 포트로 들어오는 요청을 구분합니다.

# 포트 80 — 메인 사이트
server {
listen 80;
server_name example.com;
root /var/www/main;

location / {
try_files $uri $uri/ =404;
}
}

# 포트 8080 — 관리자 사이트 (내부용)
server {
listen 8080;
server_name example.com;
root /var/www/admin;

# 내부 IP에서만 접근 허용
allow 10.0.0.0/8;
allow 192.168.0.0/16;
deny all;

location / {
try_files $uri $uri/ =404;
}
}

서브도메인 가상 호스트

api.example.com, admin.example.com 처럼 서브도메인별로 다른 앱을 서빙하는 구성입니다.

# 메인 사이트
server {
listen 80;
server_name example.com www.example.com;

root /var/www/example.com;
location / {
try_files $uri $uri/ =404;
}
}

# API 서버 (백엔드 프록시)
server {
listen 80;
server_name api.example.com;

location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

# 관리자 패널
server {
listen 80;
server_name admin.example.com;

root /var/www/admin;
location / {
try_files $uri $uri/ /index.html;
}
}

와일드카드 서브도메인

모든 서브도메인을 하나의 서버 블록에서 처리하려면 와일드카드를 사용합니다.

server {
listen 80;
server_name *.example.com;

# $host 변수로 어느 서브도메인인지 확인 가능
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
}

HTTP → HTTPS 리다이렉트

실무에서는 HTTP 요청을 HTTPS로 자동 리다이렉트하는 설정이 필수입니다.

# HTTP 서버 — HTTPS로 리다이렉트
server {
listen 80;
server_name example.com www.example.com;

# 301 영구 리다이렉트 (SEO 최적화)
return 301 https://$host$request_uri;
}

# HTTPS 서버 — 실제 콘텐츠 서빙
server {
listen 443 ssl;
server_name example.com www.example.com;

ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;

root /var/www/example.com;
index index.html;

location / {
try_files $uri $uri/ =404;
}
}

www → non-www 리다이렉트

# www.example.com → example.com 리다이렉트
server {
listen 80;
server_name www.example.com;
return 301 https://example.com$request_uri;
}

server {
listen 443 ssl;
server_name example.com;
# ... 실제 설정
}

default_server 설정

어떤 server_name에도 매칭되지 않는 요청을 처리하는 기본 서버를 지정합니다.

# 알 수 없는 도메인 요청 차단
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;

# 444: 응답 없이 즉시 연결 종료 (Nginx 전용 상태 코드)
return 444;
}

return 444는 HTTP 응답 없이 TCP 연결만 종료합니다. 스캐너나 봇의 불필요한 요청을 차단할 때 유용합니다.


가상 호스트 활성화/비활성화 (sites-available / sites-enabled 패턴)

Ubuntu/Debian의 Apache 방식을 Nginx에도 적용할 수 있습니다.

# 설정 파일 생성
sudo nano /etc/nginx/sites-available/example.com

# 심볼릭 링크로 활성화
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

# 비활성화 (링크 제거)
sudo rm /etc/nginx/sites-enabled/example.com

# 검증 후 리로드
sudo nginx -t && sudo systemctl reload nginx

nginx.conf에서 sites-enabled 디렉터리를 포함:

http {
include /etc/nginx/sites-enabled/*;
}

실전 예제: 멀티 도메인 + SPA 라우팅

React/Vue SPA를 서빙할 때 try_files로 클라이언트 사이드 라우팅을 처리하는 패턴입니다.

server {
listen 443 ssl;
server_name app.example.com;

ssl_certificate /etc/letsencrypt/live/app.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem;

root /var/www/react-app/build;
index index.html;

# 정적 파일 — 캐시 최적화
location ~* \.(js|css|png|jpg|gif|ico|woff2|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}

# API 요청 — 백엔드 프록시
location /api/ {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}

# SPA 라우팅 — React Router 처리
# 파일이 없으면 index.html로 폴백 (404 대신)
location / {
try_files $uri $uri/ /index.html;
}
}

정리

가상 호스트 유형구분 기준사용 사례
이름 기반Host 헤더 (도메인)여러 도메인을 한 서버에서 운영
포트 기반listen 포트관리자 포트 분리, 개발/운영 분리
서브도메인서브도메인 이름api., admin., app. 분리
와일드카드*.도메인동적 서브도메인 처리
default_server매칭 없음알 수 없는 도메인 차단
Advertisement