docker,nginx,letsencrypt — 사이트 설정, 달콤, 달콤한 HTTPS!

docker,nginx,letsencrypt — 사이트 설정, 달콤, 달콤한 HTTPS!



나는 과거에 letsencrypt 를 사용하여 무료 인증서를 받았지만, Docker/kestrel/nginx로 돌아간 후, 나는 그것을 성공적으로 사용한 적이 없다.오늘 모든 것이 변했다. 나는 내가 무엇을 해서 그것을 일하게 하는지 이해하는 데 오랜 시간이 걸렸다.
유닉스,docker,nginx는 모두 새로운 것이기 때문에 이것은 내가 줄곧 놓친 간단한 것일 수도 있다.그럼에도 불구하고 나는 이것이 다른 사람들을 도울 수 있기를 바란다. 아니면 앞으로 몇 달 동안 내가 다시 이렇게 하기로 결정한다면.

원래 설정


.net core 사이트가 있는데 kestrel 위탁관리를 통해 docker 에서 nginx 역방향 에이전트를 통해 실행됩니다.지금까지nginx에서 온 역방향 에이전트는 http/80 포트에서만 일했다.나는 역방향 에이전트를 잘 알지 못하지만, 그 소리를 보면, 요청을 받을 수 있고, 요청자를 대표하여 그것을 특정 위치로 전달할 수 있다.내 예에서,nginx 용기는 http 요청을 받고,nginx는 이 요청을 내kestrel 호스트에 전송합니다.net 핵심 사이트.그렇습니까?유망히
앞에서 말한 바와 같이nginx는 http 데이터만 처리합니다. 저는 https를 사용할 때 많은 번거로움을 겪었습니다. 원시 설정은 다음과 같습니다.
docker 작성:
version: '3.6'
services:

  kritner-website-web:
    image: ${DOCKER_REGISTRY}/kritnerwebsite
    expose:
      - "5000"
    networks:
      - frontend
    restart: always
    container_name: kritnerwebsite_web
  kritner-website-nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ../src/nginx/nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - kritner-website-web
    networks:
      - frontend
    restart: always
    container_name: kritnerwebsite_nginx

networks:
  frontend:
dockercompose 파일에서 나는 두 개의 독립된 용기를 사용했다 — 이 사이트는 포트 5000(docker 네트워크에서는 공개하지 않음)과 포트 80에서 실행되는nginx를 공개했다.
nginx.형태
worker_processes 4;

events { worker_connections 1024; }

