nginx加权轮询和ip_hash
nginx为后端web服务器(apache,nginx,tomcat,weblogic)等做反向代理
几台后端web服务器需要考虑文件共享,数据库共享,session共享问题.文件共享可以使用nfs,共享存储(fc,ip存储都行)+redhat GFS集群文件系
统,rsync+inotify文件同步等.小规模的集群中使用更多的是nfs.对于内容管理系统,单台进行发布信息,向多台同步使用rsync+inotify就是个不错的选择.
小规模集群,单台高性能数据库(如志强双四核,32/64/128G内存)即可,大规模集群可能要考虑数据库集群了,可以使用mysql官方提供的集群软件,也
可以使用keepalived+lvs读写分离做Mysql集群.
session共享问题是一个大问题,如果nginx采用ip_hash的轮询方法,每个ip在一定时间内会被固定的后端服务器,这样我们不用解决session共享问题.反之,
一个ip的请求被轮询分发到多台服务器上,就要解决session共享的问题,可以使用nfs共享session,把session写入mysql或者memcache等方法,当机器规模比较大
时,一般使用把session写入memcache里面.
后端的web服务器如何配置我们这里就不讨论了,后端服务器可能是apache,nginx,tomcat,lighthttp等,前端不关心后端到底是什么.
首先新建一个proxy.conf文件,方便后面我们进行调用(配置多个集群的话,把公共参数写到一个文件,然后继续include是不错的方法)
1 2 3 4 5 6 7 8 9 10 11 12 | vi /usr/ local /nginx/conf/proxy.conf proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_body_buffer_size 90 ; proxy_connect_timeout 90 ; proxy_read_timeout 90 ; proxy_buffer_size 4 k; proxy_buffers 4 32 k; proxy_busy_buffers_size 64 k; proxy_temp_file_write_size 64 |
我们这里讨论nginx的两种负载均衡方式 轮询加权(也可以不加权,就是1:1负载)和ip_hash(同一ip会被分配给固定的后端服务器,解决session问题)
这个配置文件,我们可以写到nginx.conf里面(如果只有一个web集群),如果有多个web集群,最好写到vhosts里面,以虚拟主机的方式,这里我写到nginx.conf里面
第一种配置:加权轮询,按服务器的性能给予权重,本例是1:2分配
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | upstream lb { server 192.168 . 196.130 weight= 1 fail_timeout= 20 s; server 192.168 . 196.132 weight= 2 fail_timeout= 20 s; } server { listen 80 ; server_name safexjt.com www.safexjt.com; index index.html index.htm index.php; location / { proxy_pass http://lb; proxy_next_upstream http_ 500 http_ 502 http_ 503 error timeout invalid_header; include proxy.conf; } } |
第二种配置:ip_hash轮询方法,不可给服务器加权重
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | upstream lb { server 192.168 . 196.130 fail_timeout= 20 s; server 192.168 . 196.132 fail_timeout= 20 s; ip_hash; } server { listen 80 ; server_name safexjt.com www.safexjt.com; index index.html index.htm index.php; location / { proxy_pass http://lb; proxy_next_upstream http_ 500 http_ 502 http_ 503 error timeout invalid_header; include proxy.conf; } } |
方法二 nginx负载均衡基于ip_hash实现session粘帖
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
1 2 3 4 | upstream backserver { server 192.168 . 0.14 ; server 192.168 . 0.15 ; } |
2、指定权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
1 2 3 4 | upstream backserver { server 192.168 . 0.14 weight= 10 ; server 192.168 . 0.15 weight= 10 ; } |
3、IP绑定 ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
1 2 3 4 5 | upstream backserver { ip_hash; server 192.168 . 0.14: 88 ; server 192.168 . 0.15: 80 ; } |
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
1 2 3 4 5 | upstream backserver { server server 1 ; server server 2 ; fair; } |
5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
1 2 3 4 5 6 | upstream backserver { server squid 1: 3128 ; server squid 2: 3128 ; hash $request_uri; hash_method crc 32 ; } |
在需要使用负载均衡的server中增加
1 2 3 4 5 6 7 8 9 10 | proxy_pass http://backserver/; upstream backserver{ ip_hash; server 127.0 . 0.1: 9090 down; (down 表示单前的server暂时不参与负载) server 127.0 . 0.1: 8080 weight= 2 ; (weight 默认为 1 .weight越大,负载的权重就越大) server 127.0 . 0.1: 6060 ; server 127.0 . 0.1: 7070 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器) } max_fails :允许请求失败的次数默认为 1 .当超过最大次数时,返回proxy_next_upstream 模块定义的错误 fail_timeout:max_fails次失败后,暂停的时间 |
微信

支付宝

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类