自动化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计算三角函数之acos()方法的使用
May 15 Python
Python中常见的数据类型小结
Aug 29 Python
详解Python命令行解析工具Argparse
Apr 20 Python
Python 登录网站详解及实例
Apr 11 Python
python自动化脚本安装指定版本python环境详解
Sep 14 Python
Python实现的堆排序算法原理与用法实例分析
Nov 22 Python
详解Python requests 超时和重试的方法
Dec 18 Python
由Python编写的MySQL管理工具代码实例
Apr 09 Python
六行python代码的爱心曲线详解
May 17 Python
Python模拟登入的N种方式(建议收藏)
May 31 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
Jul 03 Python
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
May 21 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批量更改数据库表前缀实现方法
2013/10/26 PHP
php输出1000以内质数(素数)示例
2014/02/16 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
2017/03/28 PHP
thinkPHP5实现的查询数据库并返回json数据实例
2017/10/23 PHP
javascript的函数、创建对象、封装、属性和方法、继承
2011/03/10 Javascript
jquery+json实现数据列表分页示例代码
2013/11/15 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
java和javascript获取word文档的书签位置对比
2014/06/19 Javascript
innerHTML在IE中报错解决方案
2014/12/15 Javascript
浅谈jQuery中Ajax事件beforesend及各参数含义
2016/12/03 Javascript
微信小程序 UI布局常用技巧整理总结
2016/12/05 Javascript
vue 2.0组件与v-model详解
2017/03/27 Javascript
基于layer.js实现收货地址弹框选择然后返回相应的地址信息
2017/05/26 Javascript
JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例
2019/01/29 Javascript
Vue 动态组件与 v-once 指令的实现
2019/02/12 Javascript
深入探讨JavaScript的最基本部分之执行上下文
2019/02/12 Javascript
vue实现商城秒杀倒计时功能
2019/12/12 Javascript
JavaScript图片旋转效果实现方法详解
2020/06/28 Javascript
[03:39]2015国际邀请赛主赛事首日精彩回顾
2015/08/05 DOTA
[01:06]DOTA2小知识课堂 Ep.01 TP出门不要忘记帮队友灌瓶哦
2019/12/05 DOTA
[48:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第二场 1月29日
2021/03/11 DOTA
简单介绍Ruby中的CGI编程
2015/04/10 Python
python使用turtle库绘制树
2018/06/25 Python
12个Python程序员面试必备问题与答案(小结)
2019/06/24 Python
python连接、操作mongodb数据库的方法实例详解
2019/09/11 Python
Python安装及Pycharm安装使用教程图解
2019/09/20 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
2019/10/28 Python
python实现修改固定模式的字符串内容操作示例
2019/12/30 Python
利用python汇总统计多张Excel
2020/09/22 Python
SQL Server提供的3种恢复模型都是什么? 有什么区别?
2012/05/13 面试题
经济与贸易专业应届生求职信
2013/11/19 职场文书
最新大学职业规划书范文
2013/12/30 职场文书
文化活动实施方案
2014/03/28 职场文书
程序员求职信
2014/04/16 职场文书
四风问题专项整治工作情况报告
2014/10/28 职场文书
小班下学期个人总结
2015/02/12 职场文书