文章目录

  • 1. Ngnix代理原理
  • 2. Nginx反向代理配置实践
  • 3. Nginx反向代理相关参数
  • 4. Nginx反向代理的局限性
  • 5. 负载均衡概述
  • 6. Nginx负载均衡场景实践
  • 7. 知识点回顾

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 balanceLB
公有云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_headerproxy_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以及全链路IPproxy_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

nginx代理(十一)相关推荐

  1. Nginx 代理缓存

    官方文档:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_path 一.设置缓存的路径和其他参数 句法:pro ...

  2. Nginx防盗链,Nginx访问控制, Nginx解析php相关配置, Nginx代理

    2019独角兽企业重金招聘Python工程师标准>>> Nginx防盗链 Nginx防盗链配置需要与不记录日志和过期时间结合在一起,因为都用到了location. 打开配置文件,注释 ...

  3. nginx代理响应报文体不全解决思路

    问题说明 环境说明: centos 6.5 nginx 1.13.7 tomcat 8.5+ jdk 1.8 问题描述 本地访问测试机接口发生异常 curl访问结果: tomcat日志: 解决思路 开 ...

  4. FastDFS + Nginx代理方式访问

    FastDFS + Nginx代理方式访问 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.在storage上安装nginx 1>.下载nginx软件(http://ngi ...

  5. go 通过nginx代理后获取用户ip

    go 如果使用自己的服务器,可以直接使用 net/http 来获取 func ip(w http.ResponseWriter, r *http.Request) {fmt.Println(r.Rem ...

  6. nginx代理多个flask

    2019独角兽企业重金招聘Python工程师标准>>> nginx 代理多个flask 本文讲述如何用nginx代理多个flask,从而进行负载均衡 所需准备 : 1. nginx ...

  7. 开发程序实现nginx代理节点状态检查及WEB界面展示

    实现功能介绍: 利用shell程序及http服务巧妙的实现监控nginx代理节点状态检查,然后通过web界面实时刷新显示结果,是不是有些吃惊这样高大上的程序?那就赶紧看看吧! to用人单位:此课程可以 ...

  8. Nginx.代理MySQL

    Nginx.代理MySQL 1. Nginx在安装的时候,需要加上一个参数:--with-stream 即Nginx安装指令为:./configure --prefix=/u01/app/nginx  ...

  9. Nginx防盗链、访问控制、Nginx解析PHP相关配置、Nginx代理

    2019独角兽企业重金招聘Python工程师标准>>> Nginx防盗链 在配置文件里写入以下内容: 用curl测试 访问控制 Nginx限制某些IP不能访问或者只允许某些IP访问. ...

最新文章

  1. 多行文本框限制输入字符长度(两种方法)
  2. pythonのgevent同步异步区别
  3. 阿里巴巴的云原生应用开源探索与实践
  4. 【pmcaff】pm怎么跟妈妈解释自己是做什么的
  5. VTK:PolyData之DijkstraGraphGeodesicPath
  6. lightgbm的GPU版本和CPU版本运行速度比较
  7. Pytest标记用例失败之xfail
  8. java变量自增题的分解08251944
  9. 基于行为树的高级游戏AI教程
  10. 安装了天正电气 服务器为空,解决 WIN7_64位系统安装 天正电气2014+CAD2008时,出现“error”或者:“不能访问到网络锁……”...
  11. Excel怎么实现表格数据行间随机打乱排序
  12. java jui_求教java大神,下面这个JUI界面是怎么布局而成的
  13. Java实现动态规划经典题目
  14. VC修改IE滚动条宽度
  15. nba2k online名字大全
  16. speedoffice(Excel)如何让图片随单元格大小改变?
  17. SQL 中的注释语句
  18. Java格式化json格式文本数据
  19. 不经一番寒彻骨,那有冰冻三尺,那有不经波折的人生?
  20. linux-gcc 找不到命令,为什么显示gcc命令没有找到?

热门文章

  1. cad四边形展开lisp_CAD的LISP功能函数一览表
  2. linux启动tigervnc服务,linux下tigervnc-servere服务的安装与使用
  3. 使用神经网络完成新闻分类
  4. 坐标转换软件Coord使用
  5. 云栖科技评论第67期:完全自动驾驶实现遥遥无期?不必多虑!
  6. 354. 俄罗斯套娃信封问题(Java动态规划)
  7. vue得到的某一时间与当前时间作比较
  8. arcgis计算坡度(需注意DEM是地理坐标系还是投影坐标系)
  9. 女大学生-程序员需要达到什么水平才能不被性别歧视?顺利拿到 20k 无压力?
  10. 1144: 零起点学算法51——数组中删数(C语言)