9、Nginx-七层负载均衡

版权声明:原创作品,谢绝转载!否则将追究法律责任。 ————— 作者:kirin

1.Nginx负载均衡基本概述

1.什么是负载均衡

负载均衡Load Balance,指的是根据负载均衡算法,将工作任务进行平衡、分摊到多个操作单元上运行。

=2.为什么要做负载均衡=

当我们的web服务器直接面向用户,往往需要承载大量的并发请求,单台服务器难以负荷,使用多台web服务器组成集群,前段使用nginx负载均衡,将请求分散到后端服务器集群中。实现负载的分发。从而提升整体性能、以及系统的容灾能力。

3.四层负载均衡TCP

所谓四层负载经指的是OSI七层模型中的传输层,四层仅需要对客户端的请求进程TCP/IP协议的包转发就可以实现负载均衡。四层负载均衡的性能极好、因为只需要底层进行转发处理,而不需要进行一些复杂的逻辑。

4.七层负载均衡

七层负载均衡他是在应用层,那么它可以完成很多应用方面的协议请求,比如我们说的http应用负载均衡,它可以实现http头信息的改写(proxy_set_header)、安全应用规则控制、URI匹配规则控制、及rewrite等功能,所以在应用层里面可以做的内容就更多了。

5.四层负载与七层负载的区别

四层负载数据包在底层就进行了分发,而七层负载数据包则是在最顶层进行分发,由此可以看出,七层负载效率没有四层高。
七层负载更贴近于服务,如http协议就是七层协议,我们可以用nginx做URL路径规则匹配、head改写、rewrite、会话保持等,这些是四层负载均衡无法实现的。

2.Nginx负载均衡配置场景

Nginx要实现负载均衡需要用到proxy_pass代理模块和upstream两个模块。

1.upstream虚拟配置语法
Syntax: **upstream** *name* { ... }
Default:
Context: http
2.upstream配置示例
[root@lb01 ~]# cat /etc/nginx/conf.d/upstream.conf
upstream blog {
	ip_hash;
	server blog1.com;###注意这里需要有hosts解析,如果没有需要写IP
	server blog2.com;
}


server {
	listen 80;
	server_name blog.com;
	location / {
		proxy_pass http://blog;
		include proxy.params;
	}
}
3.配置验证
###1.创建对应html文件
[root@Nginx ~]# mkdir /soft/{code1,code2,code3} -p
[root@Nginx ~]# cat /soft/code1/index.html
<html>
        <title> Code1</title>
        <body bgcolor="red">
                <h1> Code1-8081 </h1>
        </body>
</html>

[root@Nginx ~]# cat /soft/code2/index.html
<html>
        <title> Coder2</title>
        <body bgcolor="blue">
                <h1> Code1-8082</h1>
        </body>
</html>

[root@Nginx ~]# cat /soft/code3/index.html
<html>
        <title> Coder3</title>
        <body bgcolor="green">
                <h1> Code1-8083</h1>
        </body>
</html>
###2.建立对应的配置文件
[root@Nginx ~]# cat /etc/nginx/conf.d/releserver.conf 
server {
    listen 8081;
    root /soft/code1;
    index index.html;
}

server {
    listen 8082;
    root /soft/code2;
    index index.html;
}

server {
    listen 8083;
    root /soft/code3;
    index index.html;
}
###3.配置Nginx反向代理
[root@Nginx ~]# cat /etc/nginx/conf.d/proxy.conf 
upstream node {
    server 10.0.0.7:8081;
    server 10.0.0.7:8082;
    server 10.0.0.7:8083;
}

server {
    server_name 10.0.0.7;
    listen 80;
    location / {
        proxy_pass http://node;
        include proxy_params;
    }
}

3.nginx负载均衡调度算法

调度算法 概述
轮询 按时间顺序逐一分配到不同的后端服务器(默认)
weight 加权轮询,weight值越大,分配到的访问几率越高
ip_hash 每个请求按访问IP的hash结果分配,这样来自同一IP的固定访问一个后端服务器
url_hash 按照访问URL的hash结果来分配请求,是每个URL定向到同一个后端服务器
least_conn 最少链接数,那个机器链接数少就分发
hash关键数值 hash自定义的key
1.Nginx负载均衡权重轮询具体配置
upstream load_pass {
    server 10.0.0.7:8001;
    server 10.0.0.8:8002 weight=5;
    server 10.0.0.9:8003;
}
2.Nginx负载均衡ip_hash具体配置
//如果客户端都走相同代理, 会导致某一台服务器连接过多
upstream load_pass {
    ip_hash;
    server 10.0.0.7:8001;
    server 10.0.0.8:8002;
    server 10.0.0.9:8003;
}
//如果出现通过代理访问会影响后端节点接收状态均衡

