Diferencia entre revisiones de «Usuario:ManuelRomero/modulo TOMCAT»
De WikiEducator
(→Conceptos generales) |
(→Conceptos generales) |
||
Línea 266: | Línea 266: | ||
{{Conocimiento previo| | {{Conocimiento previo| | ||
#Fichero de configuración de tomcat '''''./tomcat/conf/server.xml''''' | #Fichero de configuración de tomcat '''''./tomcat/conf/server.xml''''' | ||
− | #Directiva para donde buscar los ficheros de las aplicacioes '''''appBase''''' appBase | + | #Directiva para donde buscar los ficheros de las aplicacioes '''''appBase''''' |
+ | #Por defecto valor de appBase "webapp" | ||
}} | }} | ||
*Elementos de una aplicación web | *Elementos de una aplicación web |
Revisión de 09:16 24 nov 2012
Contenido
Aplicaciones Web
- Definición de aplicación web
- Aplicación informática que se ejecuta en un entorno web
- Modelo de ejecución Cliente /Servidor
- Necesario un protocolo de comunicación .
- Elementos
- Cliente: navegador.
- Servidor: servidor web
- Comunicación: protocolo HTTP
Servidor de aplicaciones
- Definición de servidor de aplicaciones
- Es un software que proporciona aplicaciones a los equipos o dispositivos cliente,
- Es muy frecuente el uso de la red de Internet para realizarlo
- Utiliza el protocolo http
- Presenta dos diferencias con los servidores web (p.e. apache)
- Hace un extensivo del contenido dinámico
- De manera muy frecuente realiza integración con bases de datos.
Ventajas de servidor de aplicaciones
- centralización y simplicidad en desarrollo de aplicaciones
- Las aplicaciones se ensamblan desde bloques que el servidor provee
- Integridad de datos y de código
- Al actulizar los datos que estás centralizados todos los clientes serán conscientes de ello
Tomcat
- Definición
- Tomcat es el servidor web (incluye el servidor Apache) que puede gestionar las solicitudes y respuestas http
- También es servidor de aplicaciones del proyecto Yakarta contenedor de Servlets y JSP
- Especialmente útil para porgramar aplicaciones web usando java
- Incluye el compilador Jasper, que compila JSP covirtiéndolas en servlets.
Servlet
- Definición
- Un servlet es un programa escrito en java
- se ejecuta en un servidor
- normalmente se utiliza para generar contenido html dinámico.
- Ejemplo de servlet en java
Código de ejemplo de un Servlet que procesa una petición GET y devuelve una página web HTML sencilla: package org.pruebas; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HolaMundoServlet extends HttpServlet { /** * Servlet de ejemplo que procesa una petición GET * @param request * @param response * @throws ServletException * @throws IOException */ @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">"); out.println("<html>"); out.println("<head><title>Ejemplo Hola Mundo</title></head>"); out.println("<body>"); out.println("<h1>¡Hola Mundo!</h1>"); out.println("</body></html>"); } }
- Al final del tema al estudiar el despliegue web y analizar el fichero web.xml del servidor de aplicaciones web o contendedor de servlet tomcat probaremos este fichero.
JSP
- Definición
- JSP es un lenguaje de programación parecido al lenguaje php
- Es un código que ejecuta el servidor de aplicaciones web , al lado del servidor en el modelo cliente/servidor
- Se puede embeber junto con códgio html
- El servidor interpretar JSP de la misma manera en la que interpreta PHP, generando una página html que entrega al claiente
- Ejemplo sencillo de un jsp
<html> <body> <% out.println("Hola mundo"); %> </body> </html>
Tomcat contenedor de servlets
- Tomcat es un contenedor de servlets con un entorno JSP.
- es un servidor de aplicaciones web pensado para desarrollos con java (no exclusivo para este entorno)
- Contenedor de servlets
- es un shell de ejecución que maneja e invoca servlets por cuenta del usuario.
Clasificación de contenedores de servlets
- Contenedores de servlets stand-alone (independientes)
- Estos son una parte integral del servidor web.
- Este es el caso en el que se usa un servidor web basado en Java,
- Por defecto Tomcat trabaja en este modo, sin embargo, la mayoría de los servidores no están basados en Java.
- Contenedores de servlets dentro-de-proceso
- En esta configuración del servidor, el contenedor servlets es una combinación
- Un plugin para el servidor web
- y una implementación de contenedor Java.
- El plugin del servidor web abre una JVM (Máquina Virtual Java)
- dentro del espacio de direcciones del servidor web
- permite que el contenedor Java se ejecute en él.
- En el caso de que una petición debiera ejecutar un servlet, el plugin toma el control sobre la petición y lo pasa al contenedor Java (usando JNI).
- Un contenedor de este tipo es adecuado para servidores multithread de un sólo proceso
- Además este tipo proporciona un buen rendimiento pero está limitado en escalabilidad.
- Contenedores de servlets fuera-de-proceso
- En este caso la combinación va a ser:
- plugin para el servidor web
- y una implementación de contenedor Java
- Este se ejecuta en una JVM fuera del servidor web.
- El plugin del servidor web y el JVM del contenedor Java se comunican
- para ello usan algún mecanismo IPC (normalmente sockets TCP/IP).
- Si una cierta petición tuviese que ejecutar un servlets, el plugin toma el control sobre la petición y lo pasa al contenedor Java (usando IPCs).
- El tiempo de respuesta en este tipo de contenedores no es tan bueno como el anterior
- A su favor, obtiene mejores rendimientos en otras cosas (escalabilidad, estabilidad, etc.)
Instalación de Tomcat
- Necesitamos tener instalado JDK
- buscamos el paquete java que más nos interese
aptitude search "?provides(java-runtime)"
- instalamos java-runtime
apt-get install default-jre
- actualizamos el PATH del sistema en nuestro profile
- Indicando donde se ubican los binarios que acabamos de instalar
JAVA_HOME=/usr/lib/jvm/java6openjdk/ jre/ PATH=$PATH:$JAVA_HOME/bin export PATH JAVA_HOME
- actualizamos las variables de entorno
$ source /etc/profile o bien $ . /etc/profile
- Vamos a la web de tomcat y vemos la última version
http://apache.rediris.es/tomcat/
- Tomamos la última version v7.0.32 y la descargamos
$ wget http://apache.rediris.es/tomcat/tomcat-7/v7.0.32/src/apache-tomcat-7.0.32-src.tar.gz
- Descomprimimos y desenpaquetamos el fichero
$ tar xvzf apache-tomcat-7.0.32-src.tar.gz
- Movemos a una carpeta de destino
$ mv -fv apache-tomcat-7.0.32-src /usr/local
- Creamos un enlace para referenciar más comodamente el directorio
$ ln -s /usr/local/apache-tomcat-7.0.32-src/ /usr/local/tomcat
- De este modo tenemos acceso al directorio de tomcat de forma más sencilla
Arranque del sistema
- Un script llamado catalina gestiona el servicio de Tomcat
- 'catalina.hs debe recibir en la invocación parámetros start|stop|restart para actuar.
- También disponemos de un shell que invoca explícitamente a este fichero startup.sh
- verificamos el funcionamiento escribiendo en la url
http://127.0.0.1:8080
- Debe aparecernos una página como la que sigue
Iniciando Tomcat
- Por defecto tomcat
- puerto 8080
- directorio ./tomcat/webapps/ROOT
- Por defecto apache
- puerto 80
- directorio ./var/www o ./apache/htdocs según como se haya instalado
- Vamos a hacer que apache escuche todo
- Lo configuramos como proxy
- Apache derivará lo que considere a tomcat
- aplicamos el principio de escalabilidad
- Si nuestras necesidades crecen ponemos más tomcat en el sistema
Fichero de configuración
/usr/local/tomcat/conf/server.xml
- Al ser un fichero xml se configura por elementos y atributos
- localizamos el elemenot host
- modificamos el atributo appBase
<Host name="localhost" appBase="/var/www"
Apache y Tomcat Colaborando
- Ahora tenemos en nuestro sistemas dos servicios que responden a solicitudes web, pero son diferentes
- Debemos otorgar a cada uno su funcionalidad
- Podemos hacer que convivan juntos de la siguiente manera, la idea es la siguiente
- Todas las peticiones la recibe el servidor de apache
- Si es una solicitud web estática o php la resuelve apache
- Si es una solicitud de una aplicación web (jsp, servlet) se la entrega a tomcat para que resuelva el
- El final es apache el que devuelve la solicitud al cliente
- Este funcionamiento es totalmente trasparente para el usuario
- Este escenario también es útil para que apache balancee la carga entre diferentes servidores de aplicaciones web y aligerar el trabajo
Módulos necesarios
- Necesitamos que apache incorpore una serie de módulos
- Cargaremos estos módulos para hacer que sea apache un proxy
- Para cargar módulos usamos el comando a2enmod apache to enabled module
- Este comando sirve para cargar módulos nuevos
- Ya sabemos que apache se gestiona por módulos
- La lista de módulos que necesitamos son
- proxy, proxyf_ajp, proxy_balancer
- A continuación rearrancamos el sistema
$a2enmod proxy $a2enmod proxyf_ajp $a2enmod proxy_balancer $ /etc/init.d/apache2 restart
Directivas necesarias en epache
Usaremos las siguientes directivas
- ProxyPass
- ProxyPassReverse
- ProxyRequests
- ProxyPreserveHost.
ProxyPass
- Esta directiva tiene dos parámetros
- El primero Indicamos las URL que delegamos (/)
- El segundo el servidor de aplicaciones que atenderá la solicitud
- En nuestro caso especificamos tomcat_cluster que está definido previamente
<Proxy balancer://tomcat_cluster> Order allow,deny Allow from all BalancerMember ajp://localhost:8009 </Proxy>
Conceto del proxy y el protocolo ajp
- En lugar de usar http para comunicar apache-tomcat usamos ajp
- Es un protocolo interno, veloz y que usa conexiones TCP persistentes
- Funciona en el puerto 8009
- Proxy balancer://tomcat_cluster
- definimos el cluster con nombre tomcat_cluster
- BalancerMember ajp://localhost:8009
- Se define un miembro a tomcat_cluster
- protocolo ajp
- IP localhost' o 127.0.0.1
- Puerto 8009 que es el que por defecto usa tomcat
- ProxyPass / balancer://tomcat_cluster/
- "/" y todo lo que cuelgue de ella, sea pasado al cluster del tomcat para que lo procese él.
- Order allow,deny
- Especifica el orde de asignación de permisos
- Primero las especificaciones de permisos allow all'
- Posteriormente restricciones especificadas en la opción deny
- Si en lugar de ajp queremos usar http deberíamos especificar
http://localhost:8080/ en lugar de ajp://localhost:8009
Parte para apache, otra para tomcat
- Queremos que apache devuelva los contenidos estáticos
- Estas peticiones deben comenzar por /static/
- Para que lo haga apache el segundo parámetro de esta directiva debe ser una negación !.
Configuración de virtualhost
- Debemos modificar el fichero de configuración de virtualhost
- Editamos /etc/apache2/sites-enabled/000-default
- Añadimos los siguientes elementos
<Proxy balancer://tomcat_cluster> Order allow,deny Allow from all BalancerMember ajp://localhost:8009 </Proxy> ProxyPreserveHost On ProxyPass /phpmyadmin/ ! ProxyPass / balancer://tomcat_cluster/ ProxyPassReverse / balancer://tomcat_cluster/
Conceptos de los parámetros
- ProxyPreserveHost On
- Mantiene la cabecera http host original, en vez de reescribirla.
- "DocumentRoot" y "<Directory /var/www/>" para que apunten a /var/www/ROOT
Estructura y despliegue de una aplicación web
Conceptos generales
|
- Elementos de una aplicación web
- servlets
- páginas jsp
- ficheros html,imágenes,texto, css,sonitos, fídels, etc
- servlets
- aplicación java encargada de realizar un servicio específica dentro de un servidor web
- La especificación 2.4 define la estructura de directorios para los ficheros de una aplicación web
- Aquí puedes ver el fichero completo de la especificación final Archivo:Javaservletspecivication 2 4.pdf
- Este podría ser un ejemplo sacado de la propia especificación pág 69-70
/index.html /howto.jsp /feedback.jsp /images/banner.gif /images/jumping.gif /WEB-INF/web.xml /WEB-INF/lib/jspbean.jar /WEB-INF/classes/com/mycorp/servlets/MyServlet.class /WEB-INF/classes/com/mycorp/util/MyUtils.class
- los directorios/ficheros en negrita son obligatorios
Estructura de directorios
- El directorio raiz contendrá el nombre de la aplicación
- Todos los ficheros que cuelguen de él se pueden servir al cliente menos los que cuelguen de directorios META-INF y WEB-INF
- Normalmente después de realizar el desarrollo se empaquetarán en un archivo .war
- Una estructura de directorios almacenará el código necesario para ejecutar la aplicación.
- Una aplicación web se estructura en tres capas:
Archivos War
- WAR Web Applicatio Archive (Archivo de Aplicación Web)
- Es una forma de empaquetar en un fichero la estructura de directorios que conforman la aplicación web
- Por lo tanto contendrá
- Servlets y JSP
- Contendio estático HTML, css, imágenes
- Otros recursos web
- Facilitan enormemente el despliegue web
- Su estructura ya vista anteriormente
- /
- Es la carpeta raiz del proyecto
- En el se crean más subdirectorios para organizar la información
- Los ficheros aquí ubicados serán accesibles por el cliente
- Habrá html, js`, css, imágenes, videos, ...
- /WEB/INF/
- Elementos de la configuración .WAR web.xml
- Suelen estar la página de inicio, ubiciación de los servlets, parámetros
- /WEB/INF/clases/
- Las clases JAVA empleadas en el archivo .WAR
- Suelen encontrarse los servlet
- /WEB/INF/lib/
- Contiene ficheros jar utilizados por la aplicación
- Por ejemplo para contectarse a la base de datos
Creación del fichero .WAR
- Los entornos de desarrollo tipo Eclipse, NetBeans y otro tipo de IDE (JBuilder, JDeveloper) poseen la opción para ello.
- Otro modo en mediante Ant herramienta open-source que facilita la contrucción de aplicaciones Java
Haciendo un ejemplo sencillo
- Realizaremos un sencillo ejemplo para ver el proceso de despliegue
- Nuestra aplicación tendrá
- una página html que me pedirá nombre, apellido y edad
- Lo presentará como un formulario
- Un servlet que procesará dichos datos
- En este caso sólo los tomará y me los visualizará en otra página html que el servidor devolverá al cliente
- Necesitamos tener instalado e iniciado el contenedor de servlet (tomcat) éste se informará con un fichero 'wweb.xml de todos los servlets disponibles
=Estructura de directorios
WebApp ==> DatosUsuario (datos.html)==> WEB-INF (web.xml)==> clases(ProcesaDatos.class)
http://tomcat.apache.org/tomcat-7.0-doc/proxy-howto.html#Apache_2.0_Proxy_Support
Fichero html
<!--Param.html Lectura de parámetros con formularios + servlets --> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD><TITLE>Param.html</TITLE></HEAD> <BODY BGCOLOR="#CCCCFF"> <P></P> <H2>Introduce tus datos:</H2><BR> <% java.util.Date today = new java.util.Date(); out.println("Today's date is: "+today); %> <HR></HR> <CENTER> <FORM NAME="FORM1" METHOD="POST" ACTION="http://localhost:8080/misServlets/ParamServlet"> <TABLE BORDER> <TR> <TD><B>Nombre:</TD> <TD><INPUT TYPE=TEXTBOX NAME="NOM" SIZE="25" VALUE=""></TD> </TR> <TR> <TD><B>Edad:</TD> <TD><INPUT TYPE=TEXTBOX NAME="EDA" SIZE="20" VALUE=""></TD> </TR> </TABLE> <P></P> <INPUT TYPE=SUBMIT VALUE="Enviar"> <HR></HR> Formulario HTML que invocará a un servlet </FORM> </CENTER> </BODY> </HTML>
<!DOCTYPE HTML> <html> <head> <title>Mi primer despliegue web con servlet</title> </head> <body> ... <form name="MisDatos" method="POST" ACTION="http://localhost:8080/DatosUsuario/ProcesaDatos"> <table border> <tr> <td><B>Nombre:</td> <td><input type=TEXTBOX name="NOM" size="25" value=""></TD> ... </html>
- Se ha hecho una tabla y se ha dado un color de fondo para darle más vistosidad
- Es importante entender el valor del atributo ACTION
El servlet: ProcesaDatos.java
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ParamServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { // Obtenemos un objeto Print Writer para enviar respuesta res.setContentType("text/html"); PrintWriter pw = res.getWriter(); pw.println("<HTML><HEAD><TITLE>Leyendo parámetros</TITLE></HEAD>"); pw.println("<BODY BGCOLOR=\"#CCBBAA\">"); pw.println("<H2>Leyendo parámetros desde un formulario html</H2><P>"); pw.println("<UL>\n"); pw.println("Te llamas " + req.getParameter("NOM") + "<BR>"); pw.println("y tienes " + req.getParameter("EDA") + " años<BR>"); pw.println("</BODY></HTML>"); pw.close(); } }
Referencias
Página donde explica el proceso http://elblogdepicodev.blogspot.com.es/2011/02/unir-apache-httpd-y-tomcat-mediante-un.html