之前的文章介绍了许多我们在用的DevOps相关的工具系统,例如:方便创建多套运行环境的Alodi对运维友好的配置中心Kerrigan强大的自定义任务引擎Probius以及专注于数据库自动化的overmind等等,这篇文章介绍一个非常简单但却十分好用的系统,Proxy代理管理系统

代理系统类似于Kubernetes里Ingress的角色,位于下层服务与上层用户之间,作用与公有云的负载均衡LB一致,基于Nginx构建,主要使用Upstream模块

系统由来

为什么会需要这么个系统?来讲讲我们的场景和逻辑

每个项目都需要开发测试环境,这些环境都部署在公司内网,而很多项目因为各种原因都需要外网能访问的到,例如小程序/公众号/支付相关的项目都需要接收微信支付宝的回调,这种需求通常有两种方式来实现

  1. 直接给开发测试环境所在的主机配置个公网IP,域名指向这个公网IP
  2. 搭建一个代理服务器,所有的请求都先到这个代理服务器,然后根据域名转发到不同的项目环境

对于方案1,优点在于实现简单,但缺点更为明显,首先公网IP资源有限,其次管理也不方便,只适合一些项目不多的小团队。方案2则更为常用,只需要一个公网IP,将所有需要外网访问的项目入口集中在一起,管理起来也更为方便

我们刚开始就是找了台服务器部署Nginx做代理,如果需要代理服务就去修改Nginx配置文件,但随着项目越来越多,修改Nginx配置文件也成了麻烦事,效率低下、修改冲突、不可追踪成了急需问题,于是便开发了这个Proxy代理系统,到目前为止稳定运行3年,管理了400+代理

系统介绍

系统的核心功能就是要通过web去提交配置然后自动生成Nginx配置文件,除了用户管理这种通用模块外主要分三大块的内容:实例管理,证书管理和黑白名单,每一个实例都指的是一个代理服务,对应Nginx中的一个Server,实例关联证书和黑白名单,这里先介绍一下证书和黑白名单模块

证书模块可以用来管理所有用到的HTTPS证书,每一个证书都会在服务器上创建对应的crt和key文件,方便在实例中引用,对于证书的更新也只需要更新这一个地方就可以了,更新完成之后会自动reload以保证生效

黑白名单模块对应与Nginx的ACL设置,通过allow和deny来实现黑名单禁止访问,白名单允许访问,原理与证书管理差不多,都是根据输入内容生成对应的文件保存到服务器上,生成配置文件用到了jinja2,我的博客也是同样的方法生成的,可以看这篇文章来了解:利用Django徒手写个静态页面生成工具,黑白名单最终在实例里以include的方式引入

无论是证书还是黑白名单最终都是为实例也就是Nginx的Server服务的,对于作为代理的Server配置很简单,下方是一个模板

upstream 11 {
server 192.168.106.110:80;
} server {
listen 443;
server_name blog.ops-coffee.cn ; ssl on;
ssl_certificate ssl/1.crt;
ssl_certificate_key ssl/1.key; include acl/1.conf;
include acl/3.conf;
deny all; auth_basic "please input user&passwd";
auth_basic_user_file key/11.key; location / {
proxy_pass http://11;
} access_log /home/logs/nginx/11.log main;
}

从这个模板里可以看出,我们大概需要如下一些信息,域名server_name、开放端口listen、是否开启ssl以及SSL的证书和密钥、是否有acl白名单以及白名单的地址、是否需要auth_base认证以及账号密码这几类信息,于是对于新建实例我们就需要如下这些信息

根据平时的使用经验,可能有多个域名使用同一个代理,所以提交的数据还有个别名。同时高级配置里还支持用户输入自定义的Nginx配置,这些自定义的Nginx配置会自动填充到Server中,这样就能方便的实现更加复杂的需求,例如修改上传文件大小限制、开启websocket支持、甚至是根据URI的代理等

对于实例更多的信息可以在实例详情页面查看

注意右上角有个“日志”按钮,系统还集成了查看日志的功能,通过websocket去监听日志文件,实时的输出到页面上,方便排错,Websocket实时获取日志文件之前写过一篇文章有介绍,可以点这个链接查看,不过我在Proxy里使用的有所简化,没有用到Celery,更轻便

额外收获

Proxy原本用来管理需要对外开放访问的项目,但为了统一的管理,逐渐的把所有的代理都迁移进了Proxy,这样做不仅管理起来更为方便,而且无形中还提供了一个查询团队所有域名的入口,团队现在维护了超过100+项目,并不是每个人都能准确的记住每个项目各个环境的域名,而通过Proxy就可以方便的查询

在Proxy应用后,对于域名的管理也简单了不少,原本DNS上有几百条xxx.ops-coffee.cn的域名分别指向了不同的IP,现在也简单多了,只需要创建一条*.ops-coffee.cn的泛域名解析指向到Proxy的地址即可

Proxy虽然是个非常简单的小工具,但带来的便利却并不简单~

Proxy:简单小巧又强大好用的代理系统的更多相关文章

  1. 使用Sublime text 3打造一个小巧但强大的Go语言开发IDE

    版权声明:欢迎转载,转载请注明出处! https://blog.csdn.net/iTaacy/article/details/76716049 使用Sublime text 3打造一个小巧但强大的G ...

  2. 插件介绍 :cropper是一款使用简单且功能强大的图片剪裁jQuery插件。

    简要教程 cropper是一款使用简单且功能强大的图片剪裁jQuery插件.该图片剪裁插件支持图片放大缩小,支持鼠标滚轮操作,支持图片旋转,支持触摸屏设备,支持canvas,并且支持跨浏览器使用. c ...

  3. Victor 串口 VCL 控件 - 简单实用, 功能强大的 C++ Builder 串口控件!

    源:Victor 串口 VCL 控件 - 简单实用, 功能强大的 C++ Builder 串口控件! 2014年02月06日发布控件的重要更新版本: Victor 串口控件 1.5.0.2 版本 (包 ...

  4. 一个简单小巧的CSV读取类

    最近在基于亚马逊MWS API做一些服务,需要读取亚马逊返回的报表,是一个按照\t分割的文本,所以就封装了一个简单小巧的CsvReader类 使用方法 使用方法非常简单,只需要传递一个stream子类 ...

  5. Spring Cloud Gateway简单入门,强大的微服务网关

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 见名知义,Spring Cloud Gateway是用于微服务场景的网关组件,它是基于Spring WebFlu ...

  6. 一款简单而不失强大的前端框架——【Vue.js的详细入门教程①】

    ↓— Vue.js框架魅力 —↓ 前言       Vue.js 是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件.V ...

  7. 就这么简单!构建强大的WebShell防护体系

    接触web安全中,例如上传一句话WebShell实现上传文件的功能,再通过上传的多功能WebShell,执行病毒文件最终创建远程连接账号,达到入侵目标服务器的效果.我们可以看到,webshell在整个 ...

  8. jquery函数$.proxy简单示例

    来自于<jquery 权威指南> ------------------------------ <!DOCTYPE html PUBLIC "-//W3C//DTD XHT ...

  9. es6 Proxy简单使用

    es6的Proxy是什么? 可以理解为,是在访问对象前的一层拦截.只要访问的该对象,就要通过这个一层拦截.这一层的拦截,可以进行数据的过滤和更改 比如下面这个 var p = new Proxy({} ...

随机推荐

  1. cmd 命令行

    理想的情况下,所有的程序都能自描述, 比如 mysql -h,支持哪些命令,每项命令需要哪些参数 命令行工具有几个有关进程的命令, tasklist taskkill http://hi.baidu. ...

  2. JavaScript变量污染

    定义过多的全局变量,有可能造成全局变量冲突,这种现象称为变量污染. 全局变量在全局作用域内外都是可见的.若是已经声明了一个全局变量,再以相同的关键字和标识符重新声明全局变量,后者的赋值会替代前者的赋值 ...

  3. 七:Redis的持久化

    1.RDB(Redis DataBase) 1.1 定义:在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的snapshot快照,他恢复时是将快照文件直接读到内存里 是什么:Redis会单 ...

  4. 检查linux下服务器的带宽

    设想:公司 A 有一个名为 bsdocfs 的存储服务器,并通过名为 beckham 的客户端节点装载 NFS.公司 A 确定他们需要从 bsdocfs得到更多的带宽,因为有大量的节点需要访问 bsd ...

  5. Redis实现分布式缓存

    Redis 分布式缓存实现(一) 1. 什么是缓存(Cache) 定义:就是计算机内存中的一段数据: 2. 内存中数据特点 a. 读写快    b. 断电立即丢失 3. 缓存解决了什么问题? a. 提 ...

  6. 精尽 MyBatis 源码分析 - MyBatis 初始化(一)之加载 mybatis-config.xml

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  7. Spring Cloud Security OAuth2.0 认证授权系列(一) 基础概念

    世界上最快的捷径,就是脚踏实地,本文已收录[架构技术专栏]关注这个喜欢分享的地方. 前序 最近想搞下基于Spring Cloud的认证授权平台,总体想法是可以对服务间授权,想做一个基于Agent 的无 ...

  8. 新鲜出炉!花了三天整理的JVM复习知识点,面试突击必备!

    此次JVM知识点包含以下几个部分 1.类加载机制 2.jvm运行时数据区 3.java对象内存布局 4.jvm内存模型 5.垃圾回收机制 6.垃圾收集器 7.问题排查 一 类加载机制 主要说的部分是这 ...

  9. Camtasia中对录制视频进行编辑——旁白

    相信很多人都遇见过想要录制视频,但是不知道在电脑上用哪一款软件比较好,害怕自己录的视频导出来之后会有水印,或者在录制的过程中遇到麻烦,更或者下载一款带有病毒的软件.那么今天我便给大家推荐一款专业录制屏 ...

  10. 巧妙使用MindManager图像功能,能够让你的思维导图更精彩

    MindManager是一款多功能思维导图工具软件,有其他软件无法媲美的项目管理和商业规划高级功能.用户们制作思维导图时一定要注意图文并茂,单纯的文字会过于单调.所以接下来,小编就为大家详细介绍Min ...