免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
71 [报告]
发表于 2012-06-25 00:19 |只看该作者
回复 70# coralzd


    中国移动,中国联通,中国电信,中国建设银行这四家是JSP的,其他的就不清楚了
其他的几家大银行用的都是ASP,大企业用PHP的很少

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
72 [报告]
发表于 2012-06-25 00:22 |只看该作者
回复 66# chenyx


    这个没有试过,我是先用JSP做好之后,然后再简单的设置了那个upstream tomcat_Server,然后现在比较忙,也再没有调式过,当初用Nginx,就是看到CU上这方面的帖子比较多,好奇

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
73 [报告]
发表于 2012-06-25 09:44 |只看该作者
三、Nginx作为Cache也越来越成熟了,与专业级的Squid/Varnish相比,大家更倾向于将其应用于哪种场景中,它与Squid/Varnish相比,优势又如何呢?
我的网络不需要代理,所以目前没研究过Squid/Varnish.

这个问题就技术细节方面貌似谈得很少有深入啊,,我先google一下,

论坛徽章:
0
74 [报告]
发表于 2012-06-25 10:53 |只看该作者
回复 27# 方兆国


    与内核数量一致即可

论坛徽章:
0
75 [报告]
发表于 2012-06-25 11:00 |只看该作者
翻了这几天漏掉的帖子

感觉 总地来说, nginx是当做web前端用,尽可能的利用其高并发的能力
用反向代理的功能与后端service的进程通讯.
强大的负载均衡对多个后端进行request分发,且支持失败检测
本地的缓存功能,基本都是页面的一些静态文件,量不会太大.

现在nginx的开发也相当活跃,有很多二次开发的产品,如淘宝的tengine.

论坛徽章:
0
76 [报告]
发表于 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>元素之内。

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

论坛徽章:
2
午马
日期:2015-01-27 11:22:392015年辞旧岁徽章
日期:2015-03-03 16:54:15
77 [报告]
发表于 2012-06-25 16:54 |只看该作者
为什么我一直感觉毛子的技术不靠呢。。。 并发量大但太虚了。。。提高parallelism 但对于concurrency 就不这么明显了~~

论坛徽章:
0
78 [报告]
发表于 2012-06-25 17:45 |只看该作者
回复 78# to407


     贴出测试

论坛徽章:
54
2017金鸡报晓
日期:2017-02-08 10:39:42操作系统版块每日发帖之星
日期:2016-03-08 06:20:00操作系统版块每日发帖之星
日期:2016-03-07 06:20:00操作系统版块每日发帖之星
日期:2016-02-22 06:20:00操作系统版块每日发帖之星
日期:2016-01-29 06:20:00操作系统版块每日发帖之星
日期:2016-01-27 06:20:00操作系统版块每日发帖之星
日期:2016-01-20 06:20:00操作系统版块每日发帖之星
日期:2016-01-06 06:20:0015-16赛季CBA联赛之江苏
日期:2015-12-21 20:00:24操作系统版块每日发帖之星
日期:2015-12-21 06:20:00IT运维版块每日发帖之星
日期:2015-11-17 06:20:002015亚冠之广州恒大
日期:2015-11-12 10:58:02
79 [报告]
发表于 2012-06-25 20:43 |只看该作者
一、Nginx作为轻量级的负载均衡器,它较适用于哪种场景中,它与之LVS/HAProxy的对比,其优势在哪里?
我用的最多的是反向代理,一个前端多个后端,很轻松就布置完成,不需要很多的配置。

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

近几年,除了cgi的应用外,我基本上放弃了apache,对于web系统,nginx+php-fpm组合非常好棒,不仅速度快,安全方面也比较好控制。

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

没用nginx作为cache服务器,感觉squid在控制方面比较灵活,性能也很高。

论坛徽章:
0
80 [报告]
发表于 2012-06-26 08:56 |只看该作者
现在我们使用作为反向代理
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP