代理"用户"上网的叫做正向代理
代理"服务器"的叫做反向代理
反向代理介绍
代理服务器,客户机在发送请求时,不会直接发送给给目的主机,而是先发送给代理服务器,代理服务接受客户机请求之后,再向主机发出,并接收目的主机返回的数据,存放在代理服务器的硬盘中,再发送给客户机
应用场景
·堡垒机场景
·内网服务器发布场景
·缓存场景
堡垒机场景:
网络中存在的黑客会攻击业务服务器,盗取用户的数据。为了解决这个问题,可以将服务器放置在私网中,公网中的用户自然无法访问私网中的业务服务器,那怎么办呢?这时可以在业务服务器和用户之间的公网放置一个堡垒机,也就是代理服务器,用户访问的是堡垒机,堡垒机再将数据从业务服务器中取出交给用户,这样,业务服务器只接受源ip为堡垒机的来访问自己的80端口,这样黑客攻击的只是堡垒机,业务服务器不会丢数据,保证了安全。
发布内网服务器场景:
比如说我有一个公司,但是公司很穷逼,就只有一个公网IP。但是却有有很多服务需要发布,比如PHP、JAVA、Python等等,这样IP配给谁都不合适,这样在前面配置一个反向代理服务器,以虚拟主机的方式,配置若干个虚拟主机,也就是说用户访问不同的虚拟主机,就对应着不同的业务服务,用户访问JAVA的虚拟主机,代理服务器就来JAVA上拿数据,以此类推。这样就解决了公网IP不足的场景。
缓存功能环境:
网站分为静态和动态两种,在缓存服务器中存放所有的静态页面。用户访问静态页面,缓存服务器直接在内部拿数据,将页面返回给用户;用户访问动态页面,缓存服务器从业务服务器那里拿动态数据返回给用户。但是,这样有什么用?
当然有用 当用户请求一个页面,缓存服务器先立刻将静态页面返回,页面就开始渲染静态数据,当静态数据渲染的差不多,动态数据也过来,我们就可以看到整个页面。在这个过程中,之前假如一个页面加载需要5s,用户就需要傻傻的等待5s显示页面,但是现在在设置了缓存服务器的情况下,用户在访问页面敲下回车的一瞬间,页面就开始不断加载了。是你,你会选择哪种?
肯定是敲下回车的一瞬间页面就不断加载,在看第一个数据的时候,第二个、第三个、第四个数据源源不断的过来进行加载,用户体验会好很多。并且nginx处理静态数据很擅长。
再换个角度想想,动态数据和静态数据一般遵循二八原则,以前没有中间的缓存服务器,用户直接访问业务服务器,这样业务服务器压力会很大,缓存服务器的设置分担了业务服务器的压力,使得业务服务器只需要处理动态的数据即可。
反向代理原理
- 客户端通过浏览器 发送请求 代理服务器
- 代理服务器 接受请求
- 代理服务器 发送请求 业务服务器
- 业务服务器 接受请求
- 业务服务器 处理请求
- 业务服务器 响应请求 代理服务器
- 代理服务器 响应请求 客户端
- 客户端通过浏览器渲染请求并展示给用户
反向代理实现
首先,需要一台代理服务器和一台业务服务器
客户端 :windows主机
反代服务器: Nginx
业务服务器:http://180.101.49.12
要求:windows主机输入http://192.168.43.128可以访问得到http://180.101.49.12(百度)
操作:
1)找到nginx.conf中的Server
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
2)因为Server在这里起的是反向代理的作用,那就不需要再告诉用户根目录和索引页了
将根目录和索引页进行删除,添加上反向代理即可,如下
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://180.101.49.12;
}
测试:
在这里反向代理就应该结束了
但是。。。。。
再优化一下反向代理
比如说还有这样一个场景:
再堡垒机中,业务服务器与用户之间的交流都是经过中间的反向代理服务器,这样业务服务器只知道请求是从代理服务器来的,那么如果业务服务器也想知道反向代理服务器是替哪个用户来请求的数据,那么该怎么办呢?
在这种情况下,可以在反向代理的请求头中添加上特定的字段
这里有两种字段可以反馈用户IP:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
区别在于: 有的厂家基于第一个字段提取用户,有的厂家基于第二个字段来提取用户
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://180.101.49.12;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
下面列出常见的一些反向代理中会用到优化字段
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收
超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息
的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以
下的话,这样设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从
upstream服务器传