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

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

上小节《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 证书】-> 【免费证书】-> 【创建证书】:

创建免费的 SSL 证书创建免费的 SSL 证书

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

阿里云免费的 SSL 证书阿里云免费的 SSL 证书

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

SSL 证书绑定域名SSL 证书绑定域名

添加 DNS 记录添加 DNS 记录

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

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

配置 DNS配置 DNS

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

SSL 证书签发成功SSL 证书签发成功

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

下载 Nginx 类型的 SSL 证书下载 Nginx 类型的 SSL 证书

1.2 解压并上传到服务器

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

解压 zip 包解压 zip 包

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

创建 Nginx cert 证书目录创建 Nginx cert 证书目录

三、Nginx 配置 SSL 证书

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

Nginx 配置安装 SSL 证书Nginx 配置安装 SSL 证书

完整配置如下:

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

    ssl on;
    client_max_body_size 4M;
    root html;
    index index.html index.htm;
    # ssl 证书存放路径
    ssl_certificate /etc/nginx/cert/8055644_www.mashangan.com.pem;
    ssl_certificate_key  /etc/nginx/cert/8055644_www.mashangan.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 的反向代理配置移动到了 mashangan_ssl.conf 的配置文件中,这是为了配置隔离,将固定服务的相关配置都放到一起,方便后续统一管理。当需要配置新的域名时,只需另外新建一个 conf 配置文件即可。

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

nginx 301 跳转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.mashangan.com 来访问啦~

网站已经支持 https 协议访问网站已经支持 https 协议访问

13:T43d2,

上小节《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 证书】-> 【免费证书】-> 【创建证书】:

创建免费的 SSL 证书
创建免费的 SSL 证书

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

阿里云免费的 SSL 证书
阿里云免费的 SSL 证书

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

SSL 证书绑定域名
SSL 证书绑定域名

添加 DNS 记录
添加 DNS 记录

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

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

配置 DNS
配置 DNS

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

SSL 证书签发成功
SSL 证书签发成功

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

下载 Nginx 类型的 SSL 证书
下载 Nginx 类型的 SSL 证书

1.2 解压并上传到服务器

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

解压 zip 包
解压 zip 包

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

创建 Nginx cert 证书目录
创建 Nginx cert 证书目录

三、Nginx 配置 SSL 证书

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

Nginx 配置安装 SSL 证书
Nginx 配置安装 SSL 证书

完整配置如下:

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

    ssl on;
    client_max_body_size 4M;
    root html;
    index index.html index.htm;
    # ssl 证书存放路径
    ssl_certificate /etc/nginx/cert/8055644_www.mashangan.com.pem;
    ssl_certificate_key  /etc/nginx/cert/8055644_www.mashangan.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 的反向代理配置移动到了 mashangan_ssl.conf 的配置文件中,这是为了配置隔离,将固定服务的相关配置都放到一起,方便后续统一管理。当需要配置新的域名时,只需另外新建一个 conf 配置文件即可。

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

nginx 301 跳转
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.mashangan.com 来访问啦~

网站已经支持 https 协议访问
网站已经支持 https 协议访问