3.Nginx负载均衡url_hash具体配置
upstream load_pass {
    hash $request_uri;
    server 10.0.0.7:8001;
    server 10.0.0.8:8002;
    server 10.0.0.9:8003;
}

//针对三台服务器添加相同文件
/soft/code1/url1.html url2.html url3.html
/soft/code2/url1.html url2.html url3.html
/soft/code3/url1.html url2.html url3.html

4.Nginx负载均衡后端状态

后端服务器在负载均衡调度中的状态

状态 概述
down 当前的server暂时不参与负载均衡
backup 预留的备份服务器
max_fails 允许请求失败的次数
fail_timeout 经过max_fails失败后, 服务暂停时间
max_conns 限制最大的接收连接数
upstream load_pass {
    server 10.0.0.7:8001 down;
    server 10.0.0.8:8002 backup;
    server 10.0.0.9:8003 max_fails=1 fail_timeout=10s;
}

location  / {
    proxy_pass http://load_pass;
    include proxy_params;
}

//关闭8003测试

5.Nginx负载均衡会话共享

1.什么是会话保持?

当用户登录一个网站服务器,网站服务器会将用户的登录信息存储下来(存储下来的内容叫session),以保证我们能后一直处于登录在线状态。

2.为什么要做会话保持?

由于我们使用的是负载均衡轮询机制,会导致用户请求分散在不同地节点上,从而造成会话无法保持。

3.如何实现会话保持?

1.粘性session:指nginx每次都将同一用户的请求都转发至同一台服务器上,即nginx的ip_hash。
2.session复制:即每次session发送变化时,就广播给集群中的服务器,使所有服务器上的session相同。
3.session共享:缓存session至内存数据库中,使用resis,memcached实现。
4.session持久化:将session存储至数据库中,像操作数据一样操作session。

4.Session共享场景演示

环境准备

lb01 10.0.0.5
web01 10.0.0.7
web02 10.0.0.8
#web环境web01和web02相同配置:
##上传phpmyadmin至web服务器
[root@web01 /code/phpmyadmin]# cp config.sample.inc.php config.inc.php
[root@web01 /code/phpmyadmin]# vim +30 config.inc.php
$cfg['Servers'][$i]['host'] = '172.16.1.51'; #修改 localhost为ip地址
[root@web01 /code/phpmyadmin]# chown -R nginx.nginx /var/lib/php/session
#php.ini 配置
[root@web01 ~]# grep -m 2 -n ^session. /etc/php.ini
1231:session.save_handler = redis
1264:session.save_path = "tcp://172.16.1.51:6379"
#注释默认的配置
[root@web01 ~]# tail -4 /etc/php-fpm.d/www.conf
;php_value[session.save_handler] = files
;php_value[session.save_path] = /var/lib/php/session
php_value[soap.wsdl_cache_dir] = /var/lib/php/wsdlcache


#负载均衡配置
[root@lb01 /etc/nginx/conf.d]# cat mysql.kirin7.com.conf
upstream mysql {
server 10.0.0.7:80;
server 10.0.0.8:80;
}

server {
	listen 80;
	server_name mysql.kirin7.com;
	location / {
		proxy_pass http://mysql;
		include proxy_params;
	}
}

#数据库(redis缓存)配置
[root@db01 ~]# yum install -y redis-server
[root@db01 ~]# grep ^bind -n /etc/redis.conf
61:bind 127.0.0.1 172.16.1.51 10.0.0.51
[root@db01 ~]# systemctl restart redis

###刷新页面测试

6.基于URI代理转发

1.基于location实现
web01配置
[root@web01 ~]# cat /etc/nginx/conf.d/jing.conf 
server {
	listen 80;
	server_name zhuan.com;
	root /code/uri;
	location /static {
		index index.html;
	}
}
[root@web01 ~]# mkdir -p /code/uri/staic/
[root@web01 ~]# echo web01 static > /code/uri/staic/index.html
web02配置
[root@web02 ~]# cat /etc/nginx/conf.d/dong.conf
server {
	listen 80;
	server_name zhuan.com;
	root /code/uri;
	location /dong {
		index index.html;
	}
}
[root@web02 ~]# mkdir -p /code/uri/dong
[root@web02 ~]# echo web02 dong > /code/uri/dong/index.html
lb01配置
[root@lb01 ~]# cat /etc/nginx/conf.d/zhuan.com.conf 
upstream static {
	server 10.0.0.7;
}
upstream dong {
	server 10.0.0.8;
}

