HOME > webdevetc

nginx 서버에서 특정 호스트만 연결 설정 방법, specific host only

마지막 수정일 : 2022-07-16 / 생성일 : 2022-07-14
325
View Count
최근 서버를 이전하면서 nginx의 설치 및 설정을 변경할 부분이 발생했습니다. 이 과정에서 특정 호스트를 설정했음에도 적용되지 않는 이슈가 있어 원인과 해결 방법을 알아본 내용입니다.


# nginx 특정 호스트만 접근 설정하기
우선 host가 webisfree.com인 경우 우리는 설정 파일에서 server {} 블럭의 server_name 수정을 통해 해결 가능하리라 생각할 수 있습니다. 아마 이런 코드가 되겠군요~ 파일명이 default인 경우라면...

@ /etc/nginx/sites-available/default
server {
  listen 80;
  server_name webisfree.com;
  
  location / {
    proxy_pass 'localhost:6000'
  }
}

하지만 위와 같이 하였음에도 webisfree.com 뿐만 아니라 다른 도메인이나 111.222.333.444와 같은 ip 역시 접속이 가능했습니다. 해결 방법은 의외로 간단합니다. 크게 두 가지로 구분됩니다.


! location에 $host를 분기 처리하기즉 특정 호스트로 연결된 경우에만 연결하고 아닌 경우 404 에러 등을 리턴하는 방법입니다. 간단하게 코드를 작성하면 위 코드의 location 부분이 아래와 같이 바뀌게 됩니다.
server {
  listen 80;
  server_name webisfree.com;

  location / {
    if ($host != 'webisfree.com') {
      return 404;
    }

    proxy_pass 'localhost:6000'
  }
}

코드는 생각보다 매우 간단합니다. 하지만 분기문 처리가 그리 마음에 들지는 않습니다. 조건이 많지 않고 코드가 명료해보이지 않는군요. 다른 방법은 없을까요?


! server 블록을 추가하는 방법
아래의 방법이 가장 효과적인 방법으로 생각됩니다. server 블록을 추가하여 두 개를 만드는 방법입니다. 첫 번째 블록에서는 모든 접근에 대하여 404 또는 412 Precondition Failed 에러 등을 리턴하고 두 번째 블록에서 해당 도메인이 맞은 경우에만 정상적으로 서버를 연결하는 방법입니다. 코드는 아래와 같이 수정할 수 있습니다.
server {
  listen 80 default_server;
  listen [::]:80 default_server;
  server_name _;
  return 412;
}

server {
  listen 80;
  server_name webisfree.com;
  location / {
    proxy_pass 'localhost:6000'
  }
}

코드 작성이 완료되었습니다. 지금보니 코드의 길이는 첫 번째 방법이 짧군요 ~ 하지만 개인적으로 두 번째 방법이 더 나은 방법이라고 생각됩니다.


여기까지 특정 domain에만 nginx에서 설정하여 서버를 연결하는 방법에 대하여 간략하게 알아보았습니다.

Author ByEnSSo