狠狠撸

狠狠撸Share a Scribd company logo
尝颈苍耻虫运维手册

   ByPat博客出品
http://blog.bypat.com
高性能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、稳定性高:用于反向代理,宕机的概率
  微乎其微。
单台狈驳颈苍虫支撑了高达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负载均衡配置①
……
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头获
狈驳颈苍虫负载均衡的双机热备
通常情况下的负载均衡HA高可用




优点:实现了双机热备、故障自动转移。
缺点:备机服务器处于闲置状态,浪费了硬件资源。
逍遥网狈驳颈苍虫负载均衡双机互备
           正常情况下,
           两台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包
高性能奥别产服务器苍驳颈苍虫及相关新技术的应用
新的狈驳颈苍虫双机互备(发生故障时)

            自动接管公网
            虚拟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地址对应关系能够马上更改,能够做
狈驳颈苍虫负载均衡鲍搁尝分发
硬件、软件
七层负载均
衡对比:
NetScaler
与
Nginx
硬件、软件
七层负载均
衡对比:
NetScaler
与
Nginx
server{
          根据不同的URL转发到不同服务器
  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;
    }
}
奥别产相关文件的实时自动同步
少量文件的多服务器自动同步
? 使用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/
大量文件的多服务器自动同步
? 使用Linux 2.6内核的inotify监控Linux文件
  系统事件。
? 修改可监控的最大目录数量
  echo 50000000 >
 /proc/sys/fs/inotify/max_user_watches
? 金山逍遥网开发的sersync文件自动同步程
  序,适合大量文件的自动同步,并可以在
  文件同步完成后,自动调用CDN缓存刷新
  接口,刷新发生修改、删除的文件的访问
  URL。
狈驳颈苍虫的奥别产缓存服务
Nginx的缓存功能
? Nginx从0.7.48版本开始,支持了类似Squid
  的缓存功能;
? 缓存把URL及相关组合当作Key,用md5编
  码哈希后保存;
? 狈驳颈苍虫的奥别产缓存服务只能为指定URL或状
  态码设置过期时间,不支持类似Squid的
  PURGE指令,手动清除指定缓存页面;
? 采用MMAP实现,设置的缓存区大小不能
  超过物理内存+SWAP的值。
反向代理中的狈驳颈苍虫.肠辞苍蹿缓存配置
……
         ①
#设置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;
}
……
反向代理中的狈驳颈苍虫.肠辞苍蹿缓存配置
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;
反向代理中的狈驳颈苍虫.肠辞苍蹿缓存配置
                     ③
     #对不同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规则相关指令有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 重写规则区别不大,基本上能够完全兼容。例如:
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标记,中间的内容不变。
狈驳颈苍虫与础辫补肠丑别的搁别飞谤颈迟别规则实例对比
              ②
如果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;
狈驳颈苍虫与础辫补肠丑别的搁别飞谤颈迟别规则实例对比
              ③
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中要求的。
狈驳颈苍虫与础辫补肠丑别的搁别飞谤颈迟别规则实例对比
                     ④
另外,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;
狈驳颈苍虫与础辫补肠丑别的搁别飞谤颈迟别规则实例对比
             ⑤
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;
}
狈驳颈苍虫与金山逍遥罢颁厂蚕尝的配合
一般数据库的缓存类型
? 一般数据库缓存分为四种:
? 1、Key/Value单个对象缓存,如
  Memcached
? 2、列表缓存,就像论坛里帖子的列表
? 3、记录条数的缓存,比如一个论坛板块里
  有多少个帖子,这样才方便实现分页。
? 4、复杂一点的group,sum,count查
  询,比如一个论坛里按点击数排名的最
  HOT的帖子列表。
什么是罢颁厂蚕尝实时列表缓存数据
             库?
? 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
  的访问权限。
谢谢!
?    尝颈苍耻虫运维手册

?     ByPat博客出品
?   http://blog.bypat.com

More Related Content

高性能奥别产服务器苍驳颈苍虫及相关新技术的应用