| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> PHP知识库 -> 137.Nginx(六):负载均衡,缓存 -> 正文阅读 |
|
[PHP知识库]137.Nginx(六):负载均衡,缓存 |
目录 一、负载均衡1.负载均衡原理及处理流程系统的扩展可以分为纵向扩展和横向扩展。
应用集群:将同一应用部署到多台机器上,组成处理集群,接收负载均衡设备分发的请求,进行处理并返回响应的数据。 2.负载均衡的作用
3.负载均衡常用的处理方式方式一:用户手动选择 这种方式比较原始,只要实现的方式就是在网站主页上面提供不同线路、不同服务器链接方式,让用户来选择自己访问的具体服务器,来实现负载均衡 方式二:DNS轮询方式 DNS:域名系统(服务)协议(DNS)是一种分布式网络目录服务,主要用于域名与 IP 地址的相互转换。 大多域名注册商都支持对同一个主机名添加多条A记录(一个域名绑定多个ip),这就是DNS轮询,DNS服务器将解析请求按照A记录的顺序,随机分配到不同的IP上,这样就能完成简单的负载均衡。DNS轮询的成本非常低,在一些不重要的服务器,被经常使用。 注:如果你一个域名绑定多个,当你本地ping的时候发现并没有轮询,可能是因为缓存的原因。尝试清空缓存
DNS轮询的缺点: (1)可靠性低 如果一个ip宕机,所有轮询到这个ip的请求均失败 (2)负载均衡不均衡 上面说了,本地会缓存ip,即每次都会先去查询缓存,需要清空缓存才会轮询 方式三:四/七层负载均衡 介绍四/七层负载均衡之前,我们先了解一个概念,OSI(open systeminterconnection),叫开放式系统互联模型,这个是由国际标准化组织ISO指定的一个不基于具体机型、操作系统或公司的网络体系结构。该模型将网络通信的工作分为七层。 应用层:为应用程序提供网络服务。 所谓四层负载均衡指的是OSI七层模型中的传输层,主要是基于IP+PORT的负载均衡:
所谓的七层负载均衡指的是在应用层,主要是基于虚拟的URL或主机IP的负载均衡:
四层负载均衡数据包是在底层就进行了分发,而七层负载均衡数据包则在最顶端进行分发,所以四层负载均衡的效率比七层负载均衡的要高。 四层负载均衡不识别域名,而七层负载均衡识别域名。 处理四层和七层负载以为其实还有二层、三层负载均衡,二层是在数据链路层基于mac地址来实现负载均衡,三层是在网络层一般采用虚拟IP地址的方式实现负载均衡。. 实际环境采用的模式: 四层负载(LVS)+七层负载(Nginx) 二、Nginx七层负载均衡Nginx要实现七层负载均衡需要用到proxy_pass代理模块配置。Nginx默认安装支持这个模块,我们不需要再做任何处理。 ?Nginx的负载均衡是在Nginx的反向代理基础上把用户的请求根据指定的算法分发到一组【upstream虚拟服务池】。 1.upstream指令upstream:该指令是用来定义一组服务器,它们可以是监听不同端口的服务器,并且也可以是同时监听TCP和Unix socket的服务器。服务器可以指定不同的权重,默认为1
2.server指令server:该指令用来指定后端服务器的名称和一些参数,可以使用域名、IP、端口或者unix socket
3.七层负载均衡的实现流程4.实例先在192.168.230.133中定义一个backend组,然后反向代理到134: 134中配置如下: 访问192.168.230.133:8083会看到轮询134的9001,9002,9003 5.负载均衡状态
?(1)down该状态一般会对需要停机维护的服务器进行设置。 9001不参与负载均衡: 但是测试的时候,我们用谷歌浏览器,都是9003,这其实是浏览器问题。我们通过cmd进行测试: (2)backupbackup:将该服务器标记为备份服务器,当主服务器不可用时,将用来传递请求。 实例:我们将9002设为备份: 我们通过防火墙禁止134上的9003访问: 打开防火墙,然后禁止9003,这个时候会使用9002。当我们恢复9003,则又会继续使用9003 ?(3)max_failsmax_conns=number:用来设置代理服务器同时活动链接的最大数量,默认为0,表示不限制,使用该配置可以根据后端服务器处理请求的并发量来进行设置,防止后端服务器被压垮。 (4)max_fails和fail_timeoutmax_fails=number:设置允许请求代理服务器失败的次数,默认为1。 实例: 9003最多失败3次,如果失败3次之后15秒内暂时服务。就算15秒内9003恢复,我们还是会继续访问到9002: ? 6.负载均衡策略介绍完Nginx负载均衡的相关指令后,我们已经能实现将用户的请求分发到不同的服务器上,那么除了采用默认的分配方式以外,我们还能采用什么样的负载算法:
(1)轮询是upstream模块负载均衡默认的策略。每个请求会按时间顺序逐个分配到不同的后端服务器。轮询不需要额外的配置(上述已经演示) (2)weight加权(加权轮询)轮询其实是特殊的加权轮询,默认每个weight=1。我们也可以手动设置对应的weight。 weight=number:用来设置服务器的权重,默认为1,权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的,所有此策略比较适合服务器的硬件配置差别比较大的情况。 ? 测试:先把防火墙关了,然后在ie测试: 会发现跳9001的概率最大 (3)ip_hash解决session不共享的问题:用户登录第一次转到服务器1,session会在服务器1存储。如果下一次去了服务器2,因为服务器2没有本地存储session,会让用户重新登录,这很不合理。所以我们需要每次都让同一个用户跳转到同一个服务器。 缺点:无法保证负载均衡,有的服务器压力很大有的很小,而且配置了ip_hash后,加权也就不管用了。 针对缺点的解决思路:session不放在服务器本地,而是放在一个redis里面。 测试:第一次得到一个ip,后面都会是这个ip ?(4)least_conn最少连接,把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。 适用情况:此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。 ?使用场景:当服务器A处理很慢,而服务器B很快,同样的任务A越积越多,B则空转。因此我们希望让B多处理一些替A分担。 (5)url_hash按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取。 ?使用场景:需要下载大文件,我们希望尽量在一台机器,因为下载过一次可以使用缓存。 实例:如果你的url不变,那么对应的hash值就不会变,就会跳到同一个url ? (6)fair首先声明,nginx自生不支持fair,需要引入第三方。 fair采用的不是内建负载均衡使用的轮换的均衡算法,而是可以根据页面大小、加载时间长短智能的进行负载均衡。那么如何使用第三方模块的fair负载均衡策略。 实现fair步骤:
*1)去https://github.com/gnosek/nginx-upstream-fair下载
?*2)上传 我们新建一个module目录,然后传过去:?
*3)解压并重命名
打开133,服务器:
*4)编辑ngx_http_upstream.h
查找的时候通过/ *5)nginx添加模块
7.七层负载均衡案例(1)案例一:对所有请求实现一般轮询规则的负载均衡
(2)案例二:对所有请求实现加权轮询规则的负载均衡 基本同上,加了一个权重。上述其实也有权重,只是都是默认1。
(3)案例三:对特定资源实现负载均衡
(4)案例四:对不同域名实现负载均衡
(5)案例五:实现带有URL重写的负载均衡
三、nginx四层负载均衡Nginx在1.9之后,增加了一个stream模块,用来实现四层协议的转发、代理、负载均衡等。stream模块的用法跟http的用法类似,允许我们配置一组TCP或者UDP等协议的监听,然后通proxy_pass来转发我们的请求,通过upstream添加多个后端服务,实现负载均衡 四层协议负载均衡的实现,一般都会用到LVS、HAProxy、F5等,要么很贵要么配置很麻烦,而Nginx的配置相对来说更简单,更能快速完成工作 1.添加stream模块的支持
2.stream指令stream:该指令提供在其中指定流服务器指令的配置文件上下文。和http指令同级。
3.upstream指令upstream:该指令和http的upstream指令是类似的。 4.四层负载均衡案例nginx的ip为150,其中81端口指向146的6378和6379的redis,82端口指向146的8080redis。 (1)在146配置两个redis *1)上传redis压缩包 链接:https://pan.baidu.com/s/1-F-InkE6IKRUDumU6ZYDJQ? 我们先把redis上传一下:? *2)解压,安装,修改配置?,启动
*3)再复制一个redis
修改配置? *4)修改两个配置文件的bind 两个配置文件都要修改? *5)启动一个windows版本redis客户端调用 ?(2)150的nginx中关于redis的负载均衡 测试:146的6379配置01,6378配置02,然后多次调用150的81,会显示不同的值,证明负载均衡生效? ?(3)配置tomcat *1)上传压缩包? *2)解压并启动
3)测试 如果看到猫就对了 (4)配置nginx的负载均衡 之前我们调用150的81,会负载均衡进入146的两个redis。 现在我们调用150的82,需要进入146的tomcat 四、nginx的缓存集成相关概念1.缓存的概念缓存就是数据交换的缓冲区(称作:Cache),当用户要获取数据的时候,会先从缓存中去查询获取数据,如果缓存中有就会直接返回给用户,如果缓存中没有,则会发请求从服务器重新查询数据,将数据返回给用户的同时将数据放入缓存,下次用户就会直接从缓存中获取数据
2.缓存优缺点优:
缺:
3.nginx缓存服务器原理Nginx作为Web缓存服务器,它介于客户端和应用服务器之间,当用户通过浏览器访问一个URL时,web缓存服务器会去应用服务器获取要展示给用户的内容,将内容缓存到自己的服务器上,当下一次请求到来时,如果访问的是同一个URL,web缓存服务器就会直接将之前缓存的内容返回给客户端,而不是向应用服务器再次发送请求。 我们把url作为一个key进行md5加密,然后设置一个缓存文件夹,缓存文件夹+拆分的md5作为路径,防止同一个文件夹下文件过多。 五、nginx缓存集成的相关指令Nginx的web缓存服务主要是使用ngx_http_proxy_module模块相关指令集来完成 1.proxy_cache_path指令proxy_cache_path:该指定用于设置缓存文件的存放路径
2.proxy_cache指令proxy_cache:该指令用来开启或关闭代理缓存,如果是开启则自定使用哪个缓存区来进行缓存。
3.proxy_cache_key指令?proxy_cache_key:该指令用来设置web缓存的key值,Nginx会根据key值MD5哈希存缓存
4.proxy_cache_valid指令proxy_cache_valid:该指令用来对不同返回状态码的URL设置不同的缓存时间
5.proxy_cache_min_uses指令proxy_cache_min_uses:该指令用来设置资源被访问多少次后被缓存
6.proxy_cache_methods指令proxy_cache_methods:该指令用户设置缓存哪些HTTP方法
六、nginx缓存案例nginx缓存服务器150,应用服务器146的tomcat下有静态资源。 如果150下面有则直接缓存返回,如果没有,150去146,然后本地缓存,再返回。
*1)上传静态图片到146 现在上述146的tomcat下面新增一个路径存放图片: 启动tomcat,并查看图片
http://192.168.210.146:8080/picture/11.jpg我们可以看到图片 *2)配置150 的配置文件 http://192.168.210.150:8080/11.jpg,我们可以看到对应的图片 并且可以看到自动生成了一个缓存的文件夹,但是现在里面没有缓存数据: *3)设置缓存 设置缓存名,缓存key(key会被md5加密),对应返回值的有效时间 : ?测试方法一: 我们再调用一次150,可以看到对应缓存目录下面有数据了,而且这个数据额外加了2层,第一层两个字母,第二层一个字母(这是因为我们设置的levels=2:1)?: 测试方法二: 如果是HIT表示命中? *4)针对不同的返回值设置缓存 对于大于5次的文件,才会缓存 ? 七、nginx缓存的清除方式一:删除对应的缓存目录
这样很不好,因为我们的缓存路径是被md5加密的,很麻烦。除非删除所有缓存文件 方式二:使用第三方扩展模块 1.上传文件 ?2.解压安装
3.配置自动清除缓存 ? http://192.168.210.150:8080/purge/11.jpg,我们在路径上添加purge: 我们是写死的proxy_cache_key,也可以将值设置为:$scheme$proxy_host$request_uri 但是要注意,我们设置的时候的url和情况时候的url的路径要保持一致。 八、nginx设置资源不缓存1.proxy_no_cache指令proxy_no_cache:该指令是用来定义不将数据进行缓存的条件。
2.proxy_cache_bypass指令proxy_cache_bypass:该指令是用来设置不从缓存中获取数据的条件。(会缓存但是不读取)
3.实例http://192.168.210.150:8081/?nocache=222&&comment=777 ? 结合之前的例子:? 我们设置一个自己的值,如果这个值有值,就不缓存。 ? 九、打赏请求如果本篇博客对您有所帮助,打赏一点呗,谢谢了呢~ ? ? ? |
|
PHP知识库 最新文章 |
Laravel 下实现 Google 2fa 验证 |
UUCTF WP |
DASCTF10月 web |
XAMPP任意命令执行提升权限漏洞(CVE-2020- |
[GYCTF2020]Easyphp |
iwebsec靶场 代码执行关卡通关笔记 |
多个线程同步执行,多个线程依次执行,多个 |
php 没事记录下常用方法 (TP5.1) |
php之jwt |
2021-09-18 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 1:10:44- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |