요즘 회사 서비스에 blue, green 무중단 배포를 적용하고 있습니다.
오늘 터진 문제는 개발 환경을 만드는 상황에서 터진 문제입니다.
문제
docker compose를 이용해 Let's encrypt 인증을 받고, nginx를 띄우려는데 400에러가 발생하였습니다.
docker-compose 파일에는 spring project, nginx, certbot, redis 컨테이너에 대한 내용이 있었습니다.
docker-compose.yml, nginx.conf 파일을 도메인 부분을 변경하는 등 테스트 환경에 맞게 수정 후 실행했습니다.
docker ps 명령어로 제대로 작동하는지 확인했지만 nginx에서 문제가 발생하는듯 했습니다.

자꾸 nginx가 재시작 하고있었습니다.
nginx 로그를 확인했습니다.

로그를 확인했을때 인증서를 못찾겠다는 내용 같았습니다.
인증서 발급에 사용되는 Certbot의 로그 또한 확인하였습니다.

연결이 거절되었다고 합니다.
Let's Encrypt(Certbot)의 검증 방식은 다음과 같습니다.
- Nginx가 80번 포트에서 /.well-known/acme-challenge/ 경로를 열어둠
- Certbot이 http://도메인.com/.known/acme-challenge/... 에 접근
- fullchain.pem, privkey.pem (인증서)가 /etc/letsencrypt/live/도메인.com 에 생김
저는 인스턴스 빌리자마자 포트부터 열어놔서 왜 접근을 못하는지 이해가 안되는 상황이였습니다.

문제 해결
해결은 굉장히 단순하게 했습니다.
Nginx.conf의 443부분을 모두 주석 처리한 후 실행 -> 주석 풀고 다시 실행 하여 해결했습니다.
문제는 순서에 있었습니다.
Nginx.conf에서 인증서가 발급되지 않았는데 443 블록을 설정해놓은것이 문제였습니다.
nginx.conf 파일의 일부를 보여드리겠습니다.
## nginx.conf 일부
server {
listen 443 ssl;
server_name 설정 도메인.com;
ssl_certificate /etc/letsencrypt/live/설정 도메인.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/설정 도메인.com/privkey.pem;
location / {
proxy_pass http://spring;
proxy_redirect off;
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 Authorization $http_authorization; # 추가
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location ~ /.well-known/acme-challenge {
allow all;
root /var/www/certbot;
}
}
etc/letsencrypt/live/설정도메인.com에서 인증서를 가져오라는데 인증서가 없어서 터진 오류였습니다.
해결을 위해 443 부분을 주석 처리 후 다시 실행하였습니다.
다음 명령어로 인증서가 생긴걸 확인할 수 있습니다.
## /certbot/conf 경로
sudo ls -l live/설정 도메인

인증서가 생긴걸 확인하였으니 주석을 제거한 후 다시 실행하고 접속하였습니다.

성공적으로 해결된 것을 확인하였습니다.
초보 개발자의 글이라 부족한 점이 많습니다. 잘못된 점 등을 말씀해주시면 감사히 받겠습니다.
'Infra' 카테고리의 다른 글
[Jenkins] Built-In Node 오프라인 에러, Disk space is below threshold of 1.00GiB (0) | 2025.04.02 |
---|---|
[Infra] Grafana, Loki로 Docker 컨테이너 모니터링 하기, 로그 모니터링 시스템 구축하기 (2) | 2025.03.05 |
[Infra] npm Unable to authenicate 에러, npm ERR! code401, .npmrc 에러 (0) | 2024.08.18 |
[Infra] Jenkins로 Slack에 알림 보내기 (0) | 2024.08.06 |
[Infra] Ngrok 사용법, 외부에서 내 로컬에 접속, local에서 Jenkins Webhooks 설정, Mac (0) | 2024.06.10 |