通过 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分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/22349.html