开放端口和安装swoole
负载均衡配置并不难,学习的困难在于有的小伙伴没有那么多服务器,这里用swoole创建http服务来代替,所以有一台自己的服务器就可以了。
这里用9502和9503端口来创建两个http服务。
需要注意的地方,云服务器开通这些端口的入站和出站规则(入站和出站规则相应的端口都要打开)。
云服务器怎么开放端口见
云服务器端口和防火墙端口配置
Swoole的安装见
swoole编译安装
创建两个Http服务
这里开启了两个服务 9502和9503 格式为
http_9502.php
<?php
$http = new swoole\http\server('0.0.0.0',9502);
$http->on('request',function($request,$response){
$response->end('<h1>9502:'.date('Y-m-d H:i:s').'</h1>');
});
$http->start();
http_9503.php
同上,换下端口
打开两个CMD窗口分别执行这两个文件 php http_9502.php
php http_9503.php
这样两个http服务器就创建完成了
nginx配置
打开Nginx文档 https://tengine.taobao.org/nginx_docs/cn/docs/
搜索upstream
已经给出了配置的例子
按照文档的例子配置即可,注意upstream的上下文是http ,上下文的意思是这条指令只能写在nginx.conf中的http块中
http{
...
#负载均衡
upstream backend {
server xx.xxx.xx.xx:9502;
server xx.xxx.xx.xx:9503;
}
server {
listen 80;
server_name xx.xxx.xx.xx;
index index.php index.html index.htm default.php default.htm default.html;
root /www/wwwroot/default;
location /up {
proxy_pass http://backend;
}
}
include /www/server/panel/vhost/nginx/*.conf;
}
测试
访问http://xx.xxx.xx.xx/up
刷新
观察到9502和9503不断交替轮询,简单的负载均衡就实现了。
其他
自行按照文档配置学习即可
加权轮询:
upstream backend {
server xx.xxx.xx.xx:9502 weight=2; #20%
server xx.xxx.xx.xx:9503 weight=8; #80% 配置相对好的服务器
}
ip_hash:
如果按照加权轮询的话会有一个问题,如用户在服务器A登陆,保存会话session到A服务器,但轮询的方式,刷新网页后,导致B上没有该用户的会话,又提示登陆。ip_hash解决这个问题。但最好的办法是session入库,让A、B都能访问。
ip_hash根据客户端的ip 哈希取余分配服务器,只要客户端的ip不变,并且服务器的数量不发生改变,就可以黏住该客户端总是访问同一服务器。
如果选择了ip_hash,那么权重就失去了一定的意义。
upstream backend {
ip_hash;
server xx.xxx.xx.xx:9502;
server xx.xxx.xx.xx:9503;
server xx.xxx.xx.xx:9504;
}
ip_hash依赖于服务器的数量不发生改变,所以当需要移除一个服务器时,不能直接将代码删除,而需要在服务器后添加down参数标记服务器不可用。
upstream backend {
ip_hash;
server xx.xxx.xx.xx:9502;
server xx.xxx.xx.xx:9503;
server xx.xxx.xx.xx:9504 down;
}
least_conn:
客户端的每一次请求服务在服务器停留的时间可能会有较大的差异,随着工作时间加长,如果采用简单的轮循或随机均衡算法,每一台服务器上的连接进程可能会产生极大的不同,并没有达到真正的负载均衡。最少连接数均衡算法对内部中需负载的每一台服务器都有一个数据记录,记录当前该服务器正在处理的连接数量,当有新的服务连接请求时,将把当前请求分配给连接数最少的服务器,使均衡更加符合实际情况,负载更加均衡。
upstream backend {
least_conn;
server xx.xxx.xx.xx:9502 weight=2;
server xx.xxx.xx.xx:9503;
}
失败重试:
避免重复请求暂时不能访问的服务,增大服务器的压力,当服务器可用时再次访问。
max_fails=3 fail_timeout=30s 这2个一起搭配使用,表示:当在30秒内失败3次的时候,那么就认为这个上游服务器不可用,30s内将不会访问这台上游服务器,超过30秒后将再次重试这个服务器
upstream backend {
server xx.xxx.xx.xx:9502 weight=2;
server xx.xxx.xx.xx:9503 max_fails=3 fail_timeout=30s;
}
失败或超时切换到下一台服务器:
http{
...
#负载均衡
upstream backend {
server xx.xxx.xx.xx:9502;
server xx.xxx.xx.xx:9503;
}
server {
listen 80;
server_name xx.xxx.xx.xx;
index index.php index.html index.htm default.php default.htm default.html;
root /www/wwwroot/default;
location /up {
proxy_next_upstream timeout; #切换下台服务器的规则是超时
proxy_connect_timeout 3;#链接超时3秒
proxy_send_timeout 3;# 请求超时3秒
proxy_read_timeout 3;#响应超时3秒
#默认不限制重试次数,最好不能无限制的重试
proxy_next_upstream_tries 3;
proxy_next_upstream_timeout 3;
#注意,这个是上游服务器切换层面上的失败重试,与上面的失败重试有所不同。proxy_next_upstream_timeout时间内允许proxy_next_upstream_tries次重试
proxy_pass http://backend;
}
}
include /www/server/panel/vhost/nginx/*.conf;
}
故障转移:
backup 备胎服务器
upstream backend {
server xx.xxx.xx.xx:9502;
server xx.xxx.xx.xx:9503 backup;
}