Nginx server 블록으로 여러 사이트 운영하기
서버 한 대에서 블로그와 개인 사이트, 테스트용 사이트를 함께 운영하고 싶을 때 Nginx는 도메인별로 설정을 나눠 처리할 수 있다. 이 도메인별 설정 단위를 server 블록이라고 한다(아파치의 가상 호스트와 같은 개념). 이 글에서는 Nginx server 블록 구성으로 여러 사이트를 운영하는 방법을 정리한다. 앱 앞단에 Nginx를 두는 리버스 프록시와 SSL 발급은 Nginx 리버스 프록시와 Let’s Encrypt 무료 SSL에 먼저 정리해 두었다.

Nginx server 블록 설정 파일 위치
| 배포판 | 설정 위치 | 켜는 방법 |
|---|---|---|
| Ubuntu / Debian | /etc/nginx/sites-available/ | sites-enabled에 심볼릭 링크 |
| Rocky / RHEL | /etc/nginx/conf.d/*.conf | 파일을 두면 바로 적용 |
Ubuntu 방식에서 쓰는 심볼릭 링크는 심볼릭 링크 사용법에 정리했다.
Nginx server 블록 기본 예제
# /etc/nginx/sites-available/blog.example.com
server {
listen 80;
server_name blog.example.com;
root /var/www/blog;
index index.html index.php;
access_log /var/log/nginx/blog.access.log;
error_log /var/log/nginx/blog.error.log;
location / {
try_files $uri $uri/ =404;
}
}
# 두 번째 사이트
server {
listen 80;
server_name shop.example.com;
root /var/www/shop;
index index.html;
}
Nginx는 요청의 Host 헤더(접속한 도메인)를 server_name과 비교해 어떤 server 블록으로 보낼지 정한다. 사이트별로 로그 파일을 나눠 두면 GoAccess 로그 분석도 사이트별로 할 수 있다.
사이트 켜고 적용하기
sudo mkdir -p /var/www/blog /var/www/shop
sudo ln -s /etc/nginx/sites-available/blog.example.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/shop.example.com /etc/nginx/sites-enabled/
# 문법 검사 후 다시 읽기
sudo nginx -t
sudo systemctl reload nginx
nginx -t가 성공해야만 reload 한다. 설정 오류가 있는 채로 restart 하면 모든 사이트가 내려간다.
기본 서버(default_server)
어느 server_name에도 맞지 않는 요청(IP로 직접 접속, 등록하지 않은 도메인)은 기본 서버가 받는다. 아무 표시가 없으면 첫 번째 블록이 기본이 되어 엉뚱한 사이트가 보일 수 있으니, 기본 서버를 명시해 연결을 끊어 두는 것이 깔끔하다.
server {
listen 80 default_server;
server_name _;
return 444; # 응답 없이 연결 종료
}
Nginx server 블록 활용 예
www 주소를 하나로 합치기
server {
listen 80;
server_name www.example.com;
return 301 https://example.com$request_uri;
}
사이트별 HTTPS 적용
sudo certbot --nginx -d blog.example.com
sudo certbot --nginx -d shop.example.com
certbot이 각 server 블록에 443 설정을 추가해 준다. 갱신 점검은 certbot 인증서 갱신 글을 참고하자. 80, 443 포트가 열려 있어야 한다는 점은 방화벽 설정에서 확인하자.
자주 만나는 문제
- 다른 사이트가 보인다: server_name 오타, DNS가 다른 서버를 가리킴, default_server 미설정.
- 403 Forbidden: root 디렉터리 권한이나 index 파일이 없음(파일 권한).
- 설정이 반영 안 됨: sites-enabled에 링크를 안 만들었거나 reload를 안 했다.
- 시작이 안 됨: 포트 충돌일 수 있다(포트 사용 중 오류 해결).
server_name 매칭 규칙은 Nginx server_name 공식 문서에 자세히 나와 있다.
Nginx server 블록 정리
사이트마다 server 블록 파일 하나, 도메인은 server_name, 문서 위치는 root, 적용 전에는 nginx -t. 이 원칙만 지키면 서버 한 대로 여러 사이트를 깔끔하게 운영할 수 있다. 서버 전체 백업은 전날 글인 Lightsail 자동 스냅샷에 정리했다.
첫 댓글을 남겨보세요