通過 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,我們下期再見吧。
可以與作者交流