🌎infra

[Nginx] centos 7.8에서 docker nginx ssl 인증 후 spring boot 연동 - 502 에러 해결하기

pkyung 2024. 3. 26. 23:26
반응형

 

 

안녕하세요. 오늘은 아래의 아키텍처를 구현하는 방법에 대해 알아보려고 합니다. 

그 중에서도 docker nginx에 ssl 인증을 추가한 뒤, 이를 리버스 프록시 서버로 두고 요청이 들어오면 웹어플리케이션 서버로 넘겨주는 부분을 구현해보겠습니다. 

 

 

현재 상황

서버는 ncp classic 서버를 사용했습니다. 도메인 또한 구입하여 적용해놓았습니다. acg는 80 포트와 8080 포트 모두 열어놓았습니다. 

spring boot의 경우 nohup java -jar .jar파일 & 를 통해 배포한 상황입니다. 

 

 

Docker Nginx 컨테이너 올리기

// nginx 이미지 가져오기
docker pull nginx


// nginx 올리기
docker run --name proxy -d -p 443:443 -p 80:80 nginx


// 올린 nginx 컨테이너 접속
docker exec -it proxy bash

 

 

 

certbot 패키지 설치하기

그리고 컨테이너에 certbot 패키지를 설치해야합니다. certbot은 도메인에 ssl 인증서를 발급해주는 도구입니다. 곧 vim도 필요하기에 certbot 플러그인과 vim 을 함께 설치해줍니다. 

apt-get update

// 패키지 3개 설치
apt-get install certbot python3-certbot-nginx vim

 

 

 

nginx config 파일 수정

default.conf 파일에 접근합니다. 

vi /etc/nginx/conf.d/default.conf

 

server_name에 자신의 도메인을 입력하고, /.well-knownacme-challenge/ 경로로 들어온 인증을 수행할 수 있도록 추가해주었습니다. 

server {
    listen 80;
    server_name 도메인;
    
    location /.well-knownacme-challenge/ {
    	allow all;
        root /var/www/certbot;
    }
}

 

 

certbot 인증서 발급

certbot --nginx -d 도메인

 

위의 명령어를 실행한 뒤, 관리자 이메일 주소를 등록하고 YYY를 하면 암호키가 /etc/letsencrypt/live/도메인 아래에 생성됩니다. 

이렇게 되면 default.conf 파일에 # managed by Certbot 주석과 함께 수정된 부분을 확인할 수 있습니다. 

저는 좀 더 가독성 있도록 default.conf 파일을 수정해보았습니다. 

 

80으로 요청이 들어오면 로그를 남기고, 443으로 리다이렉트합니다. 

 

443 요청이 들어오면 proxy-pass를 통해 스프링 부트 서버로 넘기게 됩니다. 이 또한 로그를 남겼습니다. 

server {
    listen        80;
    server_name   도메인;

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

    location /.well-known/acme-challenge/ {
        allow all;
        root /var/www/certbot;
    }

    access_log /var/log/nginx/도메인_access.log;
    error_log /var/log/nginx/도메인_error.log;
}

server {
    listen 443 ssl;
    server_name 도메인;

    ssl_certificate /etc/letsencrypt/live/도메인/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/도메인/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    location / {
        proxy_pass http://서버공인ip:8080;
        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;
    }

    access_log /var/log/nginx/도메인_ssl_access.log;
    error_log /var/log/nginx/도메인_ssl_error.log;
}

 

그리고 nginx를 리로드 해주어야 합니다. 

service nginx reload

 

 

 

502 bad gateway

저는 처음에 같은 서버 내의 스프링부트에 접근하는 것이기에 proxy-pass에 localhost로 입력해주었습니다. 

 

502 게이트웨이 오류가 났고 log를 살펴봤을 때 upstream 서버에 연결할 수 없다는 것이었습니다.

그 때 proxy-pass에 서버의 공인 ip 와 포트 8080을 입력했고 잘 동작하는 것을 확인했습니다. 

 

아마도 도커 없이 nginx를 다운 받았다면 localhost가 맞을 것 같은데 도커 컨테이너를 사용했기에 이렇게 접근해야 하는 것 같았습니다. 

 

 

 

도움이 된 레퍼런스

https://lasbe.tistory.com/176

 

[Docker + Nginx] Proxy Server에 Certbot으로 SSL 인증서 발급 받고 Https 적용하기

⚡️ Certbot으로 SSL 인증서 발급받고 Https 적용하기 개인 리액트 프로젝트를 8080 포트로 올리고, 80 포트에는 Nginx를 이용해 프록시 서버를 올려 언제든 80 포트를 바꿀 수 있도록 했습니다. 그다음

lasbe.tistory.com

 

https://okky.kr/questions/1480540

 

OKKY - docker - spring boot - nginx 접속 질문 입니다 고수님들 도움 부탁드립니다

안녕하세요 spring boot와 Nginx를 docker-compose를 사용하여 컨테이너화를 시도 하엿습니다.80포트를 이용하여 localhost/api/test 를 입력했을때 "안녕하세요" 를 리턴 받는 간단한 api를 구성하였습니다.하

okky.kr

 

반응형