본문 바로가기

Study/TIL | AWS

VYBZ 서비스 도메인 & Nginx 라우팅 설정 완벽 가이드

 

우리 서비스는 유저 앱, 버스커 앱, 관리자 앱, 백엔드 API로 구성되어 있어

각 앱마다 진입점을 다르게 두어 서브 도메인 기반으로 라우팅을 설정했다


💡 알아두면 좋은 용어

  • CNAME (Canonical Name Record)
    다른 도메인으로 연결할 때 사용하는 레코드.
    예: www.vybz.kr → vybz.kr (도메인 별칭 설정)
  • A 레코드 (Address Record)
    도메인을 특정 서버의 IP 주소로 직접 연결할 때 사용.
    예: vybz.kr → 123.45.67.89

1. 도메인 레코드 설정

  • A 레코드 : 도메인을 특정 IP로 직접 연결할 때 사용
  • CNAME 레코드 : 다른 도메인으로 연결할 때 사용

예를 들어, www.vybz.kr 서브 도메인을 vybz.kr과 동일한 IP로 연결하려면 : 

www.vybz.kr  →  CNAME  →  vybz.kr

→ 이렇게 설정하면 www.vybz.kr 요청도 vybz.kr로 트래픽이 포워딩됩니다.

 

 

www.vybz.kr  요청도  vybz.kr로  트래픽이 포워딩

 

 

admin.vybz.kr, busker.vybz.kr 도메인 설정

 

 

2. Nginx 라우팅 구조

앱이 3개(유저/버스커/관리자)이고, 별도의 API 서버가 있어 총 4개의 진입점을 사용합니다.

 

(1) HTTP → HTTPS 리다이렉트

모든 HTTP 요청을 HTTPS로 강제 리디렉션 :

# 1. HTTP 요청 전부 HTTPS로 리디렉션
server {
    listen 80;
    server_name vybz.kr www.vybz.kr back.vybz.kr busker.vybz.kr admin.vybz.kr;

    return 301 https://$host$request_uri;
}

# 2. vybz.kr → 유저 앱
server {
    listen 443 ssl;
    server_name vybz.kr;

    ssl_certificate /etc/letsencrypt/live/vybz.kr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/vybz.kr/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;

        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;
    }
}

# 3. www.vybz.kr → 유저 앱
server {
    listen 443 ssl;
    server_name www.vybz.kr;

    ssl_certificate /etc/letsencrypt/live/vybz.kr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/vybz.kr/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;

        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;
    }
}

# 4. busker.vybz.kr → 버스커 앱
server {
    listen 443 ssl;
    server_name busker.vybz.kr;

    ssl_certificate /etc/letsencrypt/live/vybz.kr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/vybz.kr/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass http://localhost:3001;
        proxy_http_version 1.1;

        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;
    }
}

# 5. admin.vybz.kr → 관리자 앱
server {
    listen 443 ssl;
    server_name admin.vybz.kr;

    ssl_certificate /etc/letsencrypt/live/vybz.kr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/vybz.kr/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass http://localhost:3002;
        proxy_http_version 1.1;

        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;
    }
}

# 6. back.vybz.kr → 백엔드 API (포트 8000)
server {
    listen 443 ssl;
    server_name back.vybz.kr;

    ssl_certificate /etc/letsencrypt/live/vybz.kr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/vybz.kr/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass http://localhost:8000;
        proxy_http_version 1.1;

        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;
    }
}

🚧 Nginx 라우팅 설정 시 발생한 문제와 해결

VYBZ 서비스의 프론트, 백엔드(API) 서버를 서브 도메인(www.vybz.kr, back.vybz.kr)으로 분리해 Nginx 라우팅을 설정하는 과정에서 SSL 인증서 발급 문제가 발생했다

 


 

back.vybz.kr 접근 시 인증서가 발급되지 않아 아래와 같은 오류 화면이 발생했다.

이는 Certbot 발급 시 back.vybz.kr을 포함하지 않았기 때문에 발생한 문제였다.


🔥 해결방법 

(1) Certbot을 통한 인증서 재발급

back.vybz.kr을 포함해 모든 서브 도메인을 함께 인증서 발급

sudo certbot --nginx -d vybz.kr -d www.vybz.kr -d back.vybz.kr

-d 옵션에 모든 도메인/서브도메인을 추가해야 통합 인증서가 발급됩니다.

 

 

(2) Nginx 설정 파일 확인 및 재시작

Nginx 설정 문법 검증

sudo nginx -t

 

설정이 올바르다면 Nginx를 재시작

sudo systemctl reload nginx

 

 

(3) 인증서를 발급 완료한 최종 Nginx 설정

server {
    listen 80;
    server_name vybz.kr www.vybz.kr back.vybz.kr;

    return 301 https://$host$request_uri;
}

// 프론트 서버를 위한 서브 도메인 (www.vybz.kr)
server {
    listen 443 ssl;
    server_name vybz.kr www.vybz.kr;
    ssl_certificate /etc/letsencrypt/live/vybz.kr/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/vybz.kr/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass http://localhost:8761/;
        proxy_http_version 1.1;

        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;
    }
}

// 백엔드 서버를 위한 서브 도메인 (back.vybz.kr)
server {
    listen 443 ssl;
    server_name back.vybz.kr;
    ssl_certificate /etc/letsencrypt/live/vybz.kr/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/vybz.kr/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location = / {
        return 302 /swagger-ui/index.html;
    }

    location / {
       proxy_pass http://localhost:8000/;
       proxy_http_version 1.1;

       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;
   }    
}

 

 

 

(4) 설정 완료 후 back.vybz.kr에 접근 시, 정상적으로 HTTPS 연결 및 백엔드 API 접근이 가능

 

 

 

  • 문제 원인 : back.vybz.kr 인증서 미발급.
  • 해결 방법 : sudo certbot --nginx -d vybz.kr -d www.vybz.kr -d back.vybz.kr 명령어로 통합 인증서 발급.
  • 주의할 점 : 새로운 서브 도메인을 추가하면 반드시 certbot으로 인증서 재발급을 해줘야 함.