之前写了一些nginx的东西,这次继续,主要使用upstream针对proxy_pass转发做个处理

一般情况下我们在使用nginx反向代理的时候,都是如下配置,

...
location /api {
proxy_pass https://b.test.com; # 设置代理服务器的协议和地址
proxy_cookie_domain b.test.com a.test.com; # 修改cookie,针对request和response互相写入cookie
}
...

这样就实现了'/api'目录接口的转发。功能是实现了,但是有什么问题么?还真有!

如果我们可以反向代理,如果别人也知道了我们的接口域名也不是可以自己搭一个nginx服务器就可以代理到我们的接口服务器上去???是不是感觉很危险,是的。。。对此当时做的时候就加了一个临时方案,在接口服务中添加一个ip白名单,白名单中的ip都是nginx服务器的ip,然后就项目上线了。这样也实现了需求,但ip如果被伪造了怎么办?于是我们想到了另一个方案,使用内网IP代替对外开放的域名,这样在一定程度上就直接拦截了外部的直接访问,具体实现如下,

upstream apiServer {
server 10.10.10.10.:8888
}
...
location /api {
proxy_pass http://apiServer;
proxy_cookie_domain apiServer a.test.com;
}
...

我们使用upstream定义了一个apiServer的组,将转发都指向这里,这时相当于我们把可能存在的用户直接访问接口服务器的可能给关闭了,也就是途中红色的那部分危险操作~~

可能你会想upstream的使用纯属多余,的确当apiServer只有一台机器的时候,这个的确可以不用,但是多台机器的时候,虽然proxy_pass虽然可以定义多条但是太麻烦了。。。使用upstream组统一管理即可,同时使用upstream还有一些优势比如给多个server设置负载均衡,upstream组中支持通过weight参数来设置当前server在负载均衡中所占的比重,此外还可以通过设置backup参数指定某些服务器作为备份机等等。详细的配置内容还是建议大家参考Nginx upstream官方文档

此外,除了安全性方面,使用内网ip进行接口转发也省去了转发中的DNS重新解析的过程,有利于大幅提升接口转发效率。同时若不想破坏已经做好的SLB的话,也可以不使用upstream,直接转发到SLB服务器的内网ip应该也是可以的。

综上,在proxy_pass转发中我们使用了两种方案来对安全性做一些提升

  • proxy_pass转发到外网域名,同时在接口服务器上添加访问来源白名单,把nginx服务器的ip写进去
  • proxy_pass转发到内网域名,多服务器的话使用upstream统一管理并实现负载均衡,也能提升转发效率

第二种方案是不是通用的呢?这样可行的话,我们的接口服务器是不是都不用设置外网可访问的域名了呢?

第二种方案是可以通用的,但是这不意味着我们就可以抛弃外部可访问的域名,因为在一个落地业务中,比如第三方授权、微信支付等情况下外部可访问域名还是必须要有的。因此只有那些不需要与第三方进行通信,比如仅供公司内部使用的管理系统等,就可以直接抛弃外网域名了。此时个人建议就是上面两种方案结合一下:

  • proxy_pass的转发使用内网ip,来提升转发效率,同时对外部访问添加白名单,只暴露需要和第三方通信的接口即可。

    这样在安全和效率高上就都能得到一定的提升。

如有错误,欢迎大家指正

好好学习,天天向上~~


此处添加一个修正,最初版原文中在proxy_pass后面我们使用了https+upstream的方式进行转发,但是在生产环境上发现使用https出现服务器502网关问题。

...
location /api {
proxy_pass https://apiServer;
proxy_cookie_domain apiServer a.test.com;
}
...

考虑到内网ip访问,不需要https,于是我们把https换成了http,问题解决。

