• nginx反向代理 负载均衡


    1.反向代理介绍:


    反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。

       Nginx 除了可以在企业提供高性能的web服务之外,另外还可以将 nginx 本身不具备的请求通过某种预定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范,主要在不同的场景使用以下模块实现不同的功能

     2.七层代理和四层代理:


      2.1 七层代理:


    七层是最常用的反向代理,只能配置的在nginx配置文件的http模块中
    配置的方法名称:upstream 模块,不能写在server中,也不能在location中,在http模块当中是独立的一个配置


      2.2 四层代理:


    四层代理是基于tcp/ip协议层的代理转发方式,可以实现基于ip地址和端口进行负载均衡转发。
    四层代理无法获取http请求当中的URL信息,只能对tcp/udp数据包进行转发。流量转发。
    配置的方法名称:stream,stream是不能配置在http模块中,配置在全局当中。是属于一个独立的模块,不属于其他任何模块。
    3.反向代理web服务器:
      3.1 代理服务器配置:

    1. vim /apps/nginx/conf.d/www.conf
    2. server{
    3. listen 80;
    4. server_name www.wzw.com;
    5. root /apps/nginx/html;
    6. location / {
    7. proxy_pass http://192.168.88.101;
    8. }
    9. }

    3.2 服务器配置 :

          vim /apps/nginx/html/index.html

    1. this is yunjisuan

    2. "http://www.wzw.com/2.jpg"/>

    3.3 客户端访问:

    3.4 代理不同端口:

       代理服务器添加监听端口:

    4.反向代理动静分离:

      4.1  准备:

     4.2 代理服务器配置:

    1. server{
    2. listen 80;
    3. listen 8080;
    4. server_name www.wzw.com;
    5. root /apps/nginx/html;
    6. location /static {
    7. proxy_pass http://192.168.88.128;
    8. }
    9. location /api {
    10. proxy_pass http://192.168.88.101;
    11. }
    12. }
    13. nginx -s reload

     4.3 动态服务器配置:

    1. cd /apps/nginx/html
    2. mkdire api
    3. vim index.html
    4. api
    5. api
    6. api
    7. api
    8. api
    9. api
    10. api
    11. vim /apps/nginx/conf/nginx.conf
    12. server块添加监听端口:
    13. listen 8080;
    14. nginx -s reload
    15. 4.4 静态服务器配:

    4.4 静态服务器配:

    1. cd /apps/nginx/html
    2. mkdire api
    3. vim index.html
    4. static
    5. static
    6. static
    7. static
    8. static
    9. static

    5.反向代理服务器的缓存功能:
      后端服务器突然关闭时,客户端无法访问,代理服务器的缓存功能可以加强安全稳定性。

      5.1 主配置文件定义缓存参数:
    proxy_cache_path /apps/nginx/proxycache #定义缓存保存路径

    levels=1:1:1 #定义缓存目录结构层次

    keys_zone=proxycache:20m #指内存中缓存的大小,主要用于存放key

    inactive=120s #缓存有效时间

    max_size=10g; #最大磁盘占用空间,磁盘存入文件内容的缓存空间最大值

      5.2 子配置文件调用缓存功能:
    proxy_cache proxycache        ##使用定义名称; 

    proxy_cache_key $request_uri;  #对客户端url的数据进行MD5的运算做为缓存的key

    proxy_cache_valid   [code ...]  time;  #定义对【响应码】的响应内容的缓存时长     

    proxy_cache_valid any 1m;  #除指定的状态码返回的数据以外的缓存多长时间,必须设置,否则不会缓存

     清理缓存   方法1::rm -rf 缓存目录  (还是这个方便。。)

                      方法2: 第三方扩展模块ngx_cache_purge
     

     5.3 示例:

    代理服务器:
    1. vim /apps/nginx/conf/nginx.conf
    2. http模块添加:
    3. proxy_cache_path /apps/nginx/proyxcache levels=1:1:1 keys_zone=proxycache:20m inactive=120s max_size=1g;
    4. vim /apps/nginx/conf.d/www.conf
    5. server块添加:
    6. proxy_cache proxycache;
    7. proxy_cache_key $request_uri;
    8. proxy_cache_valid 200 302 301 10m;
    9. proxy_cache_valid any 5m;
    测试:

      真实服务器关闭服务:

    systemctl stop nginx

    6.反向代理客户端IP透传: 

        6.1反向代理服务器配置:

    1. location / {
    2. proxy_pass http://192.168.88.101:8080;
    3. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    4. #添加 客户端IP和反向代理服务器IP到请求报文头部;
    5. }
    6. proxy_set_header X-Real-IP $remote_addr;
    7. #也可以使用,只添加客户端IP到请求报文头部,转发至后端服务器;

    6.2 服务器日志:   

    $http_x_forwarded_for;    记录跳转信息,默认日志中有此项。如果是自定义日志需要添加。

    7.反向代理负载均衡:
        Nginx 可以基于ngx_http_upstream_module模块提供服务器分组转发、权重分配、状态监测、调度算法等高级功能。

      7.1 默认算法轮询:
        最基本的配置方法,每个请求会按时间顺序逐一分配到不同的后端服务器基本上1:1。
     

    1. upstream wzw { ##定义一组服务器组
    2. server 192.168.88.101;
    3. server 192.168.88.128;
    4. }
    5. server{
    6. listen 80;
    7. server_name www.wzw.com;
    8. root /apps/nginx/html;
    9. location / {
    10. proxy_pass http://wzw; ##代理到wzw组
    11. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    12. }
    13. }

    7.2  加权轮询:

      加权轮询建立在轮询算法之上,通过给不同web服务器权重,让处理能力更强的服务器可以分配到更多的请求

    1. upstream wzw { ##定义一组服务器组
    2. server 192.168.88.101 weight=5;
    3. server 192.168.88.128 weight=1;
    4. }
    5. server{
    6. listen 80;
    7. server_name www.wzw.com;
    8. root /apps/nginx/html;
    9. location / {
    10. proxy_pass http://wzw; ##代理到wzw组
    11. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    12. }
    13. }

    7.3 IP_hash:

    • ip_hash根据IP地址,计算出hash值,使用ip_hash算法,同一客户端的请求会被分配到同一个后端服务器,从而保证会话的稳定性,请求速度块。
    • 缺点:如果后端服务器数量发生改变,hash会重新计算,请求服务器也会改变。
    1. upstream wzw {
    2. ip_hash; ##同一个IP客户端固定访问一个后端服务器
    3. server 192.168.88.101; weight=5;
    4. server 192.168.88.128; weight=1;
    5. }

    7.4 url_hash:

       根据uri地址计算hash值,使用url_hash会把相同请求的uri分配到同一个后端web服务器

    1. upstream wzw {
    2. hash $request_uri consistent; #基于用户请求的uri做hash
    3. server 192.168.88.101; weight=5;
    4. server 192.168.88.128; weight=1;
    5. }

    7.5 least_conn:

        最少连接调度算法,优先将客户端请求调度到当前连接最少的后端服务器

       主要适用于后端服务器处理任务耗时不同的情况,避免了所以请求集中在处理能力更强的服务器上,一般配合加权轮询使用

    1. upstream wzw {
    2. least_conn;
    3. server 192.168.88.101; weight=5;
    4. server 192.168.88.128; weight=1;
    5. }

    7.6 使用场景总结:
    小场景:并发量很小,默认算法就可以满足
    后端web服务器的处理性能有差异:加权轮询与最少连接数配合使用
    大型并发:ip_hash或url_hash(可直接访问缓存,从而缓解后端服务器压力,第一次请求后,会有贝蒂缓存,而且因hash算法原因,请求的后端web服务器不会发生变化,从而可以提高访问速度。
     注: 

    ip_hash:后端服务器数量发生变化,请求的服务器也会发生变化

    url_hash:请求的地址发生变化,请求的服务器也可能发生变化
     

  • 相关阅读:
    HDLBits: 在线学习 SystemVerilog(六)-Problem 24-27
    【c/c++算法】曼哈顿算法简单运用
    推荐《中华小当家》
    人工智能神经网络是什么,人工神经网络应用范围
    git stash
    06 装饰(Decorator)模式
    文盘 Rust -- tokio 绑定 cpu 实践
    创建一个servlet处理用户登录请求,如果正确将用户名保存在session中,并跳转到主页面。要求,主页面要有登录权限。
    【JavaEE】HTTP协议
    [附源码]计算机毕业设计JAVAjsp校园志愿者服务管理系统
  • 原文地址:https://blog.csdn.net/OuOOutlier_/article/details/132939189