- 도메인의 호스팅이 완료된 이후, https 프로토콜을 활용하기 위한 설정을 진행합니다.
아직 도메인 네임 서버에 도메인을 등록하지 않았다면?
- (이전글)도메인 주소를 DNS에 호스팅하기
Letsencrpyt 와 Certbot을 이용한 SSL(TSL) 설정
Certbot
- https://certbot.eff.org/instructions?ws=nginx&os=ubuntufocal
- 공식 사이트에서 소개하는 nginx 와 ubuntu 20 에서의 사용방법
- https://eff-certbot.readthedocs.io/en/stable/install.html#alternative-1-docker
- 그외 문서, 도커를 활용하는 방식 소개
- Let's encrpyt 인증 서버와 통신하고 인증서를 받는 단계를 자동화 해주는 클라이언트 봇
- Certbot을 이용한 인증 방식 세가지를 소개한다.
- 기본
- 80 포트가 프리해야 함. nginx 서버가 실행 중이라면 잠깐 멈추고 Certbot을 실행해줘야 한다.
- 기본
- certbot certonly 로 실행하는 경우 (아래 외 옵션이 더 있는지는 잘 모르겠다.)
- webroot 방식
- 특정 url(/.well-known/acme-challenge)을 매핑하는 디렉토리를 지정하고, 이 디렉토리를 이용해서 인증을 수행한다.
- DNS TXT record 방식
- 역시나 특정한 url을 활용해 인증을 수행하는데, DNS에 고유한 TXT 레코드를 생성하는 방식을 활용한다.
- webroot 방식
참고
- Docker Nginx Let’s Encrypt 인증서 발급 및 자동갱신
- Certbot 과 Let's encrpyt 의 동작 원리 및 도커를 활용하여 webroot 방식으로 인증서를 발급받는 과정을 매우 잘 설명해두었다.
- 해당 블로그 글도 그렇고 여타 블로그들에서 엔진엑스 설정파일을 관리하는 법을 설명할 때, '/etc/nginx/sites-available' 에 사이트별 설정 파일을 만들고 이를 '/etc/nginx/sites-enabled' 디렉토리에 심볼릭 링크(일종의 바로가기 파일)를 생성하는 방식을 이야기하는 것을 볼 수 있다.
- 그러나 이러한 디렉토리는 엔진엑스의 설치 버전 및 os에 따라 존재하지 않기도 하므로, 필요하면 적절히 디렉토리를 생성해서 활용한다. 나는 개인적으로 복잡한 설정 파일 구성이 필요한 것이 아니므로 생략한다.
- Docker, Certbot을 이용한 Let's encrypt 인증서 발급 및 관리
- DNS TXT record 방식을 이용하여 인증서를 발급받는 과정을 잘 설명해두었다.
명령어
docker run -it --rm --name certbot \
-v "/etc/letsencrypt:/etc/letsencrypt" \
-v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
-v "/var/log/letsencrypt:/var/log/letsencrypt" \
certbot/certbot \
certonly --webroot -w /var/lib/letsencrypt \
-d dodonenow.com --agree-tos
- 여기서 세번째 볼륨 설정은 그냥 로그가 궁금해서 넣어봤습니다.(공식 사이트 문서를 보면 위 두 개 디렉토리만 볼륨을 설정한다.)
- 저기다가 로그를 찍어준대서 추가해보았다. certbot의 로그는 잘 찍혔다. 하지만, 생략 가능하다.
- 도커는 실행 후 바로 삭제가 되도록 --rm 옵션을 준다.
- -it 도커를 인터랙티브 모드로 실행시켜서 바로 certbot 명령어를 수행하도록 한다.
- certbot은 certonly 모드로 실행하고, webroot 방식을 활용한다.
- 그 외 몇가지 Argument를 전달한다. 그 중 -w 인수는 webroot 모드에서 사용할 디렉토리를 지정한다.
- --agree-tos 는 기타 동의 질문에 항상 y를 던져주도록 하는 옵션
재발급 크론 설정
- 참고1 블로그 에서 확인한 재발급 명령어를 나열한 간단한 실행파일 생성
docker run --rm --name certbot -v "/var/log/letsencrypt:/var/log/letsencrypt" -v "/etc/letsencrypt:/etc/letsencrypt" -v "/var/lib/letsencrypt:/var/lib/letsencrypt" certbot/certbot renew >> /{적당한 위치}/nginx/certbot_renew.log
docker restart nginx # 컨테이너명
https://eff-certbot.readthedocs.io/en/stable/using.html#renewing-certificates
renew 명령에 훅 옵션이 있었다! (도커 컨테이너를 사용하므로 패스)
renew 명령어는 인증서 만료기간이 30일 남았을 때부터 동작한다.
# 갱신기간이 남은 경우 로그 Certificate not yet due for renewal - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The following certificates are not due for renewal yet:
--force-renewal 옵션을 통해서 만료기간이 남은 경우에도 강제로 갱신하게 할 수는 있다.
INFO:certbot._internal.renewal:Non-interactive renewal: random delay of 245.10606920633938 seconds
- https://github.com/NginxProxyManager/nginx-proxy-manager/issues/238
- --no-random-sleep-on-renew 옵션을 통해 랜덤 딜레이 타임을 해소할 수 있다.
크론 탭으로 등록
Nginx
참고
- [Nginx] 기본 설정 방법
- 엔진엑스 기본 설정 방식(구조)에 대해서 아주 잘 정리되어 있다.
설정
# nginx/conf.d/default.conf 혹은 도메인명.conf 파일
server {
server_name {도메인명};
listen 80;
listen [::]:80;
# http로 들어오면 https로 redirect
location / {
return 301 https://$host$request_uri;
}
# certbot webroot 방식 인증
location /.well-known/acme-challenge {
root /var/lib/letsencrypt/;
}
}
server {
server_name {도메인명};
listen 443 ssl;
# Certificate
ssl_certificate /etc/letsencrypt/live/{도메인명}/fullchain.pem;
# Private Key
ssl_certificate_key /etc/letsencrypt/live/{도메인명}/privkey.pem;
# 빌드된 프론트 데이터 매핑
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://api도커컨테이너:포트번호;
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;
}
}
- 엔진엑스의 url 매핑 우선순위는 상세하고 정확할수록 높다고 한다.
'Sever > Tools' 카테고리의 다른 글
Git Submodule 활용 (0) | 2025.02.26 |
---|---|
Git 활용 (0) | 2021.01.31 |