nginx 같은 포트에서 각기 다른 파일 보여주기

DG
6 min readFeb 10, 2020

--

이번에 학교 인프라 데이터를 관리해주는 프로그램을 3개 만들어서 하나의 서버에 업로드를 해주었다. 프로젝트를 간단히 A,B,C 라고 부르도록 하겠다.

A프로젝트에 접근하는 방식은

domain.com

B프로젝트에 접근하는 방식은

domain.com:81

C프로젝트에 접근하는 방식은

domain.com:82

각기 이런 방식으로 접근을 하도록 nginx 파일을 설정해주었다. 하지만 접근 url뒤에 저런식으로 port 번호를 유저가 직접 입력을해서 접근해야만 하는 방식이 마음에 들지 않았다. 여러 도메인을 사용해서 같은 주소, 같은 포트번호로 접근을 하여도 각기 다른 파일을 보여줄순 없을까? 라는 궁금증이 들었고, 그동안 nginx 를 그저 사용만 할 줄 알았지, 조금더 구체적으로 어떤 방식으로 동작하는지를 공부해본다면 해결방법이 있을거라 생각하였다. 그래서 nginx config 설정에 대해서 알아보다가 해결방법을 찾았다.

바로 server_name 을 이용하는 것이었는데, 만약에 유저가 domain 주소를 이용해서 내 서버에 접근하게 될 시, 해당 domain주소의 모양을 server_name 으로 구분해서 식별할수가 있었다.

해당 원리만 알면 같은 주소, 같은 포트번호로 접근하는 요청이라도 해결하기 간단하다.

우선 단 프로젝트 A,B,C를 각기 3000, 3001, 3002 포트에 돌아가도록 설정해주었다.

nginx config file

server {
listen 3000;
root /home/dan/donggyu/kbu-card-client-v2/build;
index index.html index.htm index.nginx-debian.html;
server_name kbucard.com www.kbucard.com;location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ /index.html;
}
}
server {
listen 3001;
server_name cafeteria.kbucard.com;
root /home/dan/donggyu/kbu-cafeteria-client/build;
index index.html index.htm index.nginx-debian.html;
location / {
try_files $uri $uri/ /index.html;
}
}
server {
listen 3002;
server_name pray.kbucard.com;
root /home/dan/donggyu/kbu-today-pray/build;
index index.html index.htm index.nginx-debian.html;
location / {
try_files $uri $uri/ /index.html;
}
}

유저들은 웹 브라우저에 어떤 도메인을 치고 서버에 접근한다면 제일 첫번째로 80번 포트번호로 들어오게 되어있다. 난 https 서버를 쓰고있었기 때문에, ssl 로 감싸져있는 443번 포트로 유저들을 redirect 시켜주었다.

server {
listen 80;
server_name www.kbucard.com kbucard.com cafeteria.kbucard.com pray.kbucard.com;
return 301 https://$host$request_uri;
}

이제 443번 포트는 www.kbucard.com kbucard.com cafeteria.kbucard.com pray.kbucard.com 이라는 도메인접근을 받아올 수 있다. 해당 server name에 따라서 3000, 3001, 3002 포트로 리다이렉트 시켜주기만 하면 끝이다.

server {
server_name kbucard.com www.kbucard.com;
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/letsencrypt/live/kbucard.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/kbucard.com/privkey.pem;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
proxy_pass http://127.0.0.1:3000;
}
}
server {
server_name cafeteria.kbucard.com;
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/letsencrypt/live/kbucard.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/kbucard.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3001;
}
}
server {
server_name pray.kbucard.com;
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/letsencrypt/live/kbucard.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/kbucard.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3002;
}
}

이제 www.kbucard.com kbucard.com pray.kbucard.com cafeteria.kbucard.com 이라는 domain 주소는 정확하게 같은 주소의 같은 포트번호를 가리키고 있지만, 도메인을 구분지어주어서 각기 다른 화면을 유저들에게 보여줄 수 있게 되었다.

--

--

DG
DG

Written by DG

한국의 iOS 개발자이다. 강아지와 운동을 좋아함. github: https://github.com/donggyushin

No responses yet