是指将负载进行平衡,分配刀多个操作单元上进行运行。
当我们的web服务器直接面向用户,往往要承载大量并发请求,单台服务器难以负荷,我们使用多台web服务器组成集群,前端使用nginx负载均衡,将请求分散的达到我们的后端服务器集群中,实现负载的分发,那么会大大的增强
硬件:f5
软件:
七层:nginx、haproxy
四层:LVS(nginx、haproxy)
云厂商:
云厂商负载均衡的名词:
SLB
CLB
ULB
QLB
性能好,工作在传输层,
性能一般,可以改写包头的信息,实现http信息的改写、头信息的改写、安全应用规则控制等等。在应用层的服务中,我们能做的内容更多。(nginx)
四层:性能好,支持功能弱
七层:性能差,支持功能强
所以在实际应用场景中,我们会选择四层结合七层共同使用。
server {
listen 80;
server_name blog.wenjie.com;
root /code/wordpress;
client_max_body_size 100m;
location / {
index index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
upstream web {
server 172.16.1.7:80;
server 172.16.1.8:80;
}
server {
listen 80;
server_name web.oldxu.com;
server_name blog.wenjie.com;
server_name zh.wenjie.com;
location / {
proxy_pass http://web;
include proxy_params;
}
}
proxy_params文件中内容如下:
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
upstream zh {
server 172.16.1.7:80 weight = 5;
server 172.16.1.8:80 weight = 1;
}
3.ip_hash 表示每个请求按照ip_hash的结果分配的固定的节点。(用于需要登陆的网站,解决会话保持的问题,但是可能会导致后端某一个节点压力过大而其他节点没什么压力)
upstream node {
server 172.16.1.7:80 max_fails=3 fail_timeout =10s max_conns = 1000;
server 172.16.1.8:80 max_fails=3 fail_timeout=10s max_conns = 2000;
}
keepalive:表示设置没有worker进程缓存到后端应用服务器的空闲连接最大数量。如果超过次数字,则关闭最近使用的最少连接,配置在upstream中,配置方法:
keepalive 16;
# 配置最大空闲连接数量为16个。
keeplive_timeout 100s;
# 配置空闲连接的超时时间是100s。
需要安装第三方软件,同时还需要重新编译Nginx。
nginx配置文件如下:
别的都与上面相同,只需要在location中加入如下信息:
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
# 当其中一台返回错误码500、502等错误时,可以分配到下一台服务器程序继续处理,提高平台访问成功率
用户登陆百度网站以后,然后关闭浏览器,当我们再一次登陆百度以后,会发现我们仍然是在登陆状态,这就是会话保持。
会话保持实现的原理:
cookie:一般存放到cookies中,主要存放信息(sessionID)
session:由服务端程序生成,生成的是一个叫sessionID的编号,存储在服务器,主要存放的信息由:sessionID对应的用户名、登录信息等。
1.搭建Nginx+WEB的轮序调度
1)在两台web节点上安装phpmyadmin
[root@web01 ~]# unzip phpMyAdmin-5.0.2-all-languages.zip -d /code/
[root@web01 code]# ln -s /code/phpMyAdmin-5.0.2-all-languages/ /code/phpmyadmin
[root@web01 code]# cd /code/phpmyadmin/
[root@web01 phpmyadmin]# cp config.sample.inc.php config.inc.php
[root@web01 phpmyadmin]# vim config.inc.php
/* Server parameters */
$cfg['Servers'][$i]['host'] = '172.16.1.51';
#授权
[root@web01 phpmyadmin]# chown -R www.www /var/lib/php/
#Nginx配置文件
[root@web01 code]# cat /etc/nginx/conf.d/phpmyadmin.oldxu.com.conf
server {
listen 80;
server_name phpmyadmin.oldxu.com;
root /code/phpmyadmin;
location / {
index index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
[root@web01 code]# nginx -t
[root@web01 code]# systemctl reload nginx
#web02
1.拷贝配置文件
2.拷贝代码
3.重建软链接
4.授权
5.重启Nginx
2.接入负载均衡
[root@lb01 ~]# cat /etc/nginx/conf.d/proxy_phpmyadmin.oldxu.com.conf
upstream php {
server 172.16.1.7:80;
server 172.16.1.8:80;
}
server {
listen 80;
server_name phpmyadmin.oldxu.com;
location / {
proxy_pass http://php;
include proxy_params;
}
}
nginx -t
systemctl restart nginx
3.将存储在本地的Session,让其存储在Redis中。
1)安装Redis
[root@db01 ~]# yum install redis -y
2)配置 Redis (这个IP地址是本机的内网IP地址)
[root@db01 ~]# sed -i '/^bind/c bind 127.0.0.1 172.16.1.51' /etc/redis.conf
3)启动Redis
[root@db01 ~]# systemctl start redis
[root@db01 ~]# systemctl enable redis
[root@db01 ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 172.16.1.51:6379 0.0.0.0:* LISTEN 8966/redis-server 1
==============所有的web节点都需要操作一遍的。==============
4.修改( web01 web02 ) php程序,将原本存储至本地的SessionID,修改为存储至远程的Redis服务器
[root@web02 ~]# vim /etc/php.ini
session.save_handler = redis
session.save_path = "tcp://172.16.1.51:6379?weight=1&timeout=2.5" #连接redis
;session.save_path = "tcp://172.16.1.51:6379?auth=123456&weight=1&timeout=2.5" #redis有密码
#注释php-fpm中控制session存储的路径
[root@web02 ~]# vim /etc/php-fpm.d/www.conf
;php_value[session.save_handler] = files
;php_value[session.save_path] = /var/lib/php/session
重启php-fpm
[root@web02 ~]# systemctl restart php-fpm
4.测试访问,查看效果。