1. Ngnix代理原理

在这里插入图片描述
在这里插入图片描述

正向代理:

在这里插入图片描述

小提示:
正向代理理解为上网的设备,像是配了一个路由器,可以和任何网站进行联通
正向代理的方式用的很少了,上网直接用路由器就好了
负载均衡的前身就是代理
反向代理:

在这里插入图片描述

正向代理和反向代理的区别:

	区别在于形式上服务的"对象"不一样
	正向代理代理的对象是客户端,为客户端服务   PC电脑
	反向代理代理的对象是服务端,为服务端服务   服务器

Nginx代理支持的协议:

在这里插入图片描述

tcp协议代理的是端口,转发端口

tcp四层负载均衡,就会知道端口层面的代理 ,访问负载均衡的
2222端口,但是访问到了数据库的3306上了

强哥博客: qstack.com.cn

在这里插入图片描述
在这里插入图片描述

反向代理与Nginx模块总结:

反向代理模式			         Nginx配置模块
http、websocket、https		ngx_http_proxy_module
fastcgi				        ngx_http_fastcgi_module
uwsgi				        ngx_http_uwsgi_module
grpc				        ngx_http_v2_module

在这里插入图片描述

小提示: 这些模块必须加载nginx里面来,这样才能支持
通常这些模块都被集成nginx里面来了

2. Nginx反向代理配置实践

环境准备:

在lb01中先复制web的yum源, 然后安装nginx

在这里插入图片描述

只要代理是80端口就行,后端的服务器是多少无所谓

(1)配置后端的web

[root@web01 conf.d]# cat web.oldboy.com.conf 
server {
	listen 80;
	server_name web.oldboy.com;
	root /web;

	location / {
		index index.php index.html;
	}
}
[root@web01 conf.d]# mkdir /web
[root@web01 conf.d]# echo "Web01....." > /web/index.html
[root@web01 conf.d]# nginx -t
sysnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
t[root@web01 conf.d]# systemctl restart nginx

(2)nginx代理配置

[root@lb01 conf.d]# cat proxy_web.conf
server {
	listen 80;
	server_name web.oldboy.com;
	location / {
		proxy_pass http://10.0.0.7:80;
		proxy_set_header Host $http_host; #如果没有下面的语句 在这里可以指定特定的端口,指定特定的网站。 这个$http_host就是web.oldboy.com。如果不写这条语句,就必须指定特定的端口来访问(200端口)如果使用呢默认的端口80,则会默认匹配第一个网站,从而有可能不能到达所期待的网站。如果就想用80端口的话,必须指定这条语句。
	}
}

[root@web01 conf.d]# systemctl restart nginx

(3)抓包分析

从下图可知,10.0.0.1向10.0.0.5发送请求,然后10.0.0.5向10.0.0.7发送请求,然后10.0.0.7向10.0.0.5响应请求,10.0.0.5向10.0.0.1响应请求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BTsYZh0D-1675612776080)(92F1E6D2C9A94CE6AE667EB4EA57A931)]

当添加了proxy_set_header Host $http_host;之后,10.0.0.5向10.0.0.7发送请求的时候,带上了头部(域名),可以是10.0.0.7精确找到要请求的具体位置。如果不传送变量的话,可以用端口号来解决,指定的具体的端口号,这样也能找到具体的内容。如果默认使用80端口的话(直接回默认找端口号,而不会带上域名),会默认返回第一个server,这样会出现差错。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CXmyGwLI-1675612776081)(A4D4EB5BBD744347A29829D96981018C)]
在这里插入图片描述

3. Nginx反向代理相关参数

相关的参数:

proxy_pass http://10.0.0.7:80;   # 本机跟10.0.0.7的80端口建立连接
proxy_http_version 1.1;											#代理使用http1.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; # 如果别人用代理机去攻击你的后端主机,在后端的日志是看不出来的。所以要加上这个参数,可以看到这个用户的IP  

proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;

proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;

参数解释:

X-Forwarded_For  记录的是$proxy_add_x_forwarded_for(真实的ip地址)
这个变量会被后端(07机器)的$http_x_forwarded_for接收到,显示出来  

