ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 파일 생성 (아래 링크 내용 복붙 중요)

    https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/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

    댓글

Designed by Tistory.