http {
    sendfile on;

    upstream app_servers {
        server kritner-website-web:5000;
    }

    server {
        listen 80;

        location / {
            proxy_pass [http://app_servers](http://app_servers);
            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 X-Forwarded-Host $server_name;
        }
    }
}
프로필에서, 우리는 상위 서버를 설정하고 있습니다. 그 이름은 dockercompose file kritner 사이트 웹:5000에서 용기 서비스를 호출하는 이름과 같습니다.
상기 모든 내용은 제 사이트의 저장소에서 찾을 수 있습니다commit point.

HTTPS 입력


Letsencrypt는 인증서 발급 기관으로 무료 인증서를 제공하여 귀하의 사이트를 보호하는 데 도움을 줍니다.왜 TLS를 통한 HTTPS가 중요합니까?음, 이것은 매우 많고, 그리고 그것이 어떻게 작동하는지, 그러나 기본적인 사상은 사용자 데이터가 다른 한쪽으로 전송되기 전에 양쪽에서 암호화된다는 것이다.이것은 공공 와이파이와 https에서'후탐전선'이라고 말할 수 있는 사람은 데이터가 발생하고 있지만 상기 데이터의 내용을 보지 못한다는 것을 의미한다. 왜냐하면 양쪽 모두 같은 암호화 키를 사용하여 상기 데이터를 암호화/복호화하기 때문이다.http 사이트에서 이 데이터는 순수한 텍스트로 전송됩니다 — 이것은 당신의 데이터가 도청될 위험이 있다는 것을 의미합니다!아마도 나는 언젠가 암호화에 관한 더 많은 내용을 쓸 것이다 (주의하십시오) — 특히 내 일상적인 일이니까!
그래서 letsencrypt. — 이것은 내가 이전에 사용한 서비스로, 가능한 한 쉽게 사용할 수 있도록 각양각색의 실현이 있다.이 글에 대한 연구를 통해 나는 우연히 발견했다.
ACME Client Implementations - Let's Encrypt - Free SSL/TLS Certificates
비록 나는 이제야 진정으로 이 페이지를 찾았지만, 아마도 내가 모험을 시작하기 전에 그것은 매우 유용할 것이다.letsencrypt와docker 용기 사이트와nginx를 함께 사용하고 싶습니다. 가능한 한 유지보수를 줄이고 싶습니다. 왜냐하면 letsencrypt 인증서는 90일만 사용할 수 있기 때문입니다.내 연구에서 나는 우연히 docker 이미지linuxserver/letsencrypt를 발견했다. 이것은nginx,letsencrypt 인증서 생성과 자동 업데이트를 사용하겠다고 약속했다.듣기에 대단히 좋다!비록 그림의 문서는 기본적으로 충분한 것 같지만, 적어도 나는 이 과정에 정통한 사람에게나는 그것이 부족하다는 것을 발견했다.전체 설치 과정에 시간이 좀 걸렸기 때문에 이 글은 다음 사람, 또는 내가 미래에 도움이 되기를 바랍니다!
Linux 서버.입출력 로고

투쟁


이 linux 서버/letsencrypt 이미지를 시작하고 정상적으로 작동시킬 때 가장 골치 아픈 일은 다음과 같다.
  • docker 볼륨이 어떻게 작동하는지 및 이 용기와의 관계
  • 내 구성을 활용하기 위해 볼륨을 설정하는 방법 (상기 참조) — 처음에, 나는 왜 내가 용기에 변경한 설정이 상기 용기를 다시 불러올 때 변경되었는지 알기 어려웠다(왜냐하면 이것은 그들이 해야 할 일이기 때문이다)
  • 정확한nginx 설정을 어떻게 설정합니까 — 어디에 두어라, 무엇을 두어라.
  • Docker 볼륨


    Docker 볼륨 doc:

    Volumes are the preferred mechanism for persisting data generated by and used by Docker containers. While bind mounts are dependent on the directory structure of the host machine, volumes are completely managed by Docker. Volumes have several advantages over bind mounts


    letsencrypt는 많은 설정이 있습니다. 제가 실현하는 데 시간이 걸렸지만, docker 호스트의 디렉터리에서 letsencrypt 이미지의 특정 디렉터리로 비추는 볼륨이 필요합니다.나는 마침내 문서 작성에서 이 점을 완성했다. 다음과 같다.
    volumes:
          - ${DOCKER_KRITNER_NGINX}:/config 
          - ./nginx.conf:/config/nginx/site-confs/default
    
    그룹의 첫 번째 항목(${DOCKER\u KRITNER\u NGINX}:/config)은 호스트 디렉토리(변수에 정의됨)를 DOCKER 컨테이너 자체의/config에 매핑하는 새로운 환경 변수를 사용합니다.이것은 docker 호스트 (envvar 경로에 있음) 가 볼륨 맵의 두 번째 부분 (/config) 에 docker 용기와 같은 설정을 포함한다는 것을 의미합니다
    두 번째 (./nginx.conf:/config/nginx/site-confs/default)는 로컬 저장소인nginx를 비추었습니다.conf 파일 (역방향 프록시 설정 파일) 은docker 호스트와 용기에 있는/config/nginx/site confs/default 파일을 덮어씁니다.
    내 특수한 상황에 맞추어 최종적으로 수정해야 할 파일의 전체 목록은 다음과 같다.
  • /config/dns-conf/dnsimple.ini
  • /config/nginx/site-confs/default
  • dnsimple.ini 설정은add myapi 키입니다.../기본값은nginx 설정을 포함합니다.
    마지막 기본 구성은 다음과 같습니다.
    upstream app_servers {
            server kritnerwebsite:5000;
    }
    
    ## Version 2018/09/12 - Changelog: https://github.com/linuxserver/docker-letsencrypt/commits/master/root/defaults/default
    
    # listening on port 80 disabled by default, remove the "#" signs to enable
    # redirect all traffic to https
    server {
     listen 80;
     server_name kritnerwebsite;
     return 301 https://$host$request_uri;
    }
    
    # main server block
    server {
     listen 443 ssl;
    
    # enable subfolder method reverse proxy confs
     include /config/nginx/proxy-confs/*.subfolder.conf;
    
    # all ssl related config moved to ssl.conf
     include /config/nginx/ssl.conf;
    
     # enable for ldap auth
     #include /config/nginx/ldap.conf;
    
    client_max_body_size 0;
    
    location / {
                proxy_pass http://app_servers;
                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 X-Forwarded-Host $server_name;
        }
    
    }
    
    # enable subdomain method reverse proxy confs
    include /config/nginx/proxy-confs/*.subdomain.conf;
    # enable proxy cache for auth
    proxy_cache_path cache/ keys_zone=auth_cache:10m;
    
    이전의 기본 설정에 비하면, 여기에 약간의 변경 사항이 있습니다. 아래에 중점을 두고 소개하겠습니다.
    upstream app_servers {
            server kritnerwebsite:5000;
    }
    
    위의 내용은 매우 멋있다. 왜냐하면 Docker는 자신의 내부 DNS를 가지고 있기 때문이다.용기 이름을 통해 상위 서버를 설정할 수 있습니다. 예를 들면'kritner 웹 사이트'입니다. (글 앞에서'kritner 사이트'를 변경했습니다.
    # listening on port 80 disabled by default, remove the "#" signs to enable
    # redirect all traffic to https
    server {
     listen 80;
     server_name kritnerwebsite;
     return 301 https://$host$request_uri;
    }
    
    기본값에서 이 부분에 대한 설명을 취소하고 서버 이름 "kritner 웹 사이트"를 적용합니다
    # main server block
    server {
     listen 443 ssl;
    
    # enable subfolder method reverse proxy confs
     include /config/nginx/proxy-confs/*.subfolder.conf;
    
    # all ssl related config moved to ssl.conf
     include /config/nginx/ssl.conf;
    
     # enable for ldap auth
     #include /config/nginx/ldap.conf;
    
    client_max_body_size 0;
    
    location / {
                proxy_pass http://app_servers;
                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 X-Forwarded-Host $server_name;
        }
    
    }
    
    위에서 기본값에서 위치와 객체 내의 모든 컨텐트로 저장됩니다.여기서, 우리는 역방향 에이전트를 설정하고, 요청을 "/"(모든 내용) 에서 우리의 http://app_servers (우리의 상류에 따라, kritner 웹 사이트) 로 전송합니다.

    docker 작성.yml 회사


    우리의 dockercompose 파일은 초기 파일에 비해 큰 변화가 없지만 주의할 만한 변화가 있습니다. 저도 이에 대해 설명할 것입니다.
    version: '3.6'
    services:
    
      nginx:
        image: linuxserver/letsencrypt
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - ${DOCKER_KRITNER_NGINX}:/config 
          - ./nginx.conf:/config/nginx/site-confs/default
        depends_on:
          - kritnerwebsite
        networks:
          - frontend
        container_name: nginx
        environment:
          - PUID=1001 # get on dockerhost through command "id <user>""
          - PGID=1001
          - [email protected]
          - URL=kritner.com
          - SUBDOMAINS=www
          - TZ=America/NewYork
          - VALIDATION=dns # using dns validation
          - DNSPLUGIN=dnsimple # via dnsimple, note there is additional configuration require separate from this file
          # - STAGING=true # this should be uncommented when testing for initial success, to avoid some rate limiting
    
    kritnerwebsite:
        image: ${DOCKER_REGISTRY}/kritnerwebsite
        networks:
          - frontend
        expose:
          - "5000"
        restart: always
        container_name: kritnerwebsite
    
    networks:
      frontend:
    
    새 부품의 경우:
    nginx:
        image: linuxserver/letsencrypt
    
    다른 이미지 사용 — linuxserver/letsencrypt가nginx를 대체합니다.이 이미지는nginx를 포함하지만,certbot, 응용 프로그램이 시작될 때certbot을 실행하는cronjob도 포함합니다.
    ports:
          - "80:80"
          - "443:443"
    
    현재 우리는 http와 https 포트를 동시에 사용합니다. (주의:nginx 설정을 통해 http를 https로 호출합니다.)
    volumes:
          - ${DOCKER_KRITNER_NGINX}:/config 
          - ./nginx.conf:/config/nginx/site-confs/default
    
    본고에서 논의한 바와 같이 dnsimpleapi 키와 kritner 웹 사이트에 역방향 프록시를 사용하여nginx 설정을 정확하게 설정합니다.
    environment:
          - PUID=1001 # get on dockerhost through command "id <user>"
          - PGID=1001
          - [email protected]
          - URL=kritner.com
          - SUBDOMAINS=www
          - TZ=America/NewYork
          - VALIDATION=dns # using dns validation
          - DNSPLUGIN=dnsimple # via dnsimple, note there is additional configuration require separate from this file
          # - STAGING=true # this should be uncommented when testing for initial success, to avoid some rate limiting
    
    letsencrypt 문서에 필요한 환경 변수:
    linuxserver/letsencrypt
  • PUID/PGID — 명령 "id"
  • 를 통해dockerhost에 들어갑니다.
  • e-메일 — 응, 너의 이메일(인증서 만료 이메일에 사용됨)
  • URL — 마스터 도메인 URL
  • 하위 도메인 — 인증할 URL의 모든 하위 도메인
  • TZ — 시간대
  • 검증 — 실행할 인증 유형 — 나는 DNSimple을 사용하기 때문에 이 분야에서 DNS가 필요하다.기타 옵션은 html, tlssni
  • dnsplugin — dnsimple 회사 — letsencrypt 문서
  • 에 따르면 다른 옵션은 cloudflare,cloudxns,digitalocean,dnsmadeeasy,google,luadns,nsone,rfc2136,route53을 포함한다
  • 세그먼트 = 참 — 나는 그것으로 나의 모든 시도를 테스트한 후에 그것을 일하게 했다.letsencrypt는 무대 모드로 실행되지 않을 때 속도 제한이 있거나 적어도 무대 모드에서는 실행하기 어렵습니다.
  • 위의 모든 변경, 실험, 실패, 그리고 최종 성공은 이pull 요청에서 찾을 수 있습니다.
    Nginx by Kritner · Pull Request #24 · Kritner/KritnerWebsite
    최종 결과는 어떻습니까?

    https://www.ssllabs.com/ -

    "A+"는 아니지만, 미리 구축된 docker 이미지를 사용하여 나의 HTTPs 수요를 만족시키는 것은 정말 좋다!
    관련:

  • 좋은 웹페이지 즐겨찾기