본문 바로가기
개인공부/HTTPS

HTTPS - 적용하기 nginx

by 응가1414 2023. 9. 19.

HTTPS - 적용하기 nginx

일단 nginx을 끄기 (포트가 같데용)

제가 이 폴더를 만들었는지 없는 지 기억이 나지 않지만 이폴더에 인증을 위한 파일이 있습니다.

# jenkins 폴더 이동
cd /var/lib/jenkins/workspace/nct_pipeline

# docker-compose stop
docker-compose stop

# https 인증 폴더
cd /etc/letsencrypt/live/www.nuri777.kro.kr

# 기존 80포트 끄기
lsof -i tcp:80

# 기존 80포트 끄기
sudo kill -9 32452

# 인증서 갱신
sudo certbot renew

Nginx.conf 수정하기

여기서 핵심은 기본 포트로 들어오는 요청을 443포트 https 포트로 redirect 해주는 것 같아요.

Nginx.conf에

밑에 있는 코드를 추가 하였습니다.

     # https 추가
     # 핵심 인증을 위한 폴더를 명시
     listen 443 ssl; # managed by Certbot
     ssl_certificate /etc/letsencrypt/live/www.nuri777.kro.kr/fullchain.pem; # managed by Cert>
     ssl_certificate_key /etc/letsencrypt/live/www.nuri777.kro.kr/privkey.pem; # managed by Ce>
 ​
     include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
     ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
 # 80 포트로 접근시 443 포트로 리다이렉트 시켜주는 설정
 # 핵심
 server {
     if ($host = www.nuri777.kro.kr) {
             return 301 https://$host$request_uri;
     } # managed by Certbot
 ​
 ​
     # listen 80;: 이 설정은 Nginx가 IPv4 주소를 사용하여 80번 포트에서 들어오는 
     # HTTP 요청을 수신하도록 지시합니다. 
     # 80번 포트는 일반적으로 HTTP 트래픽을 처리하는 데 사용됩니다.
     listen 80;
     # listen [::]:80;: 이 설정은 Nginx가 IPv6 주소를 지원하며, 
     # IPv6 주소에서 80번 포트에서 들어오는 HTTP 요청도 수신하도록 지시합니다. 
     listen [::]:80;
 ​
     server_name nuri777.kro.kr;
     return 404; # managed by Certbot
 }

