-
Docker-compose + Nginx Letsencrypt적용 (완벽)program_language 및 궁금한것/Docker 2022. 7. 13. 20:14
지난주 Letsencrypt설정을 여러번 시도하다 어뷰징에 걸려 7일동안 작업을 못했었습니다.
7일이 지난 오늘 여차 저차 작업을 마무리 하였습니다.
Letsencrypt는 여러번 인증서 발급시에 인증서 발급이 막힙니다.
스펙: Docker-compose + Nginx + Letsencrypt
누구든 한방에 성공하게 완벽 정리합니다.
치열한 검색기록의 흔적들..
1. YUM epel저장소 추가
yum install epel-release
2. YUM cerbot 설치
yum install certbot
3. 443 방화벽 오픈
firewall-cmd --permanent --add-service=https firewall-cmd --reload
4. –standalone 옵션으로 인증서 생성시 오류가 나기 때문에 잠깐 nginx 를 꺼야 합니다.
docker stop [nginx]
5. Letsencrypt 인증서 생성
1. 도메인이 한개일때 certbot certonly --standalone -d 생성할 도메인 # ex certbot certonly --standalone -d domain.com 2. 도메인이 여러개일때 certbot certonly --standalone -d 생성할 도메인1 -d 생성할 도메인2 # ex certbot certonly --standalone -d domain.com1 -d domain.com2
모두 y 체크
인증서가 제대로 발급되었다면 /etc/letsencrypt/live/domain.com1/ 같이 입력한 도메인 명으로 폴더가 생긴걸 확인할 수 있어요.
tip. 도메인을 여러개 추가 하더라도 하나의 폴더가 생성됩니다.
6. /etc/letsencrypt/options-ssl-nginx.conf 파일 생성 (아래 링크 내용 복붙 중요)
cd /etc/letsencrypt vi options-ssl-nginx.conf
7. default.conf설정 (nginx)
server { listen 80; server_name domain.com1; server_tokens off; return 301 https://$host$request_uri; #http -> https 로 리다이렉트 시킴 필요없으면 안써도됨 } server { listen 443 ssl; server_name domain.com1; ssl_certificate /etc/letsencrypt/live/domain.com1/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domain.com1/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; location / { proxy_pass proxy.domain.com1; } } server { listen 443 ssl; #domain.com2는 80허용 안하고 443만 허용할거임 server_name domain.com2; #server_name이 달라도 domain.com1의 동일한 폴더명을 사용합니다. ssl_certificate /etc/letsencrypt/live/domain.com1/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domain.com1/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; location / { proxy_pass proxy.domain.com2; } }
7번까지만 완료하신 후에 docker run을 하게 되면 에러가 납니다. 무슨에러? 제가 오늘 애타게 찾던 아래 에러요.
nginx: [emerg] cannot load certificate "/etc/letsencrypt/live/domain.com/fullchain.pem": BIO_new_file() failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/letsencrypt/live/domain.com/fullchain.pem','r') error:2006D080:BIO routines:BIO_new_file:no such file)
그럴만한게 docker로 올라간 nginx에는 /etc/letsencrypt/live/domain.com/fullchain.pem, privkey.pem파일이 없거든요.
볼륨 설정을 해줘야지요.
8. docker-compose.yml 설정
version: '2.1' services: nginx: container_name: nginx-proxy image: "nginx:latest" ports: - "80:80" - "443:443" networks: - backend restart: always volumes: - /nginx/default.conf:/etc/nginx/conf.d/default.conf - /var/log/nginx:/var/log/nginx # log파일의 위치 - /etc/letsencrypt:/etc/letsencrypt #letsencrypt폴더 위치 environment: - TZ=Asia/Seoul networks: backend: driver: bridge
8. docker-compose 반영
docker-compose up -d > nginx-proxy is up-to-date docker start nginx-proxy
9. crontab설정( 스케쥴러 )
Letsencrypt는 3개월마다 인증서 만료가 되어 갱신을 해줘야 합니다.
일일히 하면 귀찮으니 스케쥴러를 걸어 줍니다.
1) 인증서 갱진 전(pre_hook) 후(post_hook) 작업 설정
vi /etc/letsencrypt/renewal/domain.com1.conf ## [renewalparams] 섹션에 pre_hook, post_hook 설정 추가 [renewalparams] ... ... pre_hook = docker stop nginx-proxy # nginx-proxy는 본인이 지정한 이미지 names 적기 post_hook = docker start nginx-proxy ...
2) crontab 스케쥴러 설정
crontab -e ## 한달에 한번씩 인증서가 갱신되도록 작업 추가 0 0 1 * * /bin/bash -l -c 'certbot renew --quiet'
반응형'program_language 및 궁금한것 > Docker' 카테고리의 다른 글
[Docker] 도커의 장점 (0) 2019.11.19 [ Docker ] 하이퍼바이저란? (0) 2019.11.12 [ Docker ] 클라우드란 ? (0) 2019.11.12