一、代理是个什么玩意
生活中,就有许多代理的身份,有时候我们做一些事情不方便的时候,就会叫人帮忙,比如说代购,我去不了香港,不能叫别人帮我买吗,不好意思跟心上人告白,就需要找她闺蜜来间接告白,想买二手车,找不到卖家?来某子二手车直卖网,没有中间商赚差价。事情太多了做不完,把接到的需求分一些给下面的,赋权让手下的兄弟去做
上面的例子,其实都是代理,一个喜欢当中间商的孩子
二、代理的多种身份
一般来说,代理的身份主要有两种,正向代理和反向代理
2.1 正向代理
面向客户端的代理,怎么是面向客户端呢?就是服务于客户端的,我们主动设置的代理,比较好的例子就是威屁恩了,一般来说,如果我们想访问公司内网或者是外网,一般来说我们的ip会限制非同网段的通信,因为不在同一个网段或者是没有建立对应的网络桥梁 ,就好比说我们没办法直接去香港买东西,就会主动的找代购帮我们买,而且店家也不会管是谁买的,这种行为,更像是我们主动的,而且是可控的,并且对服务端是无感的。
(图片来源于网络)
2.2 反向代理
了解了正向代理,反向代理就很明了,就是唱反调的,反向代理是面向服务端的,也就是非客户端主动设置的代理,可以说是我们无感的,最常见的就是使用 nginx 负载均衡,组长一个人活干不过来,就把需求分解成多个小模块,然后叫下属去接手实现,产品才不管是谁做的,反正我是交给组长了,组长你自己做也行,给别人做也行,对我来说是无感的,我只要最后完成的功能,同理,一台机器抗不住这么大的并发,没办法只能叫帮手了,我就当个分配任务的孩子,不是美滋滋嘛,你需求尽管过来,反正代码不是我写。反向代理对客户端来说是无感的,因为它是服务于服务端的。
(图片来源于网络)
三、代理充当着什么样的角色
经过上面的介绍,你已经大致代理是个什么玩意了,那么代理究竟可以有多大的作用呢
一:匿名访问
二:通过代理上网
三:通过代理缓存,加快上网速度
四:儿童过滤器
五:访问其他网段的网络
我们说的代理,一般都是需要承担转发请求的任务,因此它也是一个服务器,被称之代理服务器,也是一个中间商,它在服务端和客户端之中,承担着通讯作用,这样可以隐藏服务器的真正位置,当然也可以隐藏客户端的真正身份,代理可以用来监控流量,监控请求,过滤请求,转发请求,有这么一个中间者,你可以发现是可以做许多的事情的
四、如何配置反向代理
说了这么多概念性的东西,也要说一下业务会用到的东西,威屁恩是没有什么好讲的,而反代的配置,确实我们后端开发必须学会的技能,下面讲两种反代的 nginx 配置,其实一般来说,在同一台机做反代是十分傻白甜的(测试的话就没关系啦)
1. 同一个机器配置配置局部路由反代
server {
listen 80;
server_name www.a.com;
access_log /data/logs/nginx/www.a.com.access.log main;
error_log /data/logs/nginx/www.a.com.error.log error;
root /data/projects/www.a.com/public;
index index.php index.html index.htm;
#根据路由来匹配转发
location /test/ {
proxy_pass http://www.b.com:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
}
}
server {
listen 8080;
server_name www.b.com;
access_log /data/logs/nginx/www.b.com.access.log main;
error_log /data/logs/nginx/www.b.com.error.log error;
root /data/projects/www.b.com/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
}
}
2. 不同机器配置局部路由反代
upstream OTHER {
server xxx.xxx.xxx.xxx:9241;
}
server {
listen 80;
server_name www.a.com;
access_log /data/logs/nginx/www.a.com.access.log main;
root /data/projects/www.a.com/public;
index index.php index.html index.htm;
location /test/ {
proxy_pass http://OTHER;
proxy_ignore_client_abort on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
}
}
之所以在同一台机器使用了不同端口的方式进行转发,这是因为同个域名(hosts)在同一个机器是无法同时在两个 vhosts配置文件存在的,会发生域名冲突,因为nginx也不晓得到底哪个vhosts才是你想用的