Nginx实践--安全升级的更多相关文章

  1. 源码安装nginx以及平滑升级

                                                           源码安装nginx以及平滑升级                               ...

  2. nginx的平滑升级

    一:解释nginx的平滑升级 随着nginx越来越流行,并且nginx的优势也越来越明显,nginx的版本迭代也来时加速模式,1.9.0版本的nginx更新了许多新功能,例如stream四层代理功能, ...

  3. 【学习笔记】启动Nginx、查看nginx进程、查看nginx服务主进程的方式、Nginx服务可接受的信号、nginx帮助命令、Nginx平滑重启、Nginx服务器的升级

     1.启动nginx的方式: cd /usr/local/nginx ls ./nginx -c nginx.conf 2.查看nginx的进程方式: [root@localhost nginx] ...

  4. nginx的平滑升级,不间断服务

    nginx的平滑升级,不间断服务   Nginx更新真的很快,最近nginx的1.0.5稳定版,nginx的0.8.55和nginx的0.7.69旧的稳定版本已经发布.我一项比较喜欢使用新版本的软件, ...

  5. Nginx安装与升级(包括虚拟主机)

    Nginx WEB服务器最主要就是各种模块的工作,模块从结构上分为核心模块.基础模块和第三方模块,其中三类模块分别如下: 核心模块:HTTP模块.EVENT模块和MAIL模块等: 基础模块:HTTP ...

  6. 启动Nginx、查看nginx进程、nginx帮助命令、Nginx平滑重启、Nginx服务器的升级

    1.启动nginx的方式: cd /usr/local/nginx ls

  7. linux环境手动编译安装Nginx实践过程 附异常解决

    1.下载nginx源码包并解压 可在http://nginx.org/en/download.html下载.tar.gz的源码包,如(nginx-1.4.7.tar.gz) 或者使用云盘下载   ht ...

  8. 对nginx进行平滑升级

    1.查看服务器当前nginx版本 [root@instance-hwl9ix5l licenses]# nginx -v           #查看版本 nginx: nginx version: n ...

  9. Nginx入门安装升级

    1).Nginx ("engine x") 是一个高性能HTTP 和 反向代理 服务器.IMAP.POP3.SMTP 服务器. Nginx特点是占有内存少,并发能力强,事实上Ngi ...

随机推荐

  1. MVC应用程序使用jQuery接收Url的参数

    在这个练习<MVC应用jQuery动态产生数据>http://www.cnblogs.com/insus/p/3410138.html 中,学会了使用jQuery创建url链接,并设置了参 ...

  2. thinkphp save() 跟新失败

    一.失败案例 $data = I(); $rs = $this->typeModel->data($data)->save(); 二.正确案例 正确一 $rs=$this->t ...

  3. php表单中如何获取单选按钮与复选按钮的值(示例)

    转载:http://www.php.cn/php-weizijiaocheng-360027.html php代码中获取表单中单选按钮的值:(单选按钮只能让我们选择一个,这里有一个“checked”属 ...

  4. 233 Matrix(hdu5015 矩阵)

    233 Matrix Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  5. JAVA设计模式详解(二)----------观察者模式

    有一个模式可以帮助你的对象知悉现况,不会错过该对象感兴趣的事,对象甚至在运行时可以决定是否要继续被通知,如果一个对象状态的改变需要通知很多对这个对象关注的一系列对象,就可以使用观察者模式 .观察者模式 ...

  6. Liunx下配置网络

    1.首先查看一下自己的网络 ifconfig 我查看之后发现....没有eth0 ok,现在去 /etc/sysconfig/network-scripts 目录中查看是否有 ifcfg-et0 文件 ...

  7. HDU6197

    array array array Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  8. python学习之老男孩python全栈第九期_第一次周末考试题(over)第三次添加完毕

    day 6python基础数据类型考试题 考试时间:两个半小时 满分100分(80分以上包含80分及格) 一,基础题. 1. 简述变量命名规范(3分) 答:(1) 变量为数字,字母以及下划线的任意组合 ...

  9. CentOS 修改用户密码

    CentOS 修改用户密码 1.普通用户 ①获取超级用户root权限 命令:su 或者 su- 或者 su -root ②输入命令: passwd 用户名 ③输入新密码 2.超级用户 ①打开syste ...

  10. tar.xz文件的解压

    xz是绝大数linux默认就带的一个压缩工具. 压缩包xz格式的居然比7z还要小. 不过xz也有一个坏处就是压缩时间比较长,比7z压缩时间还长一些.不过压缩是一次性的,所以可以忽略. xz压缩文件方法 ...