===== Servidores de aplicaciones =====

==== Servidores de aplicaciones más conocidos ====

===== Apache Tomcat =====

==== Instalación en Windows ====

Puesto que utilizamos //XAMPP// en Windows y //Apache Tomcat// viene como opción, siguiendo las instrucciones de la instalación de XAMPP de la parte de [[apuntes:introduccion#instalacion_en_windows|instalación de servidores web]] podéis ver como hacerlo. Una vez instalado la configuración es común tanto para Windows y Linux por lo que se puede acceder directamente a [[apuntes:introduccion#configuracion_basica|ese apartado]].

==== Instalación en Linux ====

El servidor de aplicaciones [[http://tomcat.apache.org|Apache Tomcat]] no dispone de instalador por lo que la manera habitual de instalarlo es descargar la versión que queramos (actualmente la última versión es la 9) y descomprimirlo en la carpeta que queramos.

<code bash>
santi@zenbook:$ tar xvzf apache-tomcat-8.0.1.tar.gz
x apache-tomcat-8.0.1/conf/
x apache-tomcat-8.0.1/conf/catalina.policy
x apache-tomcat-8.0.1/conf/catalina.properties
x apache-tomcat-8.0.1/conf/context.xml
x apache-tomcat-8.0.1/conf/jaspic-providers.xml
x apache-tomcat-8.0.1/conf/jaspic-providers.xsd
x apache-tomcat-8.0.1/conf/logging.properties
x apache-tomcat-8.0.1/conf/server.xml
x apache-tomcat-8.0.1/conf/tomcat-users.xml
x apache-tomcat-8.0.1/conf/tomcat-users.xsd
x apache-tomcat-8.0.1/conf/web.xml
x apache-tomcat-8.0.1/bin/
. . .
. . .
</code>

Para iniciarlo, dispones de un script ''startup.sh'' que lo lanzará en segundo plano:

<code bash>
santi@zenbook:$ ./startup.sh
Using CATALINA_BASE:   /Users/Santi/apache-tomcat-8.0.1
Using CATALINA_HOME:   /Users/Santi/apache-tomcat-8.0.1
Using CATALINA_TMPDIR: /Users/Santi/apache-tomcat-8.0.1/temp
Using JRE_HOME:        /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home
Using CLASSPATH:       /Users/Santi/apache-tomcat-8.0.1/bin/bootstrap.jar:/Users/Santi/apache-tomcat-8.0.1/bin/tomcat-juli.jar
Tomcat started.
</code>

Y también de un script ''shutdown.sh'' que lo detiene:

<code bash>
santi@zenbook:$ ./shutdown.sh
Using CATALINA_BASE:   /Users/Santi/apache-tomcat-8.0.1
Using CATALINA_HOME:   /Users/Santi/apache-tomcat-8.0.1
Using CATALINA_TMPDIR: /Users/Santi/apache-tomcat-8.0.1/temp
Using JRE_HOME:        /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home
Using CLASSPATH:       /Users/Santi/apache-tomcat-8.0.1/bin/bootstrap.jar:/Users/Santi/apache-tomcat-8.0.1/bin/tomcat-juli.jar
</code>

== Instalación en Debian utilizando apt ==

Si trabajamos con Debian existe la posibilidad de instalar Tomcat utilizando la herramienta //apt//. En el ejemplo siguiente instalamos el servidor de aplicaciones y todas herramientas y documentación (vienen como paquetes a parte en Debian):

<code bash>
santi@zenbook:$ sudo apt-get install tomcat8 tomcat8-*
</code>

En este caso, si queremos iniciar/detener/reiniciar el servidor, puesto que éste se encontrará ahora instalado como un servicio en nuestro sistema Linux tendremos que hacerlo como habitualmente se hace:

<code bash>
santi@zenbook:$ sudo service tomcat8 start
santi@zenbook:$ sudo service tomcat8 restart
santi@zenbook:$ sudo service tomcat8 stop
</code>

También tenemos que tener en cuenta que, en este caso, todos los ficheros de configuración de //Apache Tomcat// se encuentran en ''/etc/tomcat8''.
==== Configuración ====

En cualquier caso, al tratarse de un servidor de aplicaciones, lo habitual es que //escuche// en el puerto 8080, aunque hay que tener en cuenta que se puede cambiar en el caso de que en el equipo donde se encuentra instalado no haya un servidor web y además queramos que nuestra aplicación web quede expuesta al exterior. Nos interesará, por tanto, modificar el puerto al 80 para mayor comodidad a la hora de acceder a nuestra aplicación desde el navegador.

Para cambiar el puerto donde //Apache Tomcat// escuchará tenemos que editar el fichero ''conf/server.xml'' y cambiar el número del conector del protocolo HTTP:

<code xml>
. . .
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />
. . .
</code>

Independientemente del puerto que hayamos configurado, si accedemos a la página principal del servidor de aplicaciones nos encontraremos la portada:

<figure>
{{ tomcat_home.png?450 }}
<caption>Home Apache Tomcat</caption></figure>

Desde donde podemos acceder a diferentes secciones donde podemos monitorizar/configurar algunos aspectos del servidor

<figure>
{{ tomcat_status.png?450 }}
<caption>Estado del servidor</caption></figure>

<figure>
{{ tomcat_apps.png?450 }}
<caption>Listado de aplicaciones web desplegadas</caption></figure>

<figure>
{{ tomcat_vhosts.png?450 }}
<caption>Listado de hosts virtuales configurados</caption></figure>

Pero antes de poder acceder a las diferentes secciones del servidor desde el navegador hay que tener en cuenta que, por seguridad, dicho acceso se encuentra restringido y tendremos que registrar usuarios en ''conf/tomcat-users.xml'' con nombre de usuario, contraseña y los roles con los que accederan.

Podemos crear un usuario para cada rol o bien un usuario que tenga varios de ellos (incluso todos). Cada rol definido por //Tomcat// da acceso a una de las partes del servidor:
  * **manager-status**: Da acceso a la sección donde monitorizar el estado de Tomcat
  * **manager-gui**: Da acceso al listado de aplicaciones y a poder desplegarlas desde la web 
  * **admin-gui**: Da acceso a la parte de administración de hosts virtuales

La forma en como podemos editar el fichero y crear nuevos usuarios puede verse en el siguiente fragmento del fichero configuración extraido de una instalación limpia de //Tomcat// y modificado con un usuario ''tomcat'' y contraseña ''tomcat'' con todos los roles.

<code xml conf/tomcat-users.xml>
<tomcat-users>
<!--
  NOTE:  By default, no user is included in the "manager-gui" role required
  to operate the "/manager/html" web application.  If you wish to use this app,
  you must define such a user - the username and password are arbitrary.
-->
<!--
  NOTE:  The sample user and role entries below are wrapped in a comment
  and thus are ignored when reading this file. Do not forget to remove
  <!.. ..> that surrounds them.
-->

  <role rolename="manager-status"/>
  <role rolename="manager-gui"/>
  <role rolename="admin-gui"/>
  <user username="usuario" password="contrasena" roles="manager-status, manager-gui, admin-gui"/>

</tomcat-users>
</code>

==== Cómo configurar el Proxy AJP para conectar Tomcat con Apache ====

En el caso de que en el mismo servidor se encuentre ya funcionando un servidor Apache nos puede resultar útil poder configurar en él un host virtual cuyo destino real sea una aplicación web desplegada en el servidor de aplicaciones, simplificando así en gran medida la configuración de ambos servidores y permitiendo que convivan sin mayor problema. Podremos configurar un host virtual en Apache como lo veníamos haciendo hasta ahora ya que, en este caso, se trata simplemente de añadir un par de líneas en dicha configuración:

<code apache>
. . .
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
. . .
</code>

En el caso de que queramos que este nuevo host virtual de Apache haga de proxy de una aplicación web concreta, podremos añadir el nombre de dicha aplicación al de la URL en las dos opciones ''ProxyPass'' y ''ProxyPassReverse'':

<code apache>
. . .
ProxyPass / ajp://localhost:8009/mi_aplicacion/
ProxyPassReverse / ajp://localhost:8009/mi_aplicacion/
. . .
</code>

El siguiente paso será activar el módulo ''proxy_ajp'' si no está ya activado y, a continuación, reiniciar el servidor para que los cambios tengan efecto (tanto la configuración como la carga del módulo):

<code bash>
santi@zenbook:$ sudo a2enmod proxy_ajp
. . .
santi@zenbook:$ sudo service apache2 restart
. . .
</code>

Si todo está correcto hasta el momento, en la configuración del servidor Tomcat habrá que //activar// la siguiente línea en el fichero ''conf/server.xml'' (o ''/etc/tomcat8/server.xml'' si hemos instalado Tomcat con ''apt''), que encontraremos comentada. Eso activa el protocolo AJP en el servidor de aplicaciones en el puerto 8009 en este caso:

<code xml conf/server.xml>
. . .
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
. . .
</code>

Y a partir de ahora podemos visitar el nuevo host virtual creado en Apache y, de forma transparente, se cargará la aplicación web que se encuentra desplegada en el servidor Tomcat.
==== Cómo crear un hosting compartido ====

==== Seguridad ====

==== Configurar Tomcat para utilizar el protocolo HTTPS ====

Utilizaremos el comando ''keytool'' para generar un fichero de claves y un certificado.

<code bash>
santi@zenbook:$ keytool -genkey -alias tomcat -keyalg RSA
Enter keystore password:  
Re-enter new password: 
What is your first and last name?
  [Unknown]:  Santiago
What is the name of your organizational unit?
  [Unknown]:  Despliegue
What is the name of your organization?
  [Unknown]:  Colegio Montessori
What is the name of your City or Locality?
  [Unknown]:  Zaragoza
What is the name of your State or Province?
  [Unknown]:  Zaragoza
What is the two-letter country code for this unit?
  [Unknown]:  ES
Is CN=Santiago, OU=Despliegue, O=Colegio Montessori, L=Zaragoza, ST=Zaragoza, C=ES correct?
  [no]:  yes

Enter key password for <tomcat>
	(RETURN if same as keystore password):
santi@zenbook:$ ls /home/santi/.keystore
/home/santi/.keystore
</code>

Por defecto el fichero se crea en la carpeta del usuario que ha ejecutado el comando con el nombre ''.keystore''. Podemos copiarlo dentro de la carpeta ''/etc/tomcat8'' que es donde se almacenan los ficheros de configuración de //Tomcat//.

<code bash>
santi@zenbook:$ sudo cp /home/santi/.keystore /etc/tomcat8
</code>

A continuación, en el fichero de configuración principal de Tomcat, ''server.xml'', tendremos que buscar la etiqueta donde se configura el conector para el puerto HTTPS y añadir algunos parámetros para comenzar a usarlo y asignarle el certificado que acabamos de crear.

La configuración por defecto es la que se muestra a continuación:

<file xml server.xml>
. . .
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
      maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
      clientAuth="false" sslProtocol="TLS" />
. . .
</file>

Y tenemos que modificar los atributos de la etiqueta ''Connector'' para que quede como en el siguiente fragmento:

<file xml server.xml>
. . .
<Connector SSLEnabled="true" acceptCount="100" clientAuth="false"
    disableUploadTimeout="true" enableLookups="false" maxThreads="25"
    port="8443" keystoreFile="/etc/tomcat8/.keystore" keystorePass="password"
    protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https"
    secure="true" sslProtocol="TLS" />
. . .
</file>

Una vez hechos estos cambios, tendremos que reiniciar el servidor de Tomcat y podremos visitar la dirección ''https://localhost:8443'' para comprobar que el certificado funciona. Habrá que tener en cuenta que, puesto que el certificado es autofirmado, aparecerá una advertencia en el navegador avisando de ello.

<figure>
{{ tomcat_ssl1.png }}
<caption>Conexión HTTPS a Tomcat</caption></figure>

<figure>
{{ tomcat_ssl2.png }}
<caption>Certificado (autofirmado) configurado en Tomcat</caption></figure>
==== Despliegue de aplicaciones ====

Para desplegar aplicaciones se pueden utilizar diferentes vías:

=== Despliegue de aplicaciones utilizando el 'manager-gui' ===

Se pueden desplegar aplicaciones web en Tomcat utilizando el propio servidor y accediendo al ''manager-gui'' de forma que podemos cargar el fichero ''.war'' en el formulario que se puede ver más abajo y lanzarla para su despliegue inmediato.

<figure>
{{ tomcat_apps.png }}
<caption>Gestor de aplicaciones Tomcat</caption></figure>

<figure>
{{ manager-gui.png }}
<caption>Despliegue de aplicaciones en Tomcat utilizando el manager-gui</caption></figure>

=== Despliegue de aplicaciones utilizando la opción autoDeploy ===

Si tenemos la opción ''autoDeploy'' activada en Tomcat, éste estará continuamente buscando nuevas aplicaciones web desplegadas en la carpeta ''webapps''. De esta forma podemos copiar directamente el fichero //.war// de nuestra aplicación a dicha carpeta y será desplegada automáticamente a los pocos segundos.

Es necesario comprobar que Tomcat está configurado para soporte ''autoDeploy'' si queremos usar esta característica (por defecto lo está).

<file xml server.xml>
. . .
<Host name="localhost"  appBase="webapps"
      unpackWARs="true" autoDeploy="true">
. . .
</file>

En este caso hay que tener en cuenta que la carpeta donde tenemos que copiar el fichero //.war// es ''/var/lib/tomcat8/webapps''.

Así, podríamos directamente subir por FTP el fichero //.war// a dicha carpeta o bien podríamos copiarla utilizando el comando ''scp'' (copia remota segura).

<code bash>
santi@zenbook:$ scp mi_app.war santi@server:/var/lib/tomcat8/webapps
mi_app.war                                                    100%  990     2.0MB/s   00:00
</code>

----

{{ ejercicio.png?75}}


=== Ejercicios ===

  - Configura un servidor FTP para utilizarlo como herramienta para el auto despliegue de aplicaciones web en tu servidor Tomcat
  - Configura un servidor SSH para utilizarlo como herramienta para el auto despliegue de aplicaciones web en tu servidor Tomcat

----
===== Pruebas de rendimiento =====


----

===== Ejercicios =====

  - Empezando desde la OVA de la máquina Debian 9 que tenéis en la sección de Descargas, realiza las siguientes instalaciones/configuraciones sobre la misma:
    * Apache Tomcat 8
    * Configurar acceso web a Tomcat 8 (configurar usuarios)
    * Preparar una aplicación web de ejemplo y despliegala en Tomcat
    * Configurar Apache y Tomcat para usar el proxy_ajp y poder poder acceder a la aplicación web desde un host virtual
    * Deshabilitar el conector para el puerto 8080 de Tomcat
    * Instalar un servidor SSH (openssh) en la máquina Debian 9
    * Instalar un servidor FTP (pure FTP) en la máquina Debian 9 \\ \\
  - Empezando desde la OVA de la máquina Debian 9 que tenéis en la sección de Descargas, realiza las siguientes instalaciones/configuraciones sobre la misma:
    * Apache 
    * Apache Tomcat 8
    * Configurar acceso web a Tomcat 8 (configurar usuarios para poder acceder a la aplicación web para desplegar aplicaciones) (CAPTURA)
    * Preparar una aplicación web de ejemplo y despliegala en Tomcat (CAPTURA)
    * Crea un host virtual en Apache para el dominio //tunombreyapellidos.com// (CAPTURA)
    * Configurar Apache y Tomcat para usar el proxy_ajp y poder poder acceder a la aplicación web desde el host virtual directamente (// www.tunombreyapellidos.com //) (CAPTURA)
    * Deshabilitar el conector para el puerto 8080 de Tomcat de forma que la aplicación web instalada sólo sea accesible a través del host virtual de Apache (CAPTURA)
    * Instalar un servidor SSH (openssh) en la máquina Debian 9
    * Despliega la aplicación web hecha para Tomcat subiéndola remotamente por SSH al servidor (CAPTURA)
    * Instalar un servidor FTP (pure FTP) en la máquina Debian 9
    * Despliega la aplicación web hecha para Tomcat subiéndola remotamente por FTP al servidor (CAPTURA)
    * Deshabilita el acceso al manager-app de Tomcat (CAPTURA)
    * Realiza una segunda aplicación web, despliegala en Tomcat utilizando el servidor FTP y configura otro host virtual en Apache para acceder a ella (en este caso a través de // www.tuapellidosynombre.com //) (CAPTURA)

----

(c) 2018 Santiago Faci