利用 NGINX 最大化 Python 性能,第二部分:负载均衡和监控
【编者按】本文主要介绍 NGINX 的主要功能以及如何通过 Nginx 优化 Python 应用性能。本文系国内 ITOM 管理平台 OneAPM 编译呈现。
本文上一篇系: 利用 NGINX 最大化 Python 性能,第一部分:Web 服务和缓存。
Python 以其高性能脚本语言而著称,而 NGINX 则能够通过增加代码的实际执行速度来提供助力。对于单一服务器来说,如果网页的一半由静态文件组成(很多网页都有一半由静态文件组成),增加静态文件缓存可使这类网页性能翻倍,缓存动态应用程序内容能够进一步提升应用程序性能。
但这种方法并不是对所有应用都受用,或者说提升的性能不足够。这时就要考虑横向扩展了---迁移到多服务器应用。多服务器应用不仅功能强大、使用灵活、几乎能够无限扩展,而且成本较低。让我们继续前面的优化 Python 性能。
技巧 6---将 NGINX 作为反向代理服务器
从单服务器环境来讲,部署反向代理服务器似乎是个很大的进步,因为这一部署非常简单,实现的功能却相当强大。添加反向代理服务器后,不仅性能立即得到大幅提升,还有机会实现:
- 增强性能 --- 在现有的 Python 应用程序前放置一个 NGINX 服务器。无需更改 Web 服务器软件或配置。现有的 Web 服务器和应用程序服务器相结合并在一个冒泡中运行,无法直接接触网络流量,由反向代理服务器提出填鸭式请求。
- 优化性能 --- 按照我们上一篇介绍 Python 的文章,针对应用程序生成的文件实施静态文件缓存和微应用缓存。但现在,我们要在新的反向代理服务器而不是应用程序服务器上实施。运行应用程序的服务器明显减轻了工作负载,这样就扩充了应用程序的容量,让所有用户都能感受到更高性能。
- 横向扩展 — 增加更多应用程序服务器并对其实施负载均衡,利用持续会话实现每位用户的连贯体验。
- 赋予高可用性 — 让你的反向代理服务器镜像到在线备份,同时拥有备用的应用程序服务器,让你的站点高度可用。
- 监控与管理 — NGINX Plus 提供了高级监测与管理功能,同时配备主动体检 —— 如果设定了主动体检,反向代理服务器会主动向各个服务器发出带外请求,核实各个服务器的可用性。

技巧 7---重写 URL
Web 服务器配置通常包括 URL 重写规则。你可以制作美观的 URL 方便用户理解,也可以让 URL 在资源迁移后仍然不变。
NGINX 配置(包括重写 URL)使用的指令数量较少,也被众多人士认为是简单明了。但如果不熟悉,使用前还是要经历一个学习过程。可以把 Creating NGINX Rewrite Rules 这篇文章当做介绍。
下面给出一个使用重写指令的 NGINX 重写规则样板。此规则查找了以 /download开头的 URL,之后还在路径中包含 /media/ 或 /audio/ 目录。此规则用 /mp3/ 替换这些元素,并增加合适的文件扩展名 .mp3 或 .ra。变量 (1 和 )2 获取保持不变的路径元素。例如,/download/cdn-west/media/file1 变成 /download/cdn-west/mp3/file1.mp3。
server {
...
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
return 403;
...
}
要在 NGINX 中实现类似 Apache 的效果,你可以在第一个服务器块中匹配短 URL 的请求,然后把它们重定向到匹配长 URL 的第二个服务器块。
# USE THIS CONVERSION
server {
listen 80;
server_name example.org;
return 301 http://www.example.org$request_uri;
}
server {
listen 80;
server_name www.example.org;
...
}
技巧 8---实施负载均衡
扩充网站容量、提高网站可用性的终极办法就是运行多台应用程序服务器并实施负载均衡。

配备 NGINX 的负载均衡 PHP 服务器,要实现 NGINX 负载均衡,首先用你需要均衡的各个服务器来创建一个服务器群组。然后编写配置代码,代码包括服务器权重---如果服务器的处理能力较强,请给它分配较大的权重,给它送去更多流量。
upstream stream_backend {
server backend1.example.com:12345 weight=5;
server backend2.example.com:12345;
server backend3.example.com:12346;
}
技巧 9---启用会话持续性和会话耗尽
网络默认用于无状态交互;如果需要特定状态的信息,可以通过若干方法来实施。如果状态位于应用程序服务器上,就得让这台服务器在会话期间处理指定用户的所有请求,这就叫做会话持续。
要管理多个负载均衡的服务器,会话耗尽是一项有效工具。利用 NGINX Plus在一台服务器上的上游群组中设置耗尽参数,NGINX Plus 会让这台服务器放松下来,不会给它发送新的请求,而是让现有连接继续下去,直到会话结束。
技巧 10---启用监控和管理功能
如果服务器配置较为复杂,在保持高性能和避免宕机时,监测和管理就变得尤其重要。监控 NGINX 状态页,在服务器可能遇到麻烦时通知用户,让用户监测自己的系统,根据信息在问题发生前采取行动。
NGINX 提供了一个内置控制面板来监测 NGINX 服务器的健康状况。你可以收集 NGIGX 面板数据确定每台特定服务器是否有问题。

