nginx如何通过客户端ip分流

nginx如何通过客户端ip分流

开发者有时候需要将部分客户端流量分流到其他web服务,比如灰度环境,又或者分流到某个特定的URL。根据用户访问的ip地址,理想情况是根据地理位置分流,又或者只是简单的想防止特定ip地址的访问我们某个路径。那么,我们怎么将客户端ip为1.2.3.4分流到http:www.gaoxuan1989.com/page1.html,并且将剩余的流量分到http://www.gaoxuan.com1989/otherpage.html,接下来我们就来讨论这个问题。

通过Nginx HttpAccessModule分发流量

由于Nginx支持条件判断,所以首先我们先看一个例子:如何使用HttpAccessModule的变量$remote_addr来分发流量。

server {
  if ($remote_addr = 1.2.3.4) {
    rewrite ^ http://www.gaoxuan1989.com/otherpage.html;
  }
}

这个例子就可以将1.2.3.4的这个ip地址转发到我们预先设定的地址了。

假如我们使用nginx作为Apache或者其他web容器的前端代理呢?

这种场景我们基本不用怎么改,只是将流量通过proxy_pass转发到后端服务就好了:

if ($remote_addr = 1.2.3.4) {
  proxy_pass http://www.gaoxuan1989.com/otherpage.html;
}

举两个现实中会用到这种情况的例子:

  • 我们需要将办公环境的请求分流到灰度环境,而将所有的正常流量分到正式环境;
  • 只允许管理员的ip地址访问到管理后台界面,其他的请求没有权限。(当然从安全角度来看,你还是要有用户名密码作为校验)。

通过nginx的Geo Module分流

还有一个办法,就是通过nginx的geo模块,它会根据用户请求的ip地址创建一个变量。

使用举例:

geo $bad_user {
  default 0;
  1.2.3.4/32 1;
}
​
server {
  if ($bad_user) {
    rewrite ^ http://www.gaoxuan1989.com/otherpage.html;
  }
}

上面的例子中,如果客户端请求ip不符合我们指定的ip段,那就将这个变量的值就是默认值0,否则就是1,这样就将制定ip段的请求都转发到我们期望的地址了。

refer:http://scalescale.staging.wpengine.com/tips/nginx/redirect-nginx-traffic-client-ip/

发表评论

电子邮件地址不会被公开。 必填项已用*标注