첫 번째 시도인 1번 과 2번 ...
두 번째 시도인 3번 과 4번 ...
이들 모두에서 최초 목표인Nginx
의 리버시 프록시 서버 와Certbot
을 이용한 SSL 인증키 그리고Nginx
의 bypass redirect 를 이용한HTTPS 서버
구축하기 에는 실패했습니다.하지만, 두 번째 시도를 통해서 근본적인
이론
과테스트 커맨드
를 알게 되었고 Nginx 와 Certbot 설정에는 문제가 없을을 알게 되었습니다.따라서 HTTP to HTTPS redirect 부분만 손보면 될 것 같다고 판단하였습니다.
다음 자료를 참고했습니다.
현재 상황은 도메인 주소
로 접속을 하면 SSL 인증이 작동하고 있었습니다.
단, Nginx Certbot 연결에서
www.도메인주소
를 제거했기 떄문에, 해당 주소는 전부 제거해주었습니다.
따라서, 문제 되는 부분이 모두 80 포트의 server 선언부
에 있다고 판단했습니다.
server {
if ($host = unchaptered.ddns.net) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name unchaptered.ddns.net;
return 301 https://unchaptered.ddns.net$request_uri;
return 404; # managed by Certbot
}
아마도 80 포트로 접속 요청이 갔을 때, IPv4 일 때는 조건문에 false 이기 때문에 bypass 가 안된다고 생각했습니다.
하지만 기본적인 return 구문이 작동한다면 당연히 return 301 https://unchaptered.ddns.net$request_uri;
부분도 작동 해야 하지 않나? 라고 생각했습니다.
따라서, 다른 키워드가 정답이라고 생각했고 location / {}
라는 부분이 생략되어 있음을 찾고 파일을 다음과 같이 수정하였습니다.
server {
listen 80;
listen [::]:80;
server_name unchaptered.ddns.net;
location / {
return 301 https://unchaptered.ddns.net$request_uri;
}
}
이번에는 bypass redirect 에 성공했습니다.
그런데, 404 Not Found
에러가 떴고 심지어 기존에 정상 작동 되던 https 도 나오지 않았습니다.
그 과정에서 /etc/nginx/site-enabled
에 있는 default 파일을 지웠던 것이 기억났고 아, SSL 코드가 적힌 server {}
안의 root 가 매핑을 하고 있음을 알 수 있었습니다.
따라서, 다음의 root 구문을 추가하여 문제를 해결했습니다.
server {
root /var/www/도메인주소/html/;
index index.html index.htm index.nginx-debian.html;
server_name 도메인주소;
location / {
try_files $uri $uri/ =404;
}
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
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
}
server {
listen 80;
listen [::]:80;
server_name 도메인주소;
root /var/www/도메인주소/html;
location / {
return 301 https://도메인주소$request_uri;
}
}