代理:可以理解成代为我们去做某事,比如代为我们去请求服务端的资源
没有代理的情况:
客户端是直接访问服务端,服务端直接响应客户端的。
但是单台服务器有些时候是支撑不了海量的用户请求的,很容易造成服务器瘫痪的情况
有代理的情况:
客户端无法直接向服务端发起请求,而是需要一台代理服务器,来实现客户端与服务端之间的通信
正向代理与反向代理的区别在于服务的"对象"不⼀样
正向代理代理的对象是客户端(个⼈)
反向代理代理的对象是服务端(网站)
正向代理
正向代理作用在客户端,例如vpn,VPN是在我们客户端上配置的,不是在服务端配置的,客户端访问外网地址时,先访问VPN地址,VPN再将请求发到服务端,服务端的响应再按照原路返回给客户端
反向代理是作用在服务端的,反向代理会将用户的请求转发到后端的服务器集群当中的某一台服务器,该服务器处理完请求后,响应会按原路返回给客户端。
我们常用的是反向代理
nginx作为代理,可以支持的代理协议如下
用户 --->HTTP----------->Nginx---代理超文本传输协议----------->Http server
用户 --->HTTPS---------->Nginx---代理HTTP/HTTPS协议---------->Http server
用户 --->TCP------------>Nginx---代理TCP/UDP协议------------->TCP server
用户 --->websocket------>Nginx---代理http1.1长链接通讯协议---->Socket server
用户 --->GRPC----------->Nginx---代理go语言远程过程调用------->Grpc server
用户 --->POP/IMAP------->Nginx---代理邮件收发协议------------->Mail server
用户 --->RTMP----------->Nginx---代理流媒体、直播、点播------->Media server
常用反向代理模式与反向代理模块对应关系
反向代理示例:
服务端:192.168.51.163
代理:192.168.51.164
服务端配置
vim /etc/nginx/conf.d/www.test.com.conf
server{
listen 80;
server_name www.test.com;
root /html;
location / {
index index.html;
}
}
准备文件
echo 'this is reverse proxy test' >/html/index.html
代理端配置
vim /etc/nginx/conf.d/proxy.conf
server{
listen 80;
server_name www.test.com;
location / {
proxy_pass http://192.168.51.163; #将请求调度到服务端192.168.51.163处理
proxy_set_hrader Host $http_host; #告诉服务端192.168.51.163,客户端要请求服务端80端口的哪个域名
#如果这里不指定域名的话,将会返回服务端其他的页面
}
}
客户端配置
编辑hosts文件
...
192.168.51.164 www.test.com
...
查看结果
访问域名www.test.com的时候,走的是代理192.168.51.164,返回的内容是服务器192.168.51.163上的内容
请求和响应过程
客户端请求192.168.51.163 --请求–> 192.168.51.164-代为客户端请求后端的–> 192.168.51.163
192.168.51.163–>返回–> 192.168.51.164—>构建响应报文–>客户端
如果说将后端的监听在80端口修改为8080,不会影响到网站被请求的结果
在代理上设置两张网卡,一个内网一个外网,客户端到代理是外网,代理到服务器是内网
代理代为请求后端时,需要传递参数,以下是涉及到的一些参数
proxy_set_header Host $http_host;
#代理请求后端服务时,明确指定要请求的域名是什么
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
透传真实客户端IP地址给后端服务。不加的话服务端是看不到,客户端的地址的,加了以后就可以在日志中看到客户端的地址
proxy_http_version 1.1;
代理至服务端的http版本,让客户端到代理保持长链接
proxy_set_header Connection " ";
设置标头中的Connection参数,让代理到服务端也保持长链接,不设定的话参数是close
proxy_connect_timeout 30;
nginx代理与后端服务器建立连接超时时间
例如代理与后端服务器建立TCP连接所用的时间超过30秒,则表示连接超时(代理连接超时)
proxy_send_timeout 60;
nginx代理等待后端服务器响应的时间
例如代理将请求发送给后端服务器后,代理就开始等待后端服务器的响应,
如果超过60秒后,代理还没有得到后端服务器的响应,则表示响应超时
proxy_read_timeout 60;
后端服务器数据回传给nginx代理超时时间
例如后端服务器从开始回传数据给代理,到数据回传完毕,所用的时间超过60秒,择表示超时
proxy_next_upstream error timeout;(默认值是error timeout)一般建议把它直接加入代理的参数配置文件
用于指定在什么情况下Nginx会将请求转移到其他服务器上
例:proxy_next_upstream error timeout http_500 http_502 http_503;
(在遇到这些状态时,会将请求转移到其他服务器上)
error timeout#即与后端服务器建立连接,或向后端服务器发送请求,
或从后端服务器接收响应时,出现错误,会将请求转移到其他服务器上。
http_500 # 返回的状态码为500
http_502 # 返回的状态码为502
http_503 # 返回的状态码为503
http_504 # 返回的状态码为504
http_404 # 返回的状态码为404
当涉及到订单或者缴费的时候,建议把它关掉
proxy_next_upstream off;
因为客户端只发起了一次请求,避免因为负载均衡的重试操作,从而创建出来多个订单
代理缓冲区
启用代理缓冲区时,nginx代理服务将尽快的接收响应Header和响应报文,将他们分别存储到对应的缓冲区中
响应Header 存储到 proxy_buffer_size
响应报文存储到 proxy_buffers
开启buffer的话,服务端返回给代理的数据达到一定的量以后,代理再将数据返回给客户端,边收边传
不开启buffer 的话,服务端返回给代理一份数据,代理将数据直接返回给户端
例如我们收信件一样,攒够几份一块送给我们效率比一份一份的送给我们更加省事些
proxy_buffering on;
开启代理缓冲
proxy_buffer_size 64k;
设定缓冲区存储Header的⼤⼩。
proxy_buffers 4 64k;
设定缓冲区存储Data的⼤⼩。
设定响应缓冲区的 ‘数量’ 和 ‘大小’
所以日常不会使用这种将报文存入磁盘的操作。
代理的参数,通常会写到⼀个⽂件中,然后在location中使⽤include包含即可使用
1.编写代理参数文件
vim /etc/nginx/proxy_params
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 64k;
proxy_buffers 4 64k;
2.编写代理配置文件
server{
listen 80;
server_name www.test.com;
location / {
proxy_pass http://192.168.51.163;
include proxy_params; #将代理的参数配置文件包含进来
}
}
3.查看测试结果
可以正常访问www.test.com