Nginx0.8.54+Tomcat6实现负载均衡

    最近公司后台系统自从加了 lucene 以来 , 上个星期每天因为内存溢出导致宕机或者系统运行极慢 ( 我都快崩溃了 ), 不得不在后台打开 Jconsole 就行实时监控 , 每当内存达到一定峰值就手动执行 GC, 释放几百 M 的内存 , 才得以正常运行 ! 后来通过 jprofiler6 监控是 lucene Term 实例过多的问题 !

如图 :

虽然内存问题通过以上方式暂时解决了 , 但是也出现了致命的问题 lucene 打开索引的文件数过多没有及时释放 ,

服务器一直在后台打印错误日志 ( 一天有 10G 的日志 )

如图 :

在上面的放两个问题 , 希望的到大家的回帖帮助 !

下面进入主题 :

测试环境:

一共两台服务器 A.B, 都是 Redhat Linux

A:ip(211.151.*.39)  服务器装有 Tomcat39 http 请求端口为 8080

B:ip(211.151.*.40)  服务器装有 Tomcat40  http 请求端口为 8080;  nginx 服务器 ,http 请求端口 8085

 

ip 地址 ( 外网 IP) 有一个被省略 , 推荐大家在一台机器测试改变 tomcat 端口就可以啦

以上是公司提供的两台测试服务器

软件版本

Nginx 0.854

Apache Tomcat/6.0.20

 

安装

过程细节网上资料很多 , 我就不写了 ……

配置 ngnix 服务器 /usr/local/nginx/conf/nginx.conf

#user  nobody;

# 工作进程数

worker_processes  6;

 

#error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;

 

#pid         logs/nginx.pid;

 

# 工作模式及连接数上限

events {

    worker_connections  4096;

}

 

 

http {

    include       mime.types;

    default_type  application/octet-stream;

        

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

    #                   '$status $body_bytes_sent "$http_referer" '

    #                  '"$http_user_agent" "$http_x_forwarded_for"';

 

    #access_log  logs/access.log  main;

 

    sendfile        on;

    #tcp_nopush     on;

 

    #keepalive_timeout  0;

    keepalive_timeout  65;

 

    #gzip  on;

         upstream tqcrm {           # tqcrm 项目名

                   # 配置 tomcat 服务器

                   server 211.151.*.39:8080 weight=1; # tomcat 地址和端口

                   server 211.151.*.40:8080 weight=1;

         }

 

    server {

        listen       8085;     #nginx 监听端口

        server_name  localhost;

 

        #charset koi8-r;

                   charset gb2312;

       

                   #access_log  logs/host.access.log  main;

 

        location / {

            root   html;

            #index  index.html index.htm;

                            proxy_pass http://tqcrm;

        }

 

     location /NginxStatus {

                  stub_status  on;

                  access_log   on;

                   auth_basic  "NginxStatus";

       }

 

 

        #error_page  404              /404.html;

 

        # redirect server error pages to the static page /50x.html

        #

        error_page    500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

 

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80

        #

        #location ~ /.php$ {

        #    proxy_pass   http://127.0.0.1;

        #}

 

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

        #

        #location ~ /.php$ {

        #    root           html;

        #    fastcgi_pass   127.0.0.1:9000;

        #    fastcgi_index  index.php;

        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

        #    include        fastcgi_params;

        #}

 

        # deny access to .htaccess files, if Apache's document root

        # concurs with nginx's one

        #

        #location ~ //.ht {

        #    deny  all;

        #}

    }

 

 

    # another virtual host using mix of IP-, name-, and port-based configuration

    #

    #server {

    #    listen       8000;

    #    listen       somename:8080;

    #    server_name  somename   alias  another.alias;

 

    #    location / {

    #        root   html;

    #        index  index.html index.htm;

    #    }

    #}

 

 

    # HTTPS server

    #

    #server {

    #    listen       443;

    #    server_name  localhost;

 

    #    ssl                  on;

    #    ssl_certificate      cert.pem;

    #    ssl_certificate_key  cert.key;

 

    #    ssl_session_timeout  5m;

 

    #    ssl_protocols  SSLv2 SSLv3 TLSv1;

    #    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;

    #    ssl_prefer_server_ciphers   on;

 

    #    location / {

    #        root   html;

    #        index  index.html index.htm;

    #    }

    #}

 

}

 

