博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过Laradock学Docker-HTTPS
阅读量:5879 次
发布时间:2019-06-19

本文共 5493 字,大约阅读时间需要 18 分钟。

前言

上一篇文章我们对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)Dockerfilerun-certbot.sh

这里有一个letsencrypt目录,这个目录是干什么用的我们先按住不表,一个dockerfile和一个shell脚本文件。

Dockerfile的内容

FROM phusion/baseimage:latestMAINTAINER Mahmoud Zalt 
RUN apt-get updateRUN apt-get install -y letsencryptCOPY run-certbot.sh /root/certbot/run-certbot.shENTRYPOINT 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/bashletsencrypt certonly --webroot -w /var/www/letsencrypt -d "$CN" --agree-tos --email "$EMAIL" --non-interactive --textcp /etc/letsencrypt/archive/"$CN"/cert1.pem /var/certs/cert1.pemcp /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:

    Donating to EFF:

至此我们的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/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;    }}

重启nginx

docker-compose build nginxdocker-compose restart nginx

结语

我们此次的配置是针对单一域名,如果想配置多域名,则在拷贝证书文件时多加一层域名目录就可以了。

至此我们就完成了整个配置,现在访问你设置好的域名就能看到域名前的小绿锁了。

最后,不要忘了证书的有效期是3个月,记得每两个月重启下容器或者配置下crontab,我们下期再见吧。

转载地址:http://ujcix.baihongyu.com/

你可能感兴趣的文章
c语言 中的共用体和结构体如何联合定义,结构体(Struct)、联合体(Union)和位域
查看>>
Lind.DDD.LindAspects方法拦截的介绍
查看>>
【第一篇】ASP.NET MVC快速入门之数据库操作(MVC5+EF6)
查看>>
Maven依赖版本冲突的分析及解决小结
查看>>
你好,2017!
查看>>
冷备手工完全恢复(recover database,recover tablespace,recover datafile)
查看>>
JS 在火狐浏览器下关闭弹窗
查看>>
MongoDB GridFS——本质上是将一个文件分割为大小为256KB的chunks 每个chunk里会放md5标识 取文件的时候会将这些chunks合并为一个整体返回...
查看>>
Linux ad7606 驱动
查看>>
安装 RabbitMQ C#使用-摘自网络(包括RabbitMQ的配置)
查看>>
Linux 防火墙iptables命令详解
查看>>
JAVA入门[6]-Mybatis简单示例
查看>>
Spring定时任务的几种实现
查看>>
ZoomIt(投影演示辅助软件)下载、安装与运行使用
查看>>
IntelliJ IDEA JRebel Maven Tomcat 实现热部署
查看>>
Java通过join方法来暂停当前线程
查看>>
源码分析——Action代理类的工作
查看>>
spring 在service中需要抛出异常才能自动回滚
查看>>
人脸数据库大全(包括人脸识别、关键点检测、表情识别,人脸姿态等等)
查看>>
iOS UITableView表视图滚动隐藏UINavigationController导航栏
查看>>