nginx的反向代理和负载均衡

1. 正向代理和反向代理

1.1正向代理

image.png

正向代理代理的是客户端
正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从目标服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转发请求,将获得的内容返回给客户端
这是格式如下

  server {
        listen 80;
 
        location / {
            proxy_pass http://baidu.com;
        }
    }

1.2反向代理

image.png

反向代理代理的是服务端
反向代理:(reverse proxy),指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式客户端不直接与后端服务器进行通信,而是与反向代理服务器进行通信,隐藏了后端服务器的 IP 地址

 upstream myapp {
        server 192.168.1.2:808;
        server 192.168.1.3;
    }
 
    server {
        listen 80;
 
        location / {
            proxy_pass http://myapp;
        }
    }

个人理解:正向代理和反向代理技术上没什么区别,正向代理通常用于为客户端提供访问原始服务器的能力,尤其是在访问受限制的服务器时。。反向代理通常用于负载均衡,因为它可以平衡服务器群的负载,提高系统的可用性和可伸缩性。
可以理解为NGINX的负载均衡时通过反向代理模式来实现的。

2.反向代理的模块

ngx_http_proxy_module: #将客户端的请求以http协议转发至指定服务器进行处理
 
ngx_http_upstream_module #用于定义为proxy_pass,fastcgi_pass,uwsgi_pass等指令引用的后端服务器分组
 
ngx_stream_proxy_module:#将客户端的请求以tcp协议转发至指定服务器处理
 
ngx_http_fastcgi_module:#将客户端对php的请求以fastcgi协议转发至指定服务器助理
 
ngx_http_uwsgi_module: #将客户端对Python的请求以uwsgi协议转发至指定服务器处理

下面就研究负载均衡主要用到ngx_stream_proxy_module模块。

3.简单的负载均衡

docker起两台在同一个网络的nginx容器
docker run --name nginx1 -d -p 8086:80 --network custom_network -v d:\www\nginx1:/etc/nginx/conf.d -v d:\www\nginx1\pro:/usr/share/nginx/html nginx
注意要使用同一个网络

image.png

配置两个容器的最简单的nginx配置。

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
image.png

这里用暴漏的端口都是可以访问到的。
配置nginx1的nginx文件增加nginx2的ip

upstream myapp {
        server 192.168.1.2:808;
        server 192.168.1.3;
    }
    server {
        listen 80;
 
        location / {
            proxy_pass http://myapp;
        }
    }
server {
    listen       808;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

配置中最重要的就是upstream 要写入内网的ip,这样再去访问(http://127.0.0.1:8186/)
就可以看到nginx1和nginx2交替出现了。
在增加个不对外暴漏端口的容器

docker run --name nginx3 -d --network custom_network -v d:\www\nginx3:/etc/nginx/conf.d -v d:\www\nginx3\pro:/usr/share/nginx/html nginx

image.png

可以看到nginx3未对外暴漏端口。
在nginx1的配置中增加NGinx3的ip就可以了

 upstream myapp {
        server 192.168.1.2:808;
        server 192.168.1.3;
        server 192.168.1.4;
    }
    server {
        listen 80;
 
        location / {
            proxy_pass http://myapp;
        }
    }

这样就可以轮流访问三个容器了。

4.负载均衡的调度算法

4.1 轮询(Round Robin)
每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。默认使用此算法,将nginx3容器关掉,会发现开始访问到nginx3时候,开始会一直卡段,等nginx确认nginx3挂掉了,就不在分配到nginx3。
示例

upstream myapp {  
       server 192.168.1.2:808;
        server 192.168.1.3;
        server 192.168.1.4;
}

4.2 轮询权值(Weighted Round Robin)
weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
示例

upstream myapp {  
       server 192.168.1.2:808 weight=1;
        server 192.168.1.3 weight=2;
        server 192.168.1.4 weight=3;
}

4.3 ip_hash
每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
设置后会发现本机一直就访问单个容器了。
示例

upstream myapp {  
       ip_hash;  
       server 192.168.1.2:808;
        server 192.168.1.3;
        server 192.168.1.4;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容