免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 无风之谷
打印 上一主题 下一主题

[其他] 案例讨论——Nginx在工作中的应用讨论(获奖名单已公布-2012-8-23) [复制链接]

论坛徽章:
0
1 [报告]
发表于 2012-06-21 14:02 |显示全部楼层


一、Nginx作为轻量级的负载均衡器,它较适用于哪种场景中,它与之LVS/HAProxy的对比,其优势在哪里?

  首先来说,Nginx比较有名的功能是反向代理,反向代理和负载均衡不是一回事,Nginx也没打算和LVS有一比。


二、Nginx作为高抗并发的Web软件,与传统的Apache相比较为有优势,大家一般会将其哪种场景中,它与Apache相对,其优势在哪里?

   其次,Nginx开发中解决的另一个重要问题是C10k问题,与Apache相比不能谈优势不优势;


三、Nginx作为Cache也越来越成熟了,与专业级的Squid/Varnish相比,大家更倾向于将其应用于哪种场景中,它与Squid/Varnish相比,优势又如何呢?

    最后,Nginx有自己的缓存机制,既可以是内存缓存也可以是磁盘缓存,而且在这套书中也介绍了Nginx的5大缓存机制:

    第一种、Proxy_cache
        第二种、proxy_store
        第三种、Memcached
        第四种、NCACHE(概念缓存,已经不用)
        第五种、Varnish

    根据应用程序或者系统部署(就是服务器的资源情况)进行选择使用。



论坛徽章:
0
2 [报告]
发表于 2012-06-21 15:10 |显示全部楼层
回复 19# 方兆国


     这是两个决然不同的缓存机制。

论坛徽章:
0
3 [报告]
发表于 2012-06-23 10:41 |显示全部楼层
能自己开发Web服务器更好, 何必对Nginx二次开发呢!不伦不类

论坛徽章:
0
4 [报告]
发表于 2012-06-24 08:05 |显示全部楼层
回复 59# chenyx


    upstream-fair模块的功能在于它将进入的请求转发到一个最近最少“忙”的后台服务器,而不是使用RR(轮询)方式,它是一个用于对后端代理服务器实现公平“工作”的一个模块,它增强了标准的RR方式负载均衡,它通过跟踪“忙”的后台服务器(例如 Thin, Ebb, Mongrel)来均衡的载人不“忙”的后台服务器进程。

安装upstream-fair模块

    下面我们来下载并且安装这个模块:

下载upstream-fair模块

[root@mail ~]# wget https://nodeload.github.com/gnos ... fair/tarball/master
--08:37:53--  https://nodeload.github.com/gnos ... fair/tarball/master
Resolving nodeload.github.com... 207.97.227.252
Connecting to nodeload.github.com|207.97.227.252|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10066 (9.8K) [application/octet-stream]
Saving to: `gnosek-nginx-upstream-fair-7171df8.tar.gz'

100%[================================>] 10,066      14.4K/s   in 0.7s   

08:37:56 (14.4 KB/s) - `gnosek-nginx-upstream-fair-7171df8.tar.gz' saved [10066/10066]
   
查看目录结构