配置 tomcat39(server.xml)

xml version = '1.0' encoding = 'utf-8' ?>

 

< Server port = "8005" shutdown = "SHUTDOWN" >

 

 

  < Listener className = "org.apache.catalina.core.AprLifecycleListener" SSLEngine = "on" />

 

  < Listener className = "org.apache.catalina.core.JasperListener" />

 

  < Listener className = "org.apache.catalina.mbeans.ServerLifecycleListener" />

  < Listener className = "org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

 

 

  < GlobalNamingResources >

   

    < Resource name = "UserDatabase" auth = "Container"

              type = "org.apache.catalina.UserDatabase"

              description = "User database that can be updated and saved"

              factory = "org.apache.catalina.users.MemoryUserDatabaseFactory"

              pathname = "conf/tomcat-users.xml" />

  GlobalNamingResources >

 

 

  < Service name = "Catalina" >

 

   

   

    < Executor name = "tomcatThreadPool" namePrefix = "catalina-exec-"

         maxThreads = "500" minSpareThreads = "50" maxIdleTime = "60000" />

   

   

   

 

 

  

   

  < Connector executor = "tomcatThreadPool"

               port = "8080" protocol = "HTTP/1.1"

               connectionTimeout = "20000"

               redirectPort = "8443" enableLookups = "false"   disableUploadTimeout = "true" URIEncoding = "gbk"

        compression = "on"

        noCompressionUserAgents = "gozilla, traviata"

        compressableMimeType = "text/html,text/xml,text/javascript,text/css,text/plain,application/json"

 

   />

             

   

   

 

   

    < Connector port = "8009" protocol = "AJP/1.3" redirectPort = "8443" />

 

 

   

 

   

    < Engine name = "Catalina" defaultHost = "localhost" jvmRoute = "tomcat39" >

 

     

     

      < 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 = "228.0.0.4"

                     port = "45564"

                     frequency = "500"

                     dropTime = "3000" />

       < Receiver className = "org.apache.catalina.tribes.transport.nio.NioReceiver"

                address = "211.151.*.39"

                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" />

         < Interceptor className = "org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor" />

          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 >

             

      < Realm className = "org.apache.catalina.realm.UserDatabaseRealm"

             resourceName = "UserDatabase" />

 

     

      < Host name = "localhost"   appBase = "webapps"

            unpackWARs = "true" autoDeploy = "true"

            xmlValidation = "false" xmlNamespaceAware = "false" >

      

        < Valve className = "org.apache.catalina.valves.AccessLogValve"

                 directory = "log"   prefix = "localhost_access_log." suffix = ".txt"

                 pattern = "%t %r %s %T" resolveHosts = "false" />

      Host >

    Engine >

  Service >

Server >

配置 tomcat40(server.xml)

xml version = '1.0' encoding = 'utf-8' ?>

 

< Server port = "8005" shutdown = "SHUTDOWN" >

 

 

  < Listener className = "org.apache.catalina.core.AprLifecycleListener" SSLEngine = "on" />

 

  < Listener className = "org.apache.catalina.core.JasperListener" />

 

  < Listener className = "org.apache.catalina.mbeans.ServerLifecycleListener" />

  < Listener className = "org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

 

 

  < GlobalNamingResources >

   

    < Resource name = "UserDatabase" auth = "Container"

              type = "org.apache.catalina.UserDatabase"

              description = "User database that can be updated and saved"

              factory = "org.apache.catalina.users.MemoryUserDatabaseFactory"

              pathname = "conf/tomcat-users.xml" />

  GlobalNamingResources >

 

 

  < Service name = "Catalina" >

 

   

   

    < Executor name = "tomcatThreadPool" namePrefix = "catalina-exec-"

         maxThreads = "500" minSpareThreads = "50" maxIdleTime = "60000" />

   

   

   

你可能感兴趣的:(javaEE,tomcat,nginx,documentation,interceptor,ssl,compression)