前言
用100篇文章讲清面试过程中80%的知识点,只要这100篇文章熟练掌握,了然于胸,就可以面试势如破竹,对面试官进行360°的反击,吊打大部分面试官,疯狂收割大厂Offer!
文章持续更新,每周两篇。会按照知识点进行分类。分为服务器篇、PHP篇、数据库篇、缓存篇、消息队列篇、算法设计模式篇、分布式服务篇。
本系列的写作思路是,用一个大部分程序员容易混淆或者不太理解的概念入手,用第一性原理讲解问题涉及的知识点,如何将知识点用到实际项目中,以及存在哪些坑、如何避坑,一切站在实战的角度。争取用一篇文章讲清楚,以后您再遇到此类问题,直接参考文中的解决思路即可,无需再浪费时间,查阅大量隔靴搔痒的文章。
一 本篇文章要解决的问题
什么是负载均衡、反向代理
什么是负载均衡、反向代理的区别
nginx如何来实现负载均衡、反向代理
二 什么是负载均衡、反向代理
负载均衡
负载均衡是干什么用的呢?这个涉及到了分布式系统的设计。例如我们现在有两台服务器(Server1和Server2)为用户提供服务,如果没有负载均衡就有可能出现95%的用户都去访问Server1,而只有5%的用户访问Server2。那样不就出现Server1快被压死了,而Server2工作负荷完全不满的情况吗。我们当然希望将用户的访问均衡的分配到这两天服务器上,那样对我们的系统是最有利的,这就是负载均衡最大的意义。
负载均衡:将客户端的请求按照一定的规则分配到一群服务器上,并将处理结果返回给相应的客户端。
所以如果我们现在访问百度服务器,请求首先是发到了是其负载均衡上面,Ip地址也是负载均衡的,我们对其后台的服务器集群一无所知。
负载均衡实现方式
1.单独的专门做负载均衡的硬件设备。如F5,工作在网络层
2.软件方式,不需要特定的设备。如nginx,工作在应用层
负载均衡的作用
- 负责调度客户端请求,使其按照最优方式分配到不同的服务器上执行,避免其中某台服务器过载。
- 消除单点失败,这个比较好理解,因为我们有多台服务器,如果其中某一台发生了错误,可以由其他服务器完成请求。
- 通过减少错误返回结果提升用户体验,因为负载均衡可以检查某一台服务器是否存在问题,如果发现存在问题,它就会将请求安排到其他运行良好的服务器上执行,所以用户很少会接到返回失败的错误。
- session持久化( session persistence),这个名词的意思就是在一个session有效期内,将某一个客户端的所有请求都交给同一个服务器执行。这有什么意义呢?假设我们在淘宝上购物,好不容易花了两小时选了两件心仪的宝贝放到了购物车里面,发现添加第三件的时候前两件不见了,那你是不是想问候一下阿里程序员老妈?为什么会这样,因为Http是无状态的,我们使用session维护状态,那假设前两件商品的操作是在Server1上完成的,而第三件商品是在Server2上完成的,那么这种糟糕的情况就出现了,因为Server2第一次接到这个session。
反向代理
首先应该明白什么是代理和正向代理,代理应该不用多解释了,理解成中间人就可以了。什么是正向代理,正向代理是内网通过代理访问外网,这个代理就是正向代理。而反向代理是指,外网通过代理访问内网,那这个代理就是反向代理。
假设把你公司的网看成是内网,那么你从公司里面的一台电脑上访问你家里的电脑上的服务,那就的通过正向代理,而你从你家电脑访问公司的这台电脑,就要通过反向代理。
反向代理与负载均衡一样,也是位于客户端与服务器之间,客户端向服务器发起的请求都是先经过反向代理,然后分发到服务器上,然后服务器将返回结果交给反向代理,反向代理在交给客户端。
反向代理的作用
- 增强了安全性。首先,你背后的服务器是在反向代理后面的,其不会暴露任何信息到网络上,所以可以防止恶意攻击。第二可以防止DDoS( distributed denial-of-service)攻击,例如通过限制某一IP访问,限制每个客户端的访问次数等。
- 增强了可伸缩性与灵活性。因为客户端只能看到反向代理的Ip地址,所以我们就可以灵活的改变其后面服务器的配置。
- 加速Web访问速度。第一:将返回结果压缩后交给客户端,这样就会节省网络带宽,从而加快速度。第二:将请求的加密解密操作放在反向代理服务器上行执行。第三:在反向代理服务器上做缓存。
三 负载均衡、反向代理的区别
反向代理是手段,负载均衡是目的。 也就是说,反向代理可以实现负载均衡,同时负载均衡可以用其他方式来做。
一般可以这样认为,如果一台服务器只是作为中介,将请求转发给另一台服务器,可以认为这台服务器是反向代理服务器。如果这台服务器是将请求按照某种规则分发到多台服务器,则认为这台服务器是负载均衡服务器。
四 nginx如何来实现负载均衡、反向代理
NGINX实现负载均衡 和反向代理都还是比较简单的,在nginx的配置文件里修改。
nginx实现负载均衡
找到nginx的配置文件,在http区块中添加如下内容:
http{
负载均衡可以随便起名字,如我这个地方起的是my_host
upstream my_host{
根据实际情况设置server的值,如要访问的真正服务在192.168.1.104:8080 端口,同时可以设置权重。
server 要代理的ip:80 weight=5;
server 192.168.1.104:8080 weight=1;
}
server{
listen 80;
server_name [www.abc.com](http://www.abc.com)
index index.html index.php
location / {
root /var/www/html
根据upstream设置的名字,前加http
proxy_pass http://my_host;
}
}
}
nginx实现反向代理
找到nginx的配置文件,在http区块中添加如下内容:
http{
server{
listen 80;
server_name [www.abc.com](http://www.abc.com)
index index.html index.php
location / {
root /var/www/html
可以设置反向代理相关的一些参数
proxy_set_header Host www.54php.cn;
设置反向代理的服务器的地址
proxy_pass http://192.168.1.104:8080;
}
}
}
nginx实现负载均衡的六种策略
- 轮询(默认)——每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
- weight ——指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
- ip_hash ——每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器。
- backup——其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
- down——表示单前的server暂时不参与负载
- fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配。与weight分配策略类似。
扩展nginx和tomcat的区别是什么?
虽然Tomcat也可以认为是HTTP服务器,内部集成了http服务器的相关功能,但通常它仍然会和Nginx配合在一起使用。
nginx常用做静态内容服务和反向代理服务器,以及页面前端高并发服务器。
严格的来说,Nginx 应该叫做「HTTP Server」;而 Tomcat 则是一个「Application Server」,或者更准确的来说,是一个「Servlet/JSP」应用的容器(Ruby/Python 等其他语言开发的应用也无法直接运行在 Tomcat 上),这种特性导致了它们在使用中有明确的分工职责。tomcat更多用来做做一个应用容器,让java web app跑在里面的东西。大部分适用于静态资源文件的访问(图片,文件)