通過 Laradock 學 Docker-HTTPS

coding01發表於2019-03-04

通過 Laradock 學 Docker-HTTPS

前言

上一篇文章我們對 laradock 的配置檔案有了一個初步的瞭解,現在我們基本可以隨心所欲的配置網站了,以此作為我們的開發環境可以說是方便快捷。

鑑於越來越多的平臺要求接入網站提供 https 協議的介面。如何讓我們的網站也支援 https,已經迫在眉睫。

接下來我們來通過 laradock 學習下,如何讓我們的網站支援 https 協議。

實現方式

目前來說,讓網站支援 https 大概有兩種方案,一種是向代理證照的公司購買證照,這種方式可以獲得1年以上的服務,當然時間的長度取決於你們之間合約的長短了。

另一種方案是通過 let`s encrypt 或 symantec 等公司提供的免費證照,這種方式一般合約期短,每三個月需要重新申請一次。

laradock 專案中已經整合了 let`s encrypt 公司的證照申請工具,我們來看看如何實現的。

配置文件

docker-compose.yml

我們找到配置檔案中 certbot 的程式碼

    certbot:
      build:
        context: ./certbot
      volumes:
        - ./data/certbot/certs/:/var/certs
        - ./certbot/letsencrypt/:/var/www/letsencrypt
      environment:
        - CN="fake.domain.com"
        - EMAIL="fake.email@gmail.com"
      networks:
        - frontend
複製程式碼

配置裡說明了容器基於 certbot 這個目錄,然後把 laradock/data/certbot/certs 目錄對映到容器內 /var/certs,把 laradock/certbot/letsencrypt 目錄對映到容器內的 /var/www/letsencrypt

配合文件,我們看一下 certbot 目錄中都有什麼檔案

letsencrypt  (dir)
Dockerfile
run-certbot.sh
複製程式碼

這裡有一個 letsencrypt 目錄,這個目錄是幹什麼用的我們先按住不表,一個 dockerfile 和一個 shell 指令碼檔案。

Dockerfile

FROM phusion/baseimage:latest

MAINTAINER Mahmoud Zalt <mahmoud@zalt.me>

RUN apt-get update
RUN apt-get install -y letsencrypt

COPY run-certbot.sh /root/certbot/run-certbot.sh

ENTRYPOINT bash -c "bash /root/certbot/run-certbot.sh && sleep infinity"
複製程式碼

這是一個基於 ubuntu 的基礎映象,安裝了 let`s encrypt 的自動化證照下載工具。

先將 run-certbot.sh 複製到容器的目標目錄下 (/root/certbot),並執行。

最後通過 sleep infinity 使得容器保持執行狀態。

run-certbot.sh

#!/bin/bash

letsencrypt certonly --webroot -w /var/www/letsencrypt -d "$CN" --agree-tos --email "$EMAIL" --non-interactive --text

cp /etc/letsencrypt/archive/"$CN"/cert1.pem /var/certs/cert1.pem
cp /etc/letsencrypt/archive/"$CN"/privkey1.pem /var/certs/privkey1.pem
複製程式碼

其實這個檔案主要命令就一行

letsencrypt certonly --webroot -w /var/www/letsencrypt -d "$CN" --agree-tos --email "$EMAIL" --non-interactive --text
複製程式碼

這行命令的是目的是:在 /var/www/letsencrypt 這個(容器中)目錄下生成 well-known/acme-challenge/ 這兩個資料夾,資料夾中成生一個隨機檔案,然後 let`s encrypt 的服務端去檢測能不能訪問到這個檔案,如果能訪問到就說明申請人擁有該域名的控制權,並將證照下載至 /etc/letsencrypt/archive/”$CN”/ 目錄下;如果不能訪問此臨時檔案,則說明申請不擁有該域名或配置不正確。而最後兩行則是把證照複製到指定目錄,以便之後將檔案對映到本地目錄。

注意:無論能否成功訪問到臨時檔案,工具都會在檢測結束後將此檔案刪除。

default.conf (80埠)