server {
	listen 80;
	server_name zhuan.com;
	location / {
		proxy_pass http://static;
		include proxy_params;
	}
	location /static {
                proxy_pass http://static;
                include proxy_params;
        }
	location /dong {
                proxy_pass http://dong;
                include proxy_params;
        }	
}

测试

[root@lb01 ~]# curl -H Host:zhuan.com 10.0.0.5/static/
web01 static
[root@lb01 ~]# curl -H Host:zhuan.com 10.0.0.5/dong/
web02 dong
2.以if语句实现
[root@lb01 ~]# cat /etc/nginx/conf.d/zhuan.com.conf
upstream static {
	server 10.0.0.7;
}
upstream dong {
	server 10.0.0.8;
}

server {
	listen 80;
	server_name zhuan.com;

location / { 

if ($request_uri   ~*   "^/static/(.*)$")
{
        proxy_pass http://static/static/$1;
}
if ($request_uri   ~*   "^/dong/(.*)$")
{
        proxy_pass http://dong/dong/$1;
}
    proxy_pass http://static;
    include proxy_params;
}
}

7.基于user_agent转发

lb01配置
[root@local ~]# cat /etc/nginx/conf.d/zhuan.com.conf
upstream jing {
	server 10.0.0.7;
}
upstream dong {
	server 10.0.0.8;
}

server {
	listen 80;
	server_name zhuan.com;

location / { 

        if ($http_user_agent ~* "Safari"){
        proxy_pass http://dong;
        }     
    #firefox浏览器访问效果
        if ($http_user_agent ~* "Firefox"){
        proxy_pass http://jing;
        }
    #chrome浏览器访问效果
        if ($http_user_agent ~* "Chrome"){
        proxy_pass http://dong;
        } 
        
    #iphone手机访问效果
        if ($http_user_agent ~* "iphone"){
        proxy_pass http://jing;
        }
    
    #android手机访问效果
        if ($http_user_agent ~* "android"){
        proxy_pass http://dong;
        }
    
    #其他浏览器访问默认规则
        proxy_pass http://jing;
        include proxy_params;



}
}

8.多级7层代理透传真实IP

1.基于X-Forward-For实现
##一级代理proxy_node1 Nginx配置如下:
[root@lb01 conf.d]# cat proxy_ip.com.conf 
server {
    listen 80;
    server_name ip.com;
    
    location / {
        proxy_pass http://10.0.0.6;
        proxy_http_version 1.1;
        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_node2 Nginx配置如下:
[root@lb01 conf.d]# cat proxy_ip.com.conf 
server {
    listen 80;
    server_name ip.com;
    
    location / {
        proxy_pass http://10.0.0.7;
        proxy_http_version 1.1;
        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_node3 Nginx配置如下:
[root@lb01 conf.d]# cat proxy_ip.com.conf 
server {
    listen 80;
    server_name ip.com;
    
    location / {
        proxy_pass http://10.0.0.8;
        proxy_http_version 1.1;
        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;
    }
}
##WebServer Nginx配置如下:
[root@web02 conf.d]# cat ip.com.conf 
server {
    listen 80;
    server_name ip.com;
    root /code;
    
    location / {
        index index.php index.html;
    }
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
####访问页面查看web端日志
2.基于nginx Realip_module实现
####Lb1和lb2配置不变,web配置如下
[root@web02 conf.d]# cat ip.com.conf 
server {
    listen 80;
    server_name ip.com;
    root /code;
    set_real_ip_from  10.0.0.5;
    set_real_ip_from  10.0.0.6;
    set_real_ip_from  10.0.0.7;
    real_ip_header    X-Forwarded-For;
    real_ip_recursive on;
    #set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行
    #real_ip_header:从哪个header头检索出需要的IP地址
    #real_ip_recursive:递归排除set_real_ip_from里面出现的IP,其余没有出现的认为是用户真实IP


    location / {
        index index.php index.html;
    }
    
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
posted @ 2022-04-12 21:03  kirin(麒麟)  阅读(231)  评论(0编辑  收藏  举报
Δ