正向代理
部署正向代理
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
proxy_pass http://20.0.0.60:8080; #配置代理地址
}
location ~ \.(gif|jpg|jepg|png|bmp|ico)$ {
root html;
expires 1d;
web服务器:
server {
listen 8080; #改监听地址
server_name www.nginx.com;
index index.html index.htm;
root html;
#charset koi8-r;
access_log logs/host.access.log main;
location ~ .*\.(jpg|gif|png)$ {
root html;
}
正向代理和反向代理的区别
正向代理:
正向代理是面向客户端的。客户端想要访问一个web服务器,但是客户端的ip被web服务器禁止访问了,
这个时候就可以通过代理服务器,客户端通过代理服务器去访问web服务器,
web服务器只会知道是代理服务器的ip访问的它,而不知道是客户端
是位于客户端和目标服务器之间的服务器,目的就是为了从目标服务器取得内容,客户端向代理发送一个请求并指定目标服务器,代理服务器和客户端处于同一个局域网内。
例如:现在有台代理服务器,我要访问百度,于是我就让代理服务器帮我转发
反向代理:
客户端直接访问代理服务器,作用就是分担服务器的负载,提高系统的可用性和稳定性。
运行方式:是代理服务器接受网络上的连接请求。它将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给网络上请求连接的客户端 。代理服务器和目标服务器处于同一个局域网内。
例如:需要访问taobao买东西,不需要知道图片上展示的东西是不是同一个服务器返回数据,是反向代理处理的,我不知道目标服务器
反向代理两种模式
配置语法
upstream 模块:upstream 模块的配置块位于 http 块内,用于配置反向代理和负载均衡的后端服务器列表,
以及相关的负载均衡算法和参数。
stream 模块:stream 模块的配置块位于 stream 块内,用于配置 TCP 和 UDP 流量的代理、
负载均衡和路由规则等。
upstream 模块用于处理 HTTP 流量,主要用于反向代理和负载均衡;
stream 模块用于处理 TCP 和 UDP 流量,可用于构建 TCP/UDP 代理和负载均衡器。
针对不同的流量类型提供了特定的功能和配置方式
七层反向代理
七层代理是最常用的反向代理方式,代理的是http的请求和响应,只能配置在Nginx配置文件中的http模块
而且配置的方法名称:upstream模块,不能写在server中,也不能写在loaction中,在http中是一个独立的配置
七层代理工作原理
客户端---------->http请求-------->七层代理的服务器上--------->代理服务器转发htp请求到内部的一组服务器(web集群)
(客户端不知道请求的是代理服务器的内部服务区,而且通过代理服务器隐藏了内部服务器的IP
实际上访问的是代理的服务器,请求到代理,代理转发给web服务器,web服务器响应的)
部署七层反向代理
基于七层的http/https/mail等应用协议的代理
他是在http模块里面添加以upstream模块,在upstream里面定义服务器组名称,添加ip,端口号,权重(如果不添加的话,默认是1),可以在添加一个调度算法。并在http模块里面添加server模块,在里面用location来匹配URL路径,定义proxy_pass http://服务器组名称,用来将以。。。为结尾的请求转发给tomcat服务器集群。并且后端服务器需要获取真实的客户端的ip地址。
http{
upstream 服务器组名称{
server IP1:PORT [weight=1 ...];
server IP2:PORT;
..........
调度算法(rr轮询/加权轮询,least_conn最小连接,ip_hash,url_hash,faire);
}
server {
location ~ ...{
#将以***为结尾的请求转发给tomcat服务器集群
proxy_pass http://服务器组名称;
#用于后端服务器获取真实的客户端ip地址
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
四层反向代理
四层代理:四层代理是基于tco/ip协议层的代理的转发方式,可以实现基于ip地址和端口进行负载均衡转发
特点:四层代理无法获取http请求当中的URL信息,只能对tcp/udp数据包进行转发(实际就是流量转发)
配置方法的名称:stream
stream 不可以配置在http模块,配置在全局模块当中,是属于一个独立的模块,不属于其他任何的模块
部署四层反向代理
基于四层的ip+tcp/upd端口的代理
他是http块同一级,一般配置在http块上面。
他是需要用到stream模块的,一般四层里面没有自带,需要编译安装一下。并在stream模块里面添加upstream +服务器名称,添加ip地址及端口号。定义server模块,里面添加listen 监听端口号,server_name 网站主机名,proxy_pass 服务器组名称。
stream{
upstream fuwu服务器名称{
server IP1:PORT;
server IP2:PORT;
server IP3:PORT;
........
}
server{
listen 监听端口;
server_name 网站主机名;
proxy_pass 服务器组名称;
}
}
四层代理和七层代理的区别(面试题)
1.七层走的是http请求 四层是tcp/udp的数据包,转发的流量
七层代理:http请求,可以对请求进行深入的解析和处理,流量控制,内容是guolv
四层代理:不可以进行流量控制,也无法对内容进行过滤
七层主要对请求进行精准的处理和控制场景
四层代理主要处理需要大量连接请求的场景
所以在工作中四层可以和七层可以配合使用
2.四层的速度比七层代理的速度快?
四层只是流量转发,不可以对请求进行解析和控制
四层代理走的是内核,内核转发的流量,所以速度快
七层代理要对请求进行处理和解析,所以速度比较慢
七层代理走的是用户态,访问控制,流量处理,所以速度比较慢
所以七层代理可以提供更高级的服务和更好的用户体验
正向代理
proxy_pass配置代理服务器访问的地址,只能写在location模块当中
反向代理
客户端访问代理服务器,代理服务器转发请求或者流量到后端服务器,后端的的web服务器会有多台,
用户并不知道最终访问的是哪一台服务器
upstream:基于http请求实现负载均衡
特点:1.http请求的负载均衡方式
2.没有缓存,所以这个时候就需要负载均衡的算法
负载均衡的算法
1.默认算法(轮询算法 rr)
轮询算法把请求轮流分配给后端服务器,轮询算法使用与web服务器处理能力相近的情况,默认算法,可以不加
2.加权轮询
建立在轮询算法的基础之上,通过给不同的web服务器不同的权重,让处理能力更强的服务器分配到更多的请求,
虽然配置的权重值,但是轮询的结果未必准确
weight:权重 配置的后端服务器权重越高,轮询的次数就会越多
3.ip_hash
根据ip地址计算哈希值,使用ip_hash算法,同一个客户端的请求会被分配到同一个后端服务器,保证会话的稳定性
但是如果后端服务器的数量发生变化,那么hash值就会被重新计算,那么请求的服务器也会发生变化
4.最少连接数 least_conn;
轮询,请求发送到当前连接数最小的web服务器,
主要适用于后端服务器耗时不同的情况,避免所有的请求集中在处理能力更强的后端服务器上,会和加权轮询配合使用
5.url_hash;
根据uri的地址计算hash值,使用url hash,相同请求的uri会分配到同一个web后端服务器
算法使用场景
小场景:并发量很小,默认算法轮询就可以满足
后端web服务器的处理能力有差异:加权轮询和最小连接数配合使用
大型并发:ip_hash url_hash.
1.第一次请求之后会有本地缓存,而且因为哈希算法的原因,请求的后台web服务器不会发生变化,可以提高访问速度,因为访问的是缓存
2.减轻了大并发引起后台服务器的请求压力
注意:ip_hash 后端web服务器数量发生变化,请求的服务器也会发生变化
url_hash 请求的地址发生变化,请求的服务器也可能会发生变化
你在工作中如何做反向代理?(面试)
反向代理就是防止大并发引起后台服务器的请求压力,所以就需要做负载均衡
即反向代理就是负载均衡
负载均衡,首先看并发量的多少,根据这个并发量指标,来确定负载均衡的算法
当并发量小的时候:使用默认轮询或者加权轮询配合最小连接数即可
当高并发时:ip_hash或者url_hash 来实现,访问一次之后,就不再切换后端web服务器,下一次访问的就是缓存,减少后台服务器的请求压力
为什么使用负载均衡
动态网站的页面上的信息都必须从数据库中读取,每打开一个页面就读取数据库一次,如果访问网站的人数很多,这会对服务器增加很大的荷载,从而影响这个网站的运行速度。所以,我们可以利用负载均衡集群,降低服务器的负载。