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)

PPT
使用Nginx轻松实现开源负载均衡
Cary Yang
 
PPT
使用Nginx轻松实现开源负载均衡
guest2d0fe3
 
PPTX
Kafka in Depth
YI-CHING WU
 
PDF
Hadoop基线选定
baggioss
 
PDF
Deployment with Capistrano
旭 張
 
PPTX
Docker進階探討
國昭 張
 
PDF
Mysql proxy cluster
Yiwei Ma
 
DOC
康盛创想项目部Linux 服务器部署标准(最新版)
Yiwei Ma
 
PPT
Monitor is all for ops
琛琳 饶
 
KEY
独爽不如众乐
Zheng Biao
 
PPT
Linux集群应用实战 通过lvs+keepalived搭建高可用的负载均衡集群系统(第二讲)
hik_lhz
 
PDF
基于OpenResty的百万级长连接推送
OpenRestyCon
 
PPT
Perl在nginx里的应用
琛琳 饶
 
DOCX
Puppet安装测试
Yiwei Ma
 
PPT
Traffic server overview
qianshi
 
PDF
Docker應用
Jui An Huang (黃瑞安)
 
PPTX
應用Ceph技術打造軟體定義儲存新局
Alex Lau
 
使用Nginx轻松实现开源负载均衡
Cary Yang
 
使用Nginx轻松实现开源负载均衡
guest2d0fe3
 
Kafka in Depth
YI-CHING WU
 
Hadoop基线选定
baggioss
 
Deployment with Capistrano
旭 張
 
Docker進階探討
國昭 張
 
Mysql proxy cluster
Yiwei Ma
 
康盛创想项目部Linux 服务器部署标准(最新版)
Yiwei Ma
 
Monitor is all for ops
琛琳 饶
 
独爽不如众乐
Zheng Biao
 
Linux集群应用实战 通过lvs+keepalived搭建高可用的负载均衡集群系统(第二讲)
hik_lhz
 
基于OpenResty的百万级长连接推送
OpenRestyCon
 
Perl在nginx里的应用
琛琳 饶
 
Puppet安装测试
Yiwei Ma
 
Traffic server overview
qianshi
 
應用Ceph技術打造軟體定義儲存新局
Alex Lau
 

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

PPT
高性能Web服务器nginx及相关新技术的应用
redhat9
 
DOC
Nginx+常见应用技术指南
andy54321
 
PDF
Hacking Nginx at Taobao
Joshua Zhu
 
PDF
-Nginx book
山城 碧海
 
PDF
课题三:Nginx基础知识
Liu Allen
 
PPTX
tengine(nginx with lua ) develop at 2013
druggo2
 
PDF
高性能LAMP程序设计
fuchaoqun
 
PPT
Nginx使用和模块开发
qingpiao1983
 
PPT
Lamp优化实践
zhliji2
 
PDF
Advanced php programming
alpha86
 
PDF
构建基于Lamp的网站架构
Cosey Lee
 
PDF
Bypat博客出品-服务器运维集群方法总结
redhat9
 
PPT
PHP Optimization for Millions Visits Level
Ho Kim
 
PPT
Tcpcopy 阿里技术沙龙
drewz lin
 
PDF
Bypat博客出品-服务器运维集群方法总结2
redhat9
 
PDF
优酷 Web网站架构案例分析
George Ang
 
PDF
Key value store
xuanhan863
 
PDF
Youku arch qcon2009_beijing
drewz lin
 
PDF
Lamp高性能设计
锐 张
 
KEY
分享平台构建之旅
tblanlan
 
高性能Web服务器nginx及相关新技术的应用
redhat9
 
Nginx+常见应用技术指南
andy54321
 
Hacking Nginx at Taobao
Joshua Zhu
 
-Nginx book
山城 碧海
 
课题三:Nginx基础知识
Liu Allen
 
tengine(nginx with lua ) develop at 2013
druggo2
 
高性能LAMP程序设计
fuchaoqun
 
Nginx使用和模块开发
qingpiao1983
 
Lamp优化实践
zhliji2
 
Advanced php programming
alpha86
 
构建基于Lamp的网站架构
Cosey Lee
 
Bypat博客出品-服务器运维集群方法总结
redhat9
 
PHP Optimization for Millions Visits Level
Ho Kim
 
Tcpcopy 阿里技术沙龙
drewz lin
 
Bypat博客出品-服务器运维集群方法总结2
redhat9
 
优酷 Web网站架构案例分析
George Ang
 
Key value store
xuanhan863
 
Youku arch qcon2009_beijing
drewz lin
 
Lamp高性能设计
锐 张
 
分享平台构建之旅
tblanlan
 
Ad

More from Frank Cai (6)

PDF
把时间当朋友
Frank Cai
 
PPT
Fotolog.Com.Mashraqi Scaling
Frank Cai
 
PPT
WAP2.0
Frank Cai
 
PDF
6 Dean Google
Frank Cai
 
PPT
高可用数据库平台架构及日常管理经验介绍.ppt
Frank Cai
 
PPT
系统性能分析和优化.ppt
Frank Cai
 
把时间当朋友
Frank Cai
 
Fotolog.Com.Mashraqi Scaling
Frank Cai
 
WAP2.0
Frank Cai
 
6 Dean Google
Frank Cai
 
高可用数据库平台架构及日常管理经验介绍.ppt
Frank Cai
 
系统性能分析和优化.ppt
Frank Cai
 
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 的访问权限。