自动化Nginx服务器的反向代理的配置方法


Posted in Python onJune 28, 2015

 自动化Nginx服务器的反向代理的配置方法

如果可以减少过多的外部隔离的API和简化部署的细节 这会是非常好的。

在以前的文章中,我解释了"一些使用反向代理的好处"。在我目前的项目里,我们已经构建分布式面向服务的架构,也显式提供了一个HTTP API,我们使用反向代理将请求路由通过API路由给单个组件。我们选择了Nginx Web这个优秀的服务器作为我们的反向代理,它快速、可靠且易于配置。我们通过它将多个HTTP的API服务聚合到一个URL空间。举例来说,当你键入:

http://api.example.com/product/pinstripe_suit
它将被路由到:
http://10.0.1.101:8001/product/pinstripe_suit
但当你访问:
http://api.example.com/customer/103474783
它将被路由到:
http://10.0.1.104:8003/customer/103474783

对使用者来言,他们觉得是在使用同一个URL空间(http://api.example.com/blah/blah),但在后端不同的顶级分类的URL被路由到不同的后端服务器。 /prodect/...路由到 10.0.1.101:8001, /customer/…则路由到10.0.1.104:8003。 我们也希望这是自动配置。比如说我想创建一个新的组件来记录的库存水平。相比于扩展现有的组件,我更希望能够写另一个独立的可执行文件或提供服务的HTTP端点,然后自动部署成为我的云计算基础架构中的主机之一,并使Nginx的自动将http ://api.example.com/sock/whatever 路由我新组件。 我们也想进行 后端服务的负载平衡,我们也想部署我们的股票 新API的多个服务实例间的Nginx自动轮询。

我们称每个顶级分类(/stock、/produck、/customer)为一个声明。 A组件上线时通过RabbitMQ发布了一个'AddApiClaim'。此消息有3个字段:'声明','IP地址','端口地址'。我们有一个'ProxyAutomation'的特殊组件,这个组件接收这些消息并按要求重写Nginx配置项。它使用SSH和SCP登录到nginx服务器,传输各种配置文件,并指示Nginx的重新加载配置。我们使用the excellent SSH.NET库来进行自动化。

Nginx的配置是一个非常好的事情是支持通配符。看一看我们的顶级配置文件:
 

...

 

 http {

 

     include       /etc/nginx/mime.types;

 

     default_type  application/octet-stream;

 

   

 

     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

 

                       '$status $body_bytes_sent "$http_referer" '

 

                       '"$http_user_agent" "$http_x_forwarded_for"';

 

   

 

     access_log  /var/log/nginx/access.log  main;

 

   

 

     sendfile        on;

 

     keepalive_timeout  65;

 

   

     include /etc/nginx/conf.d/*.conf;

 

 }

如16行所描述, 将conf.d目录的所有.conf引用到此处.

在conf.d文件夹内,有一个文件包含了所有api.example.com的请求配置:
 

include     /etc/nginx/conf.d/api.example.com.conf.d/upstream.*.conf;

 

   

 

 server {

 

     listen          80;

 

     server_name     api.example.com;

 

   

 

     include         /etc/nginx/conf.d/api.example.com.conf.d/location.*.conf;

 

   

 

     location / {

 

         root    /usr/share/nginx/api.example.com;

 

         index   index.html index.htm;

 

     }

 

 }

这段配置让 Nginx 侦听来自 80 端口的 api.example.com 的请求。

这里包括两部分。第一个部分是第一行,我将在以后讨论。第7行表述了将子目录"api.example.com.conf.d"中的location.*.conf引用到配置中来。我们代理服务器的自动化组件添加新的组件(AKA API claims)通过引入新的location.*.conf。举个例子,我们的股票组件可能创建一个location.stock.conf配置文件,像这样:
 

location /stock/ {

 

     proxy_pass http://stock;

 

 }

这只是简单的告诉Nginx将所有api.example.com/stock/…的代理请求转发到'stock'中定义的后端服务器,这些定义存放在'upstream.*.conf'中。代理自动化组件也引入了一个名为upstream.stock.conf文件,它看起来像这样:
 

upstream stock {

 

    server 10.0.0.23:8001;

 

    server 10.0.0.23:8002;

 

}

这些配置告诉Nginx将所有到api.example.com/stock/的请求轮询到给定的地址,在这个例子中两个实例在同一台机器(10.0.0.23)上,一个在8001端口,一个在8002端口。
 

正如股票组件的部署一样,添加新条目可以同样增加到upstream.stock.conf中。同样,当组件卸载时,只要删除对应条目就可以了,当所有组件移除时,将整个文件已就删除。

这种基础架构可以让我们聚合组件的基础设备。我们可以 通过简单地添加新的组件实例来扩展应用程序。作为组件开发人员也不需要做任何代理配置,只需要确保组件发送了添加或删除API声明的消息就可以了。

Python 相关文章推荐
Python标准库之sqlite3使用实例
Nov 25 Python
举例讲解Python的lambda语句声明匿名函数的用法
Jul 01 Python
Python实现的概率分布运算操作示例
Aug 14 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
Sep 30 Python
详解Python在使用JSON时需要注意的编码问题
Dec 06 Python
Python异常原理及异常捕捉实现过程解析
Mar 25 Python
opencv-python的RGB与BGR互转方式
Jun 02 Python
Python利用matplotlib绘制折线图的新手教程
Nov 05 Python
快速创建python 虚拟环境
Nov 28 Python
Python用户自定义异常的实现
Dec 25 Python
利用Python第三方库实现预测NBA比赛结果
Jun 21 Python
python 字典和列表嵌套用法详解
Jun 29 Python
python读取TXT到数组及列表去重后按原来顺序排序的方法
Jun 26 #Python
在Python中使用zlib模块进行数据压缩的教程
Jun 26 #Python
Python中的zipfile模块使用详解
Jun 25 #Python
Python实现保证只能运行一个脚本实例
Jun 24 #Python
Python中的默认参数详解
Jun 24 #Python
Python中的下划线详解
Jun 24 #Python
Python装饰器使用实例:验证参数合法性
Jun 24 #Python
You might like
PHP Curl出现403错误的解决办法
2014/05/29 PHP
ThinkPHP中调用PHPExcel的实现代码
2017/04/08 PHP
javascript中的location用法简单介绍
2007/03/07 Javascript
javascript表单验证使用示例(javascript验证邮箱)
2014/01/07 Javascript
Javascript仿PHP $_GET获取URL中的参数
2014/05/12 Javascript
JavaScript中this关键词的使用技巧、工作原理以及注意事项
2014/05/20 Javascript
IE6兼容透明背景图片及解决方案
2015/08/19 Javascript
使用NodeJs 开发微信公众号(三)微信事件交互实例
2016/03/02 NodeJs
bootstrap模态框实现拖拽效果
2016/12/14 Javascript
nodejs中模块定义实例详解
2017/03/18 NodeJs
vue.js开发环境搭建教程
2017/05/04 Javascript
vue绑定设置属性的多种方式(5)
2017/08/16 Javascript
JavaScript实现音乐自动切换和轮播
2017/11/05 Javascript
jQuery实现简单的下拉菜单导航功能示例
2017/12/07 jQuery
详解vue mixins和extends的巧妙用法
2017/12/20 Javascript
基于vue-simplemde实现图片拖拽、粘贴功能
2018/04/12 Javascript
layui获取选中行数据的实例讲解
2018/08/19 Javascript
ng-repeat指令在迭代对象时的去重方法
2018/10/02 Javascript
JavaScript常见鼠标事件与用法分析
2019/01/03 Javascript
vue基础之事件v-onclick="函数"用法示例
2019/03/11 Javascript
详解Vue源码学习之双向绑定
2019/04/10 Javascript
vue2.0自定义指令示例代码详解
2019/04/25 Javascript
JS自定义对象创建与简单使用方法示例
2020/01/15 Javascript
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
Python 爬虫爬取指定博客的所有文章
2016/02/17 Python
Python脚本实现12306火车票查询系统
2016/09/30 Python
用Python解决x的n次方问题
2019/02/08 Python
python实现顺时针打印矩阵
2019/03/02 Python
python-tkinter之按钮的使用,开关方法
2019/06/11 Python
解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题
2020/04/20 Python
Monnier Freres中文官网:法国领先的奢侈品配饰在线零售商
2017/11/01 全球购物
正规的求职信范文分享
2013/12/11 职场文书
药品营销专业毕业生自荐信
2014/07/02 职场文书
群众路线教育实践活动总结
2014/10/30 职场文书
护士自我推荐信范文
2015/03/24 职场文书
2015国庆66周年宣传语
2015/07/14 职场文书