[root@mail ~]# tar -zxvf gnosek-nginx-upstream-fair-7171df8.tar.gz
[root@mail gnosek-nginx-upstream-fair-7171df8]# tree
.
|-- README
|-- config
`-- ngx_http_upstream_fair_module.c

0 directories, 3 files
   
    目录结构很简单,需要查看一下README文件。

编译安装

[root@mail nginx-1.0.8]# ./configure --prefix=/usr/local/nginx-1.0.8-fair --add-module=/root/gnosek-nginx-upstream-fair-7171df8
[root@mail nginx-1.0.8]# make
[root@mail nginx-1.0.8]# make install
   

配置示例

upstream mongrel {
    fair;
    server 127.0.0.1:5000;
    server 127.0.0.1:5001;
    server 127.0.0.1:5002;
  }
   
指    令

    查看源代码:
   
static ngx_command_t  ngx_http_upstream_fair_commands[] = {

    { ngx_string("fair"),
      NGX_HTTP_UPS_CONF|NGX_CONF_ANY,
      ngx_http_upstream_fair,
      0,
      0,
      NULL },

    { ngx_string("upstream_fair_shm_size"),
      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
      ngx_http_upstream_fair_set_shm_size,
      0,
      0,
      NULL },

      ngx_null_command
};

    可见该模块提供了以下两条指令:

指令名称:fair
功    能:启用“公平”功能。
语    法:fair
使用环境:upstream

指令名称:upstream_fair_shm_size
功    能:该指令设置用于存储有关繁忙后台服务器的信息的共享内存大小。默认值是8个内存页面,因此在大多数系统上是32k。
语    法:upstream_fair_shm_size size
使用环境:http
默 认 值:default upstream_fair_shm_size 32k

配置实例

http {

    ……

upstream_fair_shm_size 64k;

}

upstream mongrel {
    fair;
    server 127.0.0.1:5000;
    server 127.0.0.1:5001;
    server 127.0.0.1:5002;
  }

论坛徽章:
0
5 [报告]
发表于 2012-06-25 13:26 |显示全部楼层
Nginx和Tomcat的session处理分为两步:

第一步,解决Nginx和Tomcat的负载均衡;
第二步,解决Tomcat集群和Memcached存储会话。

我们的这个案例是这样的在IP为192.168.3.139这台机器上安装了Tomcat1和Memcached1,而在IP为192.168.3.140这个台机器上安装了Tomcat2和Memcached2,对于Tomcat1和Memcached1、Tomcat2和Memcached2只是一个叫法而已,它们是完全一样的。在配置时要实现以下功能,参考了如下的官方文档:

http://code.google.com/p/memcach ... tupAndConfiguration

看下面的图:
   
< Tomcat1>  < Tomcat2>
           .  \ /   .
.   X    .
.  / \   .
< Memcached1>  < Memcached2>

    在正常情况下,换句话说就是Tomcat1和Memcached1、Tomcat2和Memcached2都正常工作的时候,Tomcat1 会将session ID存储在Memcached2中,同理Tomcat2 会将session ID存储在Memcached1中,但是如果其中的一个Memcached出现了问题,与其对应的Tomcat就会将session ID存储在另一个Memcached中。为什么这样做呢?如果运行在同一台机器上Tomcat和Memcached同时倒掉(这种情况多数是系统崩溃)时,用户的会话不会丢失。

    这样的结构实现了只要有一个Tomcat、一个Memcached不失效就可以正常工作。

第一步,解决Nginx和Tomcat的负载均衡

    这一步比较简单,在Nginx的配置文件中添加如下内容:
   
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

   upstream  tomcat   {
              server   192.168.3.139:8080;
              server   192.168.3.140:8080;
    }

   server {
        listen       80;
        server_name  localhost;
      

location  / {
            root   html;
            index  index.html index.htm;
            proxy_pass        http://tomcat;
            proxy_set_header  X-Real-IP  $remote_addr;
            client_max_body_size  80m;
        }
……
}

……
}



然后再重新启动Nginx就可以了。

第二步,解决Tomcat集群和Memcached存储会话

这一步又分为两步来完成:一是要解决Tomcat集群,二是要解决Memcached存储会话。

第一步、解决Tomcat集群

    在这个案例中我们配置了两台Tomcat服务器,在两台不同的物理服务器上,它们的IP分别为192.168.3.139和192.168.3.140。

在IP为 192.168.3.139 的机器上添加如下配置:

    将以下内容添加在$CATALINA_HOME/server.xml中。


<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="8">

          <Manager className="org.apache.catalina.ha.session.DeltaManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"/>

          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                        address="224.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="192.168.3.139"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6"/>

            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
              <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
            </Sender>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
          </Channel>

          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=""/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/>

          <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>
   
注意将以上的配置添加在原配置文件中:

      <!--
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      -->
   
的下面即可。

    另外还需要执行以下四条命令:

[root@mail tomcat]#mkdir  /tmp/war-temp/
[root@mail tomcat]#mkdir  /tmp/war-deploy/
[root@mail tomcat]#mkdir  /tmp/war-listen/
   
这三条命令没什么可解释的,这是上面配置中的需要。

[root@mail tomcat]# route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
   
这条命令的功能在于添加多播路由,对于是不是eth0设备要根据具体的情况设定。

在IP为 192.168.3.140 的机器上添加如下配置:

    将以下内容添加在$CATALINA_HOME/server.xml中。


<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="8">

          <Manager className="org.apache.catalina.ha.session.DeltaManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"/>

          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                        address="224.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="192.168.3.140"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6"/>

            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
              <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
            </Sender>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
          </Channel>

          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=""/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/>

          <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>
   
同样,注意将以上的配置添加在原配置文件中:

      <!--
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      -->
   
的下面即可。

    另外还需要执行以下四条命令:

[root@mail tomcat]#mkdir  /tmp/war-temp/
[root@mail tomcat]#mkdir /tmp/war-deploy/
[root@mail tomcat]#mkdir /tmp/war-listen/
   
这三条命令没什么可解释的,这是上面配置中的需要。

[root@mail tomcat]# route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
   
这条命令的功能在于添加多播路由,对于是不是eth0设备要根据具体的情况设定。

第二步、解决Memcached存储会话

    由于我们使用了Memcached,因此需要下载它的客户端java包,如果你能够自己写,那么也可以自己去写,不过这种活我们做运维的多数是干不了,干不了就使用开源的吧,google的开源替我们做了,需要我们做的就是下载了。

下载下面的jar包,并且将其放置在$CATALINA_HOME/lib目录下,在两台装有Tomcat的机器上做同样的操作,就是说在两个Tomcat服务器的$CATALINA_HOME/lib目录下都添加以下jar包。

[root@mail lib]#wget http://memcached-session-manager.googlecode.com/ \
> files/memcached-session-manager-tc7-1.4.1.jar
[root@mail lib]wget  http://memcached-session-manager.googlecode.com/ \
> files/msm-javolution-serializer-jodatime-1.3.0.jar
[root@mail lib] wget http://memcached-session-manager.googlecode.com/ \
> files/msm-javolution-serializer-cglib-1.3.0.jar
[root@mail lib]wget http://memcached-session-manager.googlecode.com/ \
> files/minlog-1.2.jar
[root@mail lib]wget http://memcached-session-manager.googlecode.com/ \
> files/msm-kryo-serializer-1.4.0.jar
[root@mail lib]wget http://memcached-session-manager.googlecode.com/ \
> files/kryo-1.03.jar
[root@mail lib]wget http://memcached-session-manager.googlecode.com/ \
> files/reflectasm-0.9.jar
[root@mail lib]wget http://cloud.github.com/downloads/magro/ \
> kryo-serializers/kryo-serializers-0.8.jar
[root@mail lib]wget http://mirrors.ibiblio.org/pub/mirrors/ \
> maven2/asm/asm/3.2/asm-3.2.jar
[root@mail lib]wget http://spymemcached.googlecode.com/ \
> files/memcached-2.5.jar

   
    然后再在$CATALINA_HOME/context.xml添加配置内容,两台Tomcat的$CATALINA_HOME/context.xml文件中都添加。

在192.168.3.139的机器上添加:

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:192.168.3.139:11211 n2:192.168.3.140:11211"
     failoverNodes="n1"
    requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
   
将以上的内容放置在原文件<Context> … </Context>元素之内。

在192.168.3.140的机器上添加:

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:192.168.3.139:11211 n2:192.168.3.140:11211"
     failoverNodes="n2"
    requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
   
同样添加在原文件<Context> … </Context>元素之内。

    好了,现在所有的配置都完成了。

论坛徽章:
0
6 [报告]
发表于 2012-06-25 17:45 |显示全部楼层
回复 78# to407


     贴出测试

论坛徽章:
0
7 [报告]
发表于 2012-06-27 13:45 |显示全部楼层
回复 94# pl_piaoling


    http://space.itpub.net/27043155
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP