个人笔记nginx:负载均衡和调度

本文介绍了Nginx的负载均衡实现,包括四层和七层负载均衡的区别,以及如何通过ip_hash解决会话保持问题。同时,文章探讨了如何利用Redis实现七层负载均衡下的会话共享,确保用户会话的连续性。并讨论了在企业场景中,如何处理后端服务的异常情况,通过配置proxy_next_upstream实现平滑切换。
摘要由CSDN通过智能技术生成

一、负载均衡实现的方式

硬件:f5、
软件:
	七层:Nginx   Haproxy
	四层:LVS   ( Nginx 、Haproxy )
云厂商:
	LB产品,它支持四层和七层?同时你只需要购买你需要的连接数即可?

云厂商负载均衡的名词:
	SLB
	CLB
	ULB
	QLB

四层:性能好,支持功能弱。
七层:性能差,支持功能强。

四层结合七层 共同使用。

  • Nginx负载均衡与Nginx代理不同地方在于,Nginx代理仅代理一台服务器,而Nginx负载均衡则是将客户端请求代理转发至一组upstream虚拟服务池
测试

3台机器

lb				10.0.0.5 	172.16.1.5
web01						172.16.1.7
web02						172.16.1.8
1.配置webserver
[root@web01 ~]# cat /etc/nginx/conf.d/node.xu.com.conf
server {
	listen 80;
	server_name node.xu.com;

	root /node;
	location / {
		index index.html;
	}
}

[root@web01 ~]# nginx -t
[root@web01 ~]# systemctl restart nginx
[root@web01 ~]# mkdir /node
[root@web01 ~]# echo "Web01..." > /node/index.html


2.请求测试:
[root@lb01 ~]# curl -H Host:node.xu.com 172.16.1.7
Web01...
[root@lb01 ~]# curl -H Host:node.xu.com 172.16.1.8
Web02...


3.配置负载均衡
[root@lb01 ~]# cat  /etc/nginx/conf.d/proxy_node.xu.com.conf
#定义负载均衡资源池名称
upstream node {
	server 172.16.1.7:80;
	server 172.16.1.8:80;
}

server {
	listen 80;
	server_name node.xu.com;

	location / {
		proxy_pass http://node;
		include proxy_params;
	}
}
blog 接入到负载均衡:

172.16.1.7 blog.xu.com
172.16.1.8 blog.xu.com

10.0.0.5 blog.xu.com

负载均衡的配置:
[root@lb01 ~]# cat /etc/nginx/conf.d/proxy_blog.xu.com.conf

upstream blog {
	server 172.16.1.7:80;
	server 172.16.1.8:80;
}

server {
	listen 80;
	server_name blog.xu.com;

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

二、调度算法

调度算法 概述

轮询		按时间顺序逐一分配到不同的后端服务器(默认)
weight		加权轮询,weight值越大,分配到的访问几率越高
ip_hash		每个请求按访问IP的hash结果分配,这样来自同一IP的固定访问一个后端服务器
least_conn	将请求传递到活动连接数最少的服务器。
  • ip_hash:
    解决:会话保持的问题
    缺陷:会造成后端某一个节点压力过大,而其他节点没什么压力。 ( NAT )

  • CPU 内存 IO 一模一样。丝毫不差
    既要保证轮询调度到后端的每个节点是公平调度的,同时还要保证 会话保持问题?
    IP_HASH pass掉

  • redis来存储用户的会话信息,然后共享的方式来实现

1.Nginx负载均衡[wrr]轮询具体配置
upstream load_pass {
    server 10.0.0.7:80;
    server 10.0.0.8:80;
}


2.Nginx负载均衡[weight]权重轮询具体配置
upstream load_pass {
    server 10.0.0.7:80 weight=5;
    server 10.0.0.8:80;
}

3.Nginx负载均衡ip_hash具体配置, 不能和weight一起使用。
#如果客户端都走相同代理, 会导致某一台服务器连接过多
upstream load_pass {
    ip_hash;
    server 10.0.0.7:80 weight=5;
    server 10.0.0.8:80;
}


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

状态		概述
down		当前的server暂时不参与负载均衡  相当于注释
backup		预留的备份服务器

max_fails	允许请求失败的次数
fail_timeout	经过max_fails失败后, 服务暂停时间
max_conns	限制最大的接收连接数


keepalive
[root@lb01 ~]# cat  /etc/nginx/conf.d/proxy_node.oldxu.com.conf

#定义负载均衡资源池名词
upstream node {
	server 172.16.1.7:80 max_fails=3 fail_timeout=10s;
	server 172.16.1.8:80 max_fails=3 fail_timeout=10s;

	keepalive 16;
	keepalive_timeout 100s;

}

server {
	listen 80;
	server_name node.oldxu.com;

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

linux客户端:
[root@web01 ~]# echo "10.0.0.5 node.oldxu.com" >> /etc/hosts
[root@web01 ~]# yum install httpd-tools -y
[root@web01 ~]# ab -n 10000 -c200 -k http://node.oldxu.com/	#模拟1000w个连接

负载均衡节点通过netstat查看ESTABILED的状态
[root@lb01 ~]# netstat -an | grep ESTABLISHED

企业案例:

使用nginx负载均衡时,如何将后端请求超时的服务器流量平滑的切换到另一台上。如果后台服务连接超时,Nginx是本身是有机制的,如果出现一个节点down掉的时候,Nginx会更据你具体负载均衡的设置,将请求转移到其他的节点上,但是,如果后台服务连接没有down掉,但是返回错误异常码了如:504、502、500,应该如何处理。
可以在负载均衡添加如下配置proxy_next_upstream http_500 | http_502 | http_503 | http_504 |http_404;意思是,当其中一台返回错误码404,500…等错误时,可以分配到下一台服务器程序继续处理,提高平台访问成功率。

[root@lb01 ~]# cat /etc/nginx/conf.d/proxy_blog.oldxu.com.conf

upstream blog {
	server 172.16.1.7:80;
	server 172.16.1.8:80;
}

server {
	listen 80;
	server_name blog.oldxu.com;

	 location / {
		proxy_pass http://blog;
		include proxy_params;
		proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
	}
}

三、七层负载均衡实现Redis会话共享

  1. session 由服务端程序生成, 生成的是 一个 叫 session_ID 的编号。 存储在服务端( 没登录状态 )
  2. 应用程序Nginx,会将程序生成的Session_ID 回传给 浏览器 ,通过的Header方式 set-cookies
  3. 浏览器 收到服务端的Session_ID 会将该Session_ID 存储至 Cookies中。
  4. 当我尝试登陆网站时,输入用户名称 + 用户密码 + Session_ID
  5. 登陆成功,我们的服务端会存储该 Session 至 本地,并将该sessionID与对应登陆的用户名称捆绑,标记已登陆
  6. 当浏览器再起发送请求, 还会携带 cookies 中的 Session_ID,服务端校验Session_ID, 比对成功,则会话保持。
搭建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.测试访问,查看效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值