728x90
반응형
이전 포스트와 다르게 Docker를 활용한 SSL 인증을 구현해보았다. Cerbot 컨테이너를 만들고, docker compose 명령어를 통해 동작
1. /docker/nginx/default.conf 생성
최초 certbot 인증 시에는 아래와 같이 기본 세팅으로 해야한다.
server {
listen 80;
listen [::]:80;
server_name 도메인 이름;
server_tokens off;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
}
2. /docker/nginx/ Dockerfile 생성
FROM nginx:latest
COPY ./default.conf /etc/nginx/conf.d/default.conf
CMD ["nginx", "-g", "daemon off;"]
3. docker-compose.yml 추가
services:
nginx:
build: ./docker/nginx
ports:
- "80:80"
- "443:443"
restart: always
environment:
TZ: Asia/Seoul
volumes:
- ${CERTBOT_WWW_DIR}:/var/www/certbot/:ro
- ${CERTBOT_CONF_DIR}:/etc/nginx/ssl/:ro
depends_on:
- client
- server
certbot:
image: certbot/certbot:latest
volumes:
- ${CERTBOT_WWW_DIR}:/var/www/certbot/:rw
- ${CERTBOT_CONF_DIR}:/etc/letsencrypt/:rw
client:
...
server:
...
4. .env파일 작성
...
# CERTBOT
CERTBOT_WWW_DIR=/data/certbot/www
CERTBOT_CONF_DIR=/data/certbot/conf
5. Docker compose up
$ docker compose up -d
인증서 발급을 위해 Nginx 서버를 켜준다.
6. 인증서 발급
$ docker compose run --rm certbot certonly --webroot --webroot-path /var/www/certbot/ -d 도메인이름
pem 키 위치 확인
7. default.conf 파일 수정
upstream client{
server client:3000;
}
upstream server{
server server:8080;
}
server {
listen 80;
listen [::]:80;
server_name [도메인이름];
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /var/www/certbot;
}
location / {
return 301 https://[도메인이름]$request_uri;
}
}
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name [도메인이름];
ssl_certificate /etc/nginx/ssl/live/[도메인이름]/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/live/[도메인이름]/privkey.pem;
#access_log /var/log/nginx/host.access.log main;
location /api {
proxy_pass http://server;
proxy_redirect off;
rewrite ^/api/(.*)$ /$1 break;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
}
location / {
proxy_pass http://client;
root /usr/share/nginx/html;
index index.html index.htm;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
#allow deny ip
#allow 12.0.0.0;
#deny all;
}
8. docker 재시작
$ docker compose up -d
Nginx Service에 restart:always 옵션이 존재하기 때문에 Nginx Service는 재시작된다.
9. 인증서 관련 명령어
- 인증서 확인
$ docker compose run --rm certbot certificates
- 인증서 갱신
$ docker compose run --rm certbot renew
10. 크론 탭 활용 (crontab)
- /bin/letsencrypt.sh 파일 작성
cd /home
date >> /home/certbot_renew.log
sudo docker compose run --rm certbot renew >> /home/certbot_renew.log
sudo docker compose restart nginx
- 실행 권한 부여
$ sudo chmod +x /bin/letsencrypt.sh
- 크론탭 열고 편집
$ sudo crontab -e
- 아래 배치잡 생성
30 4 * * 0 /bin/letsencrypt.sh
- 저장 후 배치잡 확인
$ sudo crontab -l
-저장하고 크론 다시 실행
$ sudo service cron restart
728x90
반응형
'Nginx' 카테고리의 다른 글
Nginx | SSL 인증 ( https ) 무료로 적용하기 Let's Encrypt | 빌드 환경에 따른 Dockefile (0) | 2024.03.11 |
---|---|
Nginx | SSL 인증 ( https ) 무료로 적용하기 Let's Encrypt (0) | 2022.06.24 |