代理的概念
代理,也就请人帮自己做一件事。生活中,代理的情况其实非常常见,比如:
- 房屋中介
- 微商
- 科学上网代理
- 黄牛
接下来,我们就以房屋中介为例,介绍一下代理的概念。
第一种形式,直接联系房东。
按照最直观的思路,我们要租房,当然要去找房东。直接联系到房东,找到我们想要的房屋资源。
这样做自然对用户来说很方便,可以直接联系到房东,不会有中间商赚差价。而且可以直接联系房东,能做的事情就多了。
但是对于房东来说,就不太喜欢这样了。首先,如果房子已经租出去了,就不希望在有人来打扰。但还会有很多人看着广告来向房东询问房屋信息。房东会不胜其烦。而且,一旦房子出了点什么问题,房客首先来找的当然是也只能是房东。这会让房东陷在租房过程中,无法抽身去做其他事,或者为更多人服务。
对于 web 请求来说,也是如此。这种方式就是浏览器直接访问服务器的 django 进程。django 不光处理租房子,也就是动态请求,其他的日常琐事,也就是静态文件也要由 django 处理。后台 django 的压力就很大,就会很吃资源,而且服务的效果也不好。这种方式,就是没有代理的 web 服务模式。
1 | 老王想租房 ----> 直接找到房东,找到我想要的资源 ---> 没有任何性能丢失,很好 |
第二种形式,联系中介租房
这次房东将房子托管给中介,委托中介帮忙把房子租出去。房客如果想租房,没办法直接联系到房东。无奈,他只好找中介帮忙。中介找到房东的房屋信息,按照约定的价格租给房客。
具体的流程是这样的:
1 | 请求过程 |
这样做的好处是,房东只需提供住房,不再需要为其他的事情操心。
此时此刻,中介在用户的眼里,就是一个服务器(房东)。
类似地,对于 web 请求,浏览器不直接访问到后端的 django。而是先由 nginx 处理请求,若是静态文件,则直接返回给浏览器,若是需要读取数据库的动态请求,方才将请求转发给后端的 django,django 通过 pymysql 读取数据。处理好数据后,django 将处理好的请求返回给 nginx,再传给浏览器。在浏览器眼里,nginx 就是服务端。
1 | 反向代理的网站部署中的应用 |
正向代理和反向代理
上面谈到的通过中介租房的代理形式,以及将请求通过 nginx 转发的代理形式,都是一种反向代理。
反向代理,代理的是服务端。
在用户眼里,中介就如同房东;在浏览器眼里,nginx 就是是服务端了,其实请求还是要转发给 django 的。
至于正向代理,代理的是客户端。
一个常见的例子是 vpn 连接。
比如我在北京,但是访问不了国外的某些网站。
但如果我在日本,是可以访问到这些网站的。
那么如果我在北京,伪装成日本的身份,去访问国外网站。在国外网站的服务器眼里,请求是来自于日本的,而不是北京 ,就允许我们进行访问。
这时在服务器看来,客户端是日本的代理服务器,而不是我们。
总而言之,正向代理,代理的是客户端;反向代理,代理的是服务端。
正、反向代理的图解
nginx 的反向代理配置
反向代理,也就是请求转发。代理服务器将浏览器发出的请求转发给资源服务器。用户通过访问代理服务器,获取到资源服务器的内容。
环境准备
首先,需要准备 2 台 Linux 虚拟机(在 VMware 里安装 2 个 Linux机器),一台作为代理服务器,一台作为资源服务器:
1 | 机器1的ip :192.168.248.128 (中介代理)(nginx,配置代理功能) |
按道理讲,资源服务器应该部署的是 django 项目。但是为了方便起见,就先用 nginx 作演示了:
中介,代理服务器配置
首先配置中介代理,128 服务器。最先要安装一个 nginx:
1
yum install nginx -y
通过 yum 安装的 nginx,配置文件路径自动的生成在了这:
1
vim /etc/nginx/nginx.conf
找到第一个 server{} 标签,修改配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
# 当请求是192.168.248.128,也就是代理服务器的时候,进入这个location路径匹配
location / {
# proxy_pass 默认会替换掉这两个请求头,需要这么设置替换回去
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 请求通过proxy_pass参数,转发给资源服务器,也就是129那台机器
proxy_pass http://192.168.248.129;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}改完
nginx.conf
之后,保存退出,启动或平滑重启 nginx:1
2
3nginx
若nginx已经启动,则需要平滑重启
nginx -s reload
房东,资源服务器配置
还是要安装配置好 nginx。
修改 nginx.conf,返回一个页面,测试使用(其实啥也不用动,直接用默认就好):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#access_log "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G" main;
location / {
root html;
index index.html index.htm;
}
error_page 404 /40x.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}因为改了配置文件,所以需要平滑重启 nginx:
1
nginx -s reload
创建首页内容:
1
echo "<meta charset='utf8'>我是资源服务器 192.168.248.129" > /opt/tengine23/html/index.html
客户端访问代理服务器
在浏览器中输入代理服务器的 IP,就可以访问到资源服务器了。