代理服务器可分为正向代理服务器和反向代理服务器。
正向代理
正向代理服务器是一个位于客户端与原服务器之间的服务器。为了从原服务器中获得数据,客户端向代理服务器发送请求并指定目标,然后代理服务器向原始服务器转交请求,并将获得的内容返回客户端。比如我们使用代理科学上网。
正向代理服务器一般作用在客户端,并且在客户端需要进行相关配置。
反向代理
反向代理服务器作用在服务端,它在服务器端接收互联网中的连接请求,然后将请求转发给内部网络中的服务器,并将从服务器中得到的结果返回给互联网中请求连接的客户端。
反向代理对外是透明的,在客户端不需要任何配置,所以访问者并不知道自己访问的是一个反向代理服务器。
正向代理实验
实验说明
实验的网络图如下所示:
基于 Nginx 的内置变量 $remote_addr
查看访问者IP。在两台服务器上修改原有的log_format。
log_format main 'client send request=> clientIP=$remote_addr serverIP=$host';
未使用正向代理服务器之前,客户端直接访问服务器,日志中记录了访问者的 IP 为客户端 IP 。
client send request=> clientIP=192.168.233.1 serverIP=192.168.233.130
client send request=> clientIP=192.168.233.1 serverIP=192.168.233.130
实现正向代理
正向代理服务器上的配置如下:
resolver 8.8.8.8;# 设置DNS的IP 用来解析 proxy_pass 中的域名
location / {
proxy_pass http://$host$request_uri;
}
客户端需要配置我们的正向代理服务器地址。就像我们科学上网时需要配置VPN一样。步骤如下:
现在我们直接访问目标服务器,查看访问日志可以发现此时的客户端IP不是原来的客户端IP了,而是正向代理服务器的IP。
client send request=> clientIP=192.168.233.131 serverIP=192.168.233.130
client send request=> clientIP=192.168.233.131 serverIP=192.168.233.130
client send request=> clientIP=192.168.233.131 serverIP=192.168.233.130
反向代理实验
实验说明
实验网络拓扑图和正向代理的差不多,只是中间的服务器变为了反向代理服务器而已。
深入反向代理
Nginx 的反向代理模块的指令是由 ngx_http_proxy_module
模块进行解析的,该模块是默认安装的。反向代理中的常用指令有: proxy_pass
、proxy_set_header
和proxy_redirect
。
proxy_pass
该指令用来设置被代理服务器地址,可以是主机名称、IP地址加端口号的形式。
语法: proxy_pass URL; # URL包含传输协议、主机名称或IP地址加端口号、URI等要素
默认: —
上下文: location
反向代理服务器上的配置如下:
location / {
proxy_pass http://192.168.233.130;
}
与正向代理实验不同,我们需要访问反向代理服务器,可以发现最后居然展示的是目标服务器的页面。
请问如下两种
proxy_pass
配置有什么区别呢?proxy_pass http://192.168.233.130;
proxy_pass http://192.168.233.130/;
表面上看只是结尾是否加 '/' 的区别,但是这里有一个小坑。若 proxy_pass
所在的 location
是 /
,万事大吉,相安无事!可是,如果 location
后的路径加上了其他玩意,完了,区别大大的。如下配置所示:
# 不加/
location /test {
proxy_pass http://192.168.233.130;
}
# 加上/
location /test {
proxy_pass http://192.168.233.130/;
}
使用前者配置直接 404 Not Found
, 尴尬。后者配置没毛病!
/
,location后的路径会直接拼接上,加上/
则不拼接。
proxy_set_header
顾名思义,该指令可以更改Nginx服务器接收到的客户端请求的请求头信息,然后将新的请求投发送给代理的服务器。
语法: proxy_set_header field value;
默认: proxy_set_header Host $proxy_host
proxy_set_header Connection close;
上下文: http, server, location
被代理服务器(131)配置如下:
server {
listen 8080;
server_name localhost;
default_type text/plain;
return 200 $http_username;# 返回传递过来的username
}
反向代理服务器(130)配置如下:
server {
listen 8080;
location / {
proxy_pass http://192.168.233.131:8080/;
proxy_set_header username CatWing;
}
}
proxy_redirect
该指令用来重置头信息中的"Location"和"Refresh"的值。
语法: proxy_redirect redirect replacement;
proxy_redirect default;
proxy_redirect off;
默认: proxy_redirect default;
上下文: http, server, location
被代理服务器(131)配置如下:
server {
listen 8081;
server_name localhost;
#if (!-f $request_filename){
# return 302 http://192.168.233.131/;
#}
location / {
root /usr/local/nginx/html;
index index.html index.htm;
if (!-f $request_filename){ # 如果访问路径不存在,跳转到欢迎页
return 302 http://192.168.233.131/;
}
}
}
反向代理服务器(130)配置如下:
server {
listen 8081;
server_name localhost;
location / {
proxy_pass http://192.168.233.131:8081/;
}
}
访问如下地址:http://192.168.233.130:8081/abc.html
(此路径不存在)。页面没有展示404 Not Found,似乎已经达到了我们的需求,可是,目标服务器的地址却暴露了,这可不是我们希望的。
通过curl
命令可以发现请求头中的Location
为131, 借助proxy_redirect
可以将其修改。修改反向代理服务器配置如下:
server {
listen 8081;
server_name localhost;
location / {
proxy_pass http://192.168.233.131:8081/;
proxy_redirect http://192.168.233.131 http://192.168.233.130;
}
}
额!地址是变化了,可是欢迎页不是目标服务器的呀!还需要配置一个反向代理。
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://192.168.233.131/;
}
}
版权属于:带翅膀的猫
本文链接:https://www.chengpengper.cn/archives/138/
转载时须注明出处及本声明
看的我热血沸腾啊www.jiwenlaw.com