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