通过代理访问后端的web,怎么记录真实的ip?(会问)
x_forwarded_for(记录的比较准确把用户的ip和每层代理的IP地址都记录下来)
分别把用户和每个代理的ip显示的日志中,记录的比较准确,比如记录111.111.111.111,222.222.222.222,333.333.333.333

如果X_Real_IP可能就记录最后一个代理的IP地址。只记录最后一个IP,比如333.333.333.333    

举个例子:
比如说 用户-->代理1-->代理2-->web  
       用户---->10.0.0.5(代理1)------>172.16.1.7(代理2)------>172.16.1.8(web)  

X_Forworded_For 客户的IP地址和一级代理的IP地址 10.0.0.1 172.16.1.5
web日志中的第一列记录代理2的IP地址  172.16.1.7  
X_real_ip 记录代理1的ip地址 172.16.1.5

在web的日志中第一列显示用户的真实ip地址,而不是代理的ip地址:

在web中设置  
set_real_ip_from:真实服务器上一级代理的ip四肢或者ip地址段,可以写多行  
real_ip_header:从那个header头检索出需要的ip地址   
real_ip_recursive:递归排除set_real_ip_from里出现的ip,没有出现的则为remote用户来源ip
server {
	listen 80;
	server_name ip.oldboy.com;
	set_real_ip_from 172.16.1.7;
	set_real_ip_from 172.16.1.5;
	real_ip_header X-Forwarded-For;
	real_ip_recursive on;
	location / {
	root /ip/;
	index index.html;
	}
}

在这里插入图片描述

实战开始:

(1)将相关的参数单独写一个文件里,然后用include进行调用。 (把那些优化参数写到文件中,直接用inceude调用!!!! )

写入此文件:/etc/nginx/proxy_params  

[root@lb01 conf.d]# cat /etc/nginx/proxy_params  
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_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;

proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;

(2)在web.oldboy.com.conf中调用参数文件

server{
        listen 80;
        server_name web.oldboy.com;

        location / {
                proxy_pass http://172.16.1.7:80; 这里模拟的是内网环境
                include proxy_params; # 如果写include的话,如果写相对路径的话,默认从/etc/nginx/找配置文件
        }

}

Nginx反向代理原理流程图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lQA4zGnr-1675612776084)(BB11375BFB0E43BDBC3731C52098BCAC)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EoG7pkUq-1675612776084)(EE5ADEAB7C9E42EEAFA5FB369C114693)]

小知识大智慧:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

常见报错:

在这里插入图片描述
在这里插入图片描述

4. Nginx反向代理的局限性

nginx代理局限性:

一个location仅能代理后端一台主机

nginx反向代理的作用:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-25GtY9A5-1675612776091)(602EFCD332594E04BEFD3A6D9AA6F3C1)]

5. 负载均衡概述

负载均衡的名称和种类:

Nginx负载均衡
	负载
	负载均衡
	调度
	load balance
	LB
公有云
	SLB		阿里云负载均衡
	QLB		青云负载均衡
	CLB		腾讯负载均衡
	ULB		ucloud的负载均衡

使用负载均衡的原因:

Nginx的反向代理中给一个location只能代理一台网站

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R5BObXyk-1675612776091)(1BDB0F5D36F94491A88371299F257B0E)]

自己总结: 通常调度节点和服务节点都在一个地域里面
用户公网访问负载均衡,负载均衡通过内网请求web,这样速度会非常快

在这里插入图片描述

常用的架构模型:

在这里插入图片描述

四层模型与七层模型的区别:

(1)四层模型:

四层负载均衡:只到四层时把数据包转发出去了。封装好了分给负载均衡,直接拆到第四层,然后就把后面三层抛出去了,交给后面的服务器
进行处理,后面才会讲这种网站的结构

七层可以使用域名

在这里插入图片描述

(2)七层模型:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k6vJjfSF-1675612776094)(658BB424347F469C9D2D10C28B5BE3CB)]

