Nginx에 SSL 붙이고 Reverse Proxy 적용하기

https://mythpoy.tistory.com/43

이전 포스팅에 이어 nginx에 ssl을 붙여서 reverse proxy를 하는 방법을 설명하고자 한다.

application 하나에 ssl 인증서를 적용하는 것과는 다르게 nginx에 적용을 한다면 nginx 뒷단의 모든 애플리케이션에 ssl이 적용이 되기 떄문에 매우 유용합니다.

 

필자의 환경

- ubuntu 18 이상

- reverse proxy 할 3개의 포트

  - 3000 (FE)

  - 8080 (AI)

  - 8081 (BE)

 

먼저 SSL For Free 를 통해 받았던 3개의 파일들을 /etc/nginx/ssl 로 옮겨야 합니다.

 

그다음 nginx의 설정파일인 /etc/nginx/sites-available 에 있는 default 파일을 수정해줘야 하는데 혹시 모르니 backup 파일을 만드시는게 좋습니다.

하지만 이렇게 파일이 2개가 있으면 Nginx에서 기본적으로 sites-available에 있는 모든 파일을 읽기 때문에 설정을 바꿔줘야 한다.

/etc/nginx/nginx.conf 파일의 하단부쯤을 살펴보면 아래와 같은 부분이 있다.

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

 

밑에 줄을 /*가 아닌 /default로 변경하여 default 파일만 읽도록 변경하면 된다.

다시 돌아와서 default 파일을 아래와 같이 변경하면 된다.

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;  # HTTP에서 HTTPS로 리다이렉션
}

server {
    listen 443 ssl;
    server_name example.com www.example.com; # 기본 도메인과 www.도메인을 둘다 넣어주면 된다.

    ssl_certificate /etc/nginx/ssl/certificate.crt;
    ssl_certificate_key /etc/nginx/ssl/private.key;
    ssl_trusted_certificate /etc/nginx/ssl/ca_bundle.crt;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    
    location / {  # 도메인 루트주소로 들어가면 3000포트로 포워딩
        proxy_pass http://localhost:3000/;
        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;
    }

    location /ai/ { # /ai 로 들어오면 8080로 포워딩
        proxy_pass http://210.115.229.219: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;
    }

    location /be/ { # /be 로 들어오면 8081로 포워딩
        proxy_pass http://localhost:8081/;
        proxy_set_header Upgrade $http_upgrade;  # Upgrade 헤더를 전달합니다.
        proxy_set_header Connection "upgrade";   # Connection 헤더를 'upgrade'로 설정합니다.
        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;
    }
}

 

/be/ 엔드포인트 쪽에서 

proxy_set_header Upgrade $http_upgrade;  # Upgrade 헤더를 전달합니다.
proxy_set_header Connection "upgrade";   # Connection 헤더를 'upgrade'로 설정합니다.

 

를 추가한 이유는 현재 프로젝트 중 /be 엔드포인트에서 webrtc를 이용하는데 Signalling 서버가 웹 소켓 프로토콜을 사용 하기 때문입니다. 일반 http 프로토콜이 아닌 다른 프로토콜을 nginx가 받을 수 있게 하려면 upgrade 헤더를 설정 해줘야 합니다. 만약 http 프로토콜만 쓰신다면 생략해도 됩니다.

 

마지막으로 설정 사항중 문법상 오류가 없는지 검사하기 위해 nginx -t 로 테스트 후 sudo systemctl restart nginx 를 해주면 반영된다.

'DevOps' 카테고리의 다른 글

[Spring Boot + MySQL] docker-compose 세팅  (1) 2024.09.02
minikube service 외부 접속 안되는 이유  (0) 2024.08.27
Jenkins CI/CD with github  (0) 2024.06.07
Docker에 nginx 컨테이너 올리기  (0) 2024.03.28