Py008-10-06反向代理

反向代理介绍

客户机发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务客户机请求之后,再向主机发出,并接收目的主机返回的数据,存放在代理服务器的硬盘中,再发送给客户端。

正向代理

1
代替用户上网,如长城宽带有很多代理服务器,你访问新浪的时候就会把这个内容缓存到代理服务器上,下次再有用户访问新浪的时候就不用直接去新浪了,直接去代理服务器

反向代理

1
2
3
4
5
6
7
代理服务器,就是把服务器发布出去。

如:买车 的4S店 它就是厂家的代理
你 ------> 4s店 ------> 汽车厂家

在以前没有4S店,你就只能去厂家下单提车,
如果有4S店,去4S店发起购买请求,然后下单,等待4S店把车拿来。

反向代理的好处

就4S店的例子

  • 对我们来说:4S店 让我们买车更方便,在家门口,而且不用应对海量用户。同时也是一个问题收集窗口(出了问题你肯定去4S店闹,不会去厂家)
  • 对厂家来说:可以专心生产汽车

应用场景

堡垒机场景

前段时间,汉某酒店的住户数据被盗了,用户数据泄漏

1
2
3
4
5
6
7
客户端--------> 反向代理服务器(公网)(堡垒机)-------->业务服务器(私网)


业务服务器:安全配置只接受来自堡垒机的链接访问,其他拒绝(客户端公网无法访问私网服务器)
只接收堡垒机ip和xx端口的访问

堡垒机:没有数据。防止拖库

内网服务器发布场景(就一个公网ip)

适用于公网IP地址不足的场景

1
2
3
4
            (虚拟主机的方式配置三个代理)
客户端--------> 反向代理服务器(公网)-------->业务服务器(私网) Php
|---------------> 业务服务器(私网) Java
|---------------> 业务服务器(私网) Python

缓存场景

1
2
3
4
5
6
7
客户端--------> 缓存服务器(公网)(缓存静态服务器)-------->业务服务器(私网)

静态数据直接从缓存服务器拿
动态数据从业务服务器拿

当用户访问一个网站时,就会瞬间得到静态数据,这个时候网站已经开始渲染了
动态数据可能过来慢一点,当渲染完静态数据时,动态数据也过来了。这个时候你就看到整个页面了
  • 一个页面你选择5s后一次返回结果
  • 还是你访问的时候数据不断的开始展示。(更好的用户体验,减小业务服务器压力)

反向代理原理

  1. 客户端通过浏览器器 发起请求 代理理服务器器
  2. 代理理服务器器 接受请求
  3. 代理理服务器器 发起请求 业务服务器器
  4. 业务服务器器 接受请求
  5. 业务服务器器 处理理请求
  6. 业务服务器器 响应请求 代理理服务器器
  7. 代理理服务器器 响应请求 客户端
  8. 客户端通过浏览器器渲染请求并展示给⽤用户

反向代理实践

1
2
3
4
5
client mac

反向代理 nginx

业务机器 book.ayitula.com http://118.190.209.153:4000/

前提保证你的nginx能上网,不然代理是不行的

  • proxy_pass配置 你的代理地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cd /usr/local/nginx/conf

# 备份配置
cp nginx.conf nginx.conf.2
cp nginx.conf.default nginx.conf

# 修改配置文件
vi nginx.conf

location / {
# 代理的ip地址
proxy_pass http://118.190.209.153:4000/;
}


# 杀掉nginx进程
killall nginx
# 重启nginx
/usr/local/nginx/sbin/nginx

# 访问你的服务器ip就ok了

优化反向代理的配置

proxy_set_header设置请求头

  • 你访问代理的时候所有请求信息都在 代理服务器,对于代理服务器的日志它能知道谁访问了它
  • 但是对于 业务服务来说,只知道是代理服务器访问了,如果想知道 客户端是谁就要设置请求头 来告诉业务服务器是谁拿的数据
1
2
3
4
5
6
设置
proxy_set_header X-Real-IP
proxy_set_header X-Forwarded-For
是因为不同厂家 设置的头不一样
有的针对 X-Real-IP 有的针对 X-Forwarded-For 提取用户
都加上就能满足所有需求

####

1
2
3
4
5
6
7
8
9
10
11
12
13
14
location / {
index index.php index.html index.htm; #定义⾸首⻚页索引⽂文件的名称
proxy_pass http://mysvr ;#请求转向mysvr 定义的服务器器列列表 proxy_set_header Host $host;
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跟后端服务器器连接超时时间(代理理连接超时)
#后端服务器器数据回传时间(代理理发送超时) #连接成功后,后端服务器器响应时间(代理理接收超时) #设置代理理服务器器(nginx)保存⽤用户头信息的缓冲区⼤大⼩小
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k; #⾼高负荷下缓冲⼤大⼩小(proxy_buffers*2) proxy_temp_file_write_size 64k; #设定缓存⽂文件夹⼤大⼩小,⼤大于这个值,将从upstream服务器器传
}