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

  • 相关阅读:
    再次梳理css3动画部分知识
    node搭环境
    微信小程序可用的第三方库
    省市区三级联动下拉框效果分析
    jq回到顶部效果分析
    jq案例中遇到的知识点总结(会飞的小鸟和三级联动)
    js正则表达式大全
    js中表达式 >>> 0 浅析
    为什么js中要用void 0 代替undefined
    npm install、npm install --save、npm install --save --dev、npm install -S、npm install -D的区别
  • 原文地址:https://www.cnblogs.com/coolid/p/9023650.html
Copyright © 2011-2022 走看看