nginx当中有两种代理方式以及含义:
1.七层代理 (http协议)
核心:代理的是http的请求和响应
客户端请求代理服务器:由代理服务器转发客户端的httpd请求,转发到内部的服务器(可以是单台和可以是一组)。
后端的web server再把响应送达代理服务器,最后再到客户端。
反向代理:客户端访问的是代理服务器,代理服务器转发http请求,但是客户端不知道访问的是哪一台服务器
正向代理:客户端访问代理服务器,代理服务器转发请求,客户端只知道代理服务器的地址,后端的web server的IP地址,客户端也不知道。
2. 四层代理 (基于tcp,udp流量转发)
四层代理属于传输层,基于tcp/ip协议层的转发代理方式,基于IP和端口号实现负载均衡。
四层代理无法获取http请求中的url信息,只能对tcp/udp的数据包进行转发。
四层代理和七层代理的区别
1.七层代理总都是用户态,需要对http的请求进行处理和解析,解析过程中,可以根据请求头和请求体的内容进行流量控制,内容过滤。转发速度比较慢,但是提供的功能更高级,用户的体验更好。
四层代理是基于IP地址和端口号,只负责将IP和端口转发到后台服务器上,不对请求做任何处理,只是负责转发而已
四层走的内核,不对请求做出处理,四层代理无法提供更高级的功能,只是转发。所以四层转发速度更快
速度而言,四层更快,因为四层在内核,而且不做任何处理直接转发。
七层走的用户态,需要对内容进行处理,转发速度相对较慢。
2.选择场景:
七层代理:需要对http请求进行控制和处理,只能选择7层代理(最为常见)
四层代理:只需要转发tcp或者udp的数据包,可以选择四层,也可以选择七层。
七层可以对IP或者端口进行转发,也可以对域名进行代理。
四层只能是IP和端口
3.模块
七层代理只能写在http模块的全局配置当中。
upstream:用于处理http请求,支持反向代理,负载均衡;缓存功能
在upstream模块中,可以配置多个服务器。
四层代理的模块:stream只能写在全局模块当中的单独配置。stream代理无谓协议,只管流量。
对请求做处理:七层
单纯数据转发:四层
正向代理的配置方法
正向代理类似于vpn,科学上网,加速器
test 1:
location / {
root html;
index index.html index.htm
proxy_pass http://20.0.0.30
}
给test2,test3配置index.html:
访问test1(20.0.0.10),显示的结果是test2(20.0.0.30)。这就是正向代理。
正向代理的局限性很低,因为他是一对一的,所以不符合企业级的架构需求,所以用的更多的是反向代理。
反向代理
七层的反向代理:
vim nginx.conf
http {
......
upstream zzr{
server 20.0.0.20;
server 20.0.0.30; //后端服务器的IP地址
}
......
location {
proxy_pass http://zzr; //次数名字要与upstream一致
}
}
点击浏览器的刷新会访问的后端服务器
由上述实验可以看到,点击刷新后会改变后端服务器的地址从而是导致页面内容不一致,但其实这里涉及到负载均衡算法,目的是让客户端可以尽可能去访问其中一个服务器,防止工作量过载。
负载均衡的算法
1.rr (round robin):
负载均衡最简单的算法,轮询。请求轮流分配到后端服务器,默认算法,可以不加。
默认算法,每发一次都是最新的请求,服务器上没有缓存。
服务器处理能力相近,而且,对访问量比较小的网站适用。
2.加权轮询(weight):
建立在默认轮询算法的基础之上,为后端服务器分配不同的权重,处理能力强的服务器可以分配的权重值要高一些。(一般权重高的轮询访问次数多,权重少的轮询次数少,但也不绝对)
轮询次数基本按照权重进行分配。服务器上也没有缓存。
中大型网站可以使用加权轮询。
权重高的服务器会被频繁的请求响应。权重低的可能闲置。会和另外一种算法配合使用
http {
......
upstream zzr {
server 20.0.0.30 weight=2; // 大概率五次有两次访问20.0.0.30
server 20.0.0.40 weight=3; // 大概率五次有三次访问20.0.0.40
}
}
3.最少连接数算法。会把请求发送到连接数较少的后端服务器。
最少连接数算法可以单独使用,但是一般都是结合加权轮询一块使用,避免所有的请求都发送到处理能力强的服务器。提高整个集群的稳定性。
中型网站,大型网站,日常访问可以满足
vim nginx.conf
http {
......
upstream zzr{
least_conn;
#最小连接数限制
server 20.0.0.20 weight=2;
server 20.0.0.30 weight=3;
}
......
}
4.ip_hash:
ip_hash会根据客户端的IP地址解析出一个hash值,然后将请求发送到对应的后端服务器,下次用户在访问时,同意客户端的请求将会被分配到同一台服务器
vim nginx.conf
http {
......
upstream zzr{
ip_hash;
server 20.0.0.20 weight=2;
server 20.0.0.30 weight=3;
}
......
}
首次访问返回值是200,刷新之后返回值是304(即读取缓存)
特点:
ip_hash第一次访问之后,后续访问是有缓存的,如果后端服务器的数量发送变化,可能会进行重新分配
ip_hash:适用于高并发,请求不会跳转,请求的是缓存。
5.url_hash
根据请求的url地址计算hash值,然后将请求发送到相应的后端服务器,相同的url地址请求会被分配到同一个服务器。
vim nginx.conf
http {
......
upstream zzr{
hash $request_uri consistent;
server 20.0.0.20 weight=2;
server 20.0.0.30 weight=3;
}
......
}
url_hash 和 ip_hash是结合在一块使用的(不绝对,看实际情况),可以适用于并发较高的场景。主要是ip_hash 和 url_hash,访问之后都是访问本地缓存,可以降低后端服务器的压力
基于域名的反向代理
test1(20.0.0.10)
http {
upstream zzr {
server www.kfc.com weight=2;
server www.bennet.com weight=3;
}
}
server {
liisten 80;
server_name www.zzzr.cc;
location / {
root html;
index index.html index.htm;
proxy_pass http://zzr;
proxy_set_header HOST $host;
#把请求的主机名发送给后端
proxy_set_header X-Real-IP $remote_addr;
#后端服务器获取客户端的真实IP
}
}
wq!
systemctl restart nginx
域名访问一定要做映射!!!!!!
vim /etc/hosts
20.0.0.10 www.zzzr.cc 代理服务器
20.0.0.30 www.kfc.com 后端服务器1
20.0.0.40 www.bennet.com 后端服务器2
域名访问一定要做地址解析!!!!!!
test2:
test2(20.0.0.30)
vim nginx.conf
server {
listen 80;
server_name www.kfc.com;
#修改为域名地址
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
wq!
systemctl restart nginx
# 做域名访问映射
vim /etc/hosts
20.0.0.10 www.zzzr.cc
20.0.0.30 www.kfc.com
test3:
test3(20.0.0.40)
vim nginx.conf
server {
listen 80;
server_name www.bennet.com;
#修改为域名地址
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
wq!
systemctl restart nginx
# 做域名访问映射
vim /etc/hosts
20.0.0.10 www.zzzr.cc
20.0.0.40 www.bennet.com
访问结果:
四层的反向代理:
stream {
upstream test {
server 20.0.0.20:80;
server 20.0.0.30:80;
}
server {
listen 80;
proxy_pass test;
}
}
http {
......
}
四层的反向代理的注意事项:
1. 在四层代理中可以使用加权轮询 最小连接数算法也可以实现负载均衡
2. 但是ip_hash,url_hash不可用在stream中使用
3. 因为四层代理只是转发数据包,不能对请求进行处理,只是转发数据包。
3. 只有http七层代理 可以处理请求地址和请求的url