Nginx(12)反向代理

代理:代理(Proxy)也称网络代理。它是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。一些网关、路由器等网络设备具备网络代理功能。一般认为代理服务有助于保障网络终端的隐私或安全,防止攻击。代理通常分为正向代理、反向代理及透明代理

正向代理:正向代理是客户端向代理服务器发送请求,代理服务器再将请求转发给目标服务器,然后将目标服务器的响应返回给客户端。正向代理的主要作用是隐藏客户端的真实IP地址,保护客户端的隐私,同时也可以加速访问速度,减轻目标服务器的负载压力。正向代理常用于翻墙、科学上网等场景。

反向代理:反向代理是客户端向目标服务器发送请求,但是请求会先经过代理服务器,代理服务器会根据请求的内容和规则将请求转发给目标服务器,然后将目标服务器的响应返回给客户端。反向代理的主要作用是隐藏目标服务器的真实IP地址,保护服务器的安全,同时也可以实现负载均衡、缓存加速等功能。反向代理常用于网站、应用服务器等场景。

正向代理是代理服务器代表客户端访问目标服务器,反向代理是代理服务器代表目标服务器接收客户端的请求。两者的使用场景和功能不同,需要根据具体情况选择合适的代理方式。

透明代理服务器
目的和原理与正向代理服务器一致,但一般布署在网关上,用户不需要再对浏览器进行设置

反向代理(七层)

一、配置反向代理
nginx反向代理功能由ngx_http_proxy_module模块提供

location / {
proxy_pass http://192.168.10.12;
}
以上配置将所有的访问请求代理到后端服务器 http://192.168.10.12 上
当我们配置好反向代理后,使用客户端访问代理服务器,将能获取后端真实服务器的内容

二、真实IP
1. 配置代理服务器将客户端 IP 传递给后端服务器
查看后端服务器的访问日志,我们发现日志中记录的客户端 IP 并非真实客户端的 IP,而是代理服务器的 IP 。
之所以会这样,原因是客户端向代理服务器发起请求后,再由代理服务器向后端服务器发起请求。
站在后端服务器的角度,代理服务器才是直接通信的“客户端”,所以记录的是代理服务器的 IP,显然,记录这个 IP 是没有意义的。

由于后端服务器和客户端并没有直接的通信,所以客户端的真实 IP 只能通过代理服务器传递给后端服务器。
我们可以在代理服务器上将客户端的 IP 封装到请求报文中发送给后端服务器。
示例:
在代理服务器上配置:

location / {
proxy_pass http://webs;
proxy_set_header   X-Real-IP    $remote_addr; # 将 $remote_addr 的值封装到请求报文头部的 X-Real-IP 字段中  proxy_set_header  定义请求头
}

做了以上配置后,再次用客户端访问代理服务器,在后端服务器上抓包,可以看到请求头部有了 X-Real-IP 字段,它的值正是客户端真实 IP

2. 配置后端 web 服务器记录下客户端真实 IP
虽然经过以上第1步配置,代理能够将客户端真实 IP 传递过来了,但默认情况下后端服务器并不会在日志中记录请求头部 X-Real-IP 字段的值。
2-1、后端服务器为 apache 产品
对于 apache 产品,只需修改配置文件中的 LogFormat 即可:
LogFormat "%{X-Real-ip}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

2-2、后端为 nginx
如果后端为nginx,有两种方法可实现:
A、直接修改 log_format ,将 $remote_addr 改为 $http_x_real_ip 即可

B、安装 real_ip 模块(ngx_http_realip_module),然后修改配置文件:
...
location / {
root html;
index index.html index.htm;
set_real_ip_from 代理服务器IP;
real_ip_header X-Real-IP;
}
...
这样配置后,$remote_addr 的值将会从请求报文中的 X-Real-IP 字段中获取。

一、ngx_http_proxy_module模块的 proxy_pass 指令
proxy_pass是反向代理最核心的指令。代理时,后面如果有路径,将替换location部分;否则,将所有路径拼接到后面。
例:访问URL:http://192.168.10.11/static/index.html
配置1:
location /static/ {
proxy_pass http://192.168.10.12; # 后面不接任何路径,所有URL路径将被拼接到后面
}
将被代理到:http://192.168.10.12/static/index.html
配置2:
location /static/ {
proxy_pass http://192.168.10.12/;
}
将被代理到:http://192.168.10.12/index.html
配置3:
location /static/ {
proxy_pass http://192.168.10.12/abc;
}
将被代理到:http://192.168.10.12/abcindex.html
配置4:
location /static/ {
proxy_pass http://192.168.10.12/abc/;
}
将被代理到:http://192.168.10.12/abc/index.html
总结
- 当proxy_pass指令后面不带URI时,将把所有的原始URI拼接到代理后的服务器上;
- 当proxy_pass指令后面带URI时,将替换掉匹配的URI;
- 当使用正则匹配时,proxy_pass指令后面不应带URI。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值