Weird. I just updated my environment (on Fedora 13) to support 4 Tomcats and it worked as expected. I verified this by running my test application, watching traffic via jk-manager, and then shutting down (disabling) one mod_jk connection at a time. Clustering worked, farm deployment worked, and the application (such as it is) worked.
Here are the particulars: OS: Fedora 13 JRE: 1.6.0_21 (32 bit) Apache: 2.2.16 (comes with OS - not the latest) Tomcat: 6.0.29 mod_jk: 1.2.30 (compiled locally) My workers.properties file (without all the comments) worker.list=jk-status,jk-manager,lb worker.jk-status.type=status worker.jk-status.read_only=true worker.jk-manager.type=status worker.template.type=ajp13 worker.template.host=192.168.0.254 worker.template.socket_connect_timeout=5000 worker.template.socket_keepalive=true worker.template.ping_mode=A worker.template.ping_timeout=10000 worker.template.connection_pool_minsize=0 worker.template.connection_pool_timeout=600 worker.template.reply_timeout=300000 worker.template.recovery_options=3 worker.deimos.reference=worker.template worker.deimos.port=8019 worker.mars.reference=worker.template worker.mars.port=8029 worker.phobos.reference=worker.template worker.phobos.port=8039 worker.xerxes.reference=worker.template worker.xerxes.port=8049 worker.lb.type=lb worker.lb.error_escalation_time=0 worker.lb.max_reply_timeouts=10 worker.lb.balance_workers=deimos,mars,phobos,xerxes My uriworkermap.properties file is next. The RPets application is a random pet generator I use for testing clustering. /examples=lb /examples/*=lb /docs=lb /docs/*=lb /RPets=lb /RPets/*=lb mod_jk is added as an included file to httpd.conf. Here is my configuration. LoadModule jk_module modules/mod_jk.so <IfModule jk_module> JkWorkersFile conf.d/workers.properties JkLogFile logs/mod_jk.log JkLogLevel info JkShmFile /var/run/httpd/mod_jk.shm JkOptions +RejectUnsafeURI JkWatchdogInterval 60 <Location /jk-status> JkMount jk-status Order deny,allow Deny from all Allow from 127.0.0.1 </Location> <Location /jk-manager> JkMount jk-manager Order deny,allow Deny from all Allow from 127.0.0.1 </Location> JkMountFile conf.d/uriworkermap.properties </IfModule> Here is one (of four) server.xml files stripped of comments and some miscellaneous global resources. I apologize for any line wrapping. Some of the package names are quite long. <?xml version='1.0' encoding='utf-8'?> <Server port="8015" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <Listener className="org.apache.catalina.core.JasperListener" /> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <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"> <Connector port="8090" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8453"/> <Connector port="8019" protocol="AJP/1.3" redirectPort="8453"/> <Engine name="Catalina" defaultHost="localhost" jvmRoute="deimos"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="6"> <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="auto" port="4000" selectorTimeout="100" 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=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="${catalina.base}/temp-dir/" deployDir="${catalina.base}/webapps/" watchDir="${catalina.base}/watch-dir/" processDeployFrequency="4" watchEnabled="true"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/> </Host> </Engine> </Service> </Server> It's all pretty generic. This particular instance happens to be the one that provides the other three with the web application, so I have watcheEnabled="true" for the Deployer. In general here's what you have to watch out for when running all of this on one machine. 1. Change ports for everything shutdown port HTTP port (if used - I use it for management) HTTPS port (if used) AJP port Receiver port in cluster (not strictly necessary since Tomcat will figure this out) 2. Match jvmroute with names used in workers.properties 3. Match the AJP ports between server.xml and workers.properties I run this using $CATALINA_HOME and $CATALINA_BASE (%CATALINA_HOME% and %CATALINA_BASE% on Windows) plus cluster-startup.sh and a cluster-shutdown.sh scripts. I haven't tried this on Windows yet, so the issue may be with shared memory allocation. Take a close look at your workers.properties files and compare it to the one above (which is based on the stock one provided with the tomcat-connectors source package). Hope this helps. . . . . just my two cents. /mde/ ----- Original Message ---- From: Christopher Schultz <ch...@christopherschultz.net> To: Tomcat Users List <users@tomcat.apache.org> Sent: Thu, September 9, 2010 11:15:14 AM Subject: Re: Apache AJP to 4 TCs -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Andrew, On 9/9/2010 2:00 AM, Andrew Bruno wrote: > [Wed Sep 08 22:57:36 2010] [6912:6336] [debug] jk_worker.c (242): > creating worker loadbalancer > [Wed Sep 08 22:57:36 2010] [6912:6336] [debug] jk_worker.c (146): > about to create instance loadbalancer of lb > [Wed Sep 08 22:57:36 2010] [6912:6336] [debug] jk_worker.c (159): > about to validate and init loadbalancer > [Wed Sep 08 22:57:36 2010] [6912:6336] [error] jk_lb_worker.c (1536): > allocating lb sub worker record from shared memory > [Wed Sep 08 22:57:36 2010] [6912:6336] [error] jk_worker.c (163): > validate failed for loadbalancer > [Wed Sep 08 22:57:36 2010] [6912:6336] [error] jk_worker.c (262): > failed to create worker loadbalancer D'oh. In your original post, did you include your entire workers.properties file? Also, can you post all your Jk* directives you have active in your httpd configuration? The code that performs validation of the worker is found in native/common/jk_lb_worker.c: static int JK_METHOD validate(jk_worker_t *pThis, jk_map_t *props, jk_worker_env_t *we, jk_logger_t *l) > [Wed Sep 08 22:57:36 2010] [6912:6336] [error] jk_lb_worker.c (1536): > allocating lb sub worker record from shared memory This occurs on line 1536 (in mod_jk 1.2.30), in this neighborhood: > 1533 for (i = 0; i < num_of_workers; i++) { > 1534 p->lb_workers[i].s = jk_shm_alloc_lb_sub_worker(&p->p); > 1535 if (p->lb_workers[i].s == NULL) { > 1536 jk_log(l, JK_LOG_ERROR, > 1537 "allocating lb sub worker record from > shared >memory"); > 1538 JK_TRACE_EXIT(l); > 1539 return JK_FALSE; > 1540 } > 1541 } This looks like it might be a shared memory allocation error. Once you get into the jk_shm and jk_pool code, there's no debug logging of any kind :( You might have to hack-in some debug logging if Rainer or Mladen can't comment further. Are you comfortable compiling your own mod_jk? It looks like compiling with DEBUG #defined to something will at least get you jk_dump_pool calls when shared memory fails to be allocated. - -chris --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org