上一篇文章咱们对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,咱们下期再见吧。