自动化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合并文本文件示例
Feb 07 Python
Python中使用item()方法遍历字典的例子
Aug 26 Python
Python通过Pygame绘制移动的矩形实例代码
Jan 03 Python
Python3.6使用tesseract-ocr的正确方法
Oct 17 Python
Python数据预处理之数据规范化(归一化)示例
Jan 08 Python
Python语言检测模块langid和langdetect的使用实例
Feb 19 Python
python脚本当作Linux中的服务启动实现方法
Jun 28 Python
对Keras中predict()方法和predict_classes()方法的区别说明
Jun 09 Python
Python numpy矩阵处理运算工具用法汇总
Jul 13 Python
区分python中的进程与线程
Aug 13 Python
python 如何用map()函数创建多线程任务
Apr 07 Python
Python中re模块的元字符使用小结
Apr 07 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开发者常犯的10个MySQL错误更正剖析
2012/01/30 PHP
php判断是否为json格式的方法
2014/03/04 PHP
服务器迁移php版本不同可能诱发的问题
2015/12/22 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
2019/04/16 PHP
JavaScript 三种创建对象的方法
2009/10/16 Javascript
JavaScript 弹出窗体点击按钮返回选择数据的实现
2010/04/01 Javascript
JS 控制小数位数的实现代码
2011/08/02 Javascript
JQuery获取浏览器窗口内容部分高度的代码
2012/02/24 Javascript
jQuery对象和Javascript对象之间转换的实例代码
2013/03/20 Javascript
JS+CSS实现的经典圆角下拉菜单效果代码
2015/10/21 Javascript
利用CSS3在Angular中实现动画
2016/01/15 Javascript
jQuery页面加载初始化的3种方法(推荐)
2016/06/02 Javascript
详解angularJS动态生成的页面中ng-click无效解决办法
2017/06/19 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
vue 子组件向父组件传值方法
2018/02/26 Javascript
vue用递归组件写树形控件的实例代码
2018/07/19 Javascript
Vue源码解析之数据响应系统的使用
2019/04/24 Javascript
electron-vue开发环境内存泄漏问题汇总
2019/10/10 Javascript
vue实现购物车的监听
2020/04/20 Javascript
[02:52]2017DOTA2国际邀请赛中国区预选赛晋级之路
2017/07/03 DOTA
Python 专题三 字符串的基础知识
2017/03/19 Python
利用Python实现网络测试的脚本分享
2017/05/26 Python
Python实现使用request模块下载图片demo示例
2019/05/24 Python
python实现按行分割文件
2019/07/22 Python
Python input函数使用实例解析
2019/11/22 Python
Python调用.net动态库实现过程解析
2020/06/05 Python
通过实例解析python创建进程常用方法
2020/06/19 Python
Python如何爬取51cto数据并存入MySQL
2020/08/25 Python
css3学习之2D转换功能详解
2016/12/23 HTML / CSS
详解CSS3选择器:nth-child和:nth-of-type之间的差异
2017/09/18 HTML / CSS
高中地理教学反思
2014/01/29 职场文书
人民教师求职自荐信
2014/03/12 职场文书
分家协议书
2014/04/21 职场文书
《雕塑之美》教学反思
2014/04/24 职场文书
十佳护士先进事迹
2014/05/08 职场文书
公司承诺书怎么写
2014/05/24 职场文书