Nginx系列之负载均衡和反响代理
NGINX介绍
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行
其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好
Nginx 是一个很强大的高性能Web和反向代理服务器,它具有很多非常优越的特性:
在连接高并发的情况下,Nginx是Apache服务器不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应,感谢Nginx为我们选择了 epoll and kqueue作为开发模型。
实现Nginx负载均衡的组件主要有两个:
ngx_http_proxy_module proxy 代理模块,用于把请求后抛给服务器节点或upstream服务器池 ngx_http_upstream_module 负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查
upstream模块
upstream模块允许Nginx定义一组或多组节点服务器组,使用时可以通过proxy_pass代理方式把网站的请求发送到事先定义好的对应upstream组的名字上,
具体写法为:proxy_pass http://syaving;
其中syaving就是一个upstream节点服务器组名字,例如
upstream syaving {
server weight= max_fails= fail_timeout=10s;
server weight= max_fails= fail_timeout=10s;
server weight= max_fails= fail_timeout=10s;
}
server {
listen ;
server_name www.syaving.com;
access_log /data/logs/nginx/xtapi_accese.log combined;
location / {
proxy_pass http://syaving;
include proxy.conf;
}
}
配置说明:
- upstream模块的内容应放于nginx.conf配置的http标签内,默认调度节点算法是wrr(权重轮询,weighted round-robin)
- server:负载均衡后面的rs配置,可以是ip或域名
- weight:服务器的权重,默认值为1,越大表示接受的请求比例越大
- max_fails:nginx尝试连接后端主机失败的次数,这个数值是配合proxy_net_upstream,fastcgi_next_upstream和memcached_next_upstream这三个参数来使用的,当nginx接收后端服务器返回这三个参数定义的状态码时,会将这个请求转发给正常工作的后端服务器,例如404,502,503 backup:热备配置(rs节点的高可用),当前面激活的rs都失败后会自动启动用热备rs,这标志着这个服务器作为备份服务器,若主服务器全部宕机了,就会向它转发请求;当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup
- fail_timeout:在max_fails定义的失败次数后,距离下次检查的时间间隔,默认10s
- down:表示服务器永远不可用,可配合ip_hash使用
upstream模块调度算法
调度算法一般分为两类:
第一类为静态调度算法,即负载均衡器根据自身设定的规则进行分配,不需要考虑后端节点服务器的情况,例如rr,wrr,ip_hash等
第二类为动态调度算法,即负载均衡器会根据后端节点的当前状态来决定是否分发请求,例如:连接数少的优先获的请求,响应时间短的优先获得请求,例如:least_conn,fair等
常见的调度算法
rr轮询:round-robin,默认调度算法,静态调度算法,按照客户端请求顺序逐一分配到不同的后端节点服务器,宕机的服务器会被自动从节点服务器池中剔除。
rr权重轮询:静态调度算法,在rr轮询算法的基础上加上权重,权重和用户访问成正比,权重值越大,被转发的请求也就越多
ip_hash:静态调度算法,每个请求按客户端IP的Hash值分配,当新的请求到达时,先将其客户端IP通过哈希算法计算出一个值,在随后的客户端请求中,客户端IP的哈希值只要相同,就会被分配到同一台服务器,可以解决动态网页的session共享问题,但也会引起分配不均的弊端
fair:动态调度算法,此算法会根据后端节点服务器的响应时间来分配请求,响应时间短的优先分配,可以依据页面大小和加载时间舱段智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。需要下载Nginx的相关模块upstream_fair
least_conn:根据后端节点的连接数来决定分配情况,哪个机器连接数少就分发
url_hash:根据访问URL的hash结果来分配请求的,让每个URL定向到同一个后端服务器,后端服务器为缓存服务器时效果显著,如果需要使用这种调度算法,必须安装Nginx的hash模块软件包
一致性hash:一般用于代理后端业务为缓存服务(squid,memcached)的场景,通过将用户请求的uri或者指定字符串进行计算,然后调度到后端的服务器上,此后任何用户查找同一个uri或者指定字符串都会被调度到这一台服务器上,因此后端的每个节点缓存的内容都是不同的,一致性hash算法可以解决后端某个或者几个节点宕机后,缓存的数据动荡最小
http_proxy_module模块
proxy_pass指令属于ngx_http_proxy_module模块,此模块可以将请求转发到另一台服务器,在实际的反向代理工作中,会通过location功能匹配指定的uri,然后把接收到的符合匹配URI的请求通过proxy_pass抛给定义好的upstream节点池
简单配置实例
location / {
proxy_pass http://10.0.0.1:8080;
include proxy.conf; #这里我把所有的proxy放到一个文件里面进行include调用,下面有介绍
}
模块参数
proxy_set_header:设置http请求header项传给后端服务器节点,例如,可以实现让代理后端的服务器节点获取访问客户端用户真实的IP地址
client_body_buffer_size:用于指定客户端请求主题缓冲区大小
proxy_connect_timeout:表示反向代理与后端节点服务器连接的超时时间,即发起握手等候响应的超时时间
proxy_send_timeout:表示代理后端服务器的数据回传时间,即在规定时间之内,后端服务器必须传完所有的数据,否则,nginx将断开这个连接
proxy_read_timeout:设置nginx从代理的后端服务器获取信息的时间,表示连接建立成功后,Nginx等待后端服务器的响应时间,其实是nginx已经后端的排队之中等候处理的时间
proxy_buffer_size:设置缓冲区大小,默认该缓冲区大小等于指令proxy_buffers设置的大小
proxy_buffers:设置缓冲区的数量和大小,nginx从代理的后端服务器获取的响应信息,会放置在缓冲区
proxy_busy_buffers_size:用于设置系统很忙时可以使用的proxy_buffers大小,官方推荐的大小为proxy_bufer*2
proxy_temp_file_write_size:指定proxy缓存临时文件的大小
proxy.conf文件如下
proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; #允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数, proxy_connect_timeout ; #nginx跟后端服务器连接超时时间(代理连接超时) proxy_send_timeout ; #后端服务器数据回传时间(代理发送超时) proxy_read_timeout ; #连接成功后,后端服务器响应时间(代理接收超时) proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header; proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*) proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 #proxy_cache cache; #proxy_cache_valid 1h; #proxy_cache_valid 1m; #proxy_cache_key $uri$is_args$args; #add_header Nginx-Cache "$upstream_cache_status"; #proxy_http_version 1.1; #proxy_set_header Upgrade $http_upgrade; #proxy_set_header Connection "Upgrade";
Nginx系列之负载均衡和反响代理的更多相关文章
- nginx的负载均衡和反响代理配置
4. 负载均衡配置 nginx 的 upstream默认是以轮询的方式实现负载均衡,这种方式中,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 另外 ...
- Nginx反向代理服务器、负载均衡和正向代理
Nginx("engine x")是一个高性能的 HTTP 和反向代理服务器,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日.官方测试 nginx 能够支撑5万 ...
- CentOS中实现Nginx负载均衡和反向代理
一.安装必要软件 负载均衡服务器:IP设置为192.168.1.10 Web服务器1:安装Apache或者Nginx,IP设置为192.168.1.11: Web服务器2:安装Apache或者Ngin ...
- nginx负载均衡和反向代理有什么区别
近在研究nginx的负载均衡和反向代理,先看下这两个简单的配置吧! 负载均衡 worker_processes 1; events { worker_connections 1024; } http{ ...
- Nginx 负载均衡和反向代理实践
nginx 以哪个配置文件启动 Nginx 负载均衡和反向代理实践 环境介绍 192.168.1.50 在这台主机上配置Nginx 的反向代理,负载均衡,和web1,web1使用的81号端口 1 ...
- Nginx(六):Nginx HTTP负载均衡和反向代理的配置与优化
一.什么是负载均衡和反向代理 随着网站访问量的快速增长,单台服务器已经无法承担大量用户的并发访问,必须釆用多台服务器协同工作,以提高计算机系统的处理能力和计算强度,满足当前业务量的需求.而如何在完成同 ...
- 【架构师之路】Nginx负载均衡与反向代理—《亿级流量网站架构核心技术》
本篇摘自<亿级流量网站架构核心技术>第二章 Nginx负载均衡与反向代理 部分内容. 当我们的应用单实例不能支撑用户请求时,此时就需要扩容,从一台服务器扩容到两台.几十台.几百台.然而,用 ...
- Nginx服务器部署 负载均衡 反向代理
Nginx服务器部署负载均衡反向代理 LVS Nginx HAProxy的优缺点 三种负载均衡器的优缺点说明如下: LVS的优点: 1.抗负载能力强.工作在第4层仅作分发之用,没有流量的产生,这个特点 ...
- Nginx可以说是标配组件,但是主要场景还是负载均衡、反向代理、代理缓存、限流等场景;而把Nginx作为一个Web容器使用的还不是那么广泛。
Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛. 用Nginx+Lua(OpenResty)开发高性能Web ...
随机推荐
- 一起來玩鳥 Starling Framework(4)TouchEvent,Touch,以及TouchPhase
這一篇來介紹一下TouchEvent.我們先來談單點的touch,下一篇再介紹MultiTouch.翻過Starling文件的應該會發現,Starling裡面沒有MouseEvent,而是整合在Tou ...
- IDEA默认VIM模式
Intellij Idea, 每次打开文件都进入了vim模式,必须输入i才可编辑,实在是非常困扰. 终于找到了解决办法:取消Vim Emulator的选择:
- B10:迭代器模式 Iterator
提供了一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 适用场景:当你需要访问一个聚合对象,而这个对象不论是什么,你都需要遍历的时候,就用迭代器. UML: 示例代码: class ...
- python中的ord,chr函数
chr().unichr()和ord() chr()函数用一个范围在range(256)内的(就是0-255)整数作参数,返回一个对应的字符.unichr()跟它一样,只不过返回的是Unicode字符 ...
- Android项目-几种常见的应用架构
android两种Tab分页的方式:TabActivity和ActivityGroup http://www.fengfly.com/plus/view-209429-1.html 1.单个Activ ...
- 【English】口头禅
1. Absolutely! 毫无疑问! 2. Adorable! 可爱极了! 3. Amazing! 太神奇了! 4. Anytime! 随时吩咐! 5. Almost! 差不多了! 6. Awfu ...
- SpringBoot学习小结
基于Spring,简化Spring应用开发的框架,整个Spring技术栈的大整合,J2EE开发的一站式解决方案 优点: 快速创建独立运行的Spring项目以及集成主流框架 使用嵌入式的Servlet容 ...
- centos7 安装及破解 jira 7.3.3
JIRA是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪.客户服务.需求收集.流程审批.任务跟踪.项目跟踪和敏捷管理等工作领域. 同样jira 的运行依赖java环境,上一节已经 ...
- C语言-EOF和feof()判断文件结尾的区别
今天获取一个图片内容时, fopen("aaaaaa.png", "r"), 读取完文件头就停止了, 后来模式改为 "rb" 就可以了, 特 ...
- spring事务管理源码解析--加了@Transactional注解后Spring究竟为我们做了哪些事情?
大家都知道事务管理是基于AOP的,对AOP还不了解的请自行百度. 实现一个事务需要以下几步:1.获取数据库连接 2.执行数据库操作 3.如果2步骤发生异常就回滚,否则就提交 4.释放资源. 然后 ...