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

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

举报
开通vip

高性能Web服务器Nginx及相关新技术的应用实践nullnull高性能Web服务器Nginx 及相关新技术的应用实践高性能Web服务器Nginx 及相关新技术的应用实践 北京金山软件 逍遥网 张宴 2009.10什么是Nginx?什么是Nginx?Nginx (“engine x”) 是俄罗斯人Igor Sysoev(塞索耶夫)编写的一款高性能的 HTTP 和反向代理服务器。 Nginx 已经在俄罗斯最大的门户网站── Rambler Media(www.rambler.ru)上运行了4年时间,同时俄罗斯超过20%的虚拟主机平台采用Nginx作为反向代理服务器...

高性能Web服务器Nginx及相关新技术的应用实践
nullnull高性能Web服务器Nginx 及相关新技术的应用实践高性能Web服务器Nginx 及相关新技术的应用实践 北京金山软件 逍遥网 张宴 2009.10什么是Nginx?什么是Nginx?Nginx (“engine x”) 是俄罗斯人Igor Sysoev(塞索耶夫)编写的一款高性能的 HTTP 和反向代理服务器。 Nginx 已经在俄罗斯最大的门户网站── Rambler Media(www.rambler.ru)上运行了4年时间,同时俄罗斯超过20%的虚拟主机平台采用Nginx作为反向代理服务器。 在国内,已经有新浪博客、新浪播客、搜狐通行证、网易新闻、网易博客、金山逍遥网、金山爱词霸、校内网、YUPOO相册、豆瓣、迅雷看看等多家网站、频道使用 Nginx 服务器。 Nginx的优点①Nginx的优点①1、高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数。 2、内存消耗少:在3万并发连接下,开启的10个Nginx 进程才消耗150M内存(15M*10=150M)。 3、配置文件非常简单:风格跟程序一样通俗易懂。 4、成本低廉:Nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币。 Nginx的优点②Nginx的优点②5、支持Rewrite重写规则:能够根据域名、URL的不同,将 HTTP 请求分到不同的后端服务器群组。 6、内置的健康检查功能:如果 Nginx Proxy 后端的某台 Web 服务器宕机了,不会影响前端访问。 7、节省带宽:支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头。 8、稳定性高:用于反向代理,宕机的概率微乎其微。 单台Nginx支撑了高达2.8万的活动并发连接数单台Nginx支撑了高达2.8万的活动并发连接数2009-09-03 14:30,金山游戏《剑侠情缘网络版3》临时维护1小时,大量玩家上官网,论坛、评论、客服等动态应用Nginx服务器集群,每台服务器的Nginx活动连接数达到2.8万,这是本人遇到的Nginx生产环境最高并发值。Nginx的主要应用类别Nginx的主要应用类别1、使用 Nginx 结合FastCGI运行 PHP、JSP 、Perl等程序 2、使用 Nginx 作反向代理、负载均衡、规则过滤 3、使用 Nginx 运行静态HTML页、图片 4、Nginx与其他新技术的结合应用Nginx在金山逍遥网中的应用案例Nginx在金山逍遥网中的应用案例金山逍遥网(xoyo.com)是金山游戏官方网站,为金山软件旗下的各款游戏提供新闻资讯、客户服务、在线充值、视听互动、在线活动、博客、相册、论坛、玩家社区等内容建设和在线服务支持。金山逍遥网 Nginx七层负载均衡的应用金山逍遥网 Nginx七层负载均衡的应用Nginx承担每个机房Web负载均衡服务Nginx承担每个机房Web负载均衡服务简单的Nginx负载均衡配置①简单的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负载均衡配置②简单的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负载均衡配置③简单的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负载均衡的双机热备Nginx负载均衡的双机热备通常情况下的负载均衡HA高可用通常情况下的负载均衡HA高可用优点:实现了双机热备、故障自动转移。 缺点:备机服务器处于闲置状态,浪费了硬件资源。逍遥网Nginx负载均衡双机互备逍遥网Nginx负载均衡双机互备正常情况下,两台Nginx负载均衡服务器全部处于活动状态,对外提供服务。服务器①绑定IP别名服务器①绑定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别名服务器②绑定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包给网关。null新的Nginx双机互备(发生故障时)新的Nginx双机互备(发生故障时)自动接管公网虚拟IP,实现故障转移服务器①去除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服务器②接管原服务器①的虚拟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分发Nginx负载均衡URL分发null硬件、软件 七层负载均衡对比: NetScaler 与 Nginxnull硬件、软件 七层负载均衡对比: NetScaler 与 Nginx根据不同的URL转发到不同服务器根据不同的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相关文件的实时自动同步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的Web缓存服务Nginx的缓存功能Nginx的缓存功能Nginx从0.7.48版本开始,支持了类似Squid的缓存功能; 缓存把URL及相关组合当作Key,用md5编码哈希后保存; Nginx的Web缓存服务只能为指定URL或状态码设置过期时间,不支持类似Squid的PURGE指令,手动清除指定缓存页面; 采用MMAP实现,设置的缓存区大小不能超过物理内存+SWAP的值。 反向代理中的Nginx.conf缓存配置①反向代理中的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缓存配置②反向代理中的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缓存配置③反向代理中的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缓存功能的优点Nginx缓存功能的优点对于修改实时性要求不高的图片、Flash、CSS样式文件、JavaScript文件,可以在Nginx反向代理(负载均衡)服务器上设置缓存,不用每次请求都转发到后端Web服务器,加快了响应速度。 减少了Nginx与后端Web服务器的连接数,提高了Nginx处理性能。Nginx的Rewrite重写规则Nginx的Rewrite重写规则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的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规则实例对比②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规则实例对比③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规则实例对比④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规则实例对比⑤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示例①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与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的配合Nginx与金山逍遥TCSQL的配合一般数据库的缓存类型一般数据库的缓存类型一般数据库缓存分为四种: 1、Key/Value单个对象缓存,如Memcached 2、列表缓存,就像论坛里帖子的列表 3、记录条数的缓存,比如一个论坛板块里有多少个帖子,这样才方便实现分页。 4、复杂一点的group,sum,count查询,比如一个论坛里按点击数排名的最HOT的帖子列表。 第一种比较好实现,后面三种比较麻烦。什么是TCSQL实时列表缓存数据库?什么是TCSQL实时列表缓存数据库?TCSQL是金山逍遥网技术支持部平台组以Tokyo Cabinet DBM为底层存储与索引,结合类似Memcached的Key-Value内存对象缓存,借鉴SQL语句的SELECT、INSERT、UPDATE、DELETE思想与功能开发的实时列表缓存数据库,可实现对列表页数据、记录条数的实时缓存。 TCSQL采用HTTP GET/POST协议+JSON数据交换格式在客户端、服务器端之间进行数据交互。 利用我们编写的MySQL UDF扩展+触发器,我们可以在MySQL的某张表发生插入、更新、删除操作时,自动将数据同步到TCSQL数据库,使得TCSQL可以当MySQL从库一样使用。 nullTCSQL的查询速度TCSQL的查询速度TCSQL在10000并发连接情况下的查询速度(服务器为浪潮NF190服务器,两颗双核Xeon(TM) CPU 2.80GHz、4GB内存、1万转SCSI硬盘。): 主键查询并取出倒序第1条记录(“=”运算):12155次请求/秒 其他索引键查询并取出倒序第1条记录(“=”运算):11897次请求/秒 TCSQL的查询速度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中间层抛弃制约性能的PHP中间层浏览器端JavaScript --查询--> 服务器端Nginx(rewrite重写规则、proxy_pass反向代理) + TCSQL 抛弃了中间制约整体性能的PHP层。 运行于浏览器端的JavaScript代码通过Nginx直接查询TCSQL数据库,取得数据并在网页显示。 利用Nginx的rewrite重写规则控制对TCSQL的访问权限。谢谢!谢谢!
本文档为【高性能Web服务器Nginx及相关新技术的应用实践】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_335002
暂无简介~
格式:ppt
大小:2MB
软件:PowerPoint
页数:0
分类:互联网
上传时间:2012-03-21
浏览量:22