nginx负载均衡二

2.反向代理(负载均衡的重要参数)

2.反向代理(负载均衡的重要参数)


# 转发http请求的,明确你的后端是运行在基于http协议上。

proxy_pass  请求转发的目标地址;

proxy_pass  http://127.0.0.1:8888;

# 部署PHP网站
# 后端php-fpm此时配置文件/etc/php-fpm.d/www.conf
# 人家说该服务,是以fastcgi这个协议运行(http  > fastcgi > php-fpm)
fastcgi_pass  php-fpm运行的地址;
web-7 (nginx+php-fpm)

fastcgi_pass  127.0.0.1:9000;

这里的俩种协议配置语法,能看懂扣  1,看不懂 2;
请求转发的


# 关于http协
# 你要记住,除了要吧请求转发过去,还得保留着客户端原始的信息数据
# 如何保留这个数据,也是基于不同的协议来设置的


# 先看如下的转发参数,都是基于http协议来的,因为它是以proxy_pass开头的参数
# 和proxy_pass参数对应起来。 
# 你在做负载均衡转发参数的时候,如果不加这些参数,
# nginx代理机器,就会丢失client的信息
# 目标server也拿不到client的信息了
# 你公司的网站架构,是 
client  >  nginx机器    >    后端的机器
如果client的信息全部丢失,你无法再后端获取client的信息
你要在后端client做一些基于ip,基于用户身份的验证,那就全部没法验证了,因为http客户端信息丢失了。。。。
简单理解,就是 如 remote_addr那个信息,x_forwarder_for 参数,获取client真实ip

真实ip 是 10.0.0.1  >  nginx代理 10.0.0.5  >   10.0.0.7


proxy_pass 结合着用;

proxy_set_header Host       $http_host; 
lb服务器将用户访问网站的hosts信息转发给后端节点
浏览器访问 域名的形式 ,  请求头部信息
host: 域名xxxx

【这里的关于http协议的请求转发,以及客户端信息转发,参数能听懂的】
结合者proxy_pass  proxy_set_header  这些参数
能理解 扣 6  不懂 7 


# nginx的代理转发参数,就是proxy_pass
# 四层转发
proxy_pass  ip:port;

# 基于七层的,http协议转发
proxy_pass  http://ip:port; 

【这两句话,看懂扣 1,不懂 2】




proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for ;
将用户真实的ip传递给后端的节点

其他的就是关于性能的参数,你可以不加,直接使用nginx默认的设置,也没问题,
关于性能的参数,不加,比你乱加,要稳定的多!这是线上的经验。

proxy_connect_timeout 60s;
peoxy和server的连接超时,要求不超过75s;

proxy_send_timeout 60s;
proxy等待server回传数据的超时时间

proxy_read_timeout 60s;
proxy等待server响应的超时;

proxy_buffering on | off;
把server返回的数据先放入缓冲区,然后再返回给client,一边收数据,一边传递,而不是全部接收完再传递。

proxy_buffers  4 128k;
缓冲区的容量参数;

nginx四层负载均衡

四层是没有应用层协议的,基于ip:port找到目标的地址。

3.nginx可以同时实现
- 四层负载均衡,基于ip:port的转发,配置如下
# nginx配置文件
# 【无须关于http的请求参数了】

[root@lb-5 /etc/nginx]#cat /etc/nginx/nginx.conf 

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}

# 四层基于stream{}这个模块即可,无须http协议相关的

stream {
    upstream mysql_pool {
		# 目标机器,后端的ip:port  以及负载均衡的参数
      server 172.16.1.51:3306  max_fails=3 fail_timeout=30s;
      server 172.16.1.52:3306  max_fails=3 fail_timeout=30s;
    }
	# 定义虚拟主机,nginx最基本的功能,就是虚拟主机,得接收请求
	# 访问这个nginx代理机器的3306端口,请求就进入如下
    server {
            listen 0.0.0.0:3306;
            proxy_pass mysql_pool;
    }


}

# 描述下请求转发过程

client 发出登录mysql请求
mysql -uroot -p -h10.0.0.5 -P3306
登录请求发给了代理服务器
↓
nginx四层代理服务器,请求轮询发给后端2个节点
↓ 
一次看到 51机器数据
一次看到52机器数据

对于四层的转发,使用mysql的测试,用了它的3306默认端口
比如 比如数据库的redis,6379,四层转发,用法和这个一样,就是端口不同。

七层负载均衡配置(http)

主配置文件,如下的http协议的配置都应该在


