SlideShare a Scribd company logo
 
高性能 Web 服务器 Nginx 及相关新技术的应用实践 北京金山软件 逍遥网 张宴 2009.10
什么是 Nginx ? Nginx (“engine x”)  是俄罗斯人 Igor Sysoev( 塞索耶夫 ) 编写的一款高性能的  HTTP  和反向代理服务器。 Nginx  已经在俄罗斯最大的门户网站──  Rambler Media ( www.rambler.ru )上运行了 4 年时间,同时俄罗斯超过 20% 的虚拟主机平台采用 Nginx 作为反向代理服务器。 在国内,已经有新浪博客、新浪播客、搜狐通行证、网易新闻、网易博客、金山逍遥网、金山爱词霸、校内网、 YUPOO 相册、豆瓣、迅雷看看等多家网站、频道使用  Nginx  服务器。
Nginx 的优点① 1 、高并发连接: 官方测试能够支撑 5 万并发连接,在实际生产环境中跑到 2 ~ 3 万并发连接数。 2 、内存消耗少: 在 3 万并发连接下,开启的 10 个 Nginx  进程才消耗 150M 内存( 15M*10=150M )。 3 、配置文件非常简单: 风格跟程序一样通俗易懂。 4 、成本低廉: Nginx 为开源软件,可以免费使用。而购买 F5 BIG-IP 、 NetScaler 等硬件负载均衡交换机则需要十多万至几十万人民币。
Nginx 的优点② 5 、支持 Rewrite 重写规则: 能够根据域名、 URL 的不同,将  HTTP  请求分到不同的后端服务器群组。 6 、内置的健康检查功能: 如果  Nginx Proxy  后端的某台  Web  服务器宕机了,不会影响前端访问。 7 、节省带宽: 支持  GZIP  压缩,可以添加浏览器本地缓存的  Header  头。 8 、稳定性高: 用于反向代理,宕机的概率微乎其微。
单台 Nginx 支撑了高达 2.8 万的活动并发连接数 2009-09-03 14:30 ,金山游戏《剑侠情缘网络版 3 》临时维护 1 小时,大量玩家上官网,论坛、评论、客服等动态应用 Nginx 服务器集群,每台服务器的 Nginx 活动连接数达到 2.8 万,这是本人遇到的 Nginx 生产环境最高并发值。
Nginx 的主要应用类别 1 、使用  Nginx  结合 FastCGI 运行  PHP 、 JSP  、 Perl 等程序 2 、使用  Nginx  作反向代理、负载均衡、规则过滤 3 、使用  Nginx  运行静态 HTML 页、图片 4 、 Nginx 与其他新技术的结合应用
Nginx 在金山逍遥网中的应用案例 金山逍遥网 (xoyo.com) 是金山游戏官方网站,为金山软件旗下的各款游戏提供新闻资讯、客户服务、在线充值、视听互动、在线活动、博客、相册、论坛、玩家社区等内容建设和在线服务支持。
金山逍遥网 Nginx 七层负载均衡的应用
Nginx 承担每个机房 Web 负载均衡服务
简单的 Nginx 负载均衡配置① ……  upstream bbs_server_pool { server  192.168.1.15:80 weight=1 max_fails=2 fail_timeout=30s; server  192.168.1.16:80 weight=1 max_fails=2 fail_timeout=30s; server  192.168.1.17:80 weight=1 max_fails=2 fail_timeout=30s; server  192.168.1.18:80 weight=1 max_fails=2 fail_timeout=30s; }  …… 在 nginx.conf 配置文件中,用 upstream 指令定义一组反向代理 / 负载均衡后端服务器池。
简单的 Nginx 负载均衡配置② ……  server{ listen 80; server_name  bbs.yourdomain.com *.bbs.yourdomain.com; location / { proxy_pass http://bbs_server_pool; proxy_set_header Host  $host; proxy_set_header X-Forwarded-For  $remote_addr; } access_log off; } ……
简单的 Nginx 负载均衡配置③ proxy_pass http://bbs_server_pool;  用于指定反向代理的服务器池。 proxy_set_header Host  $host;  当后端 Web 服务器上也配置有多个虚拟主机时,需要用该 Header 来区分反向代理哪个主机名。 proxy_set_header X-Forwarded-For  $remote_addr;  如果后端 Web 服务器上的程序需要获取用户 IP ,请从该 Header 头获取。
Nginx 负载均衡的双机热备
通常情况下的负载均衡 HA 高可用 优点:实现了双机热备、故障自动转移。 缺点:备机服务器处于闲置状态,浪费了硬件资源。
逍遥网 Nginx 负载均衡双机互备 正常情况下,两台 Nginx 负载均衡服务器全部处于活动状态,对外提供服务。
服务器①绑定 IP 别名 /sbin/ifconfig eth0:ha1 61.1.1.2 broadcast 61.1.1.255 netmask 255.255.255.0 up /sbin/route add -host 61.1.1.2 dev eth0:ha1 /sbin/arping -I eth0 -c 3 -s 61.1.1.2 61.1.1.1 在服务器①的外网网卡 eth0 上,绑定了一个虚拟 IP 61.1.1.2 ,绑定完成后发送 arping 包给网关。
服务器②绑定 IP 别名 /sbin/ifconfig eth0:ha2 61.1.1.3 broadcast 61.1.1.255 netmask 255.255.255.0 up /sbin/route add -host 61.1.1.3 dev eth0:ha2 /sbin/arping -I eth0 -c 3 -s 61.1.1.3 61.1.1.1 在服务器②的外网网卡 eth0 上,绑定了一个虚拟 IP 61.1.1.3 ,绑定完成后发送 arping 包给网关。
 
新的 Nginx 双机互备 ( 发生故障时 ) 自动接管公网虚拟 IP ,实现故障转移
服务器①去除 IP 别名 /sbin/ifconfig eth0:ha1 61.1.1.2 broadcast 61.1.1.255 netmask 255.255.255.0 down 通过两台服务器之间的互相检测机制,当服务器①上的检测程序发现自身的 Nginx 无法访问时,停止绑定虚拟 IP 61.1.1.2
服务器②接管原服务器①的虚拟 IP /sbin/ifconfig eth0:ha1 61.1.1.2 broadcast 61.1.1.255 netmask 255.255.255.0 up /sbin/route add -host 61.1.1.2 dev eth0:ha1 /sbin/arping -I eth0 -c 3 -s 61.1.1.2 61.1.1.1 给网关发送 Arping 包,保证了网关上 IP 、 MAC 地址对应关系能够马上更改,能够做到强行接管虚拟 IP 。
Nginx 负载均衡 URL 分发
硬件、软件 七层负载均衡对比: NetScaler 与 Nginx
硬件、软件 七层负载均衡对比: NetScaler 与 Nginx
根据不同的 URL 转发到不同服务器 server{ listen  80; server_name  abc.domain.com; location ~ ^/admincp.php { proxy_pass http://192.168.1.11; proxy_set_header Host  $host; proxy_set_header X-Forwarded-For  $remote_addr; } location / { proxy_pass http://php_server_pool; proxy_set_header Host  $host; proxy_set_header X-Forwarded-For  $remote_addr; } }
Web 相关文件的实时自动同步
少量文件的多服务器自动同步 使用 Linux 2.6 内核的 inotify 监控 Linux 文件系统事件。 利用开源的 lsync 监听某一目录,如果目录内文件发生增、删、改,利用 Rsync 协议自动同步到多台服务器。 http://code.google.com/p/lsyncd/ lsyncd /data0/htdocs/hu.xoyo.com/data/ 192.168.5.1::hu_data/ 192.168.5.2::hu_data/ 192.168.5.3::hu_data/ 192.168.5.4::hu_data/
大量文件的多服务器自动同步 使用 Linux 2.6 内核的 inotify 监控 Linux 文件系统事件。 修改可监控的最大目录数量 echo 50000000 > /proc/sys/fs/inotify/max_user_watches 金山逍遥网开发的 sersync 文件自动同步程序,适合大量文件的自动同步,并可以在文件同步完成后,自动调用 CDN 缓存刷新接口,刷新发生修改、删除的文件的访问 URL 。 用于:金山游戏官网的 CMS 发布系统。
Nginx 的 Web 缓存服务
Nginx 的缓存功能 Nginx 从 0.7.48 版本开始,支持了类似 Squid 的缓存功能; 缓存把 URL 及相关组合当作 Key ,用 md5 编码哈希后保存; Nginx 的 Web 缓存服务只能为指定 URL 或状态码设置过期时间,不支持类似 Squid 的 PURGE 指令,手动清除指定缓存页面; 采用 MMAP 实现,设置的缓存区大小不能超过物理内存 +SWAP 的值。
反向代理中的 Nginx.conf 缓存配置① …… # 设置 Web 缓存区名称为 cache_one ,缓存空间大小为 2000MB , 1 天清理一次缓存,单个文件超过 5m 不缓存。 proxy_cache_path  /data0/proxy_cache_path  levels=1:2  keys_zone=cache_one:2000m inactive=1d max_size=5m; # 注: proxy_temp_path 和 proxy_cache_path 指定的路径必须在同一分区 proxy_temp_path /data0/proxy_temp_path; upstream my_server_pool { server  192.168.1.2:80 weight=1 max_fails=2 fail_timeout=30s; server  192.168.1.3:80 weight=1 max_fails=2 fail_timeout=30s; } ……
反向代理中的 Nginx.conf 缓存配置② server { listen  80; server_name  my.domain.com; location / { proxy_set_header Host  $host; proxy_set_header X-Forwarded-For  $remote_addr; proxy_pass http://my_server_pool; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ { # 对图片、 JS 、 CSS 进行缓存,使用 Web 缓存区 cache_one proxy_cache cache_one;
反向代理中的 Nginx.conf 缓存配置③ # 对不同 HTTP 状态码缓存设置不同的缓存时间 proxy_cache_valid  200 10m; proxy_cache_valid  304 3m; proxy_cache_valid  301 302 1h; proxy_cache_valid  any 1m; # 设置 Web 缓存的 Key 值, Nginx 根据 Key 值 md5 哈希存储缓存,这里根据“域名、 URI 、客户端请求 Header 头中的 If-Modified-Since 信息”组合成 Key 。 proxy_cache_key $host$request_uri$http_if_modified_since; # 反向代理,访问后端内容源服务器 proxy_set_header Host  $host; proxy_set_header X-Forwarded-For  $remote_addr; proxy_pass http://my_server_pool; } access_log  off; }
Nginx 缓存功能的优点 对于修改实时性要求不高的图片、 Flash 、 CSS 样式文件、 JavaScript 文件,可以在 Nginx 反向代理 ( 负载均衡 ) 服务器上设置缓存,不用每次请求都转发到后端 Web 服务器,加快了响应速度。 减少了 Nginx 与后端 Web 服务器的连接数,提高了 Nginx 处理性能。
Nginx 的 Rewrite 重写规则
Nginx Rewrite 规则相关指令 Nginx Rewrite 规则相关指令有 if 、 rewrite 、 set 、 return 、 break 等,其中 rewrite 是最关键的指令。一个简单的 Nginx Rewrite 规则语法如下: rewrite  ^/b/(.*)\.html  /play.php?video=$1 break; 如果加上 if 语句,示例如下: if (!-f $request_filename) { rewrite ^/img/(.*)$ /site/$host/images/$1 last; }
Nginx 与 Apache 的 Rewrite 规则实例对比① 简单的 Nginx 和 Apache  重写规则区别不大,基本上能够完全兼容。例如: Apache Rewrite  规则: RewriteRule  ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 [L] RewriteRule  ^/ceshi/$ /zl/ceshi.php [L] RewriteRule  ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 [L] RewriteRule  ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 [L] Nginx Rewrite  规则: rewrite  ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 last; rewrite  ^/ceshi/$ /zl/ceshi.php last; rewrite  ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 last; rewrite  ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 last; 由以上示例可以看出, Apache 的 Rewrite 规则改为 Nginx 的 Rewrite 规则,其实很简单: Apache 的 RewriteRule 指令换成 Nginx 的 rewrite 指令, Apache 的 [L] 标记换成 Nginx 的 last 标记,中间的内容不变。
Nginx 与 Apache 的 Rewrite 规则实例对比② 如果 Apache 的 Rewrite 规则改为 Nginx 的 Rewrite 规则后,使用 nginx -t 命令检查发现 nginx.conf 配置文件有语法错误,那么可以尝试给条件加上引号。例如一下的 Nginx Rewrite 规则会报语法错误: rewrite  ^/([0-9]{5}).html$ /x.jsp?id=$1  last; 加上引号就正确了: rewrite  "^/([0-9]{5}).html$" /x.jsp?id=$1  last;
Nginx 与 Apache 的 Rewrite 规则实例对比③ Apache 与 Nginx 的 Rewrite 规则在 URL 跳转时有细微的区别: Apache Rewrite  规则: RewriteRule  ^/html/tagindex/([a-zA-Z]+)/.*$ /$1/ [R=301,L] Nginx Rewrite  规则: rewrite  ^/html/tagindex/([a-zA-Z]+)/.*$ http://$host/$1/  permanent; 以上示例中,我们注意到, Nginx Rewrite  规则的置换串中增加了“ http://$host” ,这是在 Nginx 中要求的。
Nginx 与 Apache 的 Rewrite 规则实例对比④ 另外, Apache 与 Nginx 的 Rewrite 规则在变量名称方面也有区别,例如: Apache Rewrite  规则: RewriteRule  ^/user/login/$ /user/login.php?login=1&forward=http://%{HTTP_HOST}  [L] Nginx Rewrite  规则: rewrite  ^/user/login/$ /user/login.php?login=1&forward=http://$host  last;
Nginx 与 Apache 的 Rewrite 规则实例对比⑤ Apache 与 Nginx Rewrite  规则的一些功能相同或类似的指令、标记对应关系: Apache 的 RewriteCond 指令对应 Nginx 的 if 指令; Apache 的 RewriteRule 指令对应 Nginx 的 rewrite 指令; Apache 的 [R] 标记对应 Nginx 的 redirect 标记; Apache 的 [P] 标记对应 Nginx 的 last 标记; Apache 的 [R,L] 标记对应 Nginx 的 redirect 标记; Apache 的 [P,L] 标记对应 Nginx 的 last 标记; Apache 的 [PT,L] 标记对应 Nginx 的 last 标记;
Nginx 与 Apache 的多条件 Rewrite 示例① 允许指定的域名访问本站,其他域名一律跳转到 http://www.aaa.com Apache Rewrite  规则: RewriteCond %{HTTP_HOST}  ^(.*?)\.domain\.com$ RewriteCond %{HTTP_HOST}  !^qita\.domain\.com$ RewriteCond %{DOCUMENT_ROOT}/market/%1/index.htm -f RewriteRule ^/wu/$ /market/%1/index.htm [L] Nginx 的 if 指令不支持嵌套,也不支持 AND 、 OR 等多条件匹配,相比于 Apache 的 RewriteCond ,显得麻烦一些,但是,我们可以通过 下一页 的 Nginx 配置写法来实现这个示例:
Nginx 与 Apache 的多条件 Rewrite 示例② Nginx Rewrite  规则: if ($host ~* ^(.*?)\.domain\.com$) { set $var_wupin_city $1; set $var_wupin '1'; } if ($host ~* ^qita\.domain\.com$) { set $var_wupin '0'; } if (!-f $document_root/market/$var_wupin_city/index.htm) { set $var_wupin '0'; } if ($var_wupin ~ '1') { rewrite ^/wu/$ /market/$var_wupin_city/index.htm last; }
Nginx 与金山逍遥 TCSQL 的配合
一般数据库的缓存类型 一般数据库缓存分为四种: 1 、 Key/Value 单个对象缓存 , 如 Memcached 2 、 列表缓存 , 就像论坛里帖子的列表 3 、 记录条数的缓存 , 比如一个论坛板块里有多少个帖子,这样才方便实现分页。 4 、 复杂一点的 group , sum , count 查询 , 比如一个论坛里按点击数排名的最 HOT 的帖子列表。 第一种比较好实现,后面三种比较麻烦。
什么是 TCSQL 实时列表缓存数据库? TCSQL 是金山逍遥网技术支持部平台组以 Tokyo Cabinet DBM 为底层存储与索引,结合类似 Memcached 的 Key-Value 内存对象缓存,借鉴 SQL 语句的 SELECT 、 INSERT 、 UPDATE 、 DELETE 思想与功能开发的实时列表缓存数据库,可实现对 列表页数据 、 记录条数 的实时缓存。 TCSQL 采用 HTTP GET/POST 协议+ JSON 数据交换格式在客户端、服务器端之间进行数据交互。 利用我们编写的 MySQL UDF 扩展 + 触发器,我们可以在 MySQL 的某张表发生插入、更新、删除操作时,自动将数据同步到 TCSQL 数据库,使得 TCSQL 可以当 MySQL 从库一样使用。
 
TCSQL 的查询速度 TCSQL 在 10000 并发连接情况下的查询速度(服务器为浪潮 NF190 服务器,两颗双核 Xeon(TM) CPU 2.80GHz 、 4GB 内存、 1 万转 SCSI 硬盘。): 主键查询并取出倒序第 1 条记录(“ =” 运算): 12155 次请求 / 秒 其他索引键查询并取出倒序第 1 条记录(“ =” 运算): 11897 次请求 / 秒
TCSQL 的查询速度 根据复合条件查询并取出倒序前 10 条记录: 8778 次请求 / 秒 (相当于 SELECT * FROM table WHERE dateline >=  随机时间戳  AND idtype = ' 变换的文本 ' ORDER BY pkey DESC LIMIT 0,10 ) 统计符合查询条件的记录数量: 9160 次请求 / 秒 (相当于 SELECT count(*) FROM table WHERE dateline >=  随机时间戳  AND idtype = ' 变换的文本 ' )
找出瓶颈 浏览器端  -- 查询 -->  服务器端 Nginx + PHP + TCSQL Nginx  4000~13000  请求数 / 秒 PHP  500~1500  请求数 / 秒 TCSQL  5000~15000  请求数 / 秒 位于中间的 PHP(FastCGI) 不在一个量级上,成为列表页查询请求的最大瓶颈。
抛弃制约性能的 PHP 中间层 浏览器端 JavaScript -- 查询 -->  服务器端 Nginx(rewrite 重写规则、 proxy_pass 反向代理 ) + TCSQL 抛弃了中间制约整体性能的 PHP 层。 运行于浏览器端的 JavaScript 代码通过 Nginx 直接查询 TCSQL 数据库,取得数据并在网页显示。 利用 Nginx 的 rewrite 重写规则控制对 TCSQL 的访问权限。
谢谢!

More Related Content

What's hot (17)

PDF
gRPC - 打造輕量、高效能的後端服務
升煌 黃
 
PDF
聊聊我接触的集群管理
rfyiamcool
 
PPT
使用Nginx轻松实现开源负载均衡——对外版
pigso
 
PPT
使用Nginx轻松实现开源负载均衡
guest2d0fe3
 
PPT
使用Nginx轻松实现开源负载均衡
Cary Yang
 
PDF
Linux network monitoring hands-on pratice
Kenny (netman)
 
PPTX
Kafka的设计与实现
wang xing
 
PPTX
Http Headers 與 Cache 機制(2016)
振揚 陳
 
PPT
构建ActionScript游戏服务器,支持超过15000并发连接
Renaun Erickson
 
PPTX
Http cache 的優化
振揚 陳
 
PDF
Improvements Made in KoP 2.9.0 - Pulsar Summit Asia 2021
StreamNative
 
PPT
Traffic server overview
qianshi
 
PDF
课题三:Nginx基础知识
Liu Allen
 
PPTX
The Evolution History of RoP(RocketMQ-on-Pulsar) - Pulsar Summit Asia 2021
StreamNative
 
PPT
Php Webservers
samon127
 
PDF
-Nginx book
山城 碧海
 
DOC
Apache配置文件说明
wensheng wei
 
gRPC - 打造輕量、高效能的後端服務
升煌 黃
 
聊聊我接触的集群管理
rfyiamcool
 
使用Nginx轻松实现开源负载均衡——对外版
pigso
 
使用Nginx轻松实现开源负载均衡
guest2d0fe3
 
使用Nginx轻松实现开源负载均衡
Cary Yang
 
Linux network monitoring hands-on pratice
Kenny (netman)
 
Kafka的设计与实现
wang xing
 
Http Headers 與 Cache 機制(2016)
振揚 陳
 
构建ActionScript游戏服务器,支持超过15000并发连接
Renaun Erickson
 
Http cache 的優化
振揚 陳
 
Improvements Made in KoP 2.9.0 - Pulsar Summit Asia 2021
StreamNative
 
Traffic server overview
qianshi
 
课题三:Nginx基础知识
Liu Allen
 
The Evolution History of RoP(RocketMQ-on-Pulsar) - Pulsar Summit Asia 2021
StreamNative
 
Php Webservers
samon127
 
-Nginx book
山城 碧海
 
Apache配置文件说明
wensheng wei
 

Viewers also liked (20)

DOCX
Valgrind debugger Tutorial
Anurag Tomar
 
PPTX
Script up your application with Lua! -- RyanE -- OpenWest 2014
ryanerickson
 
PDF
Nginx+lua在阿里巴巴的使用
OpenRestyCon
 
KEY
淺入淺出 GDB
Jim Chang
 
PDF
Gdb tutorial-handout
Suraj Kumar
 
PDF
Nginx: Accelerate Rails, HTTP Tricks
Adam Wiggins
 
PPT
Montreal On Rails 5 : Rails deployment using : Nginx, Mongrel, Mongrel_cluste...
addame
 
PPT
Nginx internals
liqiang xu
 
PDF
Nginx深度開發與客制化
Joshua Zhu
 
PDF
Learn C Programming Language by Using GDB
National Cheng Kung University
 
PDF
Nginx-lua
Дэв Тим Афс
 
PDF
The basics and design of lua table
Shuai Yuan
 
PDF
Lcu14 Lightning Talk- NGINX
Linaro
 
PPTX
Delivering High-Availability Web Services with NGINX Plus on AWS
NGINX, Inc.
 
PPTX
Learn nginx in 90mins
Larry Cai
 
PDF
Tuning TCP and NGINX on EC2
Chartbeat
 
PPTX
NGINX Installation and Tuning
NGINX, Inc.
 
PDF
Using ngx_lua / lua-nginx-module in pixiv
Shunsuke Michii
 
PDF
給自己更好未來的 3 個練習:嵌入式作業系統設計、實做,與移植 (2015 年春季 ) 課程說明
National Cheng Kung University
 
PDF
How to secure your web applications with NGINX
Wallarm
 
Valgrind debugger Tutorial
Anurag Tomar
 
Script up your application with Lua! -- RyanE -- OpenWest 2014
ryanerickson
 
Nginx+lua在阿里巴巴的使用
OpenRestyCon
 
淺入淺出 GDB
Jim Chang
 
Gdb tutorial-handout
Suraj Kumar
 
Nginx: Accelerate Rails, HTTP Tricks
Adam Wiggins
 
Montreal On Rails 5 : Rails deployment using : Nginx, Mongrel, Mongrel_cluste...
addame
 
Nginx internals
liqiang xu
 
Nginx深度開發與客制化
Joshua Zhu
 
Learn C Programming Language by Using GDB
National Cheng Kung University
 
The basics and design of lua table
Shuai Yuan
 
Lcu14 Lightning Talk- NGINX
Linaro
 
Delivering High-Availability Web Services with NGINX Plus on AWS
NGINX, Inc.
 
Learn nginx in 90mins
Larry Cai
 
Tuning TCP and NGINX on EC2
Chartbeat
 
NGINX Installation and Tuning
NGINX, Inc.
 
Using ngx_lua / lua-nginx-module in pixiv
Shunsuke Michii
 
給自己更好未來的 3 個練習:嵌入式作業系統設計、實做,與移植 (2015 年春季 ) 課程說明
National Cheng Kung University
 
How to secure your web applications with NGINX
Wallarm
 
Ad

Similar to 高性能Web服务器Nginx及相关新技术的应用实践 (20)

PPT
高性能Web服务器nginx及相关新技术的应用
redhat9
 
DOC
Nginx+常见应用技术指南
andy54321
 
PPTX
Varnish简介
fangdeng
 
PPT
缓存技术浅谈
Robbin Fan
 
DOC
X64服务器 lamp服务器部署标准 new
Yiwei Ma
 
PPT
Paveo Tweak WordPress
Yuancheng Yang
 
PPTX
如何使用 Xhprof 分析網站效能 (真實案例2)
Cyril Wang
 
KEY
独爽不如众乐
Zheng Biao
 
KEY
分享平台构建之旅
tblanlan
 
PDF
Lamp高性能设计
锐 张
 
PPT
腾讯大讲堂08 可扩展web架构探讨
George Ang
 
PDF
Hacking Nginx at Taobao
Joshua Zhu
 
PDF
构建基于Lamp的网站架构
Cosey Lee
 
PDF
開發環境建置
Shengyou Fan
 
DOC
康盛创想项目部Linux 服务器部署标准(最新版)
Yiwei Ma
 
PDF
Cent os 安装 subversion
YUCHENG HU
 
PDF
Bypat博客出品-服务器运维集群方法总结
redhat9
 
PPT
PHP & AppServ
Ht Wang
 
PDF
Hbase使用hadoop分析
baggioss
 
PPT
摘星
zenyuhao
 
高性能Web服务器nginx及相关新技术的应用
redhat9
 
Nginx+常见应用技术指南
andy54321
 
Varnish简介
fangdeng
 
缓存技术浅谈
Robbin Fan
 
X64服务器 lamp服务器部署标准 new
Yiwei Ma
 
Paveo Tweak WordPress
Yuancheng Yang
 
如何使用 Xhprof 分析網站效能 (真實案例2)
Cyril Wang
 
独爽不如众乐
Zheng Biao
 
分享平台构建之旅
tblanlan
 
Lamp高性能设计
锐 张
 
腾讯大讲堂08 可扩展web架构探讨
George Ang
 
Hacking Nginx at Taobao
Joshua Zhu
 
构建基于Lamp的网站架构
Cosey Lee
 
開發環境建置
Shengyou Fan
 
康盛创想项目部Linux 服务器部署标准(最新版)
Yiwei Ma
 
Cent os 安装 subversion
YUCHENG HU
 
Bypat博客出品-服务器运维集群方法总结
redhat9
 
PHP & AppServ
Ht Wang
 
Hbase使用hadoop分析
baggioss
 
摘星
zenyuhao
 
Ad

高性能Web服务器Nginx及相关新技术的应用实践

  • 1.  
  • 2. 高性能 Web 服务器 Nginx 及相关新技术的应用实践 北京金山软件 逍遥网 张宴 2009.10
  • 3. 什么是 Nginx ? Nginx (“engine x”) 是俄罗斯人 Igor Sysoev( 塞索耶夫 ) 编写的一款高性能的 HTTP 和反向代理服务器。 Nginx 已经在俄罗斯最大的门户网站── Rambler Media ( www.rambler.ru )上运行了 4 年时间,同时俄罗斯超过 20% 的虚拟主机平台采用 Nginx 作为反向代理服务器。 在国内,已经有新浪博客、新浪播客、搜狐通行证、网易新闻、网易博客、金山逍遥网、金山爱词霸、校内网、 YUPOO 相册、豆瓣、迅雷看看等多家网站、频道使用 Nginx 服务器。
  • 4. Nginx 的优点① 1 、高并发连接: 官方测试能够支撑 5 万并发连接,在实际生产环境中跑到 2 ~ 3 万并发连接数。 2 、内存消耗少: 在 3 万并发连接下,开启的 10 个 Nginx 进程才消耗 150M 内存( 15M*10=150M )。 3 、配置文件非常简单: 风格跟程序一样通俗易懂。 4 、成本低廉: Nginx 为开源软件,可以免费使用。而购买 F5 BIG-IP 、 NetScaler 等硬件负载均衡交换机则需要十多万至几十万人民币。
  • 5. Nginx 的优点② 5 、支持 Rewrite 重写规则: 能够根据域名、 URL 的不同,将 HTTP 请求分到不同的后端服务器群组。 6 、内置的健康检查功能: 如果 Nginx Proxy 后端的某台 Web 服务器宕机了,不会影响前端访问。 7 、节省带宽: 支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头。 8 、稳定性高: 用于反向代理,宕机的概率微乎其微。
  • 6. 单台 Nginx 支撑了高达 2.8 万的活动并发连接数 2009-09-03 14:30 ,金山游戏《剑侠情缘网络版 3 》临时维护 1 小时,大量玩家上官网,论坛、评论、客服等动态应用 Nginx 服务器集群,每台服务器的 Nginx 活动连接数达到 2.8 万,这是本人遇到的 Nginx 生产环境最高并发值。
  • 7. Nginx 的主要应用类别 1 、使用 Nginx 结合 FastCGI 运行 PHP 、 JSP 、 Perl 等程序 2 、使用 Nginx 作反向代理、负载均衡、规则过滤 3 、使用 Nginx 运行静态 HTML 页、图片 4 、 Nginx 与其他新技术的结合应用
  • 8. Nginx 在金山逍遥网中的应用案例 金山逍遥网 (xoyo.com) 是金山游戏官方网站,为金山软件旗下的各款游戏提供新闻资讯、客户服务、在线充值、视听互动、在线活动、博客、相册、论坛、玩家社区等内容建设和在线服务支持。
  • 10. Nginx 承担每个机房 Web 负载均衡服务
  • 11. 简单的 Nginx 负载均衡配置① …… upstream bbs_server_pool { server 192.168.1.15:80 weight=1 max_fails=2 fail_timeout=30s; server 192.168.1.16:80 weight=1 max_fails=2 fail_timeout=30s; server 192.168.1.17:80 weight=1 max_fails=2 fail_timeout=30s; server 192.168.1.18:80 weight=1 max_fails=2 fail_timeout=30s; } …… 在 nginx.conf 配置文件中,用 upstream 指令定义一组反向代理 / 负载均衡后端服务器池。
  • 12. 简单的 Nginx 负载均衡配置② …… server{ listen 80; server_name bbs.yourdomain.com *.bbs.yourdomain.com; location / { proxy_pass http://bbs_server_pool; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } access_log off; } ……
  • 13. 简单的 Nginx 负载均衡配置③ proxy_pass http://bbs_server_pool; 用于指定反向代理的服务器池。 proxy_set_header Host $host; 当后端 Web 服务器上也配置有多个虚拟主机时,需要用该 Header 来区分反向代理哪个主机名。 proxy_set_header X-Forwarded-For $remote_addr; 如果后端 Web 服务器上的程序需要获取用户 IP ,请从该 Header 头获取。
  • 15. 通常情况下的负载均衡 HA 高可用 优点:实现了双机热备、故障自动转移。 缺点:备机服务器处于闲置状态,浪费了硬件资源。
  • 16. 逍遥网 Nginx 负载均衡双机互备 正常情况下,两台 Nginx 负载均衡服务器全部处于活动状态,对外提供服务。
  • 17. 服务器①绑定 IP 别名 /sbin/ifconfig eth0:ha1 61.1.1.2 broadcast 61.1.1.255 netmask 255.255.255.0 up /sbin/route add -host 61.1.1.2 dev eth0:ha1 /sbin/arping -I eth0 -c 3 -s 61.1.1.2 61.1.1.1 在服务器①的外网网卡 eth0 上,绑定了一个虚拟 IP 61.1.1.2 ,绑定完成后发送 arping 包给网关。
  • 18. 服务器②绑定 IP 别名 /sbin/ifconfig eth0:ha2 61.1.1.3 broadcast 61.1.1.255 netmask 255.255.255.0 up /sbin/route add -host 61.1.1.3 dev eth0:ha2 /sbin/arping -I eth0 -c 3 -s 61.1.1.3 61.1.1.1 在服务器②的外网网卡 eth0 上,绑定了一个虚拟 IP 61.1.1.3 ,绑定完成后发送 arping 包给网关。
  • 19.  
  • 20. 新的 Nginx 双机互备 ( 发生故障时 ) 自动接管公网虚拟 IP ,实现故障转移
  • 21. 服务器①去除 IP 别名 /sbin/ifconfig eth0:ha1 61.1.1.2 broadcast 61.1.1.255 netmask 255.255.255.0 down 通过两台服务器之间的互相检测机制,当服务器①上的检测程序发现自身的 Nginx 无法访问时,停止绑定虚拟 IP 61.1.1.2
  • 22. 服务器②接管原服务器①的虚拟 IP /sbin/ifconfig eth0:ha1 61.1.1.2 broadcast 61.1.1.255 netmask 255.255.255.0 up /sbin/route add -host 61.1.1.2 dev eth0:ha1 /sbin/arping -I eth0 -c 3 -s 61.1.1.2 61.1.1.1 给网关发送 Arping 包,保证了网关上 IP 、 MAC 地址对应关系能够马上更改,能够做到强行接管虚拟 IP 。
  • 26. 根据不同的 URL 转发到不同服务器 server{ listen 80; server_name abc.domain.com; location ~ ^/admincp.php { proxy_pass http://192.168.1.11; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } location / { proxy_pass http://php_server_pool; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } }
  • 28. 少量文件的多服务器自动同步 使用 Linux 2.6 内核的 inotify 监控 Linux 文件系统事件。 利用开源的 lsync 监听某一目录,如果目录内文件发生增、删、改,利用 Rsync 协议自动同步到多台服务器。 http://code.google.com/p/lsyncd/ lsyncd /data0/htdocs/hu.xoyo.com/data/ 192.168.5.1::hu_data/ 192.168.5.2::hu_data/ 192.168.5.3::hu_data/ 192.168.5.4::hu_data/
  • 29. 大量文件的多服务器自动同步 使用 Linux 2.6 内核的 inotify 监控 Linux 文件系统事件。 修改可监控的最大目录数量 echo 50000000 > /proc/sys/fs/inotify/max_user_watches 金山逍遥网开发的 sersync 文件自动同步程序,适合大量文件的自动同步,并可以在文件同步完成后,自动调用 CDN 缓存刷新接口,刷新发生修改、删除的文件的访问 URL 。 用于:金山游戏官网的 CMS 发布系统。
  • 30. Nginx 的 Web 缓存服务
  • 31. Nginx 的缓存功能 Nginx 从 0.7.48 版本开始,支持了类似 Squid 的缓存功能; 缓存把 URL 及相关组合当作 Key ,用 md5 编码哈希后保存; Nginx 的 Web 缓存服务只能为指定 URL 或状态码设置过期时间,不支持类似 Squid 的 PURGE 指令,手动清除指定缓存页面; 采用 MMAP 实现,设置的缓存区大小不能超过物理内存 +SWAP 的值。
  • 32. 反向代理中的 Nginx.conf 缓存配置① …… # 设置 Web 缓存区名称为 cache_one ,缓存空间大小为 2000MB , 1 天清理一次缓存,单个文件超过 5m 不缓存。 proxy_cache_path /data0/proxy_cache_path levels=1:2 keys_zone=cache_one:2000m inactive=1d max_size=5m; # 注: proxy_temp_path 和 proxy_cache_path 指定的路径必须在同一分区 proxy_temp_path /data0/proxy_temp_path; upstream my_server_pool { server 192.168.1.2:80 weight=1 max_fails=2 fail_timeout=30s; server 192.168.1.3:80 weight=1 max_fails=2 fail_timeout=30s; } ……
  • 33. 反向代理中的 Nginx.conf 缓存配置② server { listen 80; server_name my.domain.com; location / { proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass http://my_server_pool; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ { # 对图片、 JS 、 CSS 进行缓存,使用 Web 缓存区 cache_one proxy_cache cache_one;
  • 34. 反向代理中的 Nginx.conf 缓存配置③ # 对不同 HTTP 状态码缓存设置不同的缓存时间 proxy_cache_valid 200 10m; proxy_cache_valid 304 3m; proxy_cache_valid 301 302 1h; proxy_cache_valid any 1m; # 设置 Web 缓存的 Key 值, Nginx 根据 Key 值 md5 哈希存储缓存,这里根据“域名、 URI 、客户端请求 Header 头中的 If-Modified-Since 信息”组合成 Key 。 proxy_cache_key $host$request_uri$http_if_modified_since; # 反向代理,访问后端内容源服务器 proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass http://my_server_pool; } access_log off; }
  • 35. Nginx 缓存功能的优点 对于修改实时性要求不高的图片、 Flash 、 CSS 样式文件、 JavaScript 文件,可以在 Nginx 反向代理 ( 负载均衡 ) 服务器上设置缓存,不用每次请求都转发到后端 Web 服务器,加快了响应速度。 减少了 Nginx 与后端 Web 服务器的连接数,提高了 Nginx 处理性能。
  • 36. Nginx 的 Rewrite 重写规则
  • 37. Nginx Rewrite 规则相关指令 Nginx Rewrite 规则相关指令有 if 、 rewrite 、 set 、 return 、 break 等,其中 rewrite 是最关键的指令。一个简单的 Nginx Rewrite 规则语法如下: rewrite ^/b/(.*)\.html /play.php?video=$1 break; 如果加上 if 语句,示例如下: if (!-f $request_filename) { rewrite ^/img/(.*)$ /site/$host/images/$1 last; }
  • 38. Nginx 与 Apache 的 Rewrite 规则实例对比① 简单的 Nginx 和 Apache 重写规则区别不大,基本上能够完全兼容。例如: Apache Rewrite 规则: RewriteRule ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 [L] RewriteRule ^/ceshi/$ /zl/ceshi.php [L] RewriteRule ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 [L] RewriteRule ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 [L] Nginx Rewrite 规则: rewrite ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 last; rewrite ^/ceshi/$ /zl/ceshi.php last; rewrite ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 last; rewrite ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 last; 由以上示例可以看出, Apache 的 Rewrite 规则改为 Nginx 的 Rewrite 规则,其实很简单: Apache 的 RewriteRule 指令换成 Nginx 的 rewrite 指令, Apache 的 [L] 标记换成 Nginx 的 last 标记,中间的内容不变。
  • 39. Nginx 与 Apache 的 Rewrite 规则实例对比② 如果 Apache 的 Rewrite 规则改为 Nginx 的 Rewrite 规则后,使用 nginx -t 命令检查发现 nginx.conf 配置文件有语法错误,那么可以尝试给条件加上引号。例如一下的 Nginx Rewrite 规则会报语法错误: rewrite ^/([0-9]{5}).html$ /x.jsp?id=$1 last; 加上引号就正确了: rewrite "^/([0-9]{5}).html$" /x.jsp?id=$1 last;
  • 40. Nginx 与 Apache 的 Rewrite 规则实例对比③ Apache 与 Nginx 的 Rewrite 规则在 URL 跳转时有细微的区别: Apache Rewrite 规则: RewriteRule ^/html/tagindex/([a-zA-Z]+)/.*$ /$1/ [R=301,L] Nginx Rewrite 规则: rewrite ^/html/tagindex/([a-zA-Z]+)/.*$ http://$host/$1/ permanent; 以上示例中,我们注意到, Nginx Rewrite 规则的置换串中增加了“ http://$host” ,这是在 Nginx 中要求的。
  • 41. Nginx 与 Apache 的 Rewrite 规则实例对比④ 另外, Apache 与 Nginx 的 Rewrite 规则在变量名称方面也有区别,例如: Apache Rewrite 规则: RewriteRule ^/user/login/$ /user/login.php?login=1&forward=http://%{HTTP_HOST} [L] Nginx Rewrite 规则: rewrite ^/user/login/$ /user/login.php?login=1&forward=http://$host last;
  • 42. Nginx 与 Apache 的 Rewrite 规则实例对比⑤ Apache 与 Nginx Rewrite 规则的一些功能相同或类似的指令、标记对应关系: Apache 的 RewriteCond 指令对应 Nginx 的 if 指令; Apache 的 RewriteRule 指令对应 Nginx 的 rewrite 指令; Apache 的 [R] 标记对应 Nginx 的 redirect 标记; Apache 的 [P] 标记对应 Nginx 的 last 标记; Apache 的 [R,L] 标记对应 Nginx 的 redirect 标记; Apache 的 [P,L] 标记对应 Nginx 的 last 标记; Apache 的 [PT,L] 标记对应 Nginx 的 last 标记;
  • 43. Nginx 与 Apache 的多条件 Rewrite 示例① 允许指定的域名访问本站,其他域名一律跳转到 http://www.aaa.com Apache Rewrite 规则: RewriteCond %{HTTP_HOST} ^(.*?)\.domain\.com$ RewriteCond %{HTTP_HOST} !^qita\.domain\.com$ RewriteCond %{DOCUMENT_ROOT}/market/%1/index.htm -f RewriteRule ^/wu/$ /market/%1/index.htm [L] Nginx 的 if 指令不支持嵌套,也不支持 AND 、 OR 等多条件匹配,相比于 Apache 的 RewriteCond ,显得麻烦一些,但是,我们可以通过 下一页 的 Nginx 配置写法来实现这个示例:
  • 44. Nginx 与 Apache 的多条件 Rewrite 示例② Nginx Rewrite 规则: if ($host ~* ^(.*?)\.domain\.com$) { set $var_wupin_city $1; set $var_wupin '1'; } if ($host ~* ^qita\.domain\.com$) { set $var_wupin '0'; } if (!-f $document_root/market/$var_wupin_city/index.htm) { set $var_wupin '0'; } if ($var_wupin ~ '1') { rewrite ^/wu/$ /market/$var_wupin_city/index.htm last; }
  • 46. 一般数据库的缓存类型 一般数据库缓存分为四种: 1 、 Key/Value 单个对象缓存 , 如 Memcached 2 、 列表缓存 , 就像论坛里帖子的列表 3 、 记录条数的缓存 , 比如一个论坛板块里有多少个帖子,这样才方便实现分页。 4 、 复杂一点的 group , sum , count 查询 , 比如一个论坛里按点击数排名的最 HOT 的帖子列表。 第一种比较好实现,后面三种比较麻烦。
  • 47. 什么是 TCSQL 实时列表缓存数据库? TCSQL 是金山逍遥网技术支持部平台组以 Tokyo Cabinet DBM 为底层存储与索引,结合类似 Memcached 的 Key-Value 内存对象缓存,借鉴 SQL 语句的 SELECT 、 INSERT 、 UPDATE 、 DELETE 思想与功能开发的实时列表缓存数据库,可实现对 列表页数据 、 记录条数 的实时缓存。 TCSQL 采用 HTTP GET/POST 协议+ JSON 数据交换格式在客户端、服务器端之间进行数据交互。 利用我们编写的 MySQL UDF 扩展 + 触发器,我们可以在 MySQL 的某张表发生插入、更新、删除操作时,自动将数据同步到 TCSQL 数据库,使得 TCSQL 可以当 MySQL 从库一样使用。
  • 48.  
  • 49. TCSQL 的查询速度 TCSQL 在 10000 并发连接情况下的查询速度(服务器为浪潮 NF190 服务器,两颗双核 Xeon(TM) CPU 2.80GHz 、 4GB 内存、 1 万转 SCSI 硬盘。): 主键查询并取出倒序第 1 条记录(“ =” 运算): 12155 次请求 / 秒 其他索引键查询并取出倒序第 1 条记录(“ =” 运算): 11897 次请求 / 秒
  • 50. TCSQL 的查询速度 根据复合条件查询并取出倒序前 10 条记录: 8778 次请求 / 秒 (相当于 SELECT * FROM table WHERE dateline >= 随机时间戳 AND idtype = ' 变换的文本 ' ORDER BY pkey DESC LIMIT 0,10 ) 统计符合查询条件的记录数量: 9160 次请求 / 秒 (相当于 SELECT count(*) FROM table WHERE dateline >= 随机时间戳 AND idtype = ' 变换的文本 ' )
  • 51. 找出瓶颈 浏览器端 -- 查询 --> 服务器端 Nginx + PHP + TCSQL Nginx 4000~13000 请求数 / 秒 PHP 500~1500 请求数 / 秒 TCSQL 5000~15000 请求数 / 秒 位于中间的 PHP(FastCGI) 不在一个量级上,成为列表页查询请求的最大瓶颈。
  • 52. 抛弃制约性能的 PHP 中间层 浏览器端 JavaScript -- 查询 --> 服务器端 Nginx(rewrite 重写规则、 proxy_pass 反向代理 ) + TCSQL 抛弃了中间制约整体性能的 PHP 层。 运行于浏览器端的 JavaScript 代码通过 Nginx 直接查询 TCSQL 数据库,取得数据并在网页显示。 利用 Nginx 的 rewrite 重写规则控制对 TCSQL 的访问权限。