结论
Python 创建的网站要能够同时吸引众多用户,那就需要强大的性能支持,如果你采用的是 Nginx 做 Web 服务器,可以从上面10个方面来优化性能。
OneAPM 能够帮你实现 Python 应用层面代码级监控,也能够实现 Nginx 等基础组件等监控。想阅读更多技术文章,请访问 OneAPM 官方技术博客。
本文转自 OneAPM 官方博客
原文地址:Maximizing Python Performance with NGINX, Part II: Load Balancing and Monitoring
利用 NGINX 最大化 Python 性能,第二部分:负载均衡和监控的更多相关文章
- 利用 NGINX 最大化 Python 性能,第一部分:Web 服务和缓存
[编者按]本文主要介绍 nginx 的主要功能以及如何通过 NGINX 优化 Python 应用性能.本文系国内 ITOM 管理平台 OneAPM 编译呈现. Python 的著名之处在于使用简单方便 ...
- (转载)Nginx/LVS/HAProxy三种主流负载均衡软件的对比
原地址:http://www.ha97.com/5646.html PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些 ...
- Nginx代理与反向代理、负载均衡实
通过 Nginx 提供的反向代理和负载均衡功能,可以合理的完成业务的分配,提高网站的处理能力:同时利用缓存功能,还可以将不需要实时更新的动态页面输出结果,转化为静态网页形成缓存,从而提高网站的响应速度 ...
- LVS + keepalived + nginx + tomcat 实现主从热备 + 负载均衡
前言 首先声明下,由于这两天找资料,看了不少博客 ,但是出于不细心,参考者的博客地址没有记录下来,所有文中要是出现了与大家博客相同的地方,那么请大家在评论区说明并附上博客地址,我好引用进来:这里表示抱 ...
- nginx之rewrite重写,反向代理,负载均衡
rewrite重写(伪静态): 在地址栏输入xx.com/user-xxx.html, 实际上访问的就是xxx.com/user.php?id=xxx rewrite就这么简单 附上ecshop re ...
- Nginx代理与反向代理、负载均衡实践
通过 Nginx 提供的反向代理和负载均衡功能,可以合理的完成业务的分配,提高网站的处理能力;同时利用缓存功能,还可以将不需要实时更新的动态页面输出结果,转化为静态网页形成缓存,从而提高网站的响应速度 ...
- nginx作反向代理,实现负载均衡
nginx作反向代理,实现负载均衡按正常的方法安装好 ngixn,方法可参考http://www.cnblogs.com/lin3615/p/4376224.html其中作了反向代理的服务器的配置如下 ...
- Nginx + Memcached 实现Session共享的负载均衡
session共享 我们在做站点的试试,通常需要保存用户的一些基本信息,比如登录就会用到Session:当使用Nginx做负载均衡的时候,用户浏览站点的时候会被分配到不同的服务器上,此时如果登录后Se ...
- nginx的概念与几种负载均衡算法
Nginx的背景 Nginx和Apache一样都是一种WEB服务器.基于REST架构风格,以URI(Uniform Resources Identifier,统一资源描述符)或URL(Uniform ...
随机推荐
- C# 基元类型
C#编程中,初始化一个整数有两种方式: (1).较繁琐的方法,代码如下: Int32 a = new Int32(); (2).极简的方法,代码如下: ; 对比两种方法,分析如下: 第一种:过于繁琐, ...
- Redis-cli命令总结
连接操作相关的命令 默认直接连接 远程连接-h 192.168.1.20 -p 6379 ping:测试连接是否存活如果正常会返回pong echo:打印 select:切换到指定的数据库,数据库索 ...
- Ruby on Rails Mountable vs. Full Engine
原文 :https://www.travisluong.com/ruby-on-rails-mountable-vs-full-engine/一个Rails Engine 本质是一个 Rails ap ...
- centos6 free 和 centos 7的free 的差异与对比
目录 一 centos6 free 常用参数和含义 centos6 free 命令示例 free 值讲解 计算公式 二 centos7 free 常用的参数 centos7 free 命令示例 计算公 ...
- MySQL查看所有视图的命令
有时为了查看特定数据库中所建立的所有视图,可以使用这个命令: 因为,视图其实就是一张虚拟的表,所有也可以认为是一张表,所有是 show table, 而它由于普通的表有所不同,所以有 status ...
- 重置Root用户密码
在忘记root用户密码是用于重置root用户密码: 1.开机按e. 2.在linux16开头的一行的末尾添加rd.break,按ctrl+x. 3.依次执行命令: mount -o remount,r ...
- hadoop学习笔记(九):MapReduce程序的编写
一.MapReduce主要继承两个父类: Map protected void map(KEY key,VALUE value,Context context) throws IOException, ...
- vue-webpack 做出来的项目部署到服务器上,点开是空白页(我这里把项目发布到git上)
总结1: 从网上下的很多demo,用npm run dev 就可以启动项目,比如:vue-cli,为什么?因为vue-cli自动帮我们安装了express服务器. 总结2: npm run dev 是 ...
- 【转】Visio绘制WEB流程图的心得
一个哥们在MSN上告诉我,他们公司的交互设计师只产出流程图,并问我用什么标准评价流程图的好坏.他的说法把我彻底震了-这分工也太细了吧!也不知道该说他们那里这样是好还是不好. 不过仔细想来,我倒的确没有 ...
- [转]How to Import a Text File into SQL Server 2012
Importing a using the OpenRowSet() Function The OPENROWSET bulk row set provider is accessed by call ...