给Docker中的Nginx搭建HTTPS环境

随着苹果和微信小程序强制使用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,使用以下命令拉取nginx image
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

绑定域名、转发端口

  • 在你的服务器上安装nginx,用于转发端口和绑定域名

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

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

  • 编写以后在/etc/nginx/sites-enabled/下添加软连接
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是可以使用了,但是后面还带着端口,这显然不是你想要的,下面分享一下我的两种解决办法

  • 如果在一台服务器上只创建一个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
  • 如果一台服务器上创建多个docker容器,并且要为每个容器配置HTTPS环境怎么办呢?下面我们申请腾讯云提供的免费SSL证书来演示一下

腾讯云

申请证书

登录腾讯云,进入控制台>云产品>搜索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查看错误日志

转发端口绑定域名

  • 在/etc/nginx/sites-available/下新建配置文件tencent.conf
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;
        }
}

  • 添加软链接 重启nginx
# 在/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都会看到绿锁

遇到的坑

  • no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: ,,,, server: 0.0.0.0:443

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

解决办法:

server{
    listen 443 default_server ssl;
    .
    .
    .
}
  • the "ssl" directive is deprecated, use the "listen ... ssl" directive instead in /etc/nginx/nginx.conf:14
    nginx已经弃用的ssl指令

解决办法

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343