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 ...
随机推荐
- JS代码格式化时间戳
一.[24小时制]yyyy-MM-dd HH:mm:ss new Date().toJSON() // 2019-12-13T13:12:32.265Z 通过上面的方法,基本就可以将日期格式化,然后稍 ...
- javascript js全部的 全局属性 和 方法-window
window method: open(URL,窗口名称,窗口风格)//打开一个新的窗口,并在窗口中装载指定URL地址的网页 close()//close方法用于自动关闭浏览器窗口 alert(提示字 ...
- lwip的内存管理
lwip可以不用malloc,而完全用pool,全用全局变量,没看明白怎么实现的. #if LWIP_NETCONN || LWIP_SOCKET LWIP_MEMPOOL(NETBUF, MEMP_ ...
- 小白学 Python 数据分析(9):Pandas (八)数据预处理(2)
人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...
- hyper-v安装ubuntu18的全过程+踩过的坑(win10家庭版)
一.背景介绍(作者的闲言闲语,可跳过) 最近新购入小米笔记本pro15增强版,想在笔记本上装ubuntu18的系统. 最开始尝试了双系统的方法,但是安装完之后不能wifi上网,显卡MX250不能适配, ...
- .net 用反射获取当前运行的程序集中的所有Controller与Action
public string InitPermission() { // 通过反射加载程序集 // var baseType = Assembly.LoadFile(@"G:\testproj ...
- webpack打包进行丑化压缩遇到(TypeError Cannot read property 'compilation' of undefined)问题
今天再重新配置老项目node打包环境的时候遇到了一个问题. 在打包的时候报: TypeError: Cannot read property 'compilation' of undefined 错误 ...
- MySQL基础(7) | 触发器
MySQL基础(7) | 触发器 基本语法 创建 CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EA ...
- linux centos7安装mysql8
一.RPM版安装 查看是否有其他版本的数据库,若有,删除干净 非root用户必须要有sudo权限 1.下载mysql相关安装包 https://mirrors.tuna.tsinghua.edu.cn ...
- 吴裕雄--天生自然 R语言数据可视化绘图(3)
par(ask=TRUE) opar <- par(no.readonly=TRUE) # record current settings # Listing 11.1 - A scatter ...