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 ...
随机推荐
- C++括号匹配检测(用栈)
输入一串括号,包括圆括号和方括号,()[],判断是否匹配,即([]())或[([][])]为匹配的正确的格式,[(])或([())为不匹配的格式. #include<iostream> # ...
- Python LEGB (Local, Enclosing, Global, Build in) 规则
Local 一个函数定义了一个 local 作用域; PyFrameObject 中的 f_local 属性 Global 一个 module 定义了一个 global 作用域; PyFrameObj ...
- Source Code Structure - Python 源码目录结构
Source Code Structure - Python 源码目录结构 Include 目录包含了 Python 提供的所有头文件, 如果用户需要用 C 或 C++ 编写自定义模块扩展 Pytho ...
- Python3(二) 表示‘组’的概念与定义
现实世界中总存在一组一组的事物, 一.列表的定义 type(['hello','world',1,9,True,False]) = <class 'list'> type([[1,2,3, ...
- 来看看你对Python变量理解到位了没有
变量是编程的基础概念,Python 的变量也看似很简单,但是如果理解不当,生搬硬套,可能会遇到一些麻烦. 下面用 10 个代码示例展示 Python 的 变量 本质. 以下内容有对应的 视频 手把手详 ...
- 设置允许外网访问MySQL
1:设置mysql的配置文件 /etc/mysql/my.cnf 找到 bind-address =127.0.0.1 将其注释掉://作用是使得不再只允许本地访问: 重启my ...
- typescript点滴
typescript比较优质的学习资料都放在前端资料汇总 这些都是为了自己更好的理解和记忆而不是为了学术性的博客. 这里讲的是一些容易忘记的.混淆的. #### typescript的模块的导入3种方 ...
- margin合并及解决办法
外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距. 合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者 水平方向不会发生合并 只有普通文档流中块框的垂直外边距才会发生外边距合并 ...
- C# ,数据导出到带有级联下拉框的模板(一,模板的级联功能)
一.首先解决如何做模板中增加级联功能 1,首先打开一个新的Excel文件,新增sheet,把分类保存在里面,如下图所示 2.回到sheet1,选中要增加下拉框的行(注意:请排除首行,首行是标题) 3. ...
- 献给即将35岁的初学者,焦虑 or 出路?
导言:“对抗职场“35 岁焦虑”,也许唯一的方法是比这个瞬息万变的商业社会跑得更快!” 一直以来,都有许多人说“程序员或测试员是个吃青春饭的职业”,甚至还有说“35 岁混不到管理就等于失业”的言论. ...