Docker Nginx 配置安装 SSL 证书(支持 Https 访问)

发布于 2022-07-12 18:56:01 更新于 2022-07-13 08:33:30

上小节《Docker 安装 Nginx》中,我们已经学会了通过 Docker 快速安装 Nginx ,以及配置反向代理,本小节中,我们将学习如何为 Nginx 配置安装 SSL 证书,使网站支持通过 Https 协议访问。

一、前言

HTTPS 协议是由 HTTP 加上 TLS/SSL 协议构建的可进行加密传输、身份认证的网络协议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。

想要你的服务支持 HTTPS 协议访问, 就需要有 SSL 证书,它获取方式有多种,有付费的,也有免费的,小哈这里用的是阿里云的免费证书。本文以此作为案例,讲解下如何配置 Nginx SSL 证书,从而让服务支持 HTTPS 访问。

二、获取免费的 SSL 证书

1.1 登录阿里云申请免费 SSL 证书

登录阿里云 https://www.aliyun.com/,进入控制台后,搜索关键词 ssl 证书,点击进入【SSL 证书(应用安全)】:

阿里云控制台搜索 SSL 证书

依次点击【SSL 证书】-> 【免费证书】-> 【创建证书】:

创建免费的 SSL 证书

创建成功后,即可获取一个有效期 1 年的免费版 SSL 证书了,然后,点击【证书申请】:

阿里云免费的 SSL 证书

输入需要绑定的域名,其他保持默认值即可,点击【下一步】:

SSL 证书绑定域名

添加 DNS 记录

根据页面提示添加 DNS 解析记录, 如果你要配置的域名在当前账号下,阿里云会自动帮你添加好,无需手动操作,等待数秒后,点击【验证】按钮,即可验证成功,然后点击【提交审核】,等待证书下发。

反之,如果配置的域名不在当前账号下,你就需要登录拥有该域名的账号,手动在 DNS 控制台添加记录,类型为 TXT, 主机记录和记录值复制过去即可。然后再验证通过,提交审核。

配置 DNS

审核通过后,即可看到状态为【已签发】的 SSL 证书了,点击【下载】:

SSL 证书签发成功

选择 Nginx 类型的 SSL 证书下载到本地,等会配置 Nginx SSL 需要用到:

下载 Nginx 类型的 SSL 证书

1.2 解压并上传到服务器

下载后进行解压,会看到两个文件:

解压 zip 包

接下来,在 Nginx 容器挂载的目录下创建一个 cert 目录,然后将刚刚解压出来的两个文件上传至 cert 文件夹下:

创建 Nginx cert 证书目录

三、Nginx 配置 SSL 证书

进入到 conf.d 目录下,创建 quanxiaoha_ssl.conf 文件,此配置文件专门用来配置 SSL 相关内容,核心配置截图如下:

Nginx 配置安装 SSL 证书

完整配置如下:

server {
    # 监听 443 https 端口
    listen 443 ssl http2; 
    server_name www.quanxiaoha.com;

    ssl on;
    client_max_body_size 4M;
    root html;
    index index.html index.htm;
    # ssl 证书存放路径
    ssl_certificate /etc/nginx/cert/8055644_www.quanxiaoha.com.pem;
    ssl_certificate_key  /etc/nginx/cert/8055644_www.quanxiaoha.com.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

   location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://172.17.0.1:8080; # 反向代理
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

注意1:这里配置的 SSL 证书路径在 /etc/nginx/cert/ 目录下,等会正式启动容器时,需要将这个目录挂载到宿主机的 /cert 目录,否则 Ngnix 启动时会找不到文件。

注意2:看过上小节内容的小伙伴,如果细心会发现,小哈将原本在 default.conf 的反向代理配置移动到了 quanxiaoha_ssl.conf 的配置文件中,这是为了配置隔离,将固定服务的相关配置都放到一起,方便后续统一管理。当需要配置新的域名时,只需另外新建一个 conf 配置文件即可。

添加 SSL 证书完成以后,我们还需要修改 default.conf 文件:

nginx 301 跳转

 return 301 https://$host$request_uri;

该指令用于将凡是通过 HTTP 协议过来的请求全部 301 重定向,走 HTTPS 协议。

四、运行 Nginx 容器

执行如下命令:

docker run -d --restart=always \ 
-p 80:80 -p 443:443 \ 
--name nginx \
-v /docker/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /docker/nginx/conf.d:/etc/nginx/conf.d \
-v /docker/nginx/logs:/var/log/nginx \
-v /docker/nginx/cert:/etc/nginx/cert \
nginx:1.19.4 

参数说明:

  • -p 80:80 -p 443:443:将容器的 80、443 端口映射到主机的 80、443 端口;

  • --restart=always: Docker 重启时,容器也跟着重启;

  • -v /docker/nginx/nginx.conf:/etc/nginx/nginx.conf:将容器中的 /etc/nginx/nginx.conf 文件挂载到宿主机中的 /docker/nginx/nginx.conf 文件;

  • -v /docker/nginx/conf.d:/etc/nginx/conf.d:将容器中 /etc/nginx/conf.d 目录挂载到宿主机中的 conf.d 目录下;

  • -v /docker/nginx/logs:/var/log/nginx:将容器中的 /var/log/nginx 目录挂载到宿主机中的 /docker/nginx/logs 目录下, 用以查看 Nginx 日志;

  • -v /docker/nginx/cert:/etc/nginx/cert : 将容器中的 /etc/nginx/cert 目录挂载到宿主机中 /docker/nginx/cert:/etc/nginx/cert 目录下,用于容器内部能够正常读取到 SSL 证书;

注意:小哈这里使用的阿里云服务器,同时还需要将 443 端口加入到安全组中,才能保证外界的正常访问 https 端口.

Nginx 容器运行成功后,就可以通过 https://www.quanxiaoha.com 来访问啦~

网站已经支持 https 协议访问