上一篇文章咱們對laradock的配置文件有了一個初步的瞭解,如今咱們基本能夠爲所欲爲的配置網站了,以此作爲咱們的開發環境能夠說是方便快捷。php
鑑於愈來愈多的平臺要求接入網站提供https協議的接口。如何讓咱們的網站也支持https,已經迫在眉睫。html
接下來咱們來經過laradock學習下,如何讓咱們的網站支持https協議。nginx
目前來講,讓網站支持https大概有兩種方案,一種是向代理證書的公司購買證書,這種方式能夠得到1年以上的服務器,固然時間的長度取決於大家之間合約的長短了。web
另外一種方案是經過let's encrypt或symantec等公司提供的免費證書,這種方式通常合約期短,每三個月須要從新申請一次。docker
laradock項目中已經集成了let's encrypt公司的證書申請工具,咱們來看看如何實現的。shell
咱們找到配置文件中certbot的代碼ubuntu
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/letsencryptbash
配合文檔,咱們看一下certbot目錄中都有什麼文件服務器
letsencrypt (dir) Dockerfile run-certbot.sh
這裏有一個letsencrypt目錄,這個目錄是幹什麼用的咱們先按住不表,一個dockerfile和一個shell腳本文件。app
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使得容器保持執行狀態。
#!/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"/目錄下;若是不能訪問此臨時文件,則說明申請不擁有該域名或配置不正確。而最後兩行則是把證書複製到指定目錄,以便以後將文件映射到本地目錄。
注意:不管可否成功訪問到臨時文件,工具都會在檢測結束後將此文件刪除。
因此看到這裏咱們就知道了,咱們還不能夠直接去運行這個容器,由於咱們的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容器也改到共用卷下就能夠了,也就是以前咱們按住不表的部分。
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端口訪問的相關配置就能夠了。
增長
- ./data/certbot/certs/:/var/certs
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/chain1.pem; 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; } }
docker-compose build nginx docker-compose restart nginx
咱們這次的配置是針對單一域名,若是想配置多域名,則在拷貝證書文件時多加一層域名目錄就能夠了。
至此咱們就完成了整個配置,如今訪問你設置好的域名就能看到域名前的小綠鎖了。
最後,不要忘了證書的有效期是3個月,記得每兩個月重啓下容器或者配置下crontab,咱們下期再見吧。