nginx反向代理(1)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
张贺,多年互联网行业工作经验,担任过网络工程师、系统集成工程师、LINUX系统运维工程师
个人网站:www.zhanghehe.cn
笔者微信:zhanghe15069028807,现居济南历下区
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
反向代理
概述

是转发还是生成生成数据包?
NAT、LVS,iptables都是内核功能,最多只能看到传输层的内容,修改的层次最高也就是传输层,后端的R-SERVER收到的数据包应用层里面的内容依然还是客户端的发出的。
而nginx代理则可以看到数据包全部内容,一手托两家,包已经不是原来的数据包了,应用层内容已经被改变了,nginx代理要把数据包完全拆开,检查应用层的内容,然后根据规则向后端分发数据包,这个数据包与nginx重新生成的,nginx要充当客户端向后端的web集群发请求。
是否有应用缓存?
NAT,LVS、iptables都没有真正意义上的应用缓存,所谓的应用缓存就是当客户端请求某个资源时,不用到R-SERVER上去拿,而直接通过代理的缓存响应,NAT,这三都都无法看到应用层里面客户端请求的是什么内容,根本没法缓存,它们都是内核的功能而已,看不懂应用层的报文到底请求的是什么内容。这三者并不算是真正意义的代理。
关于持久连接?
LVS、nginx、haproxy都可以实现持久连接,只不过是层次不同而已。
LVS只能通过网络层的IP地址进行持久连接
nginx可以基于URL、cookie进行持久连接。
nginx能根据URL实现持久连接,也能根据此功能实现动静分离。
nginx代理

proxy_pass
location / {
proxy_pass http://localhost:8000;
}
解释一下,如果被location给匹配了的话,会将请求转发给proxy_pass后面的RUL。下面那一行的意思是我们可以给转发给R-SERVER的数据包里面加点东西,nginx代理默认向后R-SERVER发送的数据包源IP是NGINX代理自己,我们可以通过proxy_set_header X-Real-IP $remote_addr给向后面发送的数据包里面加上一个字段,这个字段会把真正客户端的地址也封装到数据包里面传输给后端WEB集群。
//lvs的配置
server {
listen 80;
server_name www.zhanghehe.com.cn;
location / {
proxy_pass http://192.168.80.11:80;
}
}
//客户端访问结果
[root@client ~]# curl www.zhanghehe.com.cn
this is 80.11
//80.11这台主机上的nginx_log,全是80.10的访问记录
[root@rip1 ~]# cat /var/log/nginx/access.log
192.168.80.10 - - [27/Feb/2020:16:20:18 +0800] "GET / HTTP/1.1" 200 14 "-" "curl/7.29.0" "-"
192.168.80.10 - - [27/Feb/2020:16:29:07 +0800] "GET / HTTP/1.0" 200 14 "-" "curl/7.29.0" "-"
192.168.80.10 - - [27/Feb/2020:16:29:09 +0800] "GET / HTTP/1.0" 200 14 "-" "curl/7.29.0" "-"
如上述,如果是这样的话,在R-SERVER上就无法知道真实的客户端的IP了,怎么办呢?如下所示:
//lvs加一个forward模块
server {
listen 80;
server_name www.zhanghehe.com.cn;
location / {
proxy_pass http://192.168.80.11:80;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #设定发往后端主机的请求报文的请求首部值
}
}
//日志里面就带上了真正客户端的IP地址
[root@rip1 ~]# cat /var/log/nginx/access.log
192.168.80.10 - - [27/Feb/2020:16:37:52 +0800] "GET / HTTP/1.0" 200 14 "-" "curl/7.29.0" "192.168.90.9"
这是怎么实现的呢?实现上就在数据包里面加了一个字段,我们通过tcpdump就可以抓出来看一看[root@lvs conf.d]# tcpdump -i eth0 tcp -w /tmp/http.cap,此数据包已经上传到我的百度网盘,典型数据包文件夹下了
链接:https://pan.baidu.com/s/1qadF0rgAkpE_QhV8p3RhbA
提取码:mf3d

nginx代理可以在向后端web集群发送的数据包当中任意插入字段,那么web集群给客户端回复的数据包,nginx代理是否能动手脚呢?当然能了,因为nginx是完全代理嘛,上面那个图已经说的足够明白了,那我们验证一下吧!
默认nginx给客户端回复的数据包是这样的,如下所示,响应报文里面没显示是谁给我们回复的。

在nginx代理上设置一下,如下所示:
server {
listen 80;
server_name www.zhanghehe.com.cn;
location / {
proxy_pass http://192.168.80.11:80;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header X-Via $server_addr;
}
}
客户端再访问的时候,响应报文里面就会多一个字段,显示是谁响应给自己的,如下所示:

