Chinaunix首页 | 论坛 | 博客
  • 博客访问: 391296
  • 博文数量: 146
  • 博客积分: 7142
  • 博客等级: 少将
  • 技术积分: 975
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-03 09:43
文章分类

全部博文(146)

文章存档

2012年(1)

2011年(5)

2010年(24)

2009年(116)

我的朋友

分类: LINUX

2010-01-03 21:11:22

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

北京金山软件 逍遥网

张宴

2009.10

什么是Nginx

          Nginx (engine x) 是俄罗斯人Igor Sysoev(塞索耶夫)编写的一款高性能的 HTTP 和反向代理服务器。

 

          Nginx 已经在俄罗斯最大的门户网站── Rambler Media)上运行了4年时间,同时俄罗斯超过20%的虚拟主机平台采用Nginx作为反向代理服务器。

 

          在国内,已经有新浪博客、新浪播客、搜狐通行证、网易新闻、网易博客、金山逍遥网、金山爱词霸、校内网、YUPOO相册、豆瓣、迅雷看看等多家网站、频道使用 Nginx 服务器

Nginx的优点①

          1、高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到23万并发连接数。

          2、内存消耗少:在3万并发连接下,开启的10Nginx 进程才消耗150M内存(15M*10=150M)。

          3、配置文件非常简单:风格跟程序一样通俗易懂。

          4、成本低廉:Nginx为开源软件,可以免费使用。而购买F5 BIG-IPNetScaler等硬件负载均衡交换机则需要十多万至几十万人民币。

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运行 PHPJSP Perl等程序

 

          2、使用 Nginx 作反向代理、负载均衡、规则过滤

 

          3、使用 Nginx 运行静态HTML页、图片

 

          4Nginx与其他新技术的结合应用

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指令定义一组反向代理/负载均衡后端服务器池。

……

server{

   listen 80;

   server_name  bbs.yourdomain.com *.bbs.yourdomain.com;

   location /

   {

         proxy_pass

         proxy_set_header Host  $host;

         proxy_set_header X-Forwarded-For  $remote_addr;

   }

   access_log off;

 }

……

          proxy_pass 用于指定反向代理的服务器池。

           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包,保证了网关上IPMAC地址对应关系能够马上更改,能够做到强行接管虚拟IP

Nginx负载均衡URL分发

硬件、软件七层负载均衡对比:NetScalerNginx

根据不同的URL转发到不同服务器

server{

   listen       80;

   server_name  abc.domain.com;

 

   location ~ ^/admincp.php

   {

         proxy_pass

         proxy_set_header Host  $host;

         proxy_set_header X-Forwarded-For  $remote_addr;

   }

 

   location /

   {

         proxy_pass

         proxy_set_header Host  $host;

         proxy_set_header X-Forwarded-For  $remote_addr;

   }

}

Web相关文件的实时自动同步

少量文件的多服务器自动同步

          使用Linux 2.6内核的inotify监控Linux文件系统事件。

          利用开源的lsync监听某一目录,如果目录内文件发生增、删、改,利用Rsync协议自动同步到多台服务器。

          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/

大量文件的多服务器自动同步

          使用Linux 2.6内核的inotify监控Linux文件系统事件。

          修改可监控的最大目录数量

      echo 50000000 > /proc/sys/fs/inotify/max_user_watches

          金山逍遥网开发的sersync文件自动同步程序,适合大量文件的自动同步,并可以在文件同步完成后,自动调用CDN缓存刷新接口,刷新发生修改、删除的文件的访问URL

NginxWeb缓存服务

Nginx的缓存功能

          Nginx0.7.48版本开始,支持了类似Squid的缓存功能;

          缓存把URL及相关组合当作Key,用md5编码哈希后保存;

          NginxWeb缓存服务只能为指定URL或状态码设置过期时间,不支持类似SquidPURGE指令,手动清除指定缓存页面;

          采用MMAP实现,设置的缓存区大小不能超过物理内存+SWAP的值。

反向代理中的Nginx.conf缓存配置①

……

#设置Web缓存区名称为cache_one,缓存空间大小为2000MB1天清理一次缓存,单个文件超过5m不缓存。

proxy_cache_path  /data0/proxy_cache_path  levels=1:2   keys_zone=cache_one:2000m inactive=1d max_size=5m;

 

#注:proxy_temp_pathproxy_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;

}

……

server

 {

   listen       80;

   server_name  my.domain.com;

   location /

   {

        proxy_set_header Host  $host;

        proxy_set_header X-Forwarded-For  $remote_addr;

        proxy_pass

   }

   location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$

   {

        #对图片、JSCSS进行缓存,使用Web缓存区cache_one

        proxy_cache cache_one;

             

#对不同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根据Keymd5哈希存储缓存,这里根据域名、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

   }

   access_log  off;

}

Nginx缓存功能的优点

          对于修改实时性要求不高的图片、FlashCSS样式文件、JavaScript文件,可以在Nginx反向代理(负载均衡)服务器上设置缓存,不用每次请求都转发到后端Web服务器,加快了响应速度。

          减少了Nginx与后端Web服务器的连接数,提高了Nginx处理性能。

NginxRewrite重写规则

Nginx Rewrite规则相关指令

Nginx Rewrite规则相关指令有ifrewritesetreturnbreak等,其中rewrite是最关键的指令。一个简单的Nginx Rewrite规则语法如下:

rewrite  ^/b/(.*)\.html  /play.php?video=$1 break;

 

如果加上if语句,示例如下:

if (!-f $request_filename)

{

     rewrite ^/img/(.*)$ /site/$host/images/$1 last;

}

NginxApacheRewrite规则实例对比①

简单的NginxApache 重写规则区别不大,基本上能够完全兼容。例如:

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;

 

由以上示例可以看出,ApacheRewrite规则改为NginxRewrite规则,其实很简单:ApacheRewriteRule指令换成Nginxrewrite指令,Apache[L]标记换成Nginxlast标记,中间的内容不变。

 

如果ApacheRewrite规则改为NginxRewrite规则后,使用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;

ApacheNginxRewrite规则在URL跳转时有细微的区别:

 

Apache Rewrite 规则:

RewriteRule  ^/html/tagindex/([a-zA-Z]+)/.*$ /$1/ [R=301,L]

 

Nginx Rewrite 规则:

rewrite  ^/html/tagindex/([a-zA-Z]+)/.*$   permanent;

 

以上示例中,我们注意到,Nginx Rewrite 规则的置换串中增加了“”,这是在Nginx中要求的。

另外,ApacheNginxRewrite规则在变量名称方面也有区别,例如:

 

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=   last;

ApacheNginx Rewrite 规则的一些功能相同或类似的指令、标记对应关系:

 

ApacheRewriteCond指令对应Nginxif指令;

ApacheRewriteRule指令对应Nginxrewrite指令;

Apache[R]标记对应Nginxredirect标记;

Apache[P]标记对应Nginxlast标记;

Apache[R,L]标记对应Nginxredirect标记;

Apache[P,L]标记对应Nginxlast标记;

Apache[PT,L]标记对应Nginxlast标记;

NginxApache的多条件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]

 

Nginxif指令不支持嵌套,也不支持ANDOR等多条件匹配,相比于ApacheRewriteCond,显得麻烦一些,但是,我们可以通过下一页的Nginx配置写法来实现这个示例:

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;

}

 

附件为原件PPT  有兴趣的朋友可以下载看

文件: sd2c_nginx.zip
大小: 1937KB
下载: 下载

阅读(2057) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~