所以看到這裡我們就知道了,我們還不可以直接去執行這個容器,因為我們的 nginx 容器還無法訪問到 certbot 這個容器中的 /var/www/letsencrypt 這個目錄,我們看一下 nginx 的站點配置檔案是怎麼寫的

server {

    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    server_name localhost;
    root /var/www/public;
    index index.php index.html index.htm;

    location / {
         try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ .php$ {
        try_files $uri /index.php =404;
        fastcgi_pass php-upstream;
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fixes timeouts
        fastcgi_read_timeout 600;
        include fastcgi_params;
    }

    location ~ /.ht {
        deny all;
    }

    location /.well-known/acme-challenge/ {
        root /var/www/letsencrypt/;
        log_not_found off;
    }
}
複製程式碼

我們看到配置檔案的最後寫明瞭 /.well-know/acme-challenge/ 這個目錄指向了 /var/www/letsencrypt/ 這個目錄。這樣的話我們將 certbot 容器中的 /var/www/letsencrypt 和 nginx 容器中的 /var/www/letsencrypt 對映到本地同一目錄就可以了,而 nginx 容器是基於共用卷 applications 的,那麼我們只要把 certbot 容器也改到共用卷下就可以了,也就是之前我們按住不表的部分。

修改 docker-compose.yml (certbot)

certbot:
      build:
        context: ./certbot
      volumes_from:
        - applications
      volumes:
        - ./data/certbot/certs/:/var/certs
      environment:
        - CN="fake.domain.com"
        - EMAIL="fake.email@gmail.com"
      networks:
        - frontend
複製程式碼

請將配置中fake.domain.com改為你自己的域名,並將fake.email@gmail.com改為你自己的郵箱

如此一來,我們就可以嘗試執行一次 certbot 容器了

docker-compose up -d certbot
複製程式碼

我們看下執行結果:

  • If you lose your account credentials, you can recover through
    e-mails sent to fake.domain.com.

  • Congratulations! Your certificate and chain have been saved at
    /etc/letsencrypt/live/fake.domain.com/fullchain.pem. Your
    cert will expire on 2018-06-03. To obtain a new version of the
    certificate in the future, simply run Let`s Encrypt again.

  • Your account credentials have been saved in your Let`s Encrypt
    configuration directory at /etc/letsencrypt. You should make a
    secure backup of this folder now. This configuration directory will
    also contain certificates and private keys obtained by Let`s
    Encrypt so making regular backups of this folder is ideal.

  • If you like Let`s Encrypt, please consider supporting our work by:

    Donating to ISRG / Let`s Encrypt: https://letsencrypt.org/donate
    Donating to EFF: https://eff.org/donate-le

至此我們的 certbot 容器就執行成功了,並生成了證照檔案。我們只需要接下來把證照檔案對映到 nginx 可訪問到的目錄下並在站點配置檔案中增加 443 埠訪問的相關配置就可以了。

修改 docker-compose.yml (nginx)

增加

- ./data/certbot/certs/:/var/certs
複製程式碼

修改 default.conf (443埠)

server {

    listen 443;
    listen [::]:443;

    server_name localhost;
    root /var/www/public;
    index index.php index.html index.htm;
	
	ssl on;
    ssl_certificate /var/certs/fullchain1.pem;
    ssl_certificate_key /var/certs/privkey1.pem;
    ssl_trusted_certificate /var/certs/
    
    location / {
         try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ .php$ {
        try_files $uri /index.php =404;
        fastcgi_pass php-upstream;
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fixes timeouts
        fastcgi_read_timeout 600;
        include fastcgi_params;
    }

    location ~ /.ht {
        deny all;
    }
}
複製程式碼

重啟 nginx

docker-compose build nginx
docker-compose restart nginx
複製程式碼

結語

我們此次的配置是針對單一域名,如果想配置多域名,則在拷貝證照檔案時多加一層域名目錄就可以了。

至此我們就完成了整個配置,現在訪問你設定好的域名就能看到域名前的小綠鎖了。

最後,不要忘了證照的有效期是 3 個月,記得每兩個月重啟下容器或者配置下 crontab,我們下期再見吧。

可以與作者交流

通過 Laradock 學 Docker-HTTPS

相關文章