Nginx 전체 코드

 # /nginx/nginx.conf
 upstream frontend-nextjs {
     # 사용시 변경 향후 컨테이너이름:포트번호
     # max_fails 3;은 3번의 연속 실패 후에 서버를 '망가진' 상태로 표시합니다.
     # fail_timeout 10s;는 서버가 실패한 후 10초 동안 망가진 상태로 유지되며, 이 기간 동안 추가 연결 시도가 거부됩니다.
     server compose-frontend-nextjs:3000 max_fails=3 fail_timeout=10s; 
 }
 ​
 upstream backend-spring-boot-3 {
     # 사용시 변경 컨테이너이름:포트번호
     server compose-backend-spring-boot-3:8080 max_fails=3 fail_timeout=10s;
 }
 ​
 server {
     # https 추가
     server_name nuri777.kro.kr;
 ​
     location / {        
         # proxy_pass는 클라이언트의 요청을 이 업스트림 서버로 전달합니다.
         proxy_pass http://frontend-nextjs;
 ​
         # HTTP 버전 1.1을 사용하도록 Nginx에 지시합니다.
         proxy_http_version 1.1;
 ​
         # 이 설정은 HTTP 업그레이드 헤더를 설정합니다. 
         # $http_upgrade는 클라이언트의 요청에서 업그레이드 헤더의 값을 가져와서 
         # 백엔드 서버로 전달합니다. 
         # 이렇게 함으로써 웹 소켓과 같은 업그레이드 요청을 올바르게 처리할 수 있습니다.
         proxy_set_header Upgrade $http_upgrade; 
 ​
         # Connection 헤더를 'upgrade'로 설정합니다. 
         # 이것은 HTTP 연결을 업그레이드하도록 요청하는 데 사용됩니다.
         proxy_set_header Connection 'upgrade'; 
 ​
         # Host 헤더를 클라이언트의 원래 Host 헤더 값으로 설정합니다. 
         # 이것은 요청이 백엔드 서버에 도달할 때 올바른 호스트 이름으로 전달되도록 합니다.
         proxy_set_header Host $host;  
     }
 ​
     location /api {        
         # rewrite /api/(.*) /$1 break; 이 설정은 URL에서 
         # /api/ 다음의 모든 것을 가져와서 /로 재작성합니다. 
         #$ 1은 정규식 그룹을 나타내며, /api/ 다음의 경로를 그룹으로 캡처합니다. 
         # 그런 다음 /와 함께 캡처한 경로를 조합하여 URL을 재작성합니다.
             # 예를 들어, 클라이언트가 /api/some/route로 요청하면 
             #이 설정은 해당 요청을 /some/route로 재작성합니다. 
             # 이렇게 하면 실제 요청이 /some/route로 전달되며, 
             # /api/ 부분은 URL에서 제거됩니다.
         rewrite /api/(.*) /$1 break;
 ​
         # proxy_pass는 클라이언트의 요청을 이 업스트림 서버로 전달합니다.
         proxy_pass http://backend-spring-boot-3;
 ​
         # HTTP 버전 1.1을 사용하도록 Nginx에 지시합니다.
         proxy_http_version 1.1; 
 ​
         # 이 설정은 HTTP 업그레이드 헤더를 설정합니다. 
         # $http_upgrade는 클라이언트의 요청에서 업그레이드 헤더의 값을 가져와서 
         # 백엔드 서버로 전달합니다. 
         # 이렇게 함으로써 웹 소켓과 같은 업그레이드 요청을 올바르게 처리할 수 있습니다.
         proxy_set_header Upgrade $http_upgrade;

         # Connection 헤더를 'upgrade'로 설정합니다. 
         # 이것은 HTTP 연결을 업그레이드하도록 요청하는 데 사용됩니다.
         proxy_set_header Connection 'upgrade';
 ​
         # proxy_set_header: 이 지시문은 Nginx에서 요청 헤더를 설정하는 데 사용됩니다.
         # Host: 요청 헤더 중 하나로, 클라이언트가 요청한 호스트(도메인)를 나타냅니다.
         # $host: Nginx 내장 변수 중 하나로, 현재 요청을 받은 서버에 대한 호스트 정보를 나타냅니다. 이 값은 클라이언트가 요청한 호스트와 일치하게 설정됩니다.
         proxy_set_header Host $host; 
 ​
         # 이 헤더는 모든 Origin(모든 도메인)에서 리소스에 접근을 허용합니다. *는 모든 도메인을 나타냅니다. 
         # 이를 통해 어떤 Origin에서도 해당 리소스에 접근할 수 있게 됩니다.
         add_header 'Access-Control-Allow-Origin' '*';
         # 요청이 인증 정보(예: 쿠키, 인증 토큰)를 포함하고 있을 때 CORS 요청을 허용하는지 여부를 지정합니다. 
         # true로 설정되어 있으므로 인증 정보가 있는 요청도 허용됩니다.
         add_header 'Access-Control-Allow-Credentials' 'true';
         # 허용되는 HTTP 메서드를 지정합니다. 이 경우, GET, POST 및 OPTIONS 메서드가 허용됩니다.
         add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
         # 허용되는 HTTP 헤더를 지정합니다. 이 헤더는 다양한 표준 및 사용자 지정 헤더를 허용하며, 다양한 클라이언트 요청을 처리하기 위해 사용됩니다. 
         # 이 예에서는 DNT, X-CustomHeader, Keep-Alive, User-Agent 등 다양한 헤더를 허용하고 있습니다.
         add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
     }
 ​
     # https 추가
     # 핵심 인증을 위한 폴더를 명시
     listen 443 ssl; # managed by Certbot
     ssl_certificate /etc/letsencrypt/live/www.nuri777.kro.kr/fullchain.pem; # managed by Cert>
     ssl_certificate_key /etc/letsencrypt/live/www.nuri777.kro.kr/privkey.pem; # managed by Ce>
 ​
     include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
     ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
 }
 ​
 # 80 포트로 접근시 443 포트로 리다이렉트 시켜주는 설정
 # 핵심
 server {
     if ($host = www.nuri777.kro.kr) {
             return 301 https://$host$request_uri;
     } # managed by Certbot
 ​
 ​
     # listen 80;: 이 설정은 Nginx가 IPv4 주소를 사용하여 80번 포트에서 들어오는 
     # HTTP 요청을 수신하도록 지시합니다. 
     # 80번 포트는 일반적으로 HTTP 트래픽을 처리하는 데 사용됩니다.
     listen 80;
     # listen [::]:80;: 이 설정은 Nginx가 IPv6 주소를 지원하며, 
     # IPv6 주소에서 80번 포트에서 들어오는 HTTP 요청도 수신하도록 지시합니다. 
     listen [::]:80;
 ​
     server_name nuri777.kro.kr;
     return 404; # managed by Certbot
 }