/etc/nginx/nginx.conf
# 打标签
http {

	xxxxx;
    
    include /etc/nginx/conf.d/*.conf;
  

}

[root@lb-5 ~]#cat  /etc/nginx/conf.d/proxy.conf 
# 定义一组服务器 nginx反向代理,请求转发给一组服务器
# client是不知道,本次请求,到底是 7 给你返回的,还是8返回的
# client 数据都是 nginx这个代理,发给他的
# 因此实现了反向代理+负载均衡的效果
# 这里的nginx七层反向代理负载均衡,看懂扣 6,不懂7 


upstream  web-pools {
    server 172.16.1.7:8080;
    server 172.16.1.8:8080;
}

server {
    listen 80;
    # 当你访问 
    #   http://wordpress.yuchaoit.cn:80/
    #   协议 http://        域名wordpress.yuchaoit.cn 端口80  
    #  path网页资源路径 /
    
    #  这个http 的url协议规范,看懂扣 1 不懂 2
    # http://wordpress.yuchaoit.cn:80/
    server_name wordpress.yuchaoit.cn;
    	
    location / {
        proxy_pass http://web-pools;
        include /etc/nginx/proxy_params.conf;
    }
}

才能协同工作。

负载均衡策略

rr轮询(round-robin)

# 编写地址池
upstream web-pool{
	# 默认这么写,就是轮训模式,没加任何其他的参数
	server 172.16.1.7;
	server 172.16.1.8;

}

# 以及转发参数
# 创建虚拟主机文件,实现代理转发功能
# 大伙能看懂,调试配置文件,解决错误问题的过程吗?
# 能 3  不能 4

server {

	listen 22555;
	server_name _;
	location / {
		proxy_pass http://web-pool;
		include /etc/nginx/proxy_params;
	}
}

Weight(权重轮询)

upstream backend {
server 192.168.178.122 weight=1;
server 192.168.178.121 weight=2;
}

ip_hash

MD5sum 能够得到字符串的唯一值,对它进行哈希
你client每次来访问,得有client的ip地址
针对这个ip进行哈希算法,求值,nginx底层做的,得到一个唯一值
后续这个ip继续访问nginx,nginx就讲这个ip客户端的请求,固定的发给后端的一个节点。

upstream chaoge_backend {
ip_hash;
server 192.168.178.121;
server 192.168.178.122;

}

url_hash

根据访问url的hash结果分配,同一个url固定发给一个后端节点。

学习查看linux的tcp连接情况(ss命令)

ss -an     或者netstat -an 
查看当前机器的所有socket连接情况(ip:port)的连接数有多少个
# -a 显示当前服务器,所有的socket

#  -n, --numeric       don't resolve service names
# 只显示ip:port 而不是显示主机名,让你跟更清晰,ip地址是谁

netstat命令

[root@web-7 ~]#netstat -an |grep -i estab
Active Internet connections (servers and established)
tcp        0     52 10.0.0.7:22             10.0.0.1:53292          ESTABLISHED
tcp        0      0 10.0.0.7:22             10.0.0.1:58119          ESTABLISHED
Active UNIX domain sockets (servers and established)


[root@web-7 ~]#ss -an |grep -i estab | grep '10.0.0.7:22'
tcp    ESTAB      0      52     10.0.0.7:22                 10.0.0.1:53292              
tcp    ESTAB      0      0      10.0.0.7:22  

负载均衡参数

backup参数

upstream web-pool{
# 默认是轮训算法
# 还可以针对每一个节点,设置不同的功能参数
# backup 被标记为backup参数的服务器,只有服务器池内的其他机器都无法访问了,才会使用该该机器。
	server 172.16.1.7;
	server 172.16.1.8 backup;
}


down参数

down
标记这个机器停止使用了。

某个服务器,要停掉,但是也不能立即删除配置文件,down让它下线,不再接收负载均衡的请求。


[root@lb-5 /etc/nginx/conf.d]#cat proxy-web.conf 
# 编写地址池
upstream web-pool{
	# 默认这么写,就是轮训模式,没加任何其他的参数
	server 172.16.1.7 down;
	server 172.16.1.8;
}


[root@master-61 ~]#curl 10.0.0.5:22555
~~~~~~~~~~~web8
[root@master-61 ~]#curl 10.0.0.5:22555
~~~~~~~~~~~web8
[root@master-61 ~]#curl 10.0.0.5:22555
~~~~~~~~~~~web8
[root@master-61 ~]#curl 10.0.0.5:22555
~~~~~~~~~~~web8
[root@master-61 ~]#curl 10.0.0.5:22555
~~~~~~~~~~~web8

其他参数

max_failes
允许请求失败的次数,一般和fail_timeout结合用
nginx请求转发给某个节点,如果它故障,重试次数

fail_timeout
经过max_failes失败后服务暂停的时间。
重试超时时间

nginx新版本中,默认直接就是健康检查,且延迟很短,后端挂掉,立即请求转发给健康节点,在轮训实验中看过了。



down
标记这个机器停止使用了。

max_conns
限制最大接收的连接数。

图解四层负载均衡,七层负载均衡


posted @ 2024-03-31 20:44  不太聪明的大鹅  阅读(10)  评论(0编辑  收藏  举报