本文共 5214 字,大约阅读时间需要 17 分钟。
单体服务器解决不了并发量大的请求,所以,我们可以横向增加服务器的数量(集群),然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
负载均衡的意思是在服务器集群中,需要有一台服务器作为调度者,客户端所有的请求都由调度者接收,调度者再根据每台服务器的负载情况,将请求分配给对应的服务器去处理。
在这个过程中,调度者如何合理分配任务,保证所有服务器将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡的需要处理的问题了。
nginx在 nginx.conf配置文件中通过 upstream模块 和 server模块的配合使用,就可以实现负载均衡。
upstream 模块:负载均衡模块,通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。
在http的 upstream模块中,可以通过 server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。
常用的状态有:
注意:当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是backup。
nginx.conf 负载均衡的基本配置内容如下,以轮询策略为例:
worker_processes 1;events { worker_connections 1024;} http { # upstream模块:server_group_name 自定义服务组名 upstream server_group_name { # server指令指定后端服务器的IP地址和端口 server localhost:8080; server 192.168.xxx.xxx:8081 down; server 192.168.xxx.xxx:8082 max_fails=3 fail_timeout=20s; server 192.168.xxx.xxx:8083; } # server模块 server { listen 80; server_name localhost; location / { # proxy_pass:代理转发,将单体服务http://127.0.0.1:80,改为服务组名 proxy_pass http://server_group_name/; # proxy_redirect default; } }} 浏览效果:在浏览器访问:http://192.168.xxx.xxx/test.html时,由于配置的负载均衡会将请求平均分发到两台服务器中,访问时会出现不同界面。。
这里准备两台tomcat服务器,一台服务器的端口为8080,另一台服务器的端口也为8080吧;
在这两台tomcat服务器的webapps目录中的 ROOT文件夹中创建一个 test.html文件,用于测试。
# 添加 html文件并加入内容echo "This is 8080 Port
" > /usr/local/tomcat8080/webapps/ROOT/test.htmlecho "This is 8080 Port -------
" > /usr/local/tomcat8080/webapps/ROOT/test.html
启动两个tomcat服务。
#启动tomcat8080#启动tomcat8080:/usr/local/tomcat8080/bin/startup.sh#关闭tomcat8080:#/usr/local/tomcat8080/bin/shutdown.sh
浏览器直接访问tomcat服务。

第一步:修改Nginx的配置文件
vim /usr/local/nginx/conf/nginx.conf
配置内容如下,以轮询策略为例:
worker_processes 1;events { worker_connections 1024;} http { # upstream模块:自定义服务组名 upstream my_tomcat_server { server 192.168.xxx.1xx:8080; server 192.168.xxx.2xx:8080; } server { listen 80; server_name 192.168.xxx.xxx; # 指定虚拟主机的IP,或者外网域名 location / { root html; index index.html index.htm; # proxy_pass:代理转发,指定我们配置负载均衡的服务名my_tomcat_server proxy_pass http://my_tomcat_server; # 增加下面内容 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }} 注意:如果遇到 nginx 配置了https upstream,然后访问跳转失败,直接报404。
解决方法:在nginx的配置文件中添加下面内容。
# 增加下面内容 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
第二步:重启Nginx
修改 nginx完之后,保存退出,重启Nginx。
/usr/local/nginx/sbin/nginx -s reload
# 先执行停止命令再执行启动命令[root@centos7 sbin]# /usr/local/nginx/sbin/nginx -s quit[root@centos7 sbin]# /usr/local/nginx/sbin/nginx
第三步:浏览器访问OK
在浏览器访问:http://192.168.xxx.xxx/test.html时,由于配置的负载均衡会将请求平均分发到到这两台服务器中,所以,访问时会出现不同界面。

第四步:关闭服务
#关闭Nginx/usr/local/nginx/sbin/nginx -s quit#关闭tomcat/usr/local/tomcat8080/bin/shutdown.sh
轮询方式是Nginx负载默认的方式。
该策略会使得每个请求按时间顺序逐一分配到不同的后端服务器,如果其中某个后端服务器 down 掉,该策略能自动从轮询列表中剔除该服务。
轮询方式是将所有请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。
# upstream模块:自定义服务组名 upstream my_tomcat_server { server localhost:8080; # 服务器的ip:port server 192.168.xxx.xxx:8081; } 该策略会指定每个服务的权重比例,权重越高被分配的客户端(请求)也就越多,weight 和访问比率成正比。主要用于后端服务器性能不均的情况。
不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。
upstream my_tomcat_server { server localhost:8080 weight=2; server 192.168.xxx.xxx weight=5; # 权重设置为5,5>2,所以请求时会多跳转到这个服务 } 该策略会按照每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器。有效解决了动态网页存在的session共享问题。
源地址哈希法:根据获取客户端的IP地址,通过哈希函数计算得到一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。
注意:ip_hash和 weight也可以配合使用。
upstream my_tomcat_server { ip_hash; server localhost:8080; server 192.168.xxx.xxx; }# ip_hash和 weight也可以配合使用 upstream my_tomcat_server { ip_hash; server localhost:8080 weight=1; server 192.168.xxx.xxx weight=2; } 该策略会将请求分配到连接数最少的服务上。
upstream my_tomcat_server { least_conn; server localhost:8080; server 192.168.xxx.xxx; } Nginx支持集成第三方的策略插件。
比如:
参考文章:
– 求知若饥,虚心若愚。
转载地址:http://ykjfk.baihongyu.com/