• nginx的正向代理,反向代理和负载均衡


    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,科学上网,加速器

    1. test 1:
    2. location / {
    3. root html;
    4. index index.html index.htm
    5. proxy_pass http://20.0.0.30
    6. }

    给test2,test3配置index.html:

    访问test1(20.0.0.10),显示的结果是test2(20.0.0.30)。这就是正向代理。

    正向代理的局限性很低,因为他是一对一的,所以不符合企业级的架构需求,所以用的更多的是反向代理。

    反向代理

    七层的反向代理:

    1. vim nginx.conf
    2. http {
    3. ......
    4. upstream zzr{
    5. server 20.0.0.20;
    6. server 20.0.0.30; //后端服务器的IP地址
    7. }
    8. ......
    9. location {
    10. proxy_pass http://zzr; //次数名字要与upstream一致
    11. }
    12. }

    点击浏览器的刷新会访问的后端服务器

    由上述实验可以看到,点击刷新后会改变后端服务器的地址从而是导致页面内容不一致,但其实这里涉及到负载均衡算法,目的是让客户端可以尽可能去访问其中一个服务器,防止工作量过载。

    负载均衡的算法

    1.rr (round robin):

    负载均衡最简单的算法,轮询。请求轮流分配到后端服务器,默认算法,可以不加。

    默认算法,每发一次都是最新的请求,服务器上没有缓存。

    服务器处理能力相近,而且,对访问量比较小的网站适用。

    2.加权轮询(weight):

    建立在默认轮询算法的基础之上,为后端服务器分配不同的权重,处理能力强的服务器可以分配的权重值要高一些。(一般权重高的轮询访问次数多,权重少的轮询次数少,但也不绝对)

    轮询次数基本按照权重进行分配。服务器上也没有缓存。

    中大型网站可以使用加权轮询。

    权重高的服务器会被频繁的请求响应。权重低的可能闲置。会和另外一种算法配合使用

    1. http {
    2. ......
    3. upstream zzr {
    4. server 20.0.0.30 weight=2; // 大概率五次有两次访问20.0.0.30
    5. server 20.0.0.40 weight=3; // 大概率五次有三次访问20.0.0.40
    6. }
    7. }

    3.最少连接数算法。会把请求发送到连接数较少的后端服务器。

    最少连接数算法可以单独使用,但是一般都是结合加权轮询一块使用,避免所有的请求都发送到处理能力强的服务器。提高整个集群的稳定性。

    中型网站,大型网站,日常访问可以满足

    1. vim nginx.conf
    2. http {
    3. ......
    4. upstream zzr{
    5. least_conn;
    6. #最小连接数限制
    7. server 20.0.0.20 weight=2;
    8. server 20.0.0.30 weight=3;
    9. }
    10. ......
    11. }

    4.ip_hash:

    ip_hash会根据客户端的IP地址解析出一个hash值,然后将请求发送到对应的后端服务器,下次用户在访问时,同意客户端的请求将会被分配到同一台服务器

    1. vim nginx.conf
    2. http {
    3. ......
    4. upstream zzr{
    5. ip_hash;
    6. server 20.0.0.20 weight=2;
    7. server 20.0.0.30 weight=3;
    8. }
    9. ......
    10. }

    首次访问返回值是200,刷新之后返回值是304(即读取缓存)

    特点:

    ip_hash第一次访问之后,后续访问是有缓存的,如果后端服务器的数量发送变化,可能会进行重新分配

    ip_hash:适用于高并发,请求不会跳转,请求的是缓存。

    5.url_hash

    根据请求的url地址计算hash值,然后将请求发送到相应的后端服务器,相同的url地址请求会被分配到同一个服务器。

    1. vim nginx.conf
    2. http {
    3. ......
    4. upstream zzr{
    5. hash $request_uri consistent;
    6. server 20.0.0.20 weight=2;
    7. server 20.0.0.30 weight=3;
    8. }
    9. ......
    10. }

    url_hash 和 ip_hash是结合在一块使用的(不绝对,看实际情况),可以适用于并发较高的场景。主要是ip_hash 和 url_hash,访问之后都是访问本地缓存,可以降低后端服务器的压力

    基于域名的反向代理

    1. test1(20.0.0.10)
    2. http {
    3. upstream zzr {
    4. server www.kfc.com weight=2;
    5. server www.bennet.com weight=3;
    6. }
    7. }
    8. server {
    9. liisten 80;
    10. server_name www.zzzr.cc;
    11. location / {
    12. root html;
    13. index index.html index.htm;
    14. proxy_pass http://zzr;
    15. proxy_set_header HOST $host
    16. #把请求的主机名发送给后端
    17. proxy_set_header X-Real-IP $remote_addr;
    18. #后端服务器获取客户端的真实IP
    19. }
    20. }
    21. wq!
    22. systemctl restart nginx
    23. 域名访问一定要做映射!!!!!!
    24. vim /etc/hosts
    25. 20.0.0.10 www.zzzr.cc 代理服务器
    26. 20.0.0.30 www.kfc.com 后端服务器1
    27. 20.0.0.40 www.bennet.com 后端服务器2

    域名访问一定要做地址解析!!!!!!

    test2:

    1. test2(20.0.0.30)
    2. vim nginx.conf
    3. server {
    4. listen 80;
    5. server_name www.kfc.com;
    6. #修改为域名地址
    7. location / {
    8. root /usr/share/nginx/html;
    9. index index.html index.htm;
    10. }
    11. wq!
    12. systemctl restart nginx
    13. # 做域名访问映射
    14. vim /etc/hosts
    15. 20.0.0.10 www.zzzr.cc
    16. 20.0.0.30 www.kfc.com

    test3:
     

    1. test3(20.0.0.40)
    2. vim nginx.conf
    3. server {
    4. listen 80;
    5. server_name www.bennet.com;
    6. #修改为域名地址
    7. location / {
    8. root /usr/share/nginx/html;
    9. index index.html index.htm;
    10. }
    11. wq!
    12. systemctl restart nginx
    13. # 做域名访问映射
    14. vim /etc/hosts
    15. 20.0.0.10 www.zzzr.cc
    16. 20.0.0.40 www.bennet.com

    访问结果:

    四层的反向代理:

    1. stream {
    2. upstream test {
    3. server 20.0.0.20:80;
    4. server 20.0.0.30:80;
    5. }
    6. server {
    7. listen 80;
    8. proxy_pass test;
    9. }
    10. }
    11. http {
    12. ......
    13. }

    四层的反向代理的注意事项:

    1. 在四层代理中可以使用加权轮询 最小连接数算法也可以实现负载均衡

    2. 但是ip_hash,url_hash不可用在stream中使用

    3. 因为四层代理只是转发数据包,不能对请求进行处理,只是转发数据包。

    3. 只有http七层代理 可以处理请求地址和请求的url

  • 相关阅读:
    【华为OD机试真题 JS】找最小数
    STM32 寄存器配置笔记——系统时钟配置 HSE as PLL
    【LeetCode】zj面试-把字符串转换成整数
    对于Oracle,MySQL,SQL Server重复数据删除
    springboot集成xxl-job详解
    【AI Agent系列】【MetaGPT多智能体学习】4. 基于MetaGPT的Team组件开发你的第一个智能体团队
    损失函数知识梳理
    【C语言】万字详讲操作符
    【JavaWeb】Day47.Mybatis基础操作——删除
    Java项目之“拼图小游戏”
  • 原文地址:https://blog.csdn.net/qq_51506982/article/details/133862058