(3) 四层模型和七层模型的区别:

四层负载均衡数据包在底层就进行了分发,而七层负载均衡数据包则是在最顶层进行分发、由此可以看出,七层负载均衡效率没有四负载均衡高。

但七层负载均衡更贴近于服务,如:http协议就是七层协议,我们可以用Nginx可以作会话保持,URL路径规则匹配、head头改写等等,这些是四层负载均衡无法实现的。

6. Nginx负载均衡场景实践

(1)Web01服务器上配置nginx, 并创建对应html文件

[root@web01 ~]# cd /etc/nginx/conf.d/
[root@web01 conf.d]# cat node.conf 
server {
    listen 80;
    server_name node.oldboy.com;
    location / {
        root /node;
        index index.html;
    }
}
[root@web01 conf.d]# mkdir /node
[root@web01 conf.d]# echo "Web01..." > /node/index.html
[root@web01 conf.d]# systemctl restart nginx

(2)Web02服务器上配置nginx, 并创建对应html文件

[root@web02 ~]# cd /etc/nginx/conf.d/
[root@web02 conf.d]# cat node.conf 
server {
    listen 80;
    server_name node.oldboy.com;
    location / {
        root /node;
        index index.html;
    }
}
[root@web02 conf.d]# mkdir /node
[root@web02 conf.d]# echo "Web02..." > /node/index.html
[root@web02 conf.d]# systemctl restart nginx

(3)配置Nginx负载均衡

虚拟服务池是由nginx来定义的,服务池里面都是提供一摸一样的服务
upstream只能放到http层,要放到server的上面 ,现了一个流量的均摊

[root@lb01 ~]# cd /etc/nginx/conf.d/
[root@lb01 conf.d]# cat node_proxy.conf 
upstream node {
    server 172.16.1.7:80;
    server 172.16.1.8:80;
}
server {
    listen 80;
    server_name node.oldboy.com;

    location / {
        proxy_pass http://node;
        include proxy_params;
    }
}
[root@lb01 conf.d]# systemctl restart nginx

(4)WordPress和zh配置负载均衡

[root@lb01 conf.d]# vim proxy_oldboy.com.conf
upstream node {
        server 172.16.1.7:80;
        server 172.16.1.8:80;
}
server {
        listen 80;
        server_name blog.oldboy.com;
        location / {
                proxy_pass http://node;
                include proxy_params;
        }
}

server {
        listen 80;
        server_name zh.oldboy.com;
        location / {
                proxy_pass http://node;
                include proxy_params;
        }
}

优化之前的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fq1VoFIr-1675612776095)(2B31C284EFD841E381345B379103AE97)]

优化之后的:

在这里插入图片描述

7. 知识点回顾

nginx代理
	正向代理
	反向代理

	反向代理场景
		proxy_pass
		携带头部信息	proxy_set_header
	
	proxy_http_version 1.1;											#代理向后请求使用的版本
	proxy_set_header Host $http_host;								#代理向后端主机请求时携带的host域名
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;	#获取客户端真实IP以及全链路IP

	proxy_connect_timeout 30;			#代理连接后端超时时间
	proxy_send_timeout 60;				#后端传递数据至代理超时时间
	proxy_read_timeout 60;				#后端响应代理的超时时间

	proxy_buffering on;
	proxy_buffer_size 32k;
	proxy_buffers 4 128k;


负载均衡
	稳定
	高效
	容灾
	负载均衡代理的是一组虚拟资源池。
	负载均衡能对物理主机进行逻辑上的捆绑。(主要是让后端的主机组成集群。)
	
	调度--》服务节点
	负载均衡场景
		lb    --> web01  web02  
		
Nginx都会问负载均衡,互联网公司都用

问题:

使用nginx负载均衡时,如何将后端请求时的服务器流量平滑的切换到另一台上。
,Nginx是本身是有机制的,如果出现一个节点down掉的时候,Nginx会更据你具体负载均衡的设置,将请求转移到其他的节点上,但是,如果后台服务连接没有down掉,但是返回错误异常码了如:504、502、500

在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