Nginx反向代理、负载均衡分发以及正向代理之间的恩怨情仇
- 格式:docx
- 大小:118.30 KB
- 文档页数:6
Nginx反向代理、负载均衡及⽇志Nginx反向代理、负载均衡及⽇志1、原理图2、正向代理与反向代理(1)代理服务器代理服务器,客户机在发送请求时,不会直接发送给⽬的主机,⽽是先发送给代理服务器,代理服务接受客户机请求之后,再向主机发出,并接收⽬的主机返回的数据,存放在代理服务器的硬盘中,再发送给客户机。
使⽤代理服务器的好处(1.1)提⾼访问速度由于⽬标主机返回的数据会存放在代理服务器的硬盘中,因此下⼀次客户再访问相同的站点数据时,会直接从代理服务器的硬盘中读取,起到了缓存的作⽤,尤其对于热门站点能明显提⾼请求速度。
(1.2)防⽕墙作⽤由于所有的客户机请求都必须通过代理服务器访问远程站点,因此可在代理服务器上设限,过滤某些不安全信息。
(1.3)通过代理服务器访问不能访问的⽬标站点互联⽹上有许多开发的代理服务器,客户机在访问受限时,可通过不受限的代理服务器访问⽬标站点,通俗说,我们使⽤的FQ浏览器就是利⽤了代理服务器,虽然不能出国,但也可直接访问外⽹。
(2)正向代理的概念正向代理,也就是传说中的代理,他的⼯作原理就像⼀个跳板,简单的说,我是⼀个⽤户,我访问不了某⽹站,但是我能访问⼀个代理服务器,这个代理服务器呢,他能访问那个我不能访问的⽹站,于是我先连上代理服务器,告诉他我需要那个⽆法访问⽹站的内容,代理服务器去取回来,然后返回给我。
从⽹站的⾓度,只在代理服务器来取内容的时候有⼀次记录,有时候并不知道是⽤户的请求,也隐藏了⽤户的资料,这取决于代理告不告诉⽹站。
结论就是,正向代理是⼀个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送⼀个请求并指定⽬标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
客户端必须要进⾏⼀些特别的设置才能使⽤正向代理。
(3)反向代理的概念反向代理指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部⽹络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接到客户端,此时代理服务器对外就表现为⼀个服务器,⽽此种⼯作模式类似于LVS-NET模型。
正向代理与反向代理原理一、正向代理正向代理是指代理服务器代表客户端向目标服务器发送请求。
客户端在访问其他服务器时,所有的请求都会通过正向代理服务器进行转发,目标服务器无法直接获得客户端的真正地址。
正向代理的工作流程如下:1.客户端向代理服务器发送请求。
2.代理服务器接收请求,并将请求转发给目标服务器。
3.目标服务器将响应发送给代理服务器。
4.代理服务器将响应返回给客户端。
正向代理的主要功能有:1.避免访问被限制:正向代理可以绕过防火墙和网络过滤器,访问被封锁的资源。
2.缓存加速:代理服务器可以缓存目标服务器返回的内容,提高服务器响应速度,减轻服务器负担。
3.隐藏客户端真实IP地址:目标服务器无法直接获取客户端的真实IP地址,并增强客户端的隐私保护。
正向代理的经典案例是“翻墙”代理,比如在国内访问国外被墙的网站,客户端可以通过正向代理服务器访问被限制的资源。
二、反向代理反向代理是指代理服务器代表目标服务器向客户端发送请求。
当客户端向反向代理服务器发送请求时,代理服务器会根据规则将请求转发给多个目标服务器,再将目标服务器的响应返回给客户端,客户端无法直接访问目标服务器。
反向代理的工作流程如下:1.客户端向反向代理服务器发送请求。
2.反向代理服务器接收请求,并根据负载均衡策略将请求转发给目标服务器。
3.目标服务器处理请求,并将响应发送给反向代理服务器。
4.反向代理服务器将响应返回给客户端。
反向代理的主要功能有:1.负载均衡:反向代理服务器可以根据负载均衡算法将请求分发给多个目标服务器,并避免单一服务器过载。
2.缓存加速:反向代理服务器可以缓存目标服务器返回的内容,提高服务器响应速度,减轻服务器负担。
3.安全保护:反向代理可以隐藏目标服务器的真实IP地址,增强服务器的安全防护。
反向代理的经典应用场景有:1.网站负载均衡:将客户端的请求分发给多个服务器,提高网站的并发处理能力和可靠性。
2.缓存加速:将静态资源缓存到代理服务器,减少服务器负载,加快页面加载速度。
正向代理与反向代理区别图解(nginx)
正向代理与反向代理区别图解 (nginx)
1. 背景
经常听到代理,⽐如通常我们要上国外的⽹站时,需要买vpn作为跳板机器进⾏访问。
但是在公司⾥⾯也听到了nginx⽀持反向代理。
那什么是正向代理,什么是反向代理?在⽹上看了写内容,说⼀下⾃⼰的理解。
2. 正向代理
正向代理,是在⽤户端的。
⽐如需要访问某些国外⽹站,我们可能需要购买vpn。
并且vpn是在我们的⽤户浏览器端设置的(并不是在远端的服务器设置)。
浏览器先访问vpn地址,vpn地址转发请求,并最后将请求结果原路返回来。
3. 反向代理
有正向代理,就有反向代理。
(哈哈,因为起名字的⼈也会考虑,为什么不叫代理,⽽是取名"正向"代理)。
反向代理是作⽤在服务器端的,是⼀个虚拟ip(VIP)。
对于⽤户的⼀个请求,会转发到多个后端处理器中的⼀台来处理该具体请求。
⼤型⽹站都有DNS(域名解析服务器),load balance(负载均衡器)等。
总结,nginx作为软件能⽀持反向代理,也就是说nginx可以作为负载均衡器。
(负载均衡器可以提⾼⽹站性能,⽀持更⾼并发请求)。
Nginx四个作⽤本⽂只针对Nginx在不加载第三⽅模块的情况能处理哪些事情,由于第三⽅模块太多所以也介绍不完。
Nginx能做什么——反向代理——负载均衡——HTTP服务器(动静分离)——正向代理以上就是我了解到的Nginx在不依赖第三⽅模块能处理的事情,下⾯详细说明每种功能怎么做。
反向代理反向代理应该是Nginx做的最多的⼀件事了。
反向代理(Reverse Proxy)⽅式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部⽹络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为⼀个反向代理服务器。
简单来说就是真实的服务器不能直接被外部⽹络访问,所以需要⼀台代理服务器,⽽代理服务器能被外部⽹络访问的同时⼜跟真实服务器在同⼀个⽹络环境,当然也可能是同⼀台服务器,端⼝不同⽽已。
下⾯贴上⼀段简单的实现反向代理的代码server {listen 80;server_name localhost;client_max_body_size 1024M;location / {proxy_pass http://localhost:8080;proxy_set_header Host $host:$server_port;}}保存配置⽂件后启动Nginx,这样当我们访问localhost的时候,就相当于访问localhost:8080了负载均衡负载均衡也是Nginx常⽤的⼀个功能,负载均衡其意思就是分摊到多个操作单元上进⾏执⾏,例如Web服务器、FTP服务器、企业关键应⽤服务器和其它关键任务服务器等,从⽽共同完成⼯作任务。
简单⽽⾔就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置⼀般都需要同时配置反向代理,通过反向代理跳转到负载均衡。
⽽Nginx⽬前⽀持⾃带3种负载均衡策略,还有2种常⽤的第三⽅策略。
深⼊浅出,结合实战,让你彻底搞懂Nginx(转)本⽂⾸先介绍 Nginx 的反向代理、负载均衡、动静分离和⾼可⽤的原理,随后详解 Nginx 的配置⽂件,最后通过实际案例实现 Nginx 反向代理和负载均衡的具体配置。
学会 Nginx ,⼀篇⾜够了。
1. 简介 Nginx 是开源的轻量级 Web 服务器、反向代理服务器,以及负载均衡器和 HTTP 缓存器。
其特点是⾼并发,⾼性能和低内存。
Nginx 专为性能优化⽽开发,性能是其最重要的考量,实现上⾮常注重效率,能经受⾼负载的考验,最⼤能⽀持 50000 个并发连接数。
Nginx 还⽀持热部署,它的使⽤特别容易,⼏乎可以做到 7x24 ⼩时不间断运⾏。
Nginx 的⽹站⽤户有:百度、淘宝、京东、腾讯、新浪、⽹易等。
2. 反向代理2.1 正向代理 Nginx 不仅可以做反向代理,实现负载均衡,还能⽤做正向代理来进⾏上⽹等功能。
2.2 反向代理 客户端对代理服务器是⽆感知的,客户端不需要做任何配置,⽤户只请求反向代理服务器,反向代理服务器选择⽬标服务器,获取数据后再返回给客户端。
反向代理服务器和⽬标服务器对外⽽⾔就是⼀个服务器,只是暴露的是代理服务器地址,⽽隐藏了真实服务器的IP地址。
3. 负载均衡 将原先请求集中到单个服务器上的情况改为增加服务器的数量,然后将请求分发到各个服务器上,将负载分发到不同的服务器,即负载均衡。
4. 动静分离 为了加快⽹站的解析速度,可以把静态页⾯和动态页⾯由不同的服务器来解析,加快解析速度,降低原来单个服务器的压⼒。
5. ⾼可⽤ 为了提⾼系统的可⽤性和容错能⼒,可以增加nginx服务器的数量,当主服务器发⽣故障或宕机,备份服务器可以⽴即充当主服务器进⾏不间断⼯作。
6. Nginx配置⽂件6.1 ⽂件结构 Nginx 配置⽂件由三部分组成。
... #全局块events { #events块...}http #http块{... #http全局块server #server块{... #server全局块location [PATTERN] #location块{...}location [PATTERN]{...}}server{...}... #http全局块}第⼀部分全局块 主要设置⼀些影响 nginx 服务器整体运⾏的配置指令。
nginx正向代理的案例摘要:1.Nginx 正向代理的概念和作用2.Nginx 正向代理的案例3.Nginx 正向代理的配置方法4.Nginx 正向代理的优点正文:一、Nginx 正向代理的概念和作用ginx 是一款广泛应用于Web 服务器的反向代理软件,其支持HTTP、HTTPS、FTP 等协议,可以有效地提高网站的性能和可靠性。
Nginx 正向代理是指客户端向代理服务器发起请求,代理服务器再将请求转发给目标服务器,然后将响应返回给客户端的过程。
通过Nginx 正向代理,可以实现负载均衡、安全性提升、访问控制等功能。
二、Nginx 正向代理的案例假设有一个位于内网的Web 服务器(例如:局域网内的一台服务器),在外网无法直接访问。
为了实现外网访问,可以在外网部署一个Nginx 服务器,将外网的请求代理到内网服务器上。
这样做有以下优点:1.隐藏内网服务器的真实IP 地址,提高安全性;2.负载均衡,可以根据实际情况调整代理服务器和目标服务器之间的请求分发;3.灵活的访问控制,可以通过Nginx 配置实现对不同请求的允许或拒绝。
三、Nginx 正向代理的配置方法以下是一个简单的Nginx 正向代理配置示例:1.首先,需要在Nginx 服务器上安装和配置SSL 证书(如果需要代理HTTPS 服务)。
2.创建一个代理配置文件,例如:/etc/nginx/proxy.conf,并设置以下内容:```http {proxy_pass http://内网服务器IP:端口号;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;proxy_connect_timeout 90;proxy_send_timeout 90;proxy_read_timeout 90;}```其中,`内网服务器IP`和`端口号`需要替换为实际的内网Web 服务器地址和端口。
nginx前后端调用原理标题,深入理解Nginx前后端调用原理。
Nginx是一个高性能的开源Web服务器,同时也可以作为反向代理服务器、负载均衡器和HTTP缓存服务器。
它的灵活性和高性能使得它成为许多网站和应用程序的首选。
在实际应用中,Nginx经常被用于与后端应用程序进行交互,以提供更好的性能和可靠性。
在Nginx中,前后端调用是通过一系列的请求和响应过程来实现的。
下面我们将深入探讨Nginx前后端调用的原理。
1. 反向代理。
Nginx可以作为反向代理服务器,将客户端的请求转发给后端的应用服务器。
当客户端发送请求时,请求首先到达Nginx服务器,然后Nginx会根据配置的规则将请求转发给后端的应用服务器。
这种方式可以隐藏后端服务器的真实IP地址,提高安全性,并且可以实现负载均衡和高可用性。
2. 负载均衡。
Nginx可以通过负载均衡模块来分发请求到多个后端服务器上,以实现更好的性能和可靠性。
负载均衡可以根据不同的算法(如轮询、IP哈希、最少连接等)来分配请求,从而避免单个服务器的过载,提高系统的整体性能。
3. 缓存。
Nginx还可以作为HTTP缓存服务器,缓存静态资源或动态页面,以减轻后端服务器的压力,加快页面加载速度。
当客户端请求静态资源时,Nginx可以直接返回缓存的内容,而不需要向后端服务器发起请求,从而提高了整体的响应速度。
总结。
通过以上的介绍,我们可以看到Nginx在前后端调用中发挥着重要的作用。
它不仅可以实现反向代理、负载均衡和缓存,还可以提高系统的性能和可靠性。
因此,深入理解Nginx前后端调用的原理对于构建高性能、高可用的Web应用是非常重要的。
希望本文能帮助读者更好地理解Nginx的工作原理,从而更好地应用它来构建稳定高效的Web应用。
nginx正向代理与反向代理详解⽬录正向代理nginx反向代理nginx反向代理02反向代理03反向代理04反向代理05反向代理06正向代理就是假设有⼀个内⽹内⽹有两台机器,这两台机器只有 a 可以上⽹b 不能上⽹,但是 a 和 b 通过⽹络相连接这时如果 b 想访问外⽹,就可以通过 a 来正向代理访问外⽹正向代理就是在内⽹中模拟⽬标服务器,把内⽹中其它机器的请求转发给外⽹中的真正的⽬标服务器所以正向代理是接受内⽹其它机器的请求的反向代理则是反过来也是⼀个内⽹,有⼏台机器,只有其中⼀台与外⽹连接但是反向代理接受的不是内⽹机器的访问请求反向代理接受的是外⽹过来的访问请求然后把请求转发到内⽹中的其它机器上去外⽹发出请求的⽤户并不知道反向代理的服务器把请求转发给了谁要在⼀台机器上设置正向代理的功能如图,编辑⼀个nginx配置⽂件上图就是配置⽂件内容如果配置⼀台服务器作为正向代理服务器那么这个虚拟主机配置⽂件就必须是默认虚拟主机因为所有访问这台机器的⽹络请求应该先访问这个虚拟主机才对所以这⾥要设置 default_server然后还要把原来的默认虚拟主机配置⽂件名称修改掉如图,把 default.conf 配置⽂件的名称修改⼀下这样就取消了原来的默认虚拟主机配置⽂件了因为默认的默认虚拟主机配置⽂件就是 default.conf配置⽂件⾥⾯的 resolver 119.29.29.29意思是配置⼀个 dns 地址因为是做正向代理,接受了内⽹请求的域名后要把请求发送给真正要访问的服务器但是内⽹发送的域名是没有包含 ip 地址的所以还要把域名发送给 dns 服务器解析 ip 地址拿到 ip地址后才能转发到要访问的服务器上去所以这⾥需要配置⼀个 dns 地址接受了内⽹域名后,就会把域名发送到这个 dns 上去解析下⾯的 location 按照图中设置就可以了这样正向代理服务器接受内⽹机器请求后就会把域名发到配置的dns上解析,然后访问真正的服务器再把真正服务器返回的内容发送给发出请求的内⽹机器nginx反向代理做⼀个反向代理的例⼦如图建⽴⼀个测试的虚拟主机配置⽂件监听 8080 端⼝,域名为 根⽬录是 /data/wwwroot/访问虚拟主机显⽰的⾸页⽂件是 index.html如图,创建虚拟主机的根⽬录 /data/wwwroot/然后使⽤ echo "_8080" > !$/index.html创建⼀个内容为 _8080 的⾸页⽂件这个⽂件在 /data/wwwroot/ ⽬录⾥⾯如图,新建⼀个反向代理的虚拟主机配置⽂件监听 80 端⼝,域名为 下⾯的 location / ⾥⾯就是反向代理的配置当访问这个虚拟主机的时候,就会把访问请求发送给 127.0.0.1:8080如图,使⽤ curl 访问 127.0.0.1:8080 虚拟主机成功返回了 _8080 这说明这个虚拟主机能够被访问如图,再创建⼀个虚拟主机配置⽂件跟之前的 test 虚拟主机差不多但是这个虚拟主机并没有设置域名location 设置返回的内容是 8080 default 字符串保存退出,重载 nginx还要把 test虚拟主机的 default server 设置取消掉那么现在 127.0.0.1:8080 对应两个虚拟主机⼀个是 test 虚拟主机,另外⼀个是 8080 default 虚拟主机这两个虚拟主机的 ip 端⼝都是⼀模⼀样的它们的区别是 test 虚拟主机是有域名的⽽ 8080 default 虚拟主机是没有域名的现在已经设置了 8080 default 为默认虚拟主机所以如果只访问 127.0.0.1:8080 的话访问的⼀定是 8080 default 虚拟主机如果想访问 test 虚拟主机,就需要加上 test 虚拟主机的域名才能成功访问 test 虚拟主机如图,可以看到访问 curl 127.0.0.1:8080/ 返回的结果是 8080 default使⽤ curl -x127.0.0.1:8080 这⾥带上了域名,返回的就是 _8080说明想访问 test 虚拟主机,ip端⼝还需要绑定域名才⾏如图,curl 访问 127.0.0.1:80 域名 返回的是 _8080 说明这个反向代理成功了我们访问的是 80 端⼝,实际却返回了 8080 端⼝的虚拟主机的内容如图,这⾥把反向代理虚拟主机⾥⾯的 proxy_pass ⾏下⾯的都注释掉保存退出,重载 nginx如图,再使⽤ curl 访问 127.0.0.1:80 域名 实际返回的却是 8080 default⽽我们想访问的却是 test 虚拟主机如图,proxy_set_header Host $host;这⼀⾏代码就是指定访问的域名上⾯设置了 127.0.0.1:8080反向代理的时候就会指向这个 ip端⼝如果不设置 host 那就只会访问 127.0.0.1:8080 的虚拟主机如果设置了 host ,那么就会指向跟指定的 host 绑定的 127.0.0.1:8080这⾥的 $host 是系统变量,实际的值就是当前的虚拟主机的 server_name 也就是 ,server_name 是什么,host的值就是什么这⾥设置了 host 就相当于 curl -x127.0.0.1:8080 如果这⾥不设置 host 那么就只会访问 127.0.0.1:8080这样就可以把域名跟 ip端⼝进⾏绑定如图,除了写 ip端⼝之外,proxy_pass 也可以直接写域名这⾥写的是 :8080/但是这样写的话, nginx 并不知道这个域名指向哪⾥所以还需要在系统⾥⾯绑定对应的 ip例如在 /etc/hosts ⽂件⾥⾯,写⼊对应的域名和 ip 进⾏绑定这样nginx ⾥⾯的 proxy_pass 的域名系统就会解析出⼀个 Ip 地址然后再访问这个 ip端⼝下⾯的 proxy_header Host 作⽤就是设置⼀个域名这个域名会与上⾯的 ip端⼝绑定访问如果上⾯的 ip端⼝写的不是 ip ⽽是域名跟下⾯指定的域名是不冲突的,因为上⾯写的域名的作⽤是⽤来解析ip的下⾯指定的域名才会跟上⾯解析出来的 ip端⼝进⾏绑定访问这个例⼦使⽤的是 $host 这是 nginx全局变量这个变量实际是对应了⼀个值的,就是当前虚拟主机 server_name 的值但是⼀般来说,还是直接写 ip 端⼝⽅便⼀些上⾯就是指定 ip端⼝下⾯指定跟 ip端⼝绑定的 host 域名nginx反向代理02如图,proxy_pass 指令后⾯可以跟 url有三种格式,传输协议+域名+uri (访问路径)传输协议+ip端⼝+uri传输协议+socket这⾥ unix ,http ,https 都是传输协议的种类域名+uri 和 ip端⼝+uri 还有 socket 都是访问的路径socket ⼀般是某个程序专⽤的访问端⼝访问某个socket就是访问某个特定的程序,所以不需要使⽤路径如图,写 proxy_pass 的时候,不同的写法有不同的结果⽐如 location /aming/如果访问的路径包含 /aming/ 就会触发这⾥的proxy_pass 就会执⾏但是location ⾥⾯的 proxy_pass 不同的写法会导致实际访问的路径有差别虽然因为访问的路径包含 /aming/ ⽬录才执⾏ proxy_pass但是实际访问的路径不⼀定包含 /aming/这个例⼦是访问虚拟主机内的 /aming/a.html ⽂件根据 proxy_pass 的不同写法实际上会访问到不同的路径去如果 ip端⼝后⾯没有接任何⽬录符号就会访问 /aming/a.html,这是我们想要的如果 ip端⼝后⾯接了根⽬录符号 /那么就会直接访问根⽬录⾥⾯的 a.html⽂件,这显然不对ip端⼝后⾯接 /linux/ 那么就会访问 /linux/ ⾥⾯的 a.html⽂件如果 ip端⼝后⾯是 /linux 最后没有跟⽬录符号 /就会访问 /linuxa.html所以如果想正确访问 /aming/a.html有两种写法,⼀种是 ip端⼝后⾯不要加任何⽬录符号 /第⼆种是完整的写成 ip端⼝/aming/ 这样写根据上⾯⽰例可以发现,ip端⼝后⾯不管是什么⽬录实际访问路径就会变成直接把最终要访问的⽂件名称 a.html直接添加到 ip端⼝后⾯的⽬录上去所以 ip端⼝后⾯不写任何⽬录符号的话,系统才会⾃⼰添加 /aming/a.html 这个⽬录路径⼀旦有任何⽬录符号存在,就会直接把 a.html 放在这个⽬录符号后⾯第⼆种情况是,ip端⼝+ /linux实际结果是访问 /linuxa.html这可能是因为 linux 后⾯没有跟上任何⽬录符号 /所以系统把 linux 认为是⼀个没有写完的⽂件名称然后就直接把 a.html 这个⽂件名称跟 linux 粘贴在⼀起这样就变成了要访问的⽂件是 /linuxa.html 的形式所以不管写什么路径,后⾯⼀定要跟上⽬录符号 /反向代理03如图,proxy_set_header 是设置被代理的服务器可以接收到的 header 信息的⽐如有三台电脑 a b ca 是我们⽤来访问的电脑,我们从 a 发出访问请求b 是反向代理服务器,b 接收我们发出的访问请求c 是被反向代理的服务器,也就是我们真正要访问的服务器b 会把我们的访问请求转发给 c如果不设置 proxy_set_header 的话,b 转发请求给 c 的时候就不会带上相应的 header 信息如果设置了这个参数,在转发请求的时候就会带上对应的 header 信息其中 $remote_addr 和 $proxy_add_x_forwarded_for 这两个变量是 nginx 的内置变量$remote_addr 变量⾥⾯保存的是 b 反向代理服务器本⾝的 ip 地址$proxy_add_x_forwarded_for 变量⾥⾯保存的是 a 客户端电脑的 ip 地址如果不设置这个变量的话,c 服务器实际上是不知道访问请求的真实来源地址的⽽设置了这个变量, c 服务器就可以知道这个访问请求是哪⼀个ip地址发过来的如图,编辑 虚拟主机的配置⽂件假设这个虚拟主机是我们要访问的 c 服务器location ⾥⾯设置了两个echo 显⽰访问请求的来源地址,和真实来源地址$remote_addr 记录了反向代理服务器的地址$proxy_add_x_forwarded_for 记录了访问请求的真实来源地址,也就是客户端的地址这样设置,访问这个虚拟主机的时候,就会显⽰这两个变量⾥⾯保存的值保存退出,然后重载配置⽂件如图,编辑反向代理服务器虚拟主机的配置⽂件如图,可以看到 location ⾥⾯proxy_set_header X-Real-IP 和 proxy_set_header X-Forwarded-For 这两⾏是被注释掉的先做个测试,保存退出重载配置⽂件如图,使⽤ curl 测试从 192.168.133.140:80 发出访问请求192.168.133.140 这个 ip 实际就是客户端 ip因为访问请求就是从这个 ip 发出来的但是可以看到,测试之后,实际显⽰的却是两个 127.0.0.1 的回环地址并没有 192.168.133.140 这个 ip在这个测试⾥⾯,反向代理服务器和真实服务器都在本机上⾯所以真实服务器 c 接收的访问请求来源 ip 就是本机的回环地址反向代理服务 b 发送请求给真实服务器 c ⾛的就是 127.0.0.1 的内部回环地址因为这两个服务器都在本机上,本机上的程序之间通讯基本都是⾛ 127.0.0.1 回环地址的所以 c 的 $remote_addr 的值就是 127.0.0.1因为反向代理服务器 b 没有设置 $proxy_add_x_forwarded_for所以真实服务器 c 的接收到的 $proxy_add_x_forwarded_for 变量值就是请求发送过来的 ip也就是 127.0.0.1$proxy_add_x_forwarded_for 这个变量实际上是记录了从客户端开始请求总共经过了哪些 ip 地址的⼀个变量值,多个 ip 地址之间使⽤逗号分隔如果发送的访问请求没有设置 $proxy_add_x_forwarded_for 这个变量的话那么接收⽅的这个变量的值就只是访问请求发送过来的上⼀个 ip , 也就是跟 remote_addr 相同⽐如访问请求从 a 到 b 到 c如果 b 设置了 $proxy_add_x_forwarded_for 的话那么这个变量的格式就是 a_ip, b_ip也就是记录了 a 的ip 和 b 的ip如果中间还经过更多的服务器的话,那么它们的 ip 也会被记录下来,使⽤逗号分隔当然每⼀台代理服务器都需要设置 $proxy_add_x_forwarded_for 这个变量才⾏不然下⼀台代理服务器的 $proxy_add_x_forwarded_for 这个变量将不会记录到之前经过的 ip 只能够记录到上⼀台服务器的 ip所以在这个测试⾥⾯,因为 b 没有设置 $proxy_add_x_forwarded_for所以 c 服务的 $proxy_add_x_forwarded_for 变量的值等于 $remote_addr 的值如图,第⼆次测试,编辑反向代理服务器 b 的配置⽂件把 location ⾥⾯的 X-Real-IP 和 X-Forwarded-For 两⾏注释去掉保存退出重载配置⽂件如图,再次测试可以看到返回的结果,第⼀⾏ remote_addr 的值是 127.0.0.1这是代理服务器 b 的 ip第⼆⾏ $proxy_add_x_forwarded_for 的值是两个 ipcurl 命令⾥⾯,访问请求是从 192.168.133.140 发出的也就是说,客户端 a 的 ip 就是 192.168.133.140b 的 ip 就是 127.0.0.1$proxy_add_x_forwarded_for 记录的是到达 c 的访问请求经过了哪些 ip访问请求是从 a 到 b 再从 b 到 c 的所以 $proxy_add_x_forwarded_for 变量记录了 a 的 ip 和 b 的 ip因为访问请求在到达 c 之前经过了这两个 ip 地址所以以后做反向代理的时候,这⼏⾏变量都要设置后⾯的真实服务器才能够获取到访问请求的真实 ip 地址反向代理04如图,redirect 应⽤的场景不多,主要有三种写法功能是修改被代理的服务器返回的 location 和 refresh 头域信息第⼀种写法,redirect 是返回的头域信息replacement 是要修改的信息redirect 会被修改为 replacement第⼆种写法是 default 就是默认设置的意思第三种 off 意思就是关闭 redirect功能如图,做⼀个测试,编辑代理服务器的配置⽂件要测试成功有⼏个条件要达成⾸先,location 后⾯只能是根⽬录 / 不能是加别的第⼆个条件是proxy_pass后⾯的 url 后⾯不能加 / 符号正常来说是要 / 结尾的,但是这⾥不能⽤ / 结尾然后访问的⽬录必须真实存在,如果不存在可以创建⼀个然后再⽬录⾥⾯也可以创建⼀个 index.html ⽂件,⾥⾯编辑⼀些字符串内容保存退出重载⼀下配置⽂件如图,编辑被代理服务器的配置⽂件写成如图所⽰的这种简单格式保存退出重载配置⽂件如图,curl 测试访问的时候,如果 aming 后⾯加了 / 结尾,那么就会访问到 index.html ⽂件但是我们要访问的是⽬录本⾝,并不是⾥⾯的某个⽂件所以 crul 的时候,访问的地址结尾不能加上 / 符号这样就可以访问到 aming ⽬录了可以看到,返回的代码是 301 表⽰永久重定向下⾯的 location 后⾯的字段,是带端⼝8080 的访问路径如图,编辑被代理服务器的配置⽂件添加 access_log /tmp/456.log这样就开启了服务器的访问⽇志,检查访问⽇志可以更清晰的了解访问过程保存退出重载如图,重新 curl 测试⼀次,这次测试 aming 结尾是带 / 符号的cat 查看 /tmp/456.log 访问⽇志发现⽇志信息没有 host 和端⼝等信息这种情况可以修改 nginx.conf 配置⽂件⾥⾯的 format 配置如图,配置⽂件⾥⾯ log_format main 这三⾏本来是被注释掉的现在把注释去掉,让这⼏⾏产⽣作⽤,这个就是⽇志返回信息的格式设置如图,在最后⾯添加两个nginx变量 $host $server_port 这两个变量然后保存退出重载⼀下,这样访问⽇志显⽰的信息⾥⾯,就会加上这两个变量的信息了如图,编辑代理服务器配置⽂件,同样添加 access_log 配置⽇志地址就是 /tmp/proxy.log后⾯加上 main 因为 nginx.conf ⾥⾯配置的格式是⽤ main 命名的这⾥加上main 表⽰使⽤ main 命名的格式来显⽰⽇志信息如图,同样被代理服务器⾥⾯的 access_log后⾯也需要加上 main表⽰使⽤ main 的格式显⽰⽇志信息保存退出重载⼀下如图,curl 测试⼀下,这次测试是⽤ / 符号结尾的查看 456.log 后端服务器的⽇志,可以看到,访问的是 8080 端⼝查看 proxy.log 代理服务器⽇志,可以看到,访问的是 80 端⼝⽹络代码都是 200 这样是正常的如图,这次访问 aming 结尾不带 / 符号可以看到返回的是 301查看 proxy.log 返回的也是 301如图,重新测试⼀下,再查看两个⽇志看到 301 再到 200 的⽇志信息总之确定了我们访问 80 端⼝,跳转到了 8080 端⼝但是客户端是访问不到 8080 端⼝的如图,解决这个问题可以使⽤ proxy_redirect这样写可以把本来返回的 8080 端⼝信息给去掉保存退出重载如图,重新测试可以看到,返回的是 301然后 location 后⾯的地址⾥⾯,也没有 8080 端⼝的信息存在了反向代理05proxy_buffering 是缓冲的意思缓冲就是在内存⾥⾯划⼀块区域,在⾥⾯写数据写到⼀定量的时候,才会把缓冲⾥⾯的数据写进硬盘中这样做的话,就可以⼤⼤减少硬盘的读写频率如果不做缓冲,每产⽣⼀次数据都要读写⼀次硬盘,对于硬盘的负担就会很⼤假设有三个对象,客户端 a 代理服务器 b 被代理服务器 ca 发出请求,b 接收请求,转发给 cc 返回数据给 b ,然后 b 再把数据发给 a这是⼀般的运作情况,但是如果 a 发出许多访问请求或者有很多个客户端发出访问请求那么对于代理服务器 b 和被代理服务器 c 来说每个请求都要按照这个流程处理⼀次,负担就会很重proxy_buffering 就是在代理服务器 b 的内存⾥⾯设置⼀个或多个缓冲区域当缓冲区域数据量满了的时候,才把数据转发给相应的客户端这样代理服务器 b 的数据转发次数就⼤⼤减少了,负担就下降了当 proxy_buffering 开启的时候,由 proxy_busy_buffer_size 来决定何时把数据发送给 a 在这个过程中,如果 buffer 区域被写满,有数据溢出多出来的数据会被写⼊到 temp_file 也就是⼀个临时⽂件中去,这个⽂件会存储在硬盘上如果 proxy_buffering 关闭的话,c 反馈的数据就直接由 b 转发给 a⽽不会有别的操作发⽣如图,不管 proxy_buffering 是 on 还是 off 的状态proxy_buffer_size 这个选项都是⽣效的,这个参数是⽤来设置⼀个 buffer这个 buffer 存储了服务器反馈的 header 信息如果设置不够⼤,存储不了 header 信息的话,会出现 502 错误码所以建议设置为 4k如图, proxy_buffers 是定义每个请求的缓冲区个数和每个缓冲区的具体⼤⼩这⾥定义了 8 4k 意思就是有 8个缓冲区,每个缓冲区的⼤⼩为 4k那么总缓冲区的⼤⼩就是 8*4 = 32 k假设有⼀万个请求,那么缓冲区就是 8 * 10000 个缓冲区了因为这个设置是针对每个请求来的,⽽不是总共只有 8 个缓冲区proxy_busy_buffer_size 定义的是达到多少数据量,就把数据传输给客户端这⾥定义的是 16k ,那么当 b 的属于这个请求的缓冲区接收到 16k 的数据量的时候就会把数据转发给 a这⾥缓冲区有 8 个,总共 32k 的⼤⼩,缓冲区⼀般来说处于两种状态⼀个是接收数据,⼀个是发送数据,并不能同时接收数据和发送数据proxy_busy_buffer_size 定义的就是发送数据的缓冲区的⼤⼩所以 proxy_busy_buffer_size 的⼤⼩要⽐缓冲区的总⼤⼩要⼩才⾏接收的数据达到 proxy_busy_buffer_size 设置的数据量的时候这些缓冲区就进⼊发送数据的状态,剩下的缓冲区则是接收数据的状态如果请求反馈的数据总量⼩于 proxy_busy_buffer_size 设置的值那么 b 接收完成就会直接转发为 a如果请求反馈的数据总量⼤于 proxy_busy_buffer_size 设置的值那么当缓冲区接收的数据量达到 proxy_busy_buffer_size设置的值的时候就会把这部分的数据先发送给 a如图,proxy_temp_path 定义的是临时⽂件存放⽬录举例,a 发出请求,b代理服务器分配给 a 这个请求的缓冲区总⼤⼩为 32k但是 c 服务对这个请求反馈的数据量为 100 MB 这么⼤,远远超过缓冲区的⼤⼩这种情况下, b 接收 c 的数据的过程中就会有很多数据溢出缓冲区这些溢出的数据会被先保存到 b 的硬盘上的临时⽂件⾥⾯去proxy_temp_path 定义的就是这个临时⽂件存放的路径,还有⼦⽬录层级这⾥定义的路径是 /usr/local/nginx/proxy_temp 这是⼀个⽬录名称临时⽂件就会存放到这个⽬录⾥⾯去后⾯的数字 1 2 表⽰⼦⽬录层级前⾯的⽬录路径是由我们⾃⼰定义的,⼦⽬录是系统⾃动创建的创建多少个⼦⽬录层级,可以通过后⾯的数字设置⽐如只写⼀个 1 就表⽰⼦⽬录只有⼀层,⼦⽬录的名称为 0-9 的命名⽅式根据定义,proxy_temp_path ⽀持三级⼦⽬录,也就是可以写 3 个数字⽐如写 1 ⼦⽬录数量和命名⽅式就是 0- 9 共10个如果写 2 就是 00-99 共100个,如果写 3 就是 000-999 共1000个⼦⽬录⼦⽬录名称也是根据这些数字来命名的如果写 1 3 就表⽰⼦⽬录分两层,第⼀层是 0-9 10个⼦⽬录第⼆层是 000-999 1000个⼦⽬录,也可以反过来写 3 1这样第⼀层就是 1000 个⼦⽬录,每个⽬录下⾯第⼆层⼜有 10 个⼦⽬录proxy_max_temp_file_size 定义的是临时⽂件的总⼤⼩⽐如这⾥设置为 100M 说明每个临时⽂件最⼤为 100M临时⽂件的数据如果传输完成,就会⾃动删除proxy_temp_file_write_size 定义的是同时写⼊临时⽂件数据量的总⼤⼩这⾥定义⼀个值⽐如 8k 或者 16k如果同时写⼊的数据量低于这个值,那么就增加同时写⼊的数据量如果⾼于这个值,那么就减少同时写⼊的数据量因为同时写⼊的数据量太⾼,对于硬盘 IO 负担太⼤,⽽太⼩则没有充分⽤到硬盘的性能所以设置⼀个值,既不会太快,也不会太慢,充分使⽤到硬盘的性能,⼜不会负担过重如图,这是⼀个使⽤ proxy_buffering 的例⼦⾸先是设置为 on 的状态,也就是打开 buffer 功能头⽂件存储的 buffer区域⼤⼩为 4k然后是其它数据的 buffer 区域为 2 个,每个⼤⼩为 4k然后是 busy_buffers 的数据量为 4kbuffer 接收的数据量达到 4k 时就会发送数据然后是临时⽂件存放的路径定义,定义了两层⼦⽬录分别是 1 2 也就是第⼀层有 0-9 10个⼦⽬录然后每个⼦⽬录下⾯第⼆层有 00-99 100个⼦⽬录然后是每个临时⽂件的⼤⼩为 20M然后是临时⽂件同时写⼊的数据量定义为 8k反向代理06如图,要使⽤ proxy_cache ⾸先要打开 proxy_buffering 功能proxy_cache 就是缓存功能客户端 a 发出请求,如果 a 请求的数据已经保存到代理服务器 b 的缓存⾥⾯的话那么 b 会把相关数据直接发送给 a ⽽不会去向服务器 c 请求数据如果不开启缓存功能,那么 a 的每⼀次请求,代理服务器 b 都会向服务器 c 请求获取⼀次数据如果 a 两次请求的数据是⼀样的,也会向服务器 c 请求两次数据开启缓存功能的话,第⼀次请求的数据已经被保存到缓存⾥⾯了,第⼆次如果请求同样的数据b 就会直接从缓存⾥⾯获取,⽽不会去向 c 获取数据,这样就减轻了服务器 c 的负担总结,缓冲可以减轻代理服务器b 的负担,缓存可以减轻被代理服务器 c 的负担如图,proxy_cache 功能的开启与关闭proxy_cache off 意思就是关闭缓存功能proxy_cache zone 就是开启缓存区,zone 就是缓存区的名称缓存区名称是可以任意命名的,可以是 zone 也可以是 123 等任意名称这⾥写⼀个缓存区名称就表⽰了开启⼀个以这个名称命名的缓存区从 nginx 0.7.66 版本开始,开启 proxy_cache 之后还会检测被代理服务器的 http 响应头中的 Cache-Control ,Expire 头域如果 cache-control 的值为 no-cache 时,那么这个请求的数据是不会被缓存的如图,curl -I ⼀个⽹站请求数据可以看到,返回的头⽂件信息,Cache-Control 后⾯的值⾥⾯存在 no-cache ,表⽰这个请求返回的数据是不会被缓存的如图,proxy_cache_bypass 这个参数是设置某种情况下请求的数据不从 cache 中获取,⽽是直接从后端服务器中获取这个参数后⾯的 string ⼀般为 nginx 的⼀些变量⽐如 proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;这样设置就表⽰,这三个变量的值,任意⼀个不为 0 或空的情况下响应数据就不会从 cache 中获取,⽽是直接从后端服务器获取暂时很少⽤到,了解⼀下即可如图,proxy_no_cache 跟上⾯的参数⽤法相似主要是设置某种情况下,获取的数据不进⾏缓存⽰例 proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;这样设置就表⽰,当后⾯这三个变量任意⼀项的值不为 0 或者空的时候获取的数据都不进⾏缓存如图,这个参数格式跟上⾯的参数差不多,⼀般不需要设置,保持默认就可以了如图,proxy_cache_path 是设置缓存区具体配置的参数缓存除了内存中的空间外,还可以在硬盘中划出⼀块空间来做缓存path 就是指定⼀个⽬录路径作为缓存路径,缓存会存放到这⾥⾯levels=1:2 这个表⽰⽬录层级,第⼀个数字设置的是第⼀层第⼆个数字设置的是第⼆层1 表⽰ 0-9 a-f 总共16个字符,每个⽬录由单个字符组成,⼀共16个⽬录2 表⽰ 0-9 a-f 总共16个字符,但是每个⽬录由两个字符组成,00,01,04,2f 之类的,有两百多种组合总之这个参数是设置⼦⽬录层级,第⼀个数字表⽰第⼀层第⼆个数字表⽰第⼆层keys_zone 是设置内存zone 的名称和⼤⼩keys_zone=my_zone:10m 就表⽰zone的名称叫做 my_zone然后 zone 的⼤⼩是 10MBinactive 是设置多长时间后,把缓存删除⽐如图中设置为 300s 意思就是,如果数据在 300秒内没有被访问过那么这个数据就会从缓存中删除max_size 是设置硬盘中的缓存最多可以存储多少数据⽐如这⾥设置为 5g ,上⾯设置的⽬录 /data/nginx_cache/这个硬盘上的⽬录,最多可以存放 5g 的数据,如果超过这个量系统就会先把访问量最少的数据删除,再放新的数据进去proxy_cache_path 这⾏代码不能写在配置⽂件的 server 括号内要写在 http 括号⾥⾯举例说明,⾸先编辑 nginx.conf 配置⽂件如图,在 server 的外⾯添加 proxy_cache_path 代码如图,因为指定的缓存⽬录 /data/nginx_cache/ 不存在,所以这⾥要创建⼀下如图,编译⼀个虚拟主机的配置⽂件,在location ⾥⾯添加 proxy_cache my_zone;这样这个虚拟主机接收请求的时候,就会使⽤ my_zone 这个缓存空间了⽽ my_zone 缓存空间的具体定义已经在 nginx.conf 配置⽂件⾥⾯作了定义nginx.conf ⾥⾯的配置内容对所有虚拟主机都是有效的所以在 nginx.conf ⾥⾯定义了 my_zone 的话那么在所有虚拟主机配置⽂件⾥⾯使⽤ proxy_cache my_zone这些虚拟主机就都可以使⽤到 my_zone 这个缓存空间然后保存退出重载配置⽂件就可以⽣效了平时使⽤,只需要添加这样两⾏代码就成功配置好缓存了如图,还有⼀个问题就是,nginx 服务本⾝的权限是 nobody刚才的⽬录是使⽤ root 权限创建的所以这⾥要把缓存⽬录的所有者所属组修改成 nobody这样nginx 服务操作这个⽬录的时候就不会有权限问题了如图,查看 /data/nginx_cache/ ⽬录内容可以看到 0-9 a-f 的第⼀级⽬录进⼊ 0 ⽬录内查看,可以看到由两位数构成的第⼆级⽬录总结,缓存空间配置主要就是定义 proxy_cache_path可以在 nignx.conf ⾥⾯定义,这样任何虚拟主机都可以使⽤到定义好 proxy_cache_path 后,在需要使⽤缓存的虚拟主机 server内配置 proxy_cache zone_namezone_name 就是 proxy_cache_path ⾥⾯定义好的缓存空间名称这样对应的虚拟主机就可以使⽤这个缓存空间了以上就是nginx正向代理与反向代理详解的详细内容,更多关于nginx正向代理与反向代理的资料请关注其它相关⽂章!。
正向代理和反向代理实际使用中的理解正向代理和反向代理是两种常见的代理服务器模式,它们在实现方式、功能和用途上有很大的不同。
下面我会用尽量简洁的语言为您解释这两者的区别和实际使用中的理解。
---**正向代理**正向代理,也称为客户端代理,是指位于客户端与目标服务器之间的代理服务器。
当客户端发出请求时,请求首先会发送到代理服务器,然后由代理服务器转发给目标服务器。
从客户端的角度看,所有的请求都直接发送给了代理服务器,而代理服务器则代替客户端与目标服务器进行通信。
实际使用中的理解:* **安全性**:正向代理可以作为一道防火墙,保护客户端的真实IP地址,增加匿名性。
* **缓存**:正向代理可以缓存常用的内容,减少对目标服务器的请求,提高访问速度。
* **负载均衡**:正向代理可以将请求分发到多个目标服务器,实现负载均衡。
* **内容过滤**:正向代理可以对请求的内容进行过滤,例如限制某些内容的访问。
**反向代理**反向代理,也称为服务器端代理,是指位于目标服务器和客户端之间的代理服务器。
当客户端发出请求时,请求首先会发送到反向代理服务器,然后由反向代理服务器转发给目标服务器。
与正向代理不同的是,客户端并不知道反向代理的存在,它只看到目标服务器响应。
实际使用中的理解:* **负载均衡**:反向代理可以接收来自多个客户端的请求,并将它们分发到多个目标服务器上,实现负载均衡和高可用性。
* **安全性**:反向代理可以保护目标服务器的真实IP地址,增加安全性。
* **缓存**:反向代理可以缓存来自目标服务器的响应,减少对目标服务器的请求,提高访问速度。
* **SSL加密**:反向代理可以为客户端和目标服务器之间的通信提供SSL 加密,保证数据的安全性。
1.1 Nginx简介
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。
由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。
其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、新浪、网易、腾讯等。
(源自百度百科)
1.2 负载均衡分发
负载均衡是nginx最流行最出名的功能,做为一款分发软件,nginx接收来自客户端的大量访问进行平均分发到后端的多个服务器进行处理。
单个nginx服务可支持过万的并发量,很好得解决了大量web类访问。
同时,通过nginx服务器可做到内网与外网的物理隔离。
标准组网如下:
1.2.1 安装
1.2.2 配置
默认安装的配置文件为:
/usr/local/nginx/conf下的nginx.conf文件编辑配置文件:
nginx.conf
1.3 反向代理
实际上负载均衡功能即是反向代理的应用,只不过负载均衡是代理多台服务器,更注重其均衡转发功能。
此处要特别说的是,通常情况下单一的反向代理功能主要应用于内网服务器通过nginx反向代理服务器(支持公网)去访问某一特定的站点。
例如内网服务器通过nginx外网转发去访问支付宝服务端以达到内网业务的第三方支付功能。
1.3.1 安装
1.3.2 配置
编辑配置文件:
nginx.conf
1.4 正向代理
正向代理主要应用于内网环境中只有某台特定服务器支持连接互联网,而其它同一局域网的服务器IP都不支持直接连接互联网,此时可以在支持连接公网的服务器配置nginx的正向代理,局域网内其它机器可通过此台服务器连接公网。
如图,服务器①的IP没有访问公网的权限,nginx服务器同时连接了内网和公网,则服务器①可通过nginx服务器访问公网。
1.4.1 安装nginx
1.4.2 配置nginx
编辑配置文件:
nginx.conf
1.4.3 配置客户机
配置好nginx服务器后,还需要在客户机(需要上网的机:服务器①)配置一条命令:
测试结果:。