一文教您如何通过 Docker 搭建 Ngnix,反向代理,并配置 Https 证书

点击蓝色“小哈学Java”关注我哟

加个“星标”,第一时间获取小哈推送的文章哦!

640?wx_fmt=png

目录

  • 一、背景

  • 二、Docker 快速安装&搭建 Ngnix 环境

  • 三、配置 SSL

  • 四、配置反向代理

  • 五、重启 Nginx 容器

  • 六、最后

一、背景

小哈最近收到阿里云短信,提示个站 www.exception.site 的云盾 SSL 证书(Https 证书)即将到期,需要赶快续费,不然无法继续使用 Https 协议来访问网站!

这个 SSL 证书当时用的是阿里云免费型的,有效期为 1 年,到期后, 如果想继续使用这个证书,就得续费,而且费用还不低!

640?wx_fmt=jpeg

其实,要想继续使用 Https 协议,我们可以在阿里云上再次申请一张 SSL 证书就可以了,时间一年,嗨呀,又能免费用一年。

本文小哈就主要介绍如何在 Ngnix 上配置 SSL 证书,从而让我们的网站能够使用 Https 来访问,另外再附带说一下如何配置反向代理。

二、Docker 快速安装&搭建 Ngnix 环境

小哈的个站 Ngnix 搭建在容器当中,也就顺便说一下如何通过 Docker 快速安装&搭建 Ngnix 环境。

2.1 下载 Nginx 镜像

docker pull nginx:alpine

PS:我这里用的是 alipne 轻量级的镜像.

下载完成后,通过 docker images 命令检查一下镜像是否下载成功:

640?wx_fmt=png

2.2 先以简单的方式运行镜像

docker run -d -p 80:80 --name nginx nginx:alpine
  • -d: 以后台方式运行镜像;

  • --name: 指定容器的名称为 nginx;

命令执行完成后,通过 docker ps命令确认一下容器是否启动成功。确认成功后,再访问一下 80 端口,看看 nginx 服务是否启动成功:

640?wx_fmt=png

2.3 复制相关配置文件至宿主机

复制运行中 nginx 相关配置文件到宿主机的指定路径下:

# 复制名称为 nginx 容器中 /etc/nginx/nginx.conf 文件夹到宿主机的 /docker/nginx 路径下	
docker cp nginx:/etc/nginx/nginx.conf /docker/nginx	
# 复制名称为 nginx 容器中 /etc/nginx/conf.d 文件到宿主机的 /docker/nginx 路径下	
docker cp nginx:/etc/nginx/conf.d /docker/nginx

复制完成后,查看指定路径的配置文件,如下:

640?wx_fmt=png

三、配置 SSL

3.1 免费获取 SSL 证书

访问链接 https://common-buy.aliyun.com/?spm=5176.2020520163.cas.3.4bf91BFD1BFDcm&commodityCode=cas#/buy:

PS: 注意,未注册阿里云账号的童鞋,需要先注册一个账号哟~

640?wx_fmt=png

选择免费 DV SSL 证书 -> 立即购买,完成后,进入阿里云后台查看:

640?wx_fmt=png

这里需要申请签发,填写相关信息后,等待签发通过即可。

640?wx_fmt=png

签发通过后,我们下载证书:

640?wx_fmt=png

640?wx_fmt=png

这里我选择的是 Ngnix, 当然了,你也可以选择 Tomcat、Apache、IIS 等。

3.2 解压上传到服务器

下载下来后,解压,我们可以看到包含两个文件:

640?wx_fmt=png

接下来,我们先在容器的挂载目录下创建 cert 证书目录:

640?wx_fmt=png

将解压后的两个文件上传至该目录中。

640?wx_fmt=png

3.3 配置 Ngnix SSL

这里需要说一下,小哈运行在 docker 容器中的 nginx 版本,信息如下:

640?wx_fmt=jpeg

