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响应请求
当添加了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.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反向代理原理流程图
小知识大智慧
常见报错
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负载均衡场景实践
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;
}
}
优化之前的
优化之后的
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