nginx代理(十一)
Nginx负载均衡负载负载均衡调度LB公有云SLB阿里云负载均衡QLB青云负载均衡CLB腾讯负载均衡ULBucloud的负载均衡Nginx的反向代理中给一个location只能代理一台网站通常调度节点和服务节点都在一个地域里面用户公网访问负载均衡,负载均衡通过内网请求web,这样速度会非常快常用的架构模型:四层模型与七层模型的区别:四层负载均衡:只到四层时把数据包转发出去了。封装好了分给负载均衡,
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响应请求
当添加了proxy_set_header Host $http_host;之后,10.0.0.5向10.0.0.7发送请求的时候,带上了头部(域名),可以是10.0.0.7精确找到要请求的具体位置。如果不传送变量的话,可以用端口号来解决,指定的具体的端口号,这样也能找到具体的内容。如果默认使用80端口的话(直接回默认找端口号,而不会带上域名),会默认返回第一个server,这样会出现差错。
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反向代理原理流程图:
小知识大智慧:
常见报错:
4. Nginx反向代理的局限性
nginx代理局限性:
一个location仅能代理后端一台主机
nginx反向代理的作用:
5. 负载均衡概述
负载均衡的名称和种类:
Nginx负载均衡
负载
负载均衡
调度
load balance
LB
公有云
SLB 阿里云负载均衡
QLB 青云负载均衡
CLB 腾讯负载均衡
ULB ucloud的负载均衡
使用负载均衡的原因:
Nginx的反向代理中给一个location只能代理一台网站
自己总结: 通常调度节点和服务节点都在一个地域里面
用户公网访问负载均衡,负载均衡通过内网请求web,这样速度会非常快
常用的架构模型:
四层模型与七层模型的区别:
(1)四层模型:
四层负载均衡:只到四层时把数据包转发出去了。封装好了分给负载均衡,直接拆到第四层,然后就把后面三层抛出去了,交给后面的服务器
进行处理,后面才会讲这种网站的结构
七层可以使用域名
(2)七层模型:
(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;
}
}
优化之前的:
优化之后的:
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
更多推荐
所有评论(0)