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