给Docker中的Nginx搭建HTTPS环境

2018-08-30  本文已影响0人  沐码人

随着苹果和微信小程序强制使用HTTPS协议传输,越来越多的公司和企业开始使用HTTPS。下面我来分享下给Docker容器中的Nginx搭建HTTPS环境

Photo by [Yuichi Kageyama]

什么是HTTPS

超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HTTP Secure)是一种透过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。这个协议由网景公司(Netscape)在1994年首次提出,随后扩展到互联网上。
上面这段介绍来自维基百科,想要一两句话解释清楚什么是HTTPS,以及HTTPS的到底是什么也不是一件易事,本文这里不做探讨,感兴趣的朋友可以去搜索了解。

怎么获得证书

国内有很多服务商出售证书,价格从几千到上万不等,但是我们也可以通过阿里云、腾讯云、又拍云等获取免费证书,本文会以阿里云、腾讯云分别为例申请证书搭建HTTPS环境

准备工作

准备两个域名

我这里准备了2个二级域名用于申请上述两家提供的证书: aliyun.0558web.com、tencent.0558web.com 并把域名解析到对应的服务器

使用Docker创建Nginx环境

docker pull nginx

创建文件夹

在你的服务器上创建三个文件夹,nginx用于存放证书和nginx配置文件,www用于存放项目代码,ssl用于存放证书,这里演示在当前目录下创建文件夹

mkdir -p nginx/{aliyun,tencent} www/{aliyun,tencent} ssl/{aliyun,tencent}

下面来演示一下在阿里云和腾讯云申请的SSL证书来搭建HTTPS环境

阿里云

申请SSL证书

登录阿里云平台,进入控制台>选择产品与服务>搜索SSL证书,在SSL证书页面点击右上角的购买证书,购买页面提供的证书种类有很多种,每次我都是找半天才找到免费证书,民间土豪或企业可以直接购买收费的证书,如果是和我一样选择免费证书请记住以下几步:选择品牌(Symantec)>保护类型(1个域名)>证书类型(免费型DV SSL)>购买
购买成功以后,在SSL证书页面会看到刚才购买的证书,补全资料等待审核通过以后就可以下载我们的证书了,因为本文是在nginx下搭建HTTPS环境,所以这里下载证书 for Nginx

申请成功以后下载证书上传到/ssl/aliyun/目录下

编写配置nginx配置文件

在/nginx/aliyun/文件夹下编写配置文件,用于映射到docker容器中

events{
    worker_connections 1024;
}
http{

    server {
        listen 80;
        server_name localhost;
        root /usr/share/nginx/html;
    }
    
    server {
        listen 443;
        server_name localhost;
        # ssl on;
        root html;
        index index.html index.htm;
        ssl_certificate   /etc/ssl/cert/*****.pem;
        ssl_certificate_key  /etc/ssl/cert/*****.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 html;
            index index.html index.htm;
        }
    }
}

添加项目代码

在/www/aliyun/文件下新建index.html

<!---简单的输出一个Hello aliyun-->
Hello aliyun

创建nginx容器

运行一个nginx容器, 命名aliyun

docker run 
-p 8080:80
-p 8081:443 
-v $PWD/nginx/aliyun/nginx.conf:/etc/nginx/nginx.conf 
-v $PWD/www/aliyun:/usr/share/nginx/html
-v $PWD/ssl/aliyun:/ect/nginx/cert/aliyun 
--name aliyun -d nginx

启动以后,使用下面的命令查看是否会输Hello aliyun,如果输出则表示启动成功,否则可以使用docker logs 容器ID查看错误日志

curl 127.0.0.1:8080

绑定域名、转发端口

安装成功以后,在/etc/nginx/sites-available/下新建aliyun.conf,然后来编写我们的配置文件

server {
    listen 80;
    server_name aliyun.0558web.com;
    
    return 301 https://$server_name:8081$request_uri
}

cd ../sites-enabled
# 添加软连接
ln -s ../sites-available/aliyun.conf aliyun.conf

# 查看配置文件是否配置成功
nginx -t

# 重启你的本机nginx
service nginx restart

测试HTTPS环境是否成功

在浏览器中输入http://aliyun.0558web.comhttps://aliyun.0558web.com:8081就能看会看到绿锁
这个时候使用阿里云提供的免费SSL证书,我们成功搭建了HTTPS环境
但是你会发现,HTTPS是可以使用了,但是后面还带着端口,这显然不是你想要的,下面分享一下我的两种解决办法

docker run 
# 本机的80端口->docker容器的80端口
-p 80:80   
# 本机的443端口->docker容器的443端口
-p 443:443 
-v $PWD/nginx/aliyun/nginx.conf:/etc/nginx/nginx.conf 
-v $PWD/www/aliyun:/usr/share/nginx/html
-v $PWD/ssl/aliyun:/ect/nginx/cert/aliyun 
--name aliyun -d nginx

腾讯云

申请证书

登录腾讯云,进入控制台>云产品>搜索SSL证书管理,进入证书管理页面点击购买,选择域名型免费版(DV)免费申请,剩下的步骤和阿里云差不多,补全资料等待证书下发
这里通过腾讯云提供的SSL做一下演示

编写nginx配置文件

在nginx/tencent/文件夹下新增配置文件,用于映射到docker容器中

events {
    woker_connections 1024;
}
http {
    server{
        listen 80;
        server_name location;
        root /usr/share/nginx/html;
    }
}

编写项目代码

在www/tencent/文件夹下新建index.html

<!---简单的输出一个Hello Tencent-->
Hello Tencent

启动nginx

运行nginx容器,命名:tencent

docker run -p 8082:80
-v $PWD/nginx/tencent/nginx.conf:/etc/nginx/nginx.conf 
-v $PWD/www/tencent:/usr/share/nginx/html
--name tencent -d nginx

判断是否运行成功

curl 127.0.0.1:8082
# 输出 Hello Tencent 表示运行成功
# 否则 通过 docker logs 容器ID查看错误日志

转发端口绑定域名

server{
    listen 80;
    server_name tencent.0558web.com;
    return 301 https://$server_name$request_uri
}
server {
    listen 443 default_server ssl;
    server_name tencent.0558web.com;
    ssl_certificate /root/project/ssl/tencent/1_tencent.0558web.com_bundle.crt;
        ssl_certificate_key /root/project/ssl/tencent/2_tencent.0558web.com.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;
        location /{
            index  index.html index.htm;
            proxy_pass http://tencent.0558web.com:8082;
        }
}

# 在/etc/nginx/sites-enabled/下添加链接
ln -s /etc/nginx/sites-available/tencent.conf /etc/nginx/sites-enabled/tencent.conf

# 查看nginx是否配置成功
nginx -t

# 重启nginx
service nginx restart

这个时候我们在浏览器中打开
tencent.0558web.com 或者https://tencent.0558web.com都会看到绿锁

遇到的坑

大致意思是说在监听的端口上没有设置证书,但是我们命名已经设置,而且nginx -t 也没有报错,可能是我们设置的443 服务器端口没有监听到

解决办法:

server{
    listen 443 default_server ssl;
    .
    .
    .
}

解决办法

server{
    # 注释ssl on 
    listen 443 ssl;
    # ssl on;
}

总结:本文分享了通过阿里云和腾讯云提供的免费SSL证书,给docker中的nginx搭建HTTPS环境,主要用了nginx的端口转发,本人对Nginx只是属于入门阶段,文中难免有错误和不足,还请大佬们指正

上一篇下一篇

猜你喜欢

热点阅读