I'm seeing an issue on 5.5.17 with a 2 node cluster config. When a context is reloaded, it sends the context node name incorrectly to the cluster. E.g. context is called "website1"
SEVERE: Context manager doesn't exist:website1website1 The config I'm using is exactly the same as the default from server.xml, except the cluster is defined in Engine, rather than each Host. Filip Hanik - Dev Lists wrote: > also, use Tomcat 5.5.17 > > Sean O'Reilly wrote: >> Hi, >> >> I am trying to get in-memory session replication working and am testing >> running 3 seperate tomcat instances on the same server. >> >> I am using tomcat-5.5.15 and apache-2.0.54 with jk2. >> >> Whenever i run my test app although it should be doing round-robin load >> balancing it doesn't switch to another instance of tomcat until the >> eighth request and does not appear to have sent the session information >> across as the session ID changes. >> >> Here are my server.xml and workers2.properties files >> >> server.xml >> >> <Server port="8005" shutdown="SHUTDOWN"> >> >> <!-- Comment these entries out to disable JMX MBeans support used for >> the administration web application --> >> <Listener className="org.apache.catalina.core.AprLifecycleListener" /> >> <Listener >> className="org.apache.catalina.mbeans.ServerLifecycleListener" /> >> <Listener >> className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" >> /> >> <Listener >> className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/> >> >> >> <!-- Global JNDI resources --> >> <GlobalNamingResources> >> >> <!-- Test entry for demonstration purposes --> >> <Environment name="simpleValue" type="java.lang.Integer" >> value="30"/> >> >> <!-- Editable user database that can also be used by >> UserDatabaseRealm to authenticate users --> >> <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> >> >> <!-- A "Service" is a collection of one or more "Connectors" that >> share >> a single "Container" (and therefore the web applications visible >> within that Container). Normally, that Container is an "Engine", >> but this is not required. >> >> Note: A "Service" is not itself a "Container", so you may not >> define subcomponents such as "Valves" or "Loggers" at this level. >> --> >> >> <!-- Define the Tomcat Stand-Alone Service --> >> <Service name="Catalina"> >> >> <!-- A "Connector" represents an endpoint by which requests are >> received >> and responses are returned. Each Connector passes requests on >> to the >> associated "Container" (normally an Engine) for processing. >> >> By default, a non-SSL HTTP/1.1 Connector is established on >> port 8080. >> You can also enable an SSL HTTP/1.1 Connector on port 8443 by >> following the instructions below and uncommenting the second >> Connector >> entry. SSL support requires the following steps (see the SSL >> Config >> HOWTO in the Tomcat 5 documentation bundle for more detailed >> instructions): >> * If your JDK version 1.3 or prior, download and install JSSE >> 1.0.2 or >> later, and put the JAR files into "$JAVA_HOME/jre/lib/ext". >> * Execute: >> %JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA >> (Windows) >> $JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA >> (Unix) >> with a password value of "changeit" for both the certificate >> and >> the keystore itself. >> >> By default, DNS lookups are enabled when a web application >> calls >> request.getRemoteHost(). This can have an adverse impact on >> performance, so you can disable it by setting the >> "enableLookups" attribute to "false". When DNS lookups are >> disabled, >> request.getRemoteHost() will return the String version of the >> IP address of the remote client. >> --> >> >> <!-- Define a non-SSL HTTP/1.1 Connector on port 8080 >> <Connector port="8080" maxHttpHeaderSize="8192" >> maxThreads="150" minSpareThreads="25" >> maxSpareThreads="75" >> enableLookups="false" redirectPort="8443" >> acceptCount="100" >> connectionTimeout="20000" disableUploadTimeout="true" /> >> --> >> <!-- Note : To disable connection timeouts, set connectionTimeout >> value >> to 0 --> >> >> <!-- Note : To use gzip compression you could set the following >> properties : >> >> compression="on" >> compressionMinSize="2048" >> noCompressionUserAgents="gozilla, traviata" >> compressableMimeType="text/html,text/xml" >> --> >> >> <!-- Define a SSL HTTP/1.1 Connector on port 8443 --> >> <!-- >> <Connector port="8443" maxHttpHeaderSize="8192" >> maxThreads="150" minSpareThreads="25" >> maxSpareThreads="75" >> enableLookups="false" disableUploadTimeout="true" >> acceptCount="100" scheme="https" secure="true" >> clientAuth="false" sslProtocol="TLS" /> >> --> >> >> <!-- Define an AJP 1.3 Connector on port 8009 --> >> <Connector port="8009" enableLookups="false" >> redirectPort="8443" >> protocol="AJP/1.3" /> >> >> <!-- Define a Proxied HTTP/1.1 Connector on port 8082 --> >> <!-- See proxy documentation for more information about using this. >> --> >> <!-- >> <Connector port="8082" maxThreads="150" >> minSpareThreads="25" >> maxSpareThreads="75" >> enableLookups="false" acceptCount="100" >> connectionTimeout="20000" >> proxyPort="80" disableUploadTimeout="true" /> >> --> >> >> <!-- An Engine represents the entry point (within Catalina) that >> processes >> every request. The Engine implementation for Tomcat stand >> alone >> analyzes the HTTP headers included with the request, and >> passes them >> on to the appropriate Host (virtual host). --> >> >> <!-- You should set jvmRoute to support load-balancing via AJP ie : >> --> >> <Engine name="Standalone" defaultHost="localhost" >> jvmRoute="Tomcat5A"> >> <!-- Define the top level container in our container >> hierarchy >> <Engine name="Catalina" defaultHost="localhost"> --> >> >> <!-- The request dumper valve dumps useful debugging information >> about >> the request headers and cookies that were received, and the >> response >> headers and cookies that were sent, for all requests >> received by >> this instance of Tomcat. If you care only about requests to >> a >> particular virtual host, or a particular application, nest >> this >> element inside the corresponding <Host> or <Context> entry >> instead. >> >> For a similar mechanism that is portable to all Servlet 2.4 >> containers, check out the "RequestDumperFilter" Filter in the >> example application (the source for this filter may be found >> in >> "$CATALINA_HOME/webapps/examples/WEB-INF/classes/filters"). >> >> Request dumping is disabled by default. Uncomment the >> following >> element to enable it. --> >> <!-- >> <Valve className="org.apache.catalina.valves.RequestDumperValve"/> >> --> >> >> <!-- Because this Realm is here, an instance will be shared >> globally --> >> >> <!-- This Realm uses the UserDatabase configured in the global >> JNDI >> resources under the key "UserDatabase". Any edits >> that are performed against this UserDatabase are immediately >> available for use by the Realm. --> >> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" >> resourceName="UserDatabase"/> >> >> <!-- Comment out the old realm but leave here for now in case we >> need to go back quickly --> >> <!-- >> <Realm className="org.apache.catalina.realm.MemoryRealm" /> >> --> >> >> <!-- Replace the above Realm with one of the following to get a >> Realm >> stored in a database and accessed via JDBC --> >> >> <!-- >> <Realm className="org.apache.catalina.realm.JDBCRealm" >> driverName="org.gjt.mm.mysql.Driver" >> connectionURL="jdbc:mysql://localhost/authority" >> connectionName="test" connectionPassword="test" >> userTable="users" userNameCol="user_name" >> userCredCol="user_pass" >> userRoleTable="user_roles" roleNameCol="role_name" /> >> --> >> >> <!-- >> <Realm className="org.apache.catalina.realm.JDBCRealm" >> driverName="oracle.jdbc.driver.OracleDriver" >> connectionURL="jdbc:oracle:thin:@ntserver:1521:ORCL" >> connectionName="scott" connectionPassword="tiger" >> userTable="users" userNameCol="user_name" >> userCredCol="user_pass" >> userRoleTable="user_roles" roleNameCol="role_name" /> >> --> >> >> <!-- >> <Realm className="org.apache.catalina.realm.JDBCRealm" >> driverName="sun.jdbc.odbc.JdbcOdbcDriver" >> connectionURL="jdbc:odbc:CATALINA" >> userTable="users" userNameCol="user_name" >> userCredCol="user_pass" >> userRoleTable="user_roles" roleNameCol="role_name" /> >> --> >> >> <!-- Define the default virtual host >> Note: XML Schema validation will not work with Xerces 2.2. >> --> >> <Host name="localhost" appBase="webapps" >> unpackWARs="true" autoDeploy="true" >> xmlValidation="false" xmlNamespaceAware="false"> >> >> <!-- Defines a cluster for this node, >> By defining this element, means that every manager will be >> changed. >> So when running a cluster, only make sure that you have >> webapps in there >> that need to be clustered and remove the other ones. >> A cluster has the following parameters: >> >> className = the fully qualified name of the cluster class >> >> clusterName = a descriptive name for your cluster, can be >> anything >> >> mcastAddr = the multicast address, has to be the same for >> all the nodes >> >> mcastPort = the multicast port, has to be the same for all >> the nodes >> mcastBindAddr = bind the multicast socket to >> a specific >> address >> mcastTTL = the multicast TTL if you want to >> limit your >> broadcast >> mcastSoTimeout = the multicast readtimeout >> mcastFrequency = the number of milliseconds in between >> sending a "I'm alive" heartbeat >> >> mcastDropTime = the number a milliseconds before a node is >> considered "dead" if no heartbeat is received >> >> tcpThreadCount = the number of threads to handle incoming >> replication requests, optimal would be the same amount of threads as >> nodes >> tcpListenAddress = the listen address (bind address) for >> TCP cluster request on this host, in >> case of multiple ethernet cards. >> auto means that address becomes >> >> InetAddress.getLocalHost().getHostAddress() >> >> tcpListenPort = the tcp listen port >> >> tcpSelectorTimeout = the timeout (ms) for the >> Selector.select() method in case the OS >> has a wakup bug in java.nio. Set to 0 >> for no timeout >> >> printToScreen = true means that managers will also print >> to std.out >> >> expireSessionsOnShutdown = true means that >> useDirtyFlag = true means that we only replicate a session >> after setAttribute,removeAttribute has been called. >> false means to replicate the session after >> each request. >> false means that replication would work for >> the following piece of code: (only for SimpleTcpReplicationManager) >> <% >> HashMap map = >> (HashMap)session.getAttribute("map"); >> map.put("key","value"); >> %> >> replicationMode = can be either 'pooled', 'synchronous' or >> 'asynchronous'. >> * Pooled means that the replication >> happens using several sockets in a synchronous way. Ie, the data gets >> replicated, then the request return. This is the same as the >> 'synchronous' setting except it uses a pool of sockets, hence it is >> multithreaded. This is the fastest and safest configuration. To use >> this, also increase the nr of tcp threads that you have dealing with >> replication. >> * Synchronous means that the thread that >> executes the request, is also the >> thread the replicates the data to the >> other nodes, and will not return until all >> nodes have received the information. >> * Asynchronous means that there is a >> specific 'sender' thread for each cluster node, >> so the request thread will queue the >> replication request into a "smart" queue, >> and then return to the client. >> The "smart" queue is a queue where when >> a session is added to the queue, and the same session >> already exists in the queue from a >> previous request, that session will be replaced >> in the queue instead of replicating two >> requests. This almost never happens, unless there is a >> large network delay. >> --> <!-- >> When configuring for clustering, you also add in a valve to >> catch all the requests >> coming in, at the end of the request, the session may or >> may not be replicated. >> A session is replicated if and only if all the conditions >> are met: >> 1. useDirtyFlag is true or setAttribute or removeAttribute >> has been called AND >> 2. a session exists (has been created) >> 3. the request is not trapped by the "filter" attribute >> >> The filter attribute is to filter out requests that could >> not modify the session, >> hence we don't replicate the session after the end of this >> request. >> The filter is negative, ie, anything you put in the filter, >> you mean to filter out, >> ie, no replication will be done on requests that match one >> of the filters. >> The filter attribute is delimited by ;, so you can't escape >> out ; even if you wanted to. >> >> filter=".*\.gif;.*\.js;" means that we will not replicate >> the session after requests with the URI >> ending with .gif and .js are intercepted. >> The deployer element can be used to deploy >> apps cluster >> wide. >> Currently the deployment only deploys/undeploys to working >> members in the cluster >> so no WARs are copied upons startup of a broken node. >> The deployer watches a directory (watchDir) for WAR files >> when watchEnabled="true" >> When a new war file is added the war gets deployed to the >> local instance, >> and then deployed to the other instances in the cluster. >> When a war file is deleted from the watchDir the war is >> undeployed locally and cluster wide >> --> >> >> <Cluster >> className="org.apache.catalina.cluster.tcp.SimpleTcpCluster" >> >> managerClassName="org.apache.catalina.cluster.session.DeltaManager" >> expireSessionsOnShutdown="false" >> useDirtyFlag="true" >> notifyListenersOnReplication="true"> >> >> <Membership >> className="org.apache.catalina.cluster.mcast.McastService" >> mcastAddr="228.0.0.4" >> mcastPort="45564" >> mcastFrequency="500" >> mcastDropTime="3000"/> >> >> <Receiver >> className="org.apache.catalina.cluster.tcp.ReplicationListener" >> tcpListenAddress="auto" >> tcpListenPort="4001" >> tcpSelectorTimeout="100" >> tcpThreadCount="6"/> >> >> <Sender >> >> className="org.apache.catalina.cluster.tcp.ReplicationTransmitter" >> replicationMode="pooled" >> ackTimeout="15000"/> >> >> <Valve >> className="org.apache.catalina.cluster.tcp.ReplicationValve" >> >> filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/> >> >> <Deployer >> className="org.apache.catalina.cluster.deploy.FarmWarDeployer" >> tempDir="/tmp/war-temp/" >> deployDir="/tmp/war-deploy/" >> watchDir="/tmp/war-listen/" >> watchEnabled="false"/> >> <ClusterListener >> className="org.apache.catalina.cluster.session.ClusterSessionListener"/> >> </Cluster> >> >> >> >> <!-- Normally, users must authenticate themselves to each web >> app >> individually. Uncomment the following entry if you would >> like >> a user to be authenticated the first time they encounter a >> resource protected by a security constraint, and then have >> that >> user identity maintained across *all* web applications >> contained >> in this virtual host. --> >> <!-- >> <Valve >> className="org.apache.catalina.authenticator.SingleSignOn" /> >> --> >> >> <!-- Access log processes all requests for this virtual host. >> By >> default, log files are created in the "logs" directory >> relative to >> $CATALINA_HOME. If you wish, you can specify a different >> directory with the "directory" attribute. Specify either >> a relative >> (to $CATALINA_HOME) or absolute path to the desired >> directory. >> --> >> <!-- >> <Valve className="org.apache.catalina.valves.AccessLogValve" >> directory="logs" prefix="localhost_access_log." >> suffix=".txt" >> pattern="common" resolveHosts="false"/> >> --> >> >> <!-- Access log processes all requests for this virtual host. >> By >> default, log files are created in the "logs" directory >> relative to >> $CATALINA_HOME. If you wish, you can specify a different >> directory with the "directory" attribute. Specify either >> a relative >> (to $CATALINA_HOME) or absolute path to the desired >> directory. >> This access log implementation is optimized for maximum >> performance, >> but is hardcoded to support only the "common" and >> "combined" patterns. >> --> >> <!-- >> <Valve >> className="org.apache.catalina.valves.FastCommonAccessLogValve" >> directory="logs" prefix="localhost_access_log." >> suffix=".txt" >> pattern="common" resolveHosts="false"/> >> --> >> <!-- Access log processes all requests for this virtual host. >> By >> default, log files are created in the "logs" directory >> relative to >> $CATALINA_HOME. If you wish, you can specify a different >> directory with the "directory" attribute. Specify either >> a relative >> (to $CATALINA_HOME) or absolute path to the desired >> directory. >> This access log implementation is optimized for maximum >> performance, >> but is hardcoded to support only the "common" and >> "combined" patterns. >> >> This valve use NIO direct Byte Buffer to asynchornously >> store the >> log. >> --> >> <!-- >> <Valve >> className="org.apache.catalina.valves.ByteBufferAccessLogValve" >> directory="logs" prefix="localhost_access_log." >> suffix=".txt" >> pattern="common" resolveHosts="false"/> >> --> >> >> </Host> >> >> </Engine> >> >> </Service> >> >> </Server> >> >> >> workers2.properties >> >> [logger.apache2] >> file="/etc/httpd/conf/logs/error.log" >> level=INFO >> debug=1 >> >> # Config settings >> [config] >> file=/etc/httpd/conf/workers2.properties >> debug=0 >> >> # Shared memory file settings >> [shm] >> file=/etc/httpd/conf/jk2.shm >> size=100000 >> >> # Communcation channel settings for "Tomcat5A" >> [channel.socket:localhost:8009] >> host=localhost >> port=8009 >> tomcatId=Tomcat5A >> group=balanced >> lb_factor=1 >> route=Tomcat5A >> >> >> # Declare a Tomcat5A worker >> [ajp13:localhost:8009] >> channel=channel.socket:Tomcat5A >> >> >> # Communcation channel settings for "Tomcat5B" >> [channel.socket:localhost:8010] >> host=localhost >> port=8010 >> tomcatId=Tomcat5B >> group=balanced >> lb_factor=1 >> route=Tomcat5B >> >> >> # Declare a Tomcat5B worker >> [ajp13:localhost:8010] >> channel=channel.socket:Tomcat5B >> >> >> # Communcation channel settings for "Tomcat5C" >> [channel.socket:localhost:8011] >> host=localhost >> port=8011 >> tomcatId=Tomcat5C >> group=balanced >> lb_factor=1 >> route=Tomcat5C >> >> >> # Declare a Tomcat5C worker >> [ajp13:localhost:8011] >> channel=channel.socket:Tomcat5C >> >> # Load balanced Worker >> [lb:balanced] >> worker=ajp13:localhost:8009 >> worker=ajp13:localhost:8010 >> worker=ajp13:localhost:8011 >> timeout=90 >> attempts=3 >> recovery=30 >> stickySession=0 >> noWorkerMsg=Server Busy please retry later. >> noWorkerCodeMsg=503 >> >> # URI mappings for the tomcat worker >> # Map the "jsp-examples" web application context to the web server URI >> space >> [uri:/jsp-examples/*] >> info= Mapping for jsp-examples context for tomcat >> context=/jsp-examples >> group=balanced >> >> [shm] >> file=/etc/httpd/conf/jk2.shm >> size=1000000 >> >> [uri:/servlets-examples/*] >> context=/servlets-examples >> group=balanced >> >> # Define a status worker >> [status:] >> >> # Status URI mapping >> [uri:/jkstatus/*] >> group=status >> >> >> obviously the server.xml files on the other 2 instances of tomcat are >> the same except the ports and jvmRoute have been changed. >> >> >> can anyone see where i am going wrong ? >> >> Thanks >> >> >> >> > > --------------------------------------------------------------------- To start a new topic, e-mail: users@tomcat.apache.org To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]