前言
前段时间学习了Docker容器,觉得Docker在搭建环境方面非常方便,利用搭建Nginx反向代理之机,熟悉和推广一下Docker的知识。Docker是一个容器软件,可以看成是Linux下的虚拟机,但是比虚拟机轻便的多,不占内存,很多环境都不需要自己搭建,直接使用命令就可以从官网上拉取相关镜像(镜像,相当于已经搭建好的虚拟机),并且对于各个镜像和环境都比较容易维护。
概念
反向代理,是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。而nginx反向代理,是使用nginx服务器对内网的web服务做一个代理,当客户端访问web服务时,Nginx把内网web服务器发布的web服务返回给客户端,而客户端只知道Nginx服务器,并不知道web内容是内部web服务器发布的。使用Nginx反向代理服务可以做内网服务器的替身,也可以做负载均衡。
实现
在docker中安装一个nginx服务器和两个web服务器,分别配置nginx,实现简单一对一的反向代理(1个nginx服务器对1个Web服务器)和1对多的负载均衡(1个nginx服务器对多个Web服务器)。
环境介绍
配置一台Nginx服务器和两台web服务器,客户端可访问Nginx服务器,不可访问内网的两台web服务器,但可通过Nginx代理服务器访问Apache提供的web服务内容(客户端实际是不知道有Apache服务器的)。
注意:Docker容器开放的服务如web服务不可直接访问,宿主机(192.168.131.131)也不可直接访问,需配置Docker容器的web端口和宿主机某端口进行绑定。
docker run -it-p 宿主机端口:容器端口 容器镜像名称 /bin/bash
run //表示运行此镜像成为容器
-p //表示把宿主机端口和容器端口做一个绑定(或称为映射)
/bin/bash //以命令行模式运行
eg: docker run-it -p 1000:80 my_centos_nginx /bin/bash
此命令代表将运行Nginx容器,并将Nginx容器的80端口和宿主机的1000端口做一个映射。
这样,在容器中运行Nginx服务后(输入nginx),就可以通过访问http://192.168.131.131:1000进行访问了。
同理,可设置好两个apache服务器。只是绑定的宿主机的端口不同,启动httpd服务即可。
Apache服务器1:
Apache服务器2:
注意:在做反向代理配置之前保证Nginx容器可以访问apache服务:
curl 192.168.131.131:2221(或端口为2222)
有很多方式,最简单的方式是在宿主机上使用iptables -F命令清除防火墙规则。
配置简单反向代理
修改/etc/nginx/conf.d/*.conf文件(一般是修改/etc/nginx/目录下的nginx.conf),做如下配置:
其中apache为自定义名称,server对应的是内网apache服务器1的IP地址和端口。然后即可访问Nginx服务器来访问内网的apache服务器1:
配置负载均衡
使用Nginx实现负载均衡常见的有如下几种方式(目前我所知道的):
循环机制 – 循环分发对应用服务器的请求
最少连接机制 – 将请求发送给连接数最少的服务器
ip-hash机制 – 哈西函数用于确定请求被配那个服务器(基于客户端IP地址)
此次演示采用循环机制中的加权负载均衡机制,举个例子:
每当有8个请求,前5个请求交给domain1服务器去处理,接下来2个请求交给domain2服务器去处理,权重(weihgt)不设置默认为1,最后一个请求交给domain3服务器去处理。
我们在Nginx容器服务器中修改/etc/nginx/conf.d/*.conf文件,做如下配置:
重启nginx服务后连续访问nginx服务器web服务:http://192.168.131.131:1000/,可间断的访问到内网的两个apache服务器不同的起始页面。
成功实现nginx负载均衡!
优点
Nginx做反向代理服务器有如下优点:
实现负载均衡,减少开支;
方便统一管理,可以做集群管理。
相当于一道智能防火墙,主要体现在如下几个方面:
a.防止内网服务器端口对外开放,统一成一个端口对外开放.
b.一定程度上防止敏感信息泄露,减少渗透攻击针对中间件的渗透。
c.一定程度上防止漏洞利用,比如内网服务器存在MS-010,但由于端口不对外开放而无法利用。
领取专属 10元无门槛券
私享最新 技术干货