为 Docker 中的 Nginx 配置 HTTPS

没有 https 加持的网站会逐渐地被浏览器标记为不安全的,所以为网站添加 https 已经变得刻不容缓。对于商业网站来说,花钱购买 SSL/TLS 证书并不是什么问题。但对于个人用户来说,如果能有免费的 SSL/TLS 证书可用将会是非常幸福的事情!Let's Encrypt 就是一个提供免费 SSL/TLS 证书的网站,由于其证书期限只有三个月,所以需要我们用自动化的方式去更新证书。本文将介绍如何为通过 docker 运行的 nginx 中的站点添加 https 支持,并自动完成证书的更新。本文的演示环境为:运行在 Azure 上的 Ubuntu 16.04 主机(此图来自互联网):

为 Docker 中的 Nginx 配置 HTTPS

准备环境

在 Azure 上创建 Ubuntu 类型的虚机事件非常容易的事情,安装 docker 也无须赘言。比较容易忽略的是配置合适的网络安全组规则,比如打开 80 和 443 端口:

为 Docker 中的 Nginx 配置 HTTPS

还有就是配置 DNS:

为 Docker 中的 Nginx 配置 HTTPS

创建一个普通的 http 站点

简单起见,直接使用一个镜像中的 nodejs 应用作为 web 站点:

$ docker pull ljfpower/nodedemo $ docker network create -d bridge webnet $ docker run -d --restart=always --expose=3000 \ --network=webnet --name=myweb \ ljfpower/nodedemo

在用户的家目录下创建 nginx 目录及其子目录 conf.d、conf.crt 和 html,创建 logs 目录及其子目录 nginx 和 letsencrypt:

$ mkdir -p nginx/{conf.d,conf.crt,html}
$ mkdir -p logs/{nginx,letsencrypt}

说明,本文演示的示例中需要我们手动创建的文件和目录结构如下:

为 Docker 中的 Nginx 配置 HTTPS

创建 nginx/nginx.conf 文件,内容如下:

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  2048;
}

http {
    include      /etc/nginx/mime.types;
    default_type  application/octet-stream;

sendfile        on;
    keepalive_timeout    65;
    client_max_body_size 10M;

include /etc/nginx/conf.d/*.conf;
}

然后创建 nginx/conf.d/default.conf 文件,内容如下:

upstream web{
    server myweb:3000;
}
server {
    listen      80;
    listen      [::]:80;
    server_name linuxmi.com ;

location ^~ /.well-known/acme-challenge/ {
        default_type "text/plain";
        root /usr/share/nginx/html;
    }
    location = /.well-known/acme-challenge/ {
        return 404;
    }
    location / {
        proxy_pass ;    }
}

其中 /.well-known/acme-challenge/ 目录是 certbot 工具在生成证书时创建的。接下来创建文件 nginx/html/index.html 文件,内容如下:

<!DOCTYPE html><html><head>    <meta charset="utf-8" />
    <title>Let's Encrypt First Time Cert Issue Site</title></head><body>
    <h1>Hello HTTPS!</h1>    <p>
        Just used for the very first time SSL certificates are issued by Let's Encrypt's
        certbot.
    </p></body></html>

这个页面也是 certbot 在生成证书时需要用到的。最后让我们启动容器(在用户的家目录下执行下面的命令):

$ docker run -d \
    -p 80:80 \
    -v $(pwd)/nginx/conf.d:/etc/nginx/conf.d:ro \
    -v $(pwd)/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
    -v $(pwd)/logs/nginx:/var/log/nginx \
    -v $(pwd)/nginx/html:/usr/share/nginx/html \
    --restart=always \
    --name=gateway \
    --network=webnet \
    nginx:1.14

注意:这时没有映射 443 端口,也没有挂载存放证书的目录。只能以 http 协议访问访问我们的站点:

为 Docker 中的 Nginx 配置 HTTPS

为站点生成 SSL/TLS 证书

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/b28203ead9c4b5103284363c609f1113.html