Spring - Nginx Docker 운영 적용기

아이스__아메리·2023년 8월 23일
0

도입기&적용기

목록 보기
3/7
post-custom-banner

이전에 기술한 OAuth2.0서버 중 Resource Server에 도메인을 적용하기 위해 Nginx를 사용했다. 자세한 설정들이 생략되어 많이 어색해 보일수 있으니 참고부탁드립니다.

EC2에 Nginx 설치하는 방법도 있었으나 이미 Docker를 사용중이기에 해당 방법은 배제했다.(Docker를 사용해야하는 이유 라는 키워드로 구글에 검색해보기를 추천한다.)

Nginx에 도메인 및 SSL 적용하기

Nginx Dockerizing

#nginx.Dockerfile
FROM nginx:1.23-alpine #1
RUN rm /etc/nginx/conf.d/default.conf #2

#3
COPY cert/발급받은 인증서}.pem /etc/ssl/certs/secure_sign/{SSL 인증서의 개인 키 파일}.key.pem
COPY cert/발급받은 인증서}.unified.crt.pem /etc/ssl/certs/secure_sign/{SSL 인증서의 인증서 체인 파일}.unified.crt.pem
#4
COPY default.conf /etc/nginx/conf.d/
  1. nginx:1.23-alpine 이미지를 기반으로 컨테이너를 생성
  2. 기본 설정 파일 삭제:
    • 컨테이너 내부에 있는 기본 Nginx 설정 파일인 default.conf를 삭제
    • 이렇게 함으로써 컨테이너 내의 기본 설정을 제거하고, 나중에 별도의 설정 파일을 사용
  3. 인증서 파일 복사:
    • 호스트 시스템에 있는.key.pem와 .unified.crt.pem 파일을 컨테이너 내부의 /etc/ssl/certs/secure_sign/ 경로에 복사
  4. Nginx 설정 파일 복사:
    • 호스트 시스템에 있는 default.conf 파일을 컨테이너 내부의 /etc/nginx/conf.d/ 경로에 복사합니다. 이렇게 함으로써 컨테이너 내의 Nginx 설정 파일을 설정 위치로 복사

Nginx Config설정

#default.conf
server { #1
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name {등록한 도메인}.io;
    return 301 https://$host$request_uri; #2
}

server { #3
    server_name {등록한 도메인}.io; # server_name 지시어에 따라 도메인으로 들어오는 요청을 처리
-
    listen 443 ssl;

	#4
    ssl_certificate /etc/ssl/certs/secure_sign/{SSL 인증서의 개인 키 파일}.crt.pem;
    ssl_certificate_key /etc/ssl/certs/secure_sign/{SSL 인증서의 인증서 체인 파일}.key.pem;

    location / {#5
        proxy_pass https://172.17.0.1:8081; #6
        client_max_body_size 256M;
    }
}
  1. Port 80으로 요청이 들어올 경우 에러페이지로 리다이렉트
  2. 들어온 요청을 https://$host$request_uri로 리디렉션합니다. 이는 HTTP 요청을 HTTPS로 리디렉션하는 역할
  3. Port 443으로 요청이 들어오게되면 처리
  4. Dockerizing된 Nginx 내부에 있는 SSL 인증서 경로에 저장된 파일
  5. 요청받은 것을 Spring Application으로 리버스 프록시한다.
  6. Spring Application 또한 Docker로 감싸져있기 때문에 Docker에서 아용하는 IP인 https://172.17.0.1:8081로 설정

Docker Compose로 실행

#docker-compose.yml
version: "3"
services:
  spring-app:
    container_name: spring-app
    image: SpringImage
    restart: always
    ports:
      - "8081:8081"
    environment:
      TZ: Asia/Seoul
      {DB설정생략}

  nginx:
    container_name: nginx
    image: NginxImage
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - spring-app
    restart: always
    environment:
      TZ: Asia/Seoul

마치며

이 설정을 하기전 단순히 Spring 프로젝트는 Front와 연결해왔기 때문에 미지의 영역이었다. 다행히도 참고할만한 자료들이 많아 기본셋팅을 수월하게 할 수 있었다. 적용에 성공하고 난 뒤에 알게되었는데 Open API를 사용하다보면 v14, v15같은 도메인을 바꿔서 호출해서 버전업그레이드를 하는 경우도 있는데 v14, v15를 리버스 프록시를 이용한다는 것이었다.

profile
츠케멘 좋아
post-custom-banner

0개의 댓글