专栏首页Coding01通过 Laradock 学 Docker-HTTPS

抱歉,你查看的文章已删除

通过 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/fake.domain.com/fullchain1.pem;
    ssl_certificate_key /var/certs/fake.domain.com/privkey1.pem;
    ssl_trusted_certificate /var/certs/fake.domain.com/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 nginx
docker-compose restart nginx

结语

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

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

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

本文分享自微信公众号 - coding01(coding01),作者:福祉

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-03-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 001.快速理解Elasticsearch是什么

    Lucene实现了建立倒排索引、搜索等功能以及各种算法,对于开发人员来说,只要引入lucene的jar包,基于lucene的API进行开发即可。

    CoderJed
  • Elasticsearch Javascript API增删改查

    查询 根据索引、类型、id进行查询: client.get({ index:'myindex', type:'mytype', ...

    用户1154259
  • python 实现异步执行

    分析一下,下面的例子: 定义了一个装饰器 async 和 A 、B 两个function A 里面sleep 20s , 然后打印 a function...

    py3study
  • 哪些行业最适合抢驻小程序?

    1 生活服务类行业 ? 生活服务是一个很大的领域,诸如生鲜水果、餐饮服务、家居保洁等。作为日常生活的中用户接触的最多的就是生活服务了。 如果做个APP的话,运营...

    企鹅号小编
  • 为什么很多编程语言中的数组都从0开始编号?——你真的了解数组吗?

    数组是学习数据结构的开端。尽管数组看起来非常基础、简单,但是有多少人理解数组的精髓呢?

    100000860378
  • 设计模式之组合模式(Composite 模式)引入composite模式composite模式的具体实例composite模式小结

    在计算机文件系统中,有文件夹的概念,文件夹里面既可以放入文件也可以放入文件夹,但是文件中却不能放入任何东西。文件夹和文件构成了一种递归结构和容器结构。 虽然文...

    desperate633
  • 微信刚刚放出绝招!我们 1 个小时就做出了可打开网页「无需审核」的电商小程序(文内有实例)!

    对的!时隔两个月的沉默,微信团队昨夜又放弃了性生活……开放了重磅的小程序打开网页能力!

    知晓君

扫码关注云+社区

领取腾讯云代金券