加与不加/
[root@lvs conf.d]# cat nginx_proxy.conf
server {
listen 80;
server_name www.zhanghehe.com.cn;
location / {
proxy_pass http://192.168.80.11:80;
}
location /administrator {
proxy_pass http://192.168.80.11/admin;
}
location /images {
proxy_pass http://192.168.80.11/images/;
}
}
第二个location没有加/号,表示如果用户访问的是www.zhanghehe.com.cn/administrator就将其转发到http://192.168.80.11/admin/administrator下,不加/的时候,要用proxy_pass的内容替换所属location后的第一个/。
第三个location表示,如果用户访问的是www.zhanghehe.com.cn/images的话就将其转发到http://192.168.80.11/images/目录下,加上/的时候,表示完整的替换。
nginx反向代理(1)的更多相关文章
- 使用python自动生成docker nginx反向代理配置
由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...
- Nginx反向代理,负载均衡,redis session共享,keepalived高可用
相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tomcat服务器两台,由nginx进行反向代理和负载均衡,此 ...
- Nginx反向代理部署指南
一.反向代理 我们都知道,80端口是web服务的默认端口,其他主机访问web服务器也是默认和80端口进行web交互,而一台服务器也只有一个80端口,这是约定俗成的标准. 我们来看下面两个场景: 1.服 ...
- Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...
- Nginx反向代理和负载均衡
一.Nginx反向代理设置 从80端口转向其他端口反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的 ...
- nginx 反向代理
nginx 反向代理 vim nginx.conf http { ..... upstream "tomcatweb" { server 172.30.13.199:8080; s ...
- 关于nginx反向代理后获取不到客户端的真实ip地址问题
前段时间在我的网站上用nginx做了一下反向代理,最近发现不能获取客户端ip了,都是拿到的127.0.0.1的本地ip... 通过查资料后,再去看了看我的配置文件,结果发现我没有如下配置: nginx ...
- Nginx反向代理配置可跨域
由于业务需要,同一项目中的前端代码放在静态环境中,而后端代码放在tomcat中,但此时问题却出现了:前端使用ajax请求后端获取数据时出现如下报错 XMLHttpRequest cannot load ...
- Nginx反向代理搭建配置
1.反向代理方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将服务器上得到的结果返回给internet 上请求连接的客户端,此时代理服务器对外就表现为一个 ...
- nginx反向代理docker registry报”blob upload unknown"解决办法
问题症状:keepalived+nginx反向代理后端docker registry群集时,使用docker客户机向registry push镜像时出现 "blob upload unkno ...
随机推荐
- mount.nfs: Stale file handle的解决方法
在NFS客户端挂载rpc共享服务的时候出现这个问题 # mount -t nfs 192.168.20.6:/data /mnt mount.nfs: Stale file handle 原因是当cl ...
- 数据算法 --hadoop/spark数据处理技巧 --(11.K-均值聚类 12. k-近邻)
十一.k-均值聚类 这个需要MR迭代多次. 开始时,会选择K个点作为簇中心,这些点成为簇质心.可以选择很多方法啦初始化质心,其中一种方法是从n个点的样本中随机选择K个点.一旦选择了K个初始的簇质心,下 ...
- SNMP协议交互学习-获取udp的udpindatagrams
MIB的组织结构,如下左图,对于udp来说1.3.6.1.2.1.7,组织如下右图,包括4个标量和1个表格 udp节点在LwIP中的定义如下: ] = { , , , , }; ] = { (stru ...
- pinpoint安装(docker)
安装docker docker-compose yum update -y yum install docker epel-release python-pip -y pip install --up ...
- dubbo-admin dubbo-monitor 安装
dubbo-admin: 因为我们不能直观的看到dubbo和zk上到底有什么服务(提供者),所以我们需要一个可视化工具来方便我们管理每一个服务和每一个节点.dubbo-admin 就是dubbo的管理 ...
- 杭电-------2042不容易系列之二(C语言写)
/* 根据题意,知道了最终只剩下了3只羊,应该是从最后一步向前推算,但是因为题意的测试布置一个 可以从只有一个收费站算起,知道本次需要就算的收费站,这样之后有小于此数目的可以直接输出, 大于此数目的也 ...
- go每日新闻--2020-02-27
go 语言中文网(每日资讯)_2020-02-27 一.Go 语言中文网 如何正确看待 Google 宣布 Fuchsia 操作系统没有选 Go 作为终端开发语言 Actor 还是 CSP?Go 中的 ...
- c#---Socean.Rpc之EasyProxy
目录 1.高性能RPC框架:Socean.RPC 2.Socean.RPC框架实测 3.Socean.Rpc之EasyProxy 简介 这几天给Socean.RPC加上了动态代理,简称EasyProx ...
- python+selenium自动化测试,浏览器最大化报错解决方法
此处以谷歌浏览器为例 [问题1]缺少chrome驱动,webdriver调用谷歌浏览器的时候就报错了,如下图: [原因分析]缺少谷歌驱动程序 [解决办法] 1.查看本地安装chrome浏览器版本 2. ...
- python——异常(1),捕获特定异常
"""1.捕获指定异常,异常类型有多种2.若尝试执行的代码异常类型与捕获的异常类型不同则报错3.try下方一般只放一行代码,若有多行可能异常代码,则捕获一个异常类型后函数 ...