1. 需求分析

为了在线上环境提供测试分支,规定将某IP转发到测试程序地址。如果是 ngx 直接对外,采用 real_ip 就能够做限制,但是最前端确实一个7层是负载均衡就需要研究一番了。

2. 实践

业务部署在某云上,前端上挂着一个7层的负载均衡,通过查看官方可以通过 X-Forwarded-For 来获取客户端真实IP,这样就很简单了。
通过测试模拟这样的环境验证下:

192.168.118.14 - ngx :该ngx 只是充当负载均衡,开启 X-Forwarded-For
    192.168.118.15 - ngx:该ngx 为 web服务器,真正的用户端IP判断在这里实现
    192.168.118.16 - httpd:充当 测试程序

配置如下:

192.168.118.14(模拟负载均衡):

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 转发客户端真实IP
location / {
    proxy_pass http://192.168.118.15/; # 仅仅用作转发
    access_log logs/14_access.log main;
    error_log logs/14_error.log;
    #root   html;
    #index  index.html index.htm;
}

192.168.118.15(nginx - 用户端IP判断在此实现)

upstream back1 {
    server 192.168.118.16:8080;
}
server {
    listen       80;
    server_name  localhost;
    location / {
        if ($http_x_forwarded_for ~* "192.168.118.2") {
            rewrite ^/(.*)$ http://192.168.118.15/back1/$1 break;
        }
        root html;
        index index.html;
        access_log logs/15_access.log main;
        error_log logs/15_error.log;
    }
    location /back1 {
        proxy_pass http://back1/;
    }

因为负载均衡可以转发用户真实IP,所以在 nginx 中,直接判断 http_x_forwarded_for 就能做路由。

192.168.118.16 开启 8080 端口

# curl http://192.168.118.16:8080/a.html
<h1>192.168.118.16: a.html</h1>

直接访问 192.168.118.15

# curl http://192.168.118.15/a.html
<h1>192.168.118.15: a.html</h1>

定义的规则:当客户端 192.168.118.2 访问 192.168.118.14时,则转发到 192.168.118.16:8080,剩下其他客户端IP则直接访问 192.168.118.15

3. 验证

通过 192.168.118.2 客户端访问:

http://192.168.118.14/a.html 地址在浏览器已经经过 302 跳转到新的连接地址了。

其他客户端IP访问:

4. 后续

通过 rewrite 这种方式实现了条件判断的跳转,但是这个跳转是 HTTP 302 并不支持 head 等信息的转发,所以在提交 post 请求时,会出现错误。

在生产环境中,有这样一个实例:

需求:当IP: 192.168.118.2  访问 http://192.168.118.15/bbs/ 时,跳转到 http://192.168.118.16:8080/  uri中不能带有 /bbs

实现:

注意:在条件判断的反向代理中,proxy_pass http://192.168.118.16:8080 后面不得带 '/' 或者其他路径,否则 nginx -t 检测会报错。报错信息如下:

[root@localhost conf]# nginx -t
nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /usr/local/nginx/conf/nginx.conf:50
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed

Nginx - 根据IP分配不同的访问后端的更多相关文章

  1. 配置tomcat限制指定IP地址访问后端应用

    1. 场景后端存在N个tomcat实例,前端通过nginx反向代理和负载均衡. tomcat1      tomcatN         |                 |        |    ...

  2. [转帖]nginx 禁止ip访问以及禁止post方法的简单方法

    nginx禁止IP访问站点的设置方法 http://www.512873.com/archives/471.html http://www.512873.com/archives/312.html c ...

  3. 设置nginx禁止IP直接访问,只能通过指定的域名访问

    nginx的版本是1.2.1. 设置配置文件disableip.conf: server {     listen 80;     server_name _;     return500; } 这是 ...

  4. Nginx禁止ip访问或IP网段访问方法

    Nginx禁止ip访问可以防止指定IP访问我们的网站,本例子可以实现是防止单IP访问或IP网段访问了,非常的有用我们一起来看看吧. 常用的linux做法 iptables参考规则  代码如下 复制代码 ...

  5. Nginx 禁止IP访问

    我们在使用的时候会遇到很多的恶意IP攻击,这个时候就要用到Nginx 禁止IP访问了.下面我们就先看看Nginx的默认虚拟主机在用户通过IP访问,或者通过未设置的域名访问(比如有人把他自己的域名指向了 ...

  6. nginx禁止ip登录,只允许域名访问

    公司要求,线上solr.kibana要求只能通过域名进行访问,禁止用ip+端口进行登录访问,那么,下面介绍下我是如何实现的 1.禁止ip,允许域名访问 如下图,默认安装好nginx,不让ip方式访问, ...

  7. Nginx禁止IP访问,只允许域名访问

    Nginx禁止IP访问,只允许域名访问 我们在使用nginx的过程中会遇到很多的恶意IP攻击,这个时候就要用到Nginx 禁止IP访问了. 1.直接返回403错误 server { listen de ...

  8. nginx 设置ip地址访问,但是设置域名访问不了

    一.导语 在Nginx的设置过程中,ip地址能正常访问的,但是把ip地址转换成域名,就访问不了了,这个是怎么回事呢?今天来探讨一下 二.设置ip地址做负载均衡 2.1.server端 server { ...

  9. nginx 限制ip访问频率和限速 (摘录)

    限制某个IP同一时间段的访问次数 如何设置能限制某个IP某一时间段的访问次数是一个让人头疼的问题,特别面对恶意的ddos攻击的时候.其中CC攻击(Challenge Collapsar)是DDOS(分 ...

随机推荐

  1. 201671010446姚良实验十四团队项目评审&课程总结

    实验十四 团队项目评审&课程学习总结 项目 内容 这个作业属于哪个课程 http://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cn ...

  2. Virtual DOM的渲染机制--猜测

    一个node的状态发生变化: 会对当前结点和子节点的数据全部进行更新: 然后进行dom比较: 比较完毕后一次性提交: 相对于以前的渲染方式: 每一个node的数据发生变化,都会产生一次渲染提交: 以上 ...

  3. (知识点4)C++ 中vector

    1.定义vector<vector<int>> M; 2.添加元素这里是vector的嵌套使用,本质是vector元素里的每个元素也是vector类型,所以抓住本质来添加元素就 ...

  4. (1)IdentityServer4 V3.0.2-安装模板

    控制台运行命令: dotnet new -i IdentityServer4.Templates

  5. apache-maven安装

    1.下载maven 网址:http://maven.apache.org 2.下载maven和安装 由于最新版的可能会有问题,我选择下载旧版本 一般都下载二进制的zip文件 解压后文件夹apache- ...

  6. 洛谷P1962 斐波那契数列题解

    题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请 ...

  7. P1005 矩阵取数

    题目链接 看完题可能第一时间并没有清晰的思路.让我们一步一步的来考虑这道题目. 题目中描述操作为每次从所有的行中选取,这样做有些麻烦.仔细思考一下可以发现行与行之间互不干涉,所以我们可以对每行操作到底 ...

  8. mac 安装注册Charles

    软件去官网下载安装即可. 下载地址:https://www.charlesproxy.com/download/ 适用于Charles任意版本的注册码Charles 4.2.7 目前是最新版,可用. ...

  9. 倍增&矩阵乘法 专题复习

    倍增&矩阵乘法 专题复习 PreWords 这两个基础算法我就不多说啦,但是还是要介绍一下" 广义矩阵 "乘法 其实就是把矩阵换成取\(max\),然后都一样... 据神仙 ...

  10. 原生js实现元素类名的判存、添加和移除

    1.addClass:为指定的dom元素添加样式. 2.removeClass:删除指定dom元素的样式. 3.toggleClass:如果存在(不存在),就删除(添加)一个样式. 4.hasClas ...