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 ...
随机推荐
- centos7 上为php-fpm安装gd扩展库
转自:https://blog.csdn.net/liyyzz33/article/details/89166110 首先查看自己当前php的版本 php -v PHP 5.6.40 查看yum中是否 ...
- 《Head first设计模式》之单例模式
单例模式(书中叫单件模式,个人习惯叫单例)确保一个类只有一个实例,并提供一个全局访问点. 有一些对象我们只需要一个,比方说:线程池.缓存.对话框.处理器偏好设置和注册表的对象等等.事实上,这类对象只能 ...
- Centos7.5中Nginx报错:nginx: [error] invalid PID number "" in "/run/nginx.pid" 解决方法
服务器重启之后,执行 nginx -t 是OK的,然而在执行 nginx -s reload 的时候报错 nginx: [error] invalid PID number "" ...
- form表单 post 请求打开新页面
function postOpenWindow(URL, PARAMS, target) { if(target == null) target = "_blank"; var t ...
- [MongoDB]mongodb的命令行操作
./mongo1.查看所有数据库show dbs2.切换数据库use 数据库名3.查询所有集合show collections4.查询所有文档db.文档名.find()db.文档名.find().pr ...
- nginx 修改上传文件的大小限制
nginx默认的上传文件大小是有限制的,一般为2MB,如果你要上传的文件超出了这个值,将可能上传失败.修改的地方有: 1. php.ini: upload_max_filesize = 8M 2. ...
- 【React Native】在网页中打开Android应用程序
React Native官方提供Linking库用于调起其他app或者本机应用.Linking的主要属性和方法有: 属性与方法 canOpenURL(url); 判断设备上是否有已经安装相应应用或可以 ...
- 教你用python爬虫监控教务系统,查成绩快人一步!
教你用python爬虫监控教务系统,查成绩快人一步!这几天考了大大小小几门课,教务系统又没有成绩通知功能,为了急切想知道自己挂了多少门,于是我写下这个脚本. 设计思路:设计思路很简单,首先对已有的成绩 ...
- SQL server 游标用法
declare @EmpCode varchar(50), @EmpName varchar(50), @EmpAddress varchar(200);declare curEmployee cur ...
- .Net Core通过json文件 配置管理后台导航菜单
先来看个最终效果图 以前我们配置后台菜单 一般都是把菜单链接, 图标, 以及层级关系 配置到数据库,Core很容易通过json文件来配置导航菜单 而不用存数据库了 先添加个menuconfig.js ...