티스토리 뷰

기록

nginx : 도커 이미지 기본 forwarding

Korean Eagle 2024. 4. 4. 20:06
728x90

가장 많이 사용하는 웹서버이다. 

 

현재는 웹서버 보다는 SSL 인증서를 적용해주는 프록시로 사용하는 경우가  더 많다. 그래서 static 데이터 처리는 신경을 안써도 될 정도다.

 

우선 기본 설정 파일인 /etc/nginx/nginx.conf 을 알 필요가 있다. 이 파일에서 대부분의 nginx 설정이 들어있는데 마지막 줄을 보면 

include /etc/nginx/conf.d/*.conf;

 

부분이 있는데 모든 설정 후에 conf.d 폴더의 모든 .conf 파일 설정을 추가하라는 의미다. 기본적으로 도커 nginx 이미지의 nginx.conf 는 server 설정이 빠져있다. 그래서 conf.d에 추가해 주면 된다.

 

아래 부분이 conf.d 폴더의 default.conf 파일인데 여기서 서버 설정을 하면 된다. 아래는 웹서버를 도커로 운영하면서 클라이언트 서버에 request를 바로 전달하는 프록시의 예시이다. 가장 기본적인 부분만 들어 있다. 그리고 가장 기본적인 것만 있어도 대부분 문제가 없다. 필요한 경우 설정을 찾아서 넣으면 된다.

 

아래는 두 부분으로 나누어져 있는데 위쪽은 SSL 인증서를 적용한 부분이고, 아래는 http로 들어온 요청을 https로 redirect하는 부분이다. 나의 경우는 dns 기준으로 받은 무료 SSL을 적용하였다. add_header 은 중요한 부분은 아니다. 이것이 없으면 보안이 취약하다는 경고가 나와서 해당 헤더를 추가한 부분이다. 

 

아래의 server {} 부분은 request가 들어왔을 때 어떤 설정으로 처리해야 할지 옵션인데, 기본적으로 server_name을 기준으로 분류한다. 포트를 확인하고 그 후에 서버 이름을 확인해서 매핑한다. 따라서 http로 들어온 요청은 무조건 아래 쪽으로 붙어서 위쪽으로 변환된다. 도메인 필터링 기준 엄청 관대한 편이라서 여러개의 설정이 있지 않는 이상은 그냥 비슷한 것은 다 받아 준다.

 

한가지 더 언급하고 싶은 것은 아래 if 구문인데, too many redirect 문제가 생겨서 서버가 돌아가지 않는 경우 이를 막아주는 부분이다. scheme이 http 요청인 것만 포워딩을 시키면 쓸대 없는 루프백이 발생하지 않는다.

 

# confg.d/default.conf

server {
  listen 443 ssl;
  server_name bestprice.pilseong.net;
  add_header X-Content-Type-Options "nosniff";
  location / {
    proxy_pass http://192.168.50.141:3000;
  }
  ssl_certificate /opt/fullchain.cer;
  ssl_certificate_key /opt/pilseong.net.key;
}

server {
  listen 80;
  server_name bestprice.pilseong.net;
  if ($scheme = "http") {
    return 301 https://$host$request_uri;
  }
}

 

아지막으로 return 구문인데, 리턴 구문은 프로그래밍 한다고 생각하고 리턴을 제대로 처리해야 한다. 위의 경우 if 구문 내에만 있는데 물론 이 경우는 의미가 없다.  그런데 설정을 잘 이해하지 못하고 대강 작업하는 경우 아래처럼 할 수도 있는데, 그러면 아무리 301로 https로 redirect가 되어도 결국은 404가 반환 된다. 이런 것만 조심하면 된다.

 

# 항상 404를 돌려주는 예제

server {
  listen 443 ssl;
  server_name bestprice.pilseong.net;
  add_header X-Content-Type-Options "nosniff";
  location / {
    proxy_pass http://192.168.50.141:3000;
  }
  ssl_certificate /opt/fullchain.cer;
  ssl_certificate_key /opt/pilseong.net.key;
}

server {
  listen 80;
  server_name bestprice.pilseong.net;
  if ($scheme = "http") {
    301 https://$host$request_uri;
  }
  return 404;
}
728x90
댓글