因为我的 nginx 相对版本较高,可能和大家的配置文件目录有些不同,但整体的没啥大的问题,该怎么配置,还是怎么配置:

首先创建 ssl.conf 配置文件,专门用来配置 ssl 相关参数:

640?wx_fmt=png

server {	
    listen 443 ssl http2;	
    server_name  exception.site www.exception.site;	
    client_max_body_size 4M;	
    #charset koi8-r;	
    #access_log  /var/log/nginx/host.access.log  main;	
    ssl on;	
    root html;	
    index index.html index.htm;	
    ssl_certificate /etc/nginx/cert/2256161_www.exception.site.pem;	
    ssl_certificate_key  /etc/nginx/cert/2256161_www.exception.site.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:8090;	
    }	
    #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;	
    }	
}

根据阿里云的文档说明加上 ssl 相关参数,如 ssl 证书的两个文件目录,另外同时监听 443 端口。

再贴下 defaut.conf 配置文件内容:

640?wx_fmt=jpeg

server {	
    listen       80;	
    server_name  exception.site www.exception.site;	
    return 301 https://$host$request_uri;	
}

可以看到,主要对 http80 端口主要做了一下 301 重定向,也就是说,如果前端使用的 http 访问,这里会重定向到 https协议

四、配置反向代理

再来说说如何配置反向代理,先通过命令 ifconfig 命令获取 docker0网卡的 ip 地址:

640?wx_fmt=png

PS: 因为我需要反向代理的服务部署在本机的 Docker 容器中,所以用的这个 IP,如果你用的外网其他地址,可自行修改。

由于上面我们已经新建了一个 ssl.conf 配置文件,这里就直接将反向代理的配置写在里面:

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:8090;

640?wx_fmt=png

通过配置,我们反向代理到了 8090 端口的 Spring Boot 服务。

五、重启 Nginx 容器

先删除之前启动的 nginx 容器:

docker rm -f nginx

成功后,回到配置文件的主目录,执行:

docker run -d \ 	
-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:alpine 

参数说明:

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

  • -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 证书目录下;

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

运行命令成功后,通过 https 协议来访问我们的网站域名 www.exception.site,看看是否能够正常访问,并且方向代理到 8090 端口的 Spring Boot 服务上:

640?wx_fmt=png

OK! 大工告成。

六 、最后

本文中,我们学习了如何通过 Docker 快速搭建 Nginx 环境,并对其配置 SSL 证书和反向代理,让网站能够以 Https 协议来访问。希望童鞋们看完本文能够有所收获,下期见~

免费无套路分享 | 面试&学习福利资源

最近在网上发现一个不错的 PDF 资源《Java 核心知识&面试.pdf》,内容覆盖很广,Java 核心基础、Java 多线程、高并发、Spring、微服务、Netty 与 RPC、Zookeeper、Kafka、RabbitMQ、Habase、设计模式、负载均衡、分布式缓存、Hadoop、Spark、Storm、云计算等

获取方式: 关注本公众号: 小哈学Java, 后台回复资源,既可免费无套路获取资源链接哦!

640?

更多推荐内容

↓↓↓

面试官:大数据量sql分页查询很慢,有哪些优化方案?

面试题:谈谈 Redis 热点 Key 如何发现,解决方案有哪些

一文带您了解常用Json库中,哪种性能最出色

面试官:说说看,线上发生Mysql死锁,你的排查思路?

如何优雅地生成那些花里胡哨的复杂样式 Excel 文件?

这可能是将String.format格式化讲解的最清楚的一篇文章

为什么阿里巴巴代码规约要求避免使用 Apache BeanUtils 进行属性复制

一文教您通过 Docker 快速搭建各种测试环境(Mysql, Redis, ES, MongoDB) | 建议收藏

如果你喜欢本文

请长按二维码,关注小哈学Java

640?wx_fmt=jpeg

转发朋友圈,是对我最大的支持哟

如果你喜欢这篇文章,在看,转发吧。

相信明天更加美好 (*^__^*) 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值