一.使用swoole编写4台http服务器,监听的端口分别是8080、8081、8082、8083
8080服务器的代码
<?php
//搭建HTTP服务器
$server=new Swoole_http_server("0.0.0.0",8080);
$server->on("connect",function ($server,$fd){
echo "建立连接\n";
});
//接收请求
$server->on("request",function ($request,$response){
$request=(array)$request;
$request_method=$request["server"]["request_method"];
$request_uri=$request['server']["request_uri"];
//设置返回头信息
$response->end("8080");
});
//关闭连接
$server->on("close",function ($server,$fd){
echo "关闭连接\n";
});
//启动服务器
$server->start();
?>
8081服务器的代码
<?php
//搭建HTTP服务器
$server=new Swoole_http_server("0.0.0.0",8081);
$server->on("connect",function ($server,$fd){
echo "建立连接\n";
});
//接收请求
$server->on("request",function ($request,$response){
$request=(array)$request;
$request_method=$request["server"]["request_method"];
$request_uri=$request['server']["request_uri"];
//设置返回头信息
$response->end("8081");
});
//关闭连接
$server->on("close",function ($server,$fd){
echo "关闭连接\n";
});
//启动服务器
$server->start();
?>
8082服务器的代码
<?php
//搭建HTTP服务器
$server=new Swoole_http_server("0.0.0.0",8082);
$server->on("connect",function ($server,$fd){
echo "建立连接\n";
});
//接收请求
$server->on("request",function ($request,$response){
$request=(array)$request;
$request_method=$request["server"]["request_method"];
$request_uri=$request['server']["request_uri"];
//设置返回头信息
$response->end("8082");
});
//关闭连接
$server->on("close",function ($server,$fd){
echo "关闭连接\n";
});
//启动服务器
$server->start();
?>
#### 8083服务器的代码
<?php
//搭建HTTP服务器
$server=new Swoole_http_server("0.0.0.0",8083);
$server->on("connect",function ($server,$fd){
echo "建立连接\n";
});
//接收请求
$server->on("request",function ($request,$response){
$request=(array)$request;
$request_method=$request["server"]["request_method"];
$request_uri=$request['server']["request_uri"];
//设置返回头信息
$response->end("8083");
});
//关闭连接
$server->on("close",function ($server,$fd){
echo "关闭连接\n";
});
//启动服务器
$server->start();
?>
二.将4个文件传入服务器,并将4台服务器启动
四台服务器已经启动
三.防火墙开放8080 8081 8082 8083 四个端口
/sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 8081 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 8082 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 8083 -j ACCEPT
在浏览器中进行测试访问
经过测试4台服务器均可以进行访问测试
四.nginx集群配置
所谓集群就是将同一个业务部署到多个服务器上面
将一个应用程序,部署到多太服务器上面,然后在这些服务器的前面通过负载均衡服务器来选择在哪一台服务器去执行
进入nginx安装目录,修改nginx.conf配置文件
1.配置服务器组,在http{} 节点之间添加upstream配置。(注意不要写localhost,不然访问速度会很慢)
upstream nginxCluster{
server 127.0.0.1:8080;#服务器8080
server 127.0.0.1:8081;#服务器8081
server 127.0.0.1:8082;#服务器8082
server 127.0.0.1:8083;#服务器8083
}
2.在location{}中,利用proxy_pass配置反向代理地址:
location / {
proxy_pass http://nginxCluster;
}
修改配置文件
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#gzip on;
upstream nginxCluster{
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
server 127.0.0.1:8083;
}
server {
listen 80;
server_name 192.168.80.128;
location ~ \.(css|js|png|jpg|jpeg|mp3|mp4)$ {
root /usr/local/nginx/html/static;
index index.htm index.html;
}
location / {
proxy_pass http://nginxCluster;
}
}
保存配置文件,重启nginx
访问测试
这说明负载均衡已经搭建成功
五.负载均衡策略
负载均衡:
将服务器接收到的请求按照规则顺序分发的过程,称为负载均衡
1.轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,自动剔除。
2.指定轮询机率
weight和访问比率成正比,用于后端服务性能不均的情况默认选项,当weight不指定时,个服务器weight相同 (weight=1)
upstream nginxCluster{
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:8080 weight=3;
server 127.0.0.1:8080 weight=4;
}
3.ip_hash
每个请求按访问ip的hash值分配,这样同一客户端连续的web请求都会被分发到同一服务器上进行处理,可以解决session的问题。当后台服务器宕机时,会自动跳转到其他服务器。
upstream nginxCluster{
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:8080;
server 127.0.0.1:8080;
server 127.0.0.1:8080;
}
基于weight的负载均衡和基于ip_hash的负载均衡可以组合在一起使用
4.url_hash(第三方)
url_hash是nginx的第三方模块,nginx本身不支持,需要打补丁
nginx按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存服务器 文件服务器 静态服务器时比较有效。缺点是当后端服务宕机的时候,url_hash不会自动跳转到其他缓存服务器,二十返回给用户一个503的错误。
5.fair(第三方)
按后端服务的相应来分配请求,相应时间短的优先分配。