[转帖]Nginx - 根据IP分配不同的访问后端
https://www.cnblogs.com/hukey/p/11868017.html
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(模拟负载均衡):
|
1
2
3
4
5
6
7
8
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 转发客户端真实IPlocation / { 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判断在此实现)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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 端口
|
1
2
|
# curl http://192.168.118.16:8080/a.html<h1>192.168.118.16: a.html</h1> |
直接访问 192.168.118.15
|
1
2
|
# 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 检测会报错。报错信息如下:
|
1
2
3
|
[root@localhost conf]# nginx -tnginx: [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:50nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed |
本文作者:hukey
本文链接:https://www.cnblogs.com/hukey/p/11868017.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
[转帖]Nginx - 根据IP分配不同的访问后端的更多相关文章
- Nginx - 根据IP分配不同的访问后端
1. 需求分析 为了在线上环境提供测试分支,规定将某IP转发到测试程序地址.如果是 ngx 直接对外,采用 real_ip 就能够做限制,但是最前端确实一个7层是负载均衡就需要研究一番了. 2. 实践 ...
- [转帖]nginx 禁止ip访问以及禁止post方法的简单方法
nginx禁止IP访问站点的设置方法 http://www.512873.com/archives/471.html http://www.512873.com/archives/312.html c ...
- [转帖]nginx配置ssl证书实现https访问
https://www.cnblogs.com/tianhei/p/7726505.html 今天就是如此处理的 感觉挺不错的. 一,环境说明 服务器系统:ubuntu16.04LTS 服务器IP地址 ...
- nginx upstream的分配方式
1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2.weight 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况. 例 ...
- [转帖]nginx upstream模块--负载均衡
nginx upstream模块--负载均衡 https://www.cnblogs.com/linjiqin/p/5494783.html Module ngx_http_upstream_modu ...
- [转帖]Nginx安装及配置详解 From https://www.cnblogs.com/zhouxinfei/p/7862285.html
Nginx安装及配置详解 nginx概述 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP ...
- [转帖]nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件
nginx学习,看这一篇就够了:下载.安装.使用:正向代理.反向代理.负载均衡.常用命令和配置文件 2019-10-09 15:53:47 冯insist 阅读数 7285 文章标签: nginx学习 ...
- nginx负载均衡分配策略有哪些?
nginx负载均衡分配策略有哪些? 答: 1.轮询(默认,不用在upstream中配置)方式 2.weight(权重) 当指定的服务器的权重参数,权重占比为负载均衡决定的一部分.权重大负载就大. ...
- [转帖]Nginx服务器的六种负载均衡策略详解
Nginx服务器的六种负载均衡策略详解 咔咔侃技术 2019-09-11 17:40:12 一.关于Nginx的负载均衡 在服务器集群中,Nginx起到一个代理服务器的角色(即反向代理),为了避免单独 ...
- 设置nginx禁止IP直接访问,只能通过指定的域名访问
nginx的版本是1.2.1. 设置配置文件disableip.conf: server { listen 80; server_name _; return500; } 这是 ...
随机推荐
- 高版本jdk的访问私有成员属性的正确姿势
在jdk17+已经不能直接通过 setAccessible 来访问私有属性了 Field name = access.getClass().getDeclaredField("name&qu ...
- Golang 命名返回值和普通返回值
1.概述 在Go语言中,函数可以有命名返回值和普通(匿名)返回值.命名返回值会被视为定义在函数顶部的变量,并且在使用 return 语句返回时,不再必须在其后面指定参数名,也就是支持"裸&q ...
- cookie和session的一些疑惑以及ai解答
我: 那么当浏览器关闭的时候,当再次访问这个地址的时候,为什么之前设置的cookie没有被删除掉?而且按照你说的这次可能会生成一个新的sessionID,那么cookie里面的其他数据,它是如何获取上 ...
- MySQL系列:索引(B+Tree树、构建过程、回表、基本操作、执行计划、应用)
介绍 https://dev.mysql.com/doc/refman/5.7/en/optimization-indexes.html 作用 优化查询 算法 索引的算法包括 BTree Hash R ...
- Java 获取Excel中的表单控件
Excel中可通过[开发工具]菜单栏下插入表单控件,如文本框.单选按钮.复选框.组合框等等,插入后的控件可执行设置控件格式,如大小.是否锁定.位置.可选文字.数据源区域.单元格链接等.当Excel中已 ...
- 视频编码耗时长、编码帧发送失败…DVPP视频编码问题典型案例分析
摘要:本期就分享几个关于DVPP视频编码问题的典型案例,并给出原因分析及解决方法 本文分享自华为云社区<DVPP媒体数据处理视频编码问题案例>,作者:昇腾CANN. DVPP(Digita ...
- 使用appuploader工具流程(Windows版本)
转载:使用appuploader工具流程(Windows版本) 目录 转载:使用appuploader工具流程(Windows版本) 一.登录apple官网,注册账号 二.下载Appuploade ...
- 火山引擎DataTester分享:A/B实验中常见的8个错误
火山引擎DataTester是科学可信的A/B测试与智能优化平台,源自字节跳动长期沉淀,能够深度耦合推荐.广告.搜索.UI.产品功能等多种行业场景需求,为业务增长.转化.产品迭代,运营提效等各环节提供 ...
- 【Vue day01】前端发展介绍 Vue的快速使用 插值语法 指令系统之文本指令、事件指令、属性指令
目录 前端发展介绍 Vue框架入门 M-V-VM思想(重要) 组件化开发 单页面应用 Vue的快速使用 前期准备 快速使用 对象与标签绑定 查看Vue对象 插值语法 三目运算符 指令系统之文本指令 v ...
- vim-修改键盘Tab键为四个空格
在 /etc/vimrc 文件后添加一行 set ts=4