![[Nginx] 다중 도메인 설정, 로드 밸런싱](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJg4qX%2FbtsNL3uSxv5%2FxTKkpvVFFk7ohMW9IuxHzK%2Fimg.png)
[Nginx] 다중 도메인 설정, 로드 밸런싱DevOps/Nginx2025. 5. 7. 13:35
Table of Contents
다중 도메인 설정
- Nginx를 통해서 하나의 서버에서 도메인마다 다른 애플리케이션에 연결시킬 수 있다.
- 예를들어, aaa.com 이라는 도메인에는 A라는 스프링부트 애플리케이션에 연결시키고, bbb.com이라는 도메인에는 B라는 스프링부트 애플리케이션에 연결시킬 수 있다.
이 글에서 설명하는 방법은 우분투 환경을 기준으로 설명하며, /etc/nginx/conf.d에 있는 .conf 파일을 사용하지 않는다.
/etc/nginx/nginx.conf
- 모든 사이트에 적용할 전역 설정
/etc/nginx/sites-available
- 이 디렉토리는 Nginx에서 사용할 수 있는 모든 서버 블록 설정 파일을 보관하는 장소이다.
- 이곳에 설정 파일을 작성한다고 해서 Nginx가 자동으로 해당 설정을 반영하지는 않으며, 단순히 설정을 정의만 해두는 곳이다. 예를 들어 example.com이라는 도메인에 대한 서버 블록을 정의할 때, 그 내용을 /etc/nginx/sites-available/example.com 파일로 만들어 두면 된다.
- 이 디렉토리는 일종의 설정 저장소 역할을 하며, 실제 활성화 여부는 sites-enabled에 연결되느냐에 따라 결정된다.
/etc/nginx/sites-enabled
- 이 디렉토리는 실제로 Nginx가 사용할 서버 블록 설정 파일들의 심볼릭 링크가 저장된 디렉토리이다. 즉, sites-available에 존재하는 설정 파일 중 활성화하고 싶은 것만 ln -s 명령을 사용해 이곳에 링크를 걸어두면, Nginx는 sites-enabled 디렉토리에 포함된 파일만 읽어들여 해당 서버 블록을 실제 서비스에 적용한다.
- 따라서 어떤 설정을 활성화하거나 비활성화할 때는 sites-enabled에서 심볼릭 링크를 생성하거나 제거하는 방식으로 관리한다.
nginx.conf
아래는 예시일 뿐입니다. (사용자의 요구에 알맞게 수정하는것을 추천)
user www-data; worker_processes auto; pid /run/nginx.pid; error_log /var/log/nginx/error.log; include /etc/nginx/modules-enabled/*.conf; events { worker_connections 768; # multi_accept on; } http { # Nginx 버전정보 노출 끔 server_tokens off; # 디렉토리 목록 노출 방지 autoindex off; # DoS 공격방어 # 요청 제한 영역 정의 (클라이언트 IP 기반) # 초당 3회 이상 요청시 요청 거부 limit_req_zone $binary_remote_addr zone=req_zone:10m rate=3r/s; map $remote_addr $limit { default 1; "127.0.0.1" 0; } # Basic Settings sendfile on; tcp_nopush on; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; # 보안 헤더 add_header X-Content-Type-Options nosniff; add_header X-Frame-Options SAMEORIGIN; add_header X-XSS-Protection "1; mode=block"; #add_header Content-Security-Policy "default-src 'self';"; #이건 적절히 판단 # SSL 설정 ssl_stapling on; ssl_stapling_verify on; resolver 1.1.1.1 8.8.8.8 valid=300s; resolver_timeout 5s; ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt; include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot # Logging Settings access_log /var/log/nginx/access.log; # Gzip Settings gzip on; # Virtual Host Configs include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } |
sites-available
- 여기에 도메인별 서버블록을 정의한다.
- abc.com이라는 도메인이라면 도메인명 그대로 파일을 만든다.
- 도메인 개수 만큼 이 디렉터리에 도메인별 서버블록을 정의한다.
아래는 예시일 뿐입니다. (사용자의 요구에 알맞게 수정하는것을 추천)
server { listen 80; listen [::]:80; server_name 도메인명; # http -> https 리다이렉트 return 301 https://$host$request_uri; } server { listen [::]:443 ssl; # managed by Certbot listen 443 ssl; # managed by Certbot server_name 도메인명; ssl_certificate /etc/letsencrypt/live/도메인명/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/도메인명/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # 보안 헤더(HSTS) add_header Strict-Transport-Security "max-age=157680000; includeSubDomains; preload" always; # Certbot 인증 경로 처리 location /.well-known/acme-challenge/ { root /var/www/html; } # 리버스 프록시 설정 location / { proxy_pass http://127.0.0.1:10001; # 연결하고자하는 애플리케이션 포트번호 기입 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # DoS 공격 방어(기본 요청횟수 + 2 만큼 순간적으로 요청 허용) limit_req zone=req_zone burst=2 nodelay; limit_req_status 429; } } |
sites-enabled
sites-available에서 정의한 서버 블록 파일을 단순히 이곳에 심볼릭 링크를 저장하면 된다.
심볼릭 링크를 저장하는 명령어는 아래와 같다.
- sudo ln -s /etc/nginx/sites-available/도메인명 /etc/nginx/sites-enabled/
심볼릭 링크를 삭제하는 명령어는 아래와 같다.
- sudo rm /etc/nginx/sites-enabled/도메인명
아래의 명령어를 통해서 추가된 심볼릭 링크를 확인할 수 있다.
- ls -l /etc/nginx/sites-enabled/
nginx 설정파일 문법검사 및 설정파일 리로딩
- sudo nginx -t : 문법 검사
- sudo nginx -s reload : 설정 파일 리로딩
로드 밸런싱
같은 네트워크에 다음과 같은 서버들이 있다고 가정한다.
- 192.168.0.10:8080(백엔드 서버 1, 8080포트에서 실행중)
- 192.168.0.11:8080(백엔드 서버 2, 8080포트에서 실행중)
- 192.168.0.12:8080(백엔드 서버 3, 8080포트에서 실행중)
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=3r/s; # 로드 밸런싱 대상 서버들을 upstream이라는 그룹으로 묶음 # upstream 그룹의 이름은 backend라고 지정 upstream backend { server 192.168.0.10:8080; server 192.168.0.11:8080; server 192.168.0.12:8080; } server { limit_req zone=mylimit; limit_req_status 429; server_name api.jscode.p-e.kr; # upstream 그룹에서 지정한 서버들로 요청이 분산됨 location / { proxy_pass http://backend; } listen 443 ssl; # managed by Certbot ... } ... |
변경된 Nginx 설정 적용
sudo nginx -t
sudo nginx -s reload