zoukankan      html  css  js  c++  java
  • nginx使用用户真实IP做hash(解决经过CND后ip_hash失效问题)

    在nginx中常用的有以下四种负载均衡的算法,分别是:round-robin、ip-hash、least-connected和weighted。当然在实际生产中或许使用最多的就是ip-hash了,一般会这样使用:

    upstream h5 {
       ip_hash;
       server 192.168.100.104:9080;
       server 192.168.100.105:9080;
     }
    

      

    如果用户是直连的话那还好,nginx可以根据用户的IP均匀地向多个服务器节点分配负载请求。但是如果我们的域名使用了CDN加速的话,那么用户在请求js、CSS、图片等静态资源时并没有直接请求到我们的服务器,而是请求的少量的CDN加速节点服务器,从而造成有少量IP(PS:CDN节点服务器IP)频繁大量访问nginx。同时又因为ip_hash策略的原因,导致出现部分服务器的负载非常大,其他服务器却没有多少请求的现象

    因此,为了解决这个问题,我们可以通过在nginx中获取用户请求时的真实IP,然后根据这些真实IP做hash策略,也就是自定义nginx的hash策略。实现步骤如下:

    (1)修改nginx配置文件nginx.conf:

    http {
    include mime.types; #设定mime类型,类型由mime.type文件定义
    default_type application/octet-stream;
    log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘
    ‘$status $body_bytes_sent “$http_referer” ‘
    ‘”$http_user_agent” “$http_x_forwarded_for”‘;
    access_log logs/access.log main;

    #获取用户真实IP,并赋值给变量$clientRealIP

    map $http_x_forwarded_for $clientRealIp {
    "" $remote_addr;
    ~^(?P<firstAddr>[0-9.]+),?.*$ $firstAddr;
    }
    

      

    ……..

    include gzip.conf; #压缩配置文件
    include proxy.conf; #proxy_cache参数配置文件
    include vhost/*.conf; #nginx虚拟主机包含文件目录
    include mysvrhost.conf; #后端WEB服务器列表文件
    }

    (2)修改nginx的配置文件mysvrhost.conf:

    upstream h5 {
    hash $clientRealIp;
    server 192.168.100.104:9080;
    server 192.168.100.105:9080;
    }

    注:这种方式也并不是万无一失了,因为请求的Header中的HTTP_X_FORWARDED_FOR参数是可以在请求时被修改的,因此就存在一定的安全隐患。不过现在的CDN一般都有加速防黑的功能,所有实际上问题也不是很大。如果实在不放心的话不是还可以使用SSL证书整站加密嘛

    转自:https://www.zifangsky.cn/659.html

  • 相关阅读:
    深入剖析ASP.NET的编译原理之一:动态编译(Dynamical Compilation)
    ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline Part I
    IIS Server Variables(IIS 服务器变量)
    .Net源码之Page类(二)
    博客改变生活
    目录、路径、虚拟路径
    Windows 7 Beta 1 7000
    《Visual Studio Hacks 》读书笔记 (十二)
    新建XML文件
    另一个分页函数
  • 原文地址:https://www.cnblogs.com/coolid/p/9023650.html
Copyright © 2011-2022 走看看