OBJETIVO
Se pretende poder montar webs dinámicas y estáticas independientes en una sola máquina.
Descargas
- De http://jakarta.apache.org/tomcat/
- Tomcat 5.5.7
- jakarta-tomcat-5.5.7.tar.gz
- Administración de Tomcat
- jakarta-tomcat-5.5.7-admin.tar.gz
- Compatibilidad con sdk y jre 1.3
- jakarta-tomcat-5.5.7-compat.tar.gz
- Fuentes (para obtener el módulo conector con apache)
- jakarta-tomcat-5.5.7-src.tar.gz
- Del repositorio de RH
- Apache 1.3.27
- apache-1.3.27-9.ent.i386.hdr
- apache-1.3.27-9.ent.i386.rpm
- Java JRE 1.3.1 de IBM
- IBMJava2-JRE-1.3.1-3.i386.hdr
- IBMJava2-JRE-1.3.1-3.i386.rpm
- Java SDK 1.3.1 de IBM
- IBMJava2-SDK-1.3.1-3.i386.hdr
- IBMJava2-SDK-1.3.1-3.i386.rpm
Instalación básica
- Instalamos los paquetes de RH
- rpm -ihv apache-1.3.27-9.ent.i386.rpm
- rpm -ihv IBMJava2-JRE-1.3.1-3.i386.rpm
- rpm -ihv IBMJava2-SDK-1.3.1-3.i386.rpm
- Descomprimimos los paquetes de Tomcat (por este orden)
- tar xvzf jakarta-tomcat-5.5.7.tar.gz
- tar xvzf jakarta-tomcat-5.5.7-admin.tar.gz
- tar xvzf jakarta-tomcat-5.5.7-compat.tar.gz
- tar xvzf jakarta-tomcat-5.5.7-src.tar.gz
Configuración Básica
Creamos un script de arranque para tomcat en /etc/init.d
----------- Fichero /etc/init.d/tomcat ------------
#!/bin/bash
#
# Fichero de inicio de Tomcat
#
# Guimi - 2005/02
#
# Path de tomcat
tomcat_dir=/opt/jakarta-tomcat
tomcat_bin=$tomcat_dir/bin
prog=Tomcat
RETVAL=0
export JAVA_HOME=/opt/java
# Inicio
start() {
echo -n $"Iniciando $prog: "
$tomcat_bin/startup.sh
RETVAL=$?
echo
return $RETVAL
}
stop() {
echo -n $"Parando $prog: "
$tomcat_bin/shutdown.sh
RETVAL=$?
echo
return $RETVAL
}
# Procedemos segun el argumento
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo $"Uso: $prog {start|stop|restart}"
exit 1
esac
exit $RETVAL
---------------------------------------------------
- Configuramos el autoarranque
cd /etc/rc3.d/
ln -s ../init.d/tomcat S65tomcat
ln -s ../init.d/httpd S66httpd
- Configuramos los usuarios de Tomcat
--- Fichero $CATALINA_HOME/conf/tomat-users.xml ---
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="manager"/>
<role rolename="admin"/>
<user username="webdinamica" password="a-ti-te-lo-voy-a-decir" roles="manager"/>
<user username="admin" password="a-ti-te-lo-voy-a-decir" roles="admin,manager"/>
</tomcat-users>
---------------------------------------------------
Primeras pruebas
Tomcat no funciona bien con IBMJava2-JRE-1.3.1-3 así que tenemos que bajar y compilar j2sdk1.4.1_06 y hacer que /opt/java apunte a /opt/j2sdk1.4.1_06.
En este momento ya deben funcionar tanto Apache como Tomcat
- Para las pruebas, en la máquina cliente en /etc/hosts o en C:\WINNT\system32\drivers\etc\lmhosts o en donde sea configuramos que tanto 'maquina' como 'prueba' como 'dinamica' apunten a la ip de nuestro servidor
- Arrancamos los servicios
/etc/init.d/tomcat start
/etc/init.d/httpd start
- Probamos con un navegador
http://maquina (Apache)
http://maquina:8080 (Tomcat)
Seguridad local de la máquina
- Creamos usuarios y grupos adecuados
groupadd -g 600 www
useradd webdinamica -G www
- Quitamos las aplicaciones de ejemplo de Tomcat (todas menos la de administración 'ROOT')
mv $CATALINA_HOME/webapps $CATALINA_HOME/old-webapps
mv $CATALINA_HOME/old-webapps/ROOT $CATALINA_HOME/webapps/
- Configuramos los permisos de Tomcat
mkdir -p $CATALINA_HOME/webapps/webdinamica
cd $CATALINA_HOME/webapps/webdinamica
chown -R webdinamica:www .
find . -type f -exec chmod 644 \{\} \;
find . -type d -exec chmod 755 \{\} \;
Configuramos en Apache los Virtual Host
----------- Fichero httpd.conf (parte) ------------
NameVirtualHost *
<VirtualHost *>
ServerName maquina
DocumentRoot /var/www/html
</VirtualHost>
<VirtualHost *>
ServerName prueba
DocumentRoot /var/www/prueba
</VirtualHost>
---------------------------------------------------
- Creamos /var/www/html/index.html si no existe
- Creamos /var/www/prueba/index.html si no existe
http://maquina debe devolvernos /var/www/html/index.html
http://prueba debe devolvernos /var/www/prueba/index.html
Configuramos en Tomcat las máquinas virtuales (JVM) con el comando Host
----------- Fichero server.xml (parte) ------------
<Host
appBase="webapps"
name="localhost">
</Host>
<Host
appBase="webappsdinamica"
name="prueba">
</Host>
---------------------------------------------------
- Creamos $CATALINA_HOME/webapps/ROOT/index.html e index.jsp si no existen
- Creamos $CATALINA_HOME/webappsdinamica/ROOT/index.html e index.jsp si no existen
http://maquina:8080 debe devolvernos $CATALINA_HOME/webapps/ROOT/index.jsp (Administración Tomcat)
http://prueba:8080 debe devolvernos $CATALINA_HOME/webappsdinamica/ROOT/index.jsp (web dinámica 1)
Conectar Apache con Tomcat
Este es el gran problema.
En este caso RH EL 2.1 no soporta Tomcat, sí lo hace la versión 3. Pero no podemos pasar a la versión 3 porque el SecurePath de HP no soporta RH EL 3.
En definitiva, hay que compilar el módulo mod_jk. Puestos a no tener soporte igualmente y dada la dificultad de compilar y utilizar un mod_jk para Apache 1.3 (RH EL 2.1) y Tomcat 5.5 (no soportado), finalmente hemos compilado e instalado Apache httpd2.0.52. (para esto hay extensa bibliografía).
- Eliminamos Apache 1.3
- rpm -e apache
Recapitulemos:
- Tenemos Apache2 en /usr/local/apache2
- Tenemos j2sdk en /opt/java/
- Tenemos Tomcat5.5 en /opt/jakarta-tomcat/
- Tenemos mod_jk2.so en /usr/local/apache2/modules/mod_jk2.so
- Cargamos el módulo mod_jk2 en Apache2
- Al final de la Sección 1 de httpd.conf ponemos
LoadModule jk2_module modules/mod_jk2.so
(Apache2 debe estar compilado con DSO. Ejecutando httpd -l debe aparecer mod_so.c)
Una vez se tiene el conector, se puede hacer que Tomcat sirva los ficheros .jsp fácilmente con el sieguiente fichero workers2.properties, en $APACHE_BASE/conf
----------- Fichero workers2.properties -----------
[shm]
info=Scoreboard. Required for reconfiguration and status with multiprocess servers.
file=anon
# Defines a load balancer named lb. Use even if you only have one machine.
[lb:lb]
# Canal de comunicaciones localhost
[channel.socket:localhost:8009]
port=8009
host=127.0.0.1
# worker para 'localhost'
[ajp13:localhost:8009]
channel=channel.socket:localhost:8009
group=lb
[uri:/*.jsp]
group=lb
---------------------------------------------------
Pero las aplicaciones en JSP a veces se desarrollan con rutas relativas a ficheros y además queremos tener varios hosts, unos jsp y otros no, en la misma máquina y sin mezclarse, por ello hay que configurar VirtualHost en Apache y relacionar los de aplicaciones JSP con maquinas virtuales (JVM) de Tomcat.
Conectar VirtualHost de Apache con JVM de Tomcat
Situación de ficheros:
- Apache2 en /usr/local/apache2
- j2sdk en /opt/java -> j2sdk1.4.1_06
- Tomcat5.5 en /opt/jakarta-tomcat -> jakarta-tomcat-5.5.7
- mod_jk2.so en /usr/local/apache2/modules/mod_jk2.so
- web estática 1 en /var/www/html
- web estática 2 en /var/www/prueba
- administración Tomcat en /opt/jakarta-tomcat/webapps/ROOT
- web dinámica 1 en /var/www/webapps/webdinamica1
- web dinámica 1 en /var/www/webapps/webdinamica2
----------- Fichero httpd.conf (parte) ------------
NameVirtualHost *
<VirtualHost *>
ServerName localhost
DocumentRoot /var/www/html
</VirtualHost>
<VirtualHost *>
ServerName prueba
DocumentRoot /var/www/prueba
</VirtualHost>
<VirtualHost *>
ServerName dinamica
DocumentRoot /var/www/webapps/webdinamica1
# Al enviar TODO al Tomcat realmente no utiliza el DocumentRoot
<Location "/*">
JkUriSet worker ajp13:dinamica:8010
</Location>
</VirtualHost>
---------------------------------------------------
----------- Fichero workers2.properties -----------
[shm]
info=Scoreboard. Required for reconfiguration and status with multiprocess servers.
file=anon
# Defines a load balancer named lb. Use even if you only have one machine.
[lb:lb]
# Canal de comunicaciones localhost
[channel.socket:localhost:8009]
port=8009
host=127.0.0.1
# Canal de comunicaciones 'dinamica'
[channel.socket:dinamica:8010]
port=8010
host=127.0.0.1
# worker para 'localhost'
[ajp13:localhost:8009]
channel=channel.socket:localhost:8009
group=lb
# worker para 'dinamica'
[ajp13:dinamica:8010]
channel=channel.socket:dinamica:8010
group=lb
---------------------------------------------------
----------- Fichero server.xml (parte) ------------
<Service
name="Catalina">
<!-- Connector web de Tomcat -->
<Connector
port="8080"
redirectPort="8443">
</Connector>
<!-- Connector de Apache -->
<Connector
port="8009"
protocol="AJP/1.3"
protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"
redirectPort="8443">
</Connector>
<Engine
defaultHost="localhost"
name="Catalina">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"/>
<Host
appBase="webapps"
name="localhost">
</Host>
<Host
appBase="webappsdinamica"
name="prueba">
</Host>
</Engine>
</Service>
<Service
name="Dinamica">
<!-- Connector con servidor web -->
<Connector
port="8010"
protocol="AJP/1.3"
protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"
redirectPort="8443">
</Connector>
<Engine
defaultHost="dinamica"
name="Dinamica">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"/>
<Host
appBase="webappsdinamica"
name="dinamica">
<Context docBase="/var/www/webapps/webdinamica1" path="">
</Context>
</Host>
</Engine>
</Service>
---------------------------------------------------
http://maquina debe devolvernos /var/www/html/index.html
http://prueba debe devolvernos /var/www/prueba/index.html
http://maquina:8080 debe devolvernos $CATALINA_HOME/webapps/ROOT/index.jsp (Administración Tomcat)
http://prueba:8080 debe devolvernos $CATALINA_HOME/webappsdinamica/ROOT/index.jsp (web dinámica 1)
http://dinamica debe devolvernos /var/www/webapps/webdinamica1/index.jsp (web dinámica 1)
Últimos ajustes
Podemos configurar un manager para la web dinámica 1 creando el fichero $CATALINA_HOME/conf/Dinamica/dinamica/manager.xml como sigue:
-------------- Fichero manager.xml ----------------
<?xml version="1.0" encoding="UTF-8"?>
<Context
debug="0"
docBase="/opt/jakarta-tomcat-5.5.7/server/webapps/manager"
privileged="true">
<ResourceLink
global="UserDatabase"
name="users"
type="org.apache.catalina.UserDatabase"/>
<WatchedResource>/opt/jakarta-tomcat/conf/context.xml</WatchedResource>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>META-INF/context.xml</WatchedResource>
<WatchedResource>/opt/jakarta-tomcat/conf/Catalina/localhost/context.xml.default</WatchedResource>
<WatchedResource>/opt/jakarta-tomcat/conf/context.xml</WatchedResource>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>META-INF/context.xml</WatchedResource>
<WatchedResource>/opt/jakarta-tomcat/conf/Catalina/localhost/context.xml.default</WatchedResource>
<WatchedResource>/opt/jakarta-tomcat/conf/context.xml</WatchedResource>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>META-INF/context.xml</WatchedResource>
<WatchedResource>/opt/jakarta-tomcat/conf/Catalina/localhost/context.xml.default</WatchedResource>
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127.0.0.1"/>
</Context>
---------------------------------------------------
Esto nos permite gestionar nuestra web dinámica 1 en http://dinamica/manager/html o a traves de la interfaz http://dinamica/manager (más info en http://dinamica/manager/manager-howto.html).
El último valor hace que solo se pueda acceder al manager localmente.
Podemos afinar un poco más la configuración haciendo que Apache solo redirija a Tomcat las páginas dinámicas y el manager, mejorando claramente la eficiencia. Ade más podemos configurar un alias y un log propio.
----------- Fichero httpd.conf (parte) ------------
<VirtualHost *>
ServerName www.dinamica.com
ServerAlias dinamica.com
CustomLog logs/dinamica_access_log combined
DocumentRoot /var/www/webapps/webdinamica
<Location "/*.jsp">
JkUriSet worker ajp13:dinamica:8010
</Location>
<Location "/manager">
JkUriSet worker ajp13:dinamica:8010
</Location>
</VirtualHost>
---------------------------------------------------
Para acabar es recomendable crear scripts de inicio y parada de Apache y Tomcat en el sistema de arranque de la máquina.