nginx代理(十一)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

文章目录

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

2nginx代理配置

[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.111222.222.222.222333.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.8web  

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负载均衡场景实践

1Web01服务器上配置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

2Web02服务器上配置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

4WordPress和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

在这里插入图片描述

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: nginx