当前位置: 首页 > 科技观察

Nginx快速入门Nginx反向代理与负载均衡

时间:2023-03-20 19:34:35 科技观察

概念什么是反向代理,它与正向代理有什么区别?正向代理是指在客户端和目标服务器之间增加一个代理服务器,客户端直接访问该代理服务器,当代理服务器访问目标服务器后返回给客户端并返回。在这个过程中,客户端需要知道代理服务器的地址并配置连接。如图:反向代理就是客户端访问目标服务器。目标服务内部有一个统一的接入网关,将请求转发给后端真正的处理服务器,并返回结果。在这个过程中,客户端不需要知道代理服务器的地址,代理对客户端是透明的。如图:正向代理和反向代理的区别:Nginx反向代理Nginx正向代理只需要在location配置proxy_pass属性即可。它指向代理的服务器地址。就像我们上一篇文章配置的百度代理:这是正向代理的经典例子。以下是配置反向代理的示例。首先启动两个应用,端口分别是8010和8020,访问/hello:然后我们在nginx中,先反向代理一个地址:可以看到监听80端口,代理的是8010的端口地址,路径是/你好。然后配置本地主机:然后访问查看反向代理是否成功:可以看到正向代理和反向代理在配置上没有太大区别。主要区别在于代理服务的位置,一种是远程(百度),一种是在局域网内(本地机器8010)。查看proxy相关参数:proxy_pass#Proxyserviceproxy_redirectoff;#是否允许重定向proxy_set_headerHost$host;#将header参数传递给后端服务proxy_set_headerX-Forwarded-For$remote_addr;#设置requestheader,即客户端IP地址proxy_connect_timeout90;#Connect代理服务超时proxy_send_timeout90;#请求发送最大时间proxy_read_timeout90;#读取最大时间proxy_buffer_size4k;www.baidu.com,百度图片是image.baidu.com,百度翻译是fanyi.baidu.com。可以看出,相同的一级域名和不同的二级域名代表不同的系统。这种方法也可以通过使用nginx的反向代理来实现。可以看出,两个不同的二级域名分别访问了两个不同的端口地址。访问效果如下:这样可以在一台服务器上部署多个项目。分别使用有意义的二级域名。负载均衡可以通过proxy_pass将请求代理到后端服务,但是为了达到更高的负载和性能,我们的后端服务通常会有多个,这时候就需要通过upstream模块来实现负载均衡了。下面配置一个upstream:可以看到在一个upstream中定义了两个服务地址,并命名为wwwdemocom,下面设置了反向代理:在反向代理的配置中,只配置了upstream的名称,而刷新页面,可以看到同一个地址,一直分别访问两个项目:所以如果我们部署多个相同的系统,我们可以将所有的并发流量分成多个top,从而达到提高并发的目的。此时两个系统正在切换访问,策略默认是轮流训练,即不管有多少系统轮流访问。如果想让两台机器的访问量按照1:2分配,可以设置权重:刷新页面可以看到8010访问一次,后面是8020访问两次,这个是按权重划分的,改变原来默认的轮训策略。这适用于机器性能不同的情况。我们看一下相关的upstream参数:servicereverse服务地址加上端口权重weightmax_fails失败多少次如果主机认为宕机,kickoutfail_timeout踢出后,重新检测时间backupbackupservicemax_connsallow最大连接数再来看一个备份参数演示备份服务的例子,在服务器上启动另一个8030服务:使用这个服务作为备份服务,当服务意外停止时,这个会置顶!查看nginx配置:重启nginx,先刷新页面查看效果,发现配置的8010和8020还在做负载均衡。现在停止8010和8020,可以看到8030在最上面:注意:关闭一个服务不会触发备份服务。只有当8010和8020都意外停止时,8030才会顶上来!如果重启8010,那么备份服务就不行了,访问还是8010:再来说说max_fails和fail_timeout这两个参数。原来的8010服务器重启后,nginx可以快速检测到原来的8010已经恢复并投入使用,因为nginx和8010之间有一个类似心跳检测的机制,可以实时监控8010是否可用。上面的max_fails参数是设置失败多少次,就认为挂了,所以会删掉。fail_timeout参数是删除后重新检查这个属性。也是设置恢复时设置检测时间的时间间隔。待检测并投入使用。可以想象,如果实时查看的话,会非常消耗性能,所以这两个参数非常有用。接下来我们设置最大失败重试次数为10次,恢复检测时间为30秒:重新加载,然后停止8010和8020,访问页面,可以看到加载一段时间后会出现8030的结果,如果重试次数设置为100次的话,加载时间会比较明显。我们启动8010,可以看到前30秒左右还是8030,然后我们开始访问8010:这两个参数也是很重要的参数,在实际生产环境中会用到。合理设置重试次数和等待时间。max_conns是项目服务允许的最大连接数,这个很容易理解。上面的负载均衡算法介绍了简单的负载均衡,还涉及到简单的round-robin负载均衡和加权负载均衡算法。下面具体介绍upstream的负载均衡算法:ll+weight:round-robinweighted(默认)缺点是,其中一个连接满了,nginx还是会往前加连接,导致连接越来越多,速度越来越慢,不够自动化和智能化同一个ip,容易导致某个服务连接过多,负载不均衡,机器挂了,session跟着会丢失url_hash:静态资源缓存,节省存储,加速(第三方),同计算方式如ip_hash,不同的应用场景,通过这种算法,可以将一些静态资源平均分配给各个服务,节省空间least_conn:leastLink(第三方),可以优先向与nginx连接最少的服务请求,最大限度地利用资源least_time:最小的3个响应时间,计算节点的平均响应时间,然后取一个响应最快并分配更高权重的(第三方),您可以充分利用性能良好的机器。以上演示都是通过轮询加权的。再看ip_hash算法:注意除了去掉权重,还可以注释掉备份服务。两者不能同时使用,现在reload看看效果:效果是在一个地方访问时,只会出现一个服务的结果,不会访问其他服务。这就是ip_hash算法的效果。使用其他机器访问,也会出现只访问其中一台的效果:,