+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

张贺,多年互联网行业工作经验,担任过网络工程师、系统集成工程师、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)的更多相关文章

  1. 使用python自动生成docker nginx反向代理配置

    由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...

  2. Nginx反向代理,负载均衡,redis session共享,keepalived高可用

    相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tomcat服务器两台,由nginx进行反向代理和负载均衡,此 ...

  3. Nginx反向代理部署指南

    一.反向代理 我们都知道,80端口是web服务的默认端口,其他主机访问web服务器也是默认和80端口进行web交互,而一台服务器也只有一个80端口,这是约定俗成的标准. 我们来看下面两个场景: 1.服 ...

  4. Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...

  5. Nginx反向代理和负载均衡

    一.Nginx反向代理设置 从80端口转向其他端口反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的 ...

  6. nginx 反向代理

    nginx 反向代理 vim nginx.conf http { ..... upstream "tomcatweb" { server 172.30.13.199:8080; s ...

  7. 关于nginx反向代理后获取不到客户端的真实ip地址问题

    前段时间在我的网站上用nginx做了一下反向代理,最近发现不能获取客户端ip了,都是拿到的127.0.0.1的本地ip... 通过查资料后,再去看了看我的配置文件,结果发现我没有如下配置: nginx ...

  8. Nginx反向代理配置可跨域

    由于业务需要,同一项目中的前端代码放在静态环境中,而后端代码放在tomcat中,但此时问题却出现了:前端使用ajax请求后端获取数据时出现如下报错 XMLHttpRequest cannot load ...

  9. Nginx反向代理搭建配置

    1.反向代理方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将服务器上得到的结果返回给internet 上请求连接的客户端,此时代理服务器对外就表现为一个 ...

  10. nginx反向代理docker registry报”blob upload unknown"解决办法

    问题症状:keepalived+nginx反向代理后端docker registry群集时,使用docker客户机向registry push镜像时出现 "blob upload unkno ...

随机推荐

  1. python的Django构建web应用

    创建一个网上购物的网站 首先创建一个简单的python项目,然后在终端输入pip install django 安装Django框架 然后输入django-admin startproject pys ...

  2. javascript 动态加载javascript文件

    /* loadFile(data, callback): 动态加载js文件 data: 存放需要加载的js文件的url("url" || ["url", &qu ...

  3. Spring Bean几种注入方式——setter(常用),构造器,注入内部Bean,注入集合,接口...

    依赖注入分为三种方式: 1.1构造器注入 构造器通过构造方法实现,构造方法有无参数都可以.在大部分情况下我们都是通过类的构造器来创建对象,Spring也可以采用反射机制通过构造器完成注入,这就是构造器 ...

  4. 【转】Android之四大组件、六大布局、五大存储

    文章来自:http://blog.csdn.net/shenggaofei/article/details/52450668 一.四大组件: Android四大组件分别为activity.servic ...

  5. 杭电-------2055An Easy Problem(C语言)

    #include<stdio.h> int main() { int m; int i; scanf("%d", &m); ]; int y; int z; ; ...

  6. java连接Oracle数据库,从ResultSet中提取数据出现java.sql.sqlException结果集已耗尽

    出现错误的原因是ResultSet中并没有任何东西,再调用next()方法就会出错,原因可能是oracle创建用户,表没有提交,commit即可

  7. Windows渗透备忘录

    Windows渗透备忘录 mimikatz mimikatz.exe ""privilege::debug"" ""sekurlsa::lo ...

  8. [shell] shell 变量生命周期, source, export

    1. shell 的派生 用户登录到Linux系统后,系统将启动一个用户shell.在这个shell中,可以使用shell命令, 或声明变量,也可以创建并运行shell脚本程序.运行shell脚本程序 ...

  9. redis的基础知识

    select切换数据库 remoteSelf:0>select 0 "OK" dbsize查看当前数据库的key数量 remoteSelf:0>dbsize " ...

  10. 「Flink」理解流式处理重要概念

    什么是流式处理呢? 这个问题其实我们大部分时候是没有考虑过的,大多数,我们是把流式处理和实时计算放在一起来说的.我们先来了解下,什么是数据流. 数据流(事件流) 数据流是无边界数据集的抽象 我们之前接 ...