资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,高性能,Web,服务器,Nginx,及相关新技术的应用实践,北京金山软件 逍遥网,张宴,2009.10,什么是,Nginx,?,Nginx (“engine x”),是俄罗斯人,Igor Sysoev(,塞索耶夫,),编写的一款高性能的,HTTP,和反向代理服务器。,Nginx,已经在俄罗斯最大的门户网站,Rambler Media,()上运行了,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,在金山逍遥网中的应用案例,金山逍遥网,(),是金山游戏官方网站,为金山软件旗下的各款游戏提供新闻资讯、客户服务、在线充值、视听互动、在线活动、博客、相册、论坛、玩家社区等内容建设和在线服务支持。,金山逍遥网,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,listen80;,server_name *;,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,在服务器的外网网卡,eth0,上,绑定了一个虚拟,绑定完成后发送,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,在服务器的外网网卡,eth0,上,绑定了一个虚拟,绑定完成后发送,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,/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,给网关发送,Arping,包,保证了网关上,IP,、,MAC,地址对应关系能够马上更改,能够做到强行接管虚拟,IP,。,Nginx,负载均衡,URL,分发,硬件、软件,七层负载均衡对比:,NetScaler,与,Nginx,硬件、软件,七层负载均衡对比:,NetScaler,与,Nginx,根据不同的,URL,转发到不同服务器,server,listen 80;,server_name ;,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,协议自动同步到多台服务器。,lsyncd /data0/htdocs/ 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,从版本开始,支持了类似,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 ;,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-95).html$ /x.jsp?id=$1 last;,加上引号就正确了:,rewrite /(0-95).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,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,示例,允许指定的域名访问本站,其他域名一律跳转到,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 400013000,请求数,/,秒,PHP 5001500,请求数,/,秒,TCSQL 500015000,请求数,/,秒,位于中间的,PHP(FastCGI),不在一个量级上,成为列表页查询请求的最大瓶颈。,抛弃制约性能的,PHP,中间层,浏览器端,JavaScript,-,查询,-,服务器端,Nginx(rewrite,重写规则、,proxy_pass,反向代理,) + TCSQL,抛弃了中间制约整体性能的,PHP,层。,运行于浏览器端的,JavaScript,代码通过,Nginx,直接查询,TCSQL,数据库,取得数据并在网页显示。,利用,Nginx,的,rewrite,重写规则控制对,TCSQL,的访问权限。,谢谢!,
展开阅读全文