当我们的web服务器直接面向用户,往往要承受大量的并发请求,
单台服务器难以负荷,我使用多台web服务器组成集群,前端使用Nginx负载均衡,
将请求分散的打到我们的后端集群中,实现负载的分支.
那么会大大的提升系统的吞吐率,请求性能,高容宰.
往往我们就出的最多的是SLB(Server Load Balance)负载均衡,
实现最多的也是SLB,那么SLB他的调度节点和服务节点通常实在一个地域里面.
那么它在这个小得逻辑地域里面决定了对部分服务的实时性,响应性是非常好的.
所以说当海量用户请求过来以后,他同样是请求调度节点,
调度节点将用户的请求转发给后端对应的服务节点,
服务节点处理完请求后宰转发给调度节点,调度节点最后响应给用户节点,
这样实现一个均衡的作用,那么Nginx是一个典型的SLB
负载均衡
负载
Load Balance
LB
云叫法:
SLB 阿里云负载均衡
QLB 青云负载均衡
CLB 腾讯云负载均衡
ULB UClound负载均衡
Nginx
Haproxy
LVS
所谓四层负载均衡是指OSI七层模型中的传输层,
那么传输层Nginx已经支持TCP/IP的控制,
所以只需要对客户端的请求进行TCP/IP协议的包转发就可以实现负载,
那么他的好处是性能非常快,
只需要底层进行应用处理,而不需要进行一些复杂的逻辑.
七层负载均衡是在应用层,那么他可以完成后很多应用方面的协议请求,
当然四层有四层的好处,七层七层的好处,四层就不支持协议的转发,(http,https,DNS等)只支持IP,但是它的速度快.
应用层虽然没有四层负载快,但是支持很多功能,比如说他支持http信息的改写、头部信息的改写、(意识是,七层代理着用户往后请求的时候把我们用户请求的头部信息加上,长连接协议也可以修改等)、
安全应用规则控制、URL匹配规则控制、以及转发、rewrite等一些规则,
所以在应用层的服务里面,可以做的内容就更多了。Nginx是一个典型的七层负载均衡
四层负载均衡数据包在底层就进行了转发,而七层负载均衡数据则是在最顶层进行转发,
由此可以看出,七层负载效率没有四层负载均衡效率高。
但是七层负载均衡更贴近与服务,如:http就是七层协议,我们可以用Nginx做回话保持,
URL路劲规则匹配、头部改写等等,这些四层是无法实现的
注意:四层负载均衡不识别域名,七层负载均衡识别域名
Nginx要实现负载均衡需要用到proxy_pass代理模块配置
Nginx负载均衡与nginx代理不同地方在于,Nginx的一个location仅能代理一台服务器,(可以说是后端的一个location一个匹配规则,你想要访问/admin,那我给你抛到后端的那台服务器下的某一个位置中去),而Nginx负载均衡是将客户端请求代理转发至一组upstream虚拟服务池。(反向代理一个location只能匹配后端的一个server,那我们的负载均衡就不一样了,用定义的方式把后端的服务放到一个组里面,使用这个组需要一个模块,upstream就是来定义地址池的,也就是说我先把后端的所有你想要负载的节点,我给你定义到一个地址池里面去这个地址池叫upstream,upstream存放着所有的地址。当用户再去请求server_name时,就不是请求一个服务了,而是直接请求一个组名就可以了,uptream默认会轮训匹配,一个一个的放下找,直到找到想要的地址为止。负载均衡有两个模块,一个是proxy_pass模块、一个是upstream模块)
upstream
upstream name { #名字可以随便起
server www.xxx.com; #后端的域名
server www.xxx.com:666; #后端的端口
}
server {
location / {
proxy_pass http://name; #proxy_pass调用upstream里定义的名字
}
}
角色 | 外网IP(NRT) | 内网IP(LAN) | 主机名 |
---|---|---|---|
LB01 | eth0:172.16.1.5 | eth1:172.16.1.5 | lb01 |
web01 | eth0:172.16.1.7 | eth1:172.16.1.7 | web01 |
web02 | eth0:172.16.1.8 | eth1:172.16.1.8 | web02 |
root@lb01 ~]# vim /etc/nginx/conf.d/lb.conf
upstream wordpress.sheng.com {
server 172.16.1.7;
server 172.16.1.8;
}
upstream zh.sheng.com {
server 172.16.1.7;
server 172.16.1.8;
}
upstream phpshe.sheng.com {
server 172.16.1.7;
server 172.16.1.8;
}
server {
listen 80;
server_name wordpress.sheng.com;
location / {
proxy_pass http://wordpress.sheng.com;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
}
}
server {
listen 80;
server_name phpshe.sheng.com;
location / {
proxy_pass http://phpshe.sheng.com;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
}
}
server {
listen 80;
server_name zh.sheng.com;
location / {
proxy_pass http://zh.sheng.com;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
}
}
[root@lb01 ~]# cat /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
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;
[root@web01 ~]# cat /etc/nginx/conf.d/php.conf
server {
listen 80;
server_name php.sheng.com;
root /admin;
index index.php index.html;
location ~ \.php$ {
root /zh;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
[root@web01 ~]# cat /etc/nginx/conf.d/php.conf
server {
listen 80;
server_name php.sheng.com;
root /admin;
index index.php index.html;
location ~ \.php$ {
root /admin;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
[root@web01 ~]# systemctl reload nginx
[root@web01 ~]# wget https://files.phpmyadmin.net/phpMyAdmin/5.1.0/phpMyAdmin-5.1.0-all-languages.zip
[root@web01 ~]# unzipphpMyAdmin-5.1.0-all-languages.zip #解压
[root@web01 ~]# mv phpMyAdmin-5.1.0-all-languages /usr/local #移动
[root@web01 ~]# ln -s /usr/local/phpMyAdmin-5.1.0-all-languages/ /admin #做软连接
[root@web01 ~]# ll -d /admin
lrwxrwxrwx 1 root root 42 Mar 27 16:31 /admin -> /usr/local/phpMyAdmin-5.1.0-all-languages/ # 查看
[root@web01 ~]# chown -R www.www /var/lib/php/session
[root@web01 admin]# cp config.sample.inc.php config.inc.php
[root@web01 admin]# vim config.inc.php
/* Server parameters */
$cfg['Servers'][$i]['host'] = '172.16.1.51'; #修改
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['AllowNoPassword'] = false;
[root@web01 admin]# scp /etc/nginx/conf.d/php.conf 172.16.1.8:/etc/nginx/conf.d/
[root@web01 admin]# scp -r /usr/local/phpMyAdmin-5.1.0-all-languages/ 172.16.1.8:/usr/local/
[root@web02 conf.d]# ln -s /usr/local/phpMyAdmin-5.1.0-all-languages/ /admin
[root@web02 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web02 conf.d]# systemctl restart nginx
[root@web02 conf.d]# chown -R www.www /var/lib/php/session
1.配置lb.conf,添加php.sheng.com
[root@lb01 conf.d]# vim lb.conf
upstream wordpress.shengcom {
server 172.16.1.7;
server 172.16.1.8;
}
upstream zh.sheng.com {
server 172.16.1.7;
server 172.16.1.8;
}
upstream phpshe.sheng.com {
server 172.16.1.7;
server 172.16.1.8;
}
upstream php.sheng.com {
server 172.16.1.7;
server 172.16.1.8;
}
server {
listen 80;
server_name wordpress.sheng.com;
location / {
proxy_pass http://wordpress.sheng.com;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
}
}
server {
listen 80;
server_name phpshe.sheng.com;
location / {
proxy_pass http://phpshe.sheng.com;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
}
}
server {
listen 80;
server_name zh.sheng.com;
location / {
proxy_pass http://zh.sheng.com;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
}
}
server {
listen 80;
server_name php.sheng.com;
location / {
proxy_pass http://php.sheng.com;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
}
}
[root@lb01 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 conf.d]# systemctl restart nginx
[root@db01 ~]# yum -y install redis
[root@db01 ~]# vim /etc/redis.conf
bind 127.0.0.1 172.16.1.51
[root@web02 conf.d]# yum -y install redis
[root@web02 conf.d]# redis-cli -h 172.16.1.51
172.16.1.51:6379>
[root@web01 ~]# vim /etc/php.ini
session.save_handler = redis
session.save_path = "tcp://172.16.1.51:6379"
;session.save_path = "tcp://172.16.1.51:6379?auth=123" #如果redis存在密码,则使用该方式
session.auto_start = 1
;php_value[session.save_handler] = files
;php_value[session.save_path] = /var/lib/php/session
[root@web01 session]# systemctl restart php-fpm
[root@web01 ~]# scp /etc/php.ini [email protected]:/etc/php.ini
[root@web01 ~]# scp /etc/php-fpm.d/www.conf [email protected]:/etc/php-fpm.d/www.conf
[root@web02 session]# systemctl restart php-fpm
[root@db01 ~]# redis-cli
127.0.0.1:6379> keys *
1) "PHPREDIS_SESSION:e1a4e117d2f30f17535e80fecc366043"
2) "PHPREDIS_SESSION:888faf20779bfb887f3188eca012baa4"