自动化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实现设置windows桌面壁纸代码分享
Mar 28 Python
python通过ftplib登录到ftp服务器的方法
May 08 Python
java中两个byte数组实现合并的示例
May 09 Python
对TensorFlow中的variables_to_restore函数详解
Jul 30 Python
在python中利用GDAL对tif文件进行读写的方法
Nov 29 Python
python实现桌面壁纸切换功能
Jan 21 Python
Python列表(List)知识点总结
Feb 18 Python
教你如何编写、保存与运行Python程序的方法
Jul 12 Python
使用django的ORM框架按月统计近一年内的数据方法
Jul 18 Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
Aug 12 Python
python批量将excel内容进行翻译写入功能
Oct 10 Python
python自动化调用百度api解决验证码
Apr 13 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
一些星际专用术语解释
2020/03/04 星际争霸
PHP最常用的ini函数分析 针对PHP.ini配置文件
2010/04/22 PHP
php递归调用删除数组空值元素的方法
2015/04/28 PHP
详解PHP防止直接访问.php 文件的实现方法
2017/07/28 PHP
Aster vs KG BO3 第一场2.19
2021/03/10 DOTA
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
javascript动态加载三
2012/08/22 Javascript
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
2013/02/01 Javascript
dwz 如何去掉ajaxloading具体代码
2013/05/22 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
超赞的jQuery图片滑块动画特效代码汇总
2016/01/25 Javascript
基于JS实现移动端访问PC端页面时跳转到对应的移动端网页
2020/12/24 Javascript
jQuery DataTables插件自定义Ajax分页实例解析
2020/04/28 Javascript
Bootstrap框架下下拉框select搜索功能
2020/03/26 Javascript
js实现按钮开关单机下拉菜单效果
2018/11/22 Javascript
微信小程序五子棋游戏的悔棋实现方法【附demo源码下载】
2019/02/20 Javascript
[43:14]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
Python3 正在毁灭 Python的原因分析
2014/11/28 Python
Python中使用第三方库xlrd来写入Excel文件示例
2015/04/05 Python
Python面向对象之继承和组合用法实例分析
2018/08/27 Python
Python中字符串与编码示例代码
2019/05/20 Python
Python数学形态学实例分析
2019/09/06 Python
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
Airbnb爱彼迎官网:成为爱彼迎房东,赚取收入
2019/03/14 全球购物
美国手工艺品市场的领导者:Annie’s
2019/04/04 全球购物
The Outnet亚太地区:折扣设计师时装店
2019/12/05 全球购物
简历里的自我评价
2014/01/31 职场文书
草船借箭教学反思
2014/02/03 职场文书
有趣的广告词
2014/03/18 职场文书
企业安全生产责任书
2014/04/14 职场文书
超市理货员岗位职责
2014/07/04 职场文书
中学教代会开幕词
2016/03/04 职场文书
经典格言警句:没有热忱,世间便无进步
2019/11/13 职场文书
python实现web邮箱扫描的示例(附源码)
2021/03/30 Python
Win11 vmware不兼容怎么办?Win11与VMware虚拟机不兼容的解决方法
2023/01/09 数码科技