zhao-sun.com

June 18, 2004

Resin with Apache on Unix

Filed under: Computer — blogadmin @ 2:13 pm

Resin is an application server that is in the process of completing J2EE certification. The reason I choose Resin is because of that a popular web hosting company LunarPages uses Resin to support jsp and servlet.

Following are the steps to make Resin work with Apache on Unix and Liuux:

1. Compiling Apache
2. Compile mod_caucho.so
3. Configure Apache
4. Set up environment
5. Configure resin.conf
6. Restart Apache and start srun

Compiling Apache
You need a version of Apache with DSO support enabled. Apache has full documentation at their website . To check if your apache has DSO support, you can check for mod_so.c in your your httpd

checking apache httpd for mod_so.c unix> /usr/local/apache/bin/httpd -l
Compiled-in modules:

mod_so.c

Many distributions, e.g. Red Hat Linux, will have Apache preinstalled. However, because the standard distribution has files all over the place, some people prefer to recompile Apache from scratch.

Once you untar Apache, build it like:

unix> ./configure –prefix=/usr/local/apache \
–enable-module=so
unix> make
unix> make install

Solaris versions of Apache may need additional flags, otherwise you’ll get some linking errors when trying to load Resin. You may need to refer to the Apache documentation if you get linking errors. Here’s an example configuration on Solaris:

unix> ./configure –prefix=/usr/local/apache \
–enable-rule=SHARED_CORE \
–enable-rule=SHARED_CHAIN \
–enable-module=so \
–enable-module=most \
–enable-shared=max

Compiling mod_caucho.so
To compile and install mod_caucho on Unix, you’ll need to run Resin’s configure and then make. This step will create mod_caucho.so and put it in the Apache module directory. Usually, mod_caucho.so will end up in /usr/local/apache/libexec/mod_caucho.so.

If you know where your apxs executable is, you can use –with-apxs. apxs is a little Perl script that the Apache configuration makes. It lets modules like Resin know how all the Apache directories are configured. It is generally in /usr/local/apache/bin/apxs or /usr/sbin/apxs. It’s usually easiest to use –with-apxs so you don’t need to worry where all the Apache directories are.

unix> ./configure –with-apxs=/usr/local/apache/bin/apxs
unix> make

Even if you don’t know where apxs is, the configure script can often find it:

unix> ./configure –with-apxs
unix> make

As an alternative to –with-apxs, if you’ve compiled Apache yourself, or if you have a simple configuration, you can generally just point to the Apache directory:

unix> ./configure –with-apache=/usr/local/apache
unix> make
unix> make install

The previous –with-apxs or –with-apache should cover most configurations. For some unusual configurations, you can have finer control over each directory with the following arguments to ./configure. In general, you should use –with-apache or –with-apxs, but the other variables are there if you know what you’re doing.

–with-apache=dir The Apache root directory.
–with-apxs=apxs Pointer to the Apache extension script
–with-apache-include=dir The Apache include directory
–with-apache-libexec=dir The Apache module directory
–with-apache-conf=httpd.conf The Apache config file

Configure the Environment
If you don’t already have Java installed, you’ll need to download a JDK and set some environment variables.

Here’s a typical environment that you might put in ~/.profile or /etc/profile

# Java Location
JAVA_HOME=/<installdir>/jdk1.4
export JAVA_HOME

# Resin location (optional). Usually Resin can figure this out.
RESIN_HOME=/<installdir>/resin-3.0.2
export RESIN_HOME

# If you’re using additional class libraries, you’ll need to put them
# in the classpath.
CLASSPATH=

Configuring resin.conf
The default resin.conf, looks in resin-3.0.x/doc for JSP files and resin-3.0.x/doc/WEB-INF/classes for servlets and beans. To tell Resin to use Apache’s document area, you configure the document-directory. Change document-directory from ‘doc’ to something like ‘/usr/local/apache/htdocs’.

resin.conf <resin xmlns=”http://caucho.com/ns/resin”>
<server>
<host id=””>
<document-directory>/usr/local/apache/htdocs resin-3.0.x/bin/httpd.sh
Resin 3.0.2-beta (built Mon Aug 4 09:26:44 PDT 2003)
Copyright(c) 1998-2003 Caucho Technology. All rights reserved.

Starting Resin on Mon, 04 Aug 2003 09:43:39 -0700 (PDT)
[09:43:40.664] Loaded Socket JNI library.
[09:43:40.664] http listening to *:8080
[09:43:40.664] ServletServer[] starting
[09:43:40.879] hmux listening to *:6802
[09:43:41.073] Host[] starting
[09:43:41.446] Application[http://localhost:8080/resin-doc] starting
[09:43:41.496] Application[http://localhost:8080] starting

Resin will print every port it’s listening to. In the above example, Resin is listening to port 8080 using HTTP and 6802 using its servlet runner protocol. In other words, mod_caucho can connect to Resin with 6802 only on same host, but you can browse port 8080 from any host.

The following snippet shows the and configuration for the above example.

<resin xmlns=”http://caucho.com/ns/resin”>
<server>
<http id=”” host=”*” port=”8080″/>

<cluster>
<srun id=”” host=”localhost” port=”6802″ index=”1″/>
</cluster>


</server>
</resin>

Testing the servlet engine
Create a test file ‘/usr/local/apache/htdocs/test.jsp’

2 + 2 = <%= 2 + 2 %>

Browse http://localhost/test.jsp again. You should now get

2 + 2 = 4

Configuring Apache by hand

Making mod_caucho will automatically change your httpd.conf file. You can also configure Apache directly, instead of letting mod_caucho read the configuration from the resin.conf file. If you use this method, you need to make sure you match the Apache configuration with the Resin configuration.

httpd.conf LoadModule caucho_module libexec/mod_caucho.so

<IfModule mod_caucho.c>
ResinConfigServer localhost 6802
<Location /caucho-status>
SetHandler caucho-status
</Location>
</IfModule>

Note: The caucho-status is optional and probably should be avoided in a production site. It lets you ask the Caucho Apache module about the Caucho status, valuable for debugging.

Restart Apache. Now browse http://localhost/caucho-status. It should return a table indicating that the servlet runner is stopped.

Browse http://localhost/test.jsp. It should return a message like:

Cannot connect to Servlet Runner.

You can also dispatch to Resin directly from the httpd.conf. The apache handler name is “caucho-request”.

Apache Handler Meaning
caucho-status Handler to display /caucho-status
caucho-request Dispatch a request to Resin

Requests dispatched directly from the Apache httpd.conf will not appear in /caucho-status. You can use caucho-request as follows:

<Location /foo/*>
SetHandler caucho-request
</Location>

Apache Command Meaning
ResinConfigServer host port Specifies the Resin JVM at host:port as a configuration server.
CauchoStatus true/false Enables/disables the /caucho-status management

Virtual Hosts
The virtual host topic describes virtual hosts in detail. If you’re using a single JVM, you only need to configure the resin.conf. If you want a different JVM for each virtual host, your httpd.conf can load a different resin.conf for each JVM:

httpd.conf <VirtualHost foo.com>
ServerName foo.com
ServerAlias www.foo.com
ResinConfigServer 192.168.0.1 6802
</VirtualHost>

<VirtualHost bar.com>
ServerName bar.com
ServerAlias www.bar.com
ResinConfigServer 192.168.0.2 6802
</VirtualHost>

The foo.conf might look something like:

foo.conf <resin xmlns=”http://caucho.com/ns/resin”>
<server>
<cluster>
<srun id=”” host=”192.168.0.2″ port=”6802″/>
</cluster>

<host id=’www.foo.com’>

</host>
</server>
</resin>

Dispatching
mod_caucho queries the configuration server to distinguish the URLs going to Resin from the URLs handled by Apache. The configuration server uses the <servlet-mapping> directives to decide which URLs to send. Also, any *.war file automatically gets all its URLs. Other URLs stay with Apache. There’s a more complete discussion of the URL dispatching in the plugin-dispatch page.

Load Balancing

In Resin 3.0, you can distribute requests to multiple machines. All requests in a session will go to the same host. In addition, if one host goes down, Resin will send the request to the next available machine.

In addition, you can specify backup machines. The backup only will serve requests if all primaries are down.

See the http config section for more details.

resin.conf <resin xmlns=”http://caucho.com/ns/resin”>
<server>
<cluster>
<srun id=”a” host=”host1″ port=”6802″ index=”1″/>
<srun id=”b” host=”host2″ port=”6802″ index=”2″/>
<srun id=”c” host=”backup” port=”6802″ index=”3″ backup=”true”/>
</cluster>

</server>
</resin>

Troubleshooting

1. First, check your configuration with the standalone httpd.sh. In other words, add a <http port=’8080’/> and check port 8080.
2. Check http://localhost/caucho-status. That will tell if mod_caucho has properly connected to the configuration server.
3. Each srun host should be green and the mappings should match your resin.conf.
4. If caucho-status fails entirely, the problem is in the mod_caucho installation and the Apache httpd.conf.
5. If caucho-status shows the wrong mappings, there’s something wrong with the resin.conf or the pointer to resin.conf in httpd.conf.
6. If caucho-status shows a red servlet runner, then httpd.sh hasn’t properly started.
7. If you get a “cannot connect to servlet engine”, caucho-status will show red, and httpd.sh hasn’t started properly.
8. If httpd.sh doesn’t start properly, you should look at the logs in resin-3.0.x/log. You should start httpd.sh -verbose to get more information.
9. If httpd.sh says “no servers defined”, your resin.conf is missing a or definition.
10. If httpd.sh never shows a “srun listening to *:6802” line, it’s not paying attention to mod_caucho. You’ll need to add a line.
11. If httpd.sh shows “srun listening to localhost:6802” line, only an Apache on the same host can connect to the srun. If you need an Apache on a different host to connect to srun, you’ll need to change the host attribute in the srun configuration.
12. If you get Resin’s “file not found”, the Apache configuration is good but the resin.conf probably points to the wrong directories.

No Comments

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress