====== Despliegue de aplicaciones web ======

Aqui vamos a ver como poner en marcha una aplicación web hecha con Spring Boot como paquete jar, de forma que no necesitemos de un servidor de aplicaciones para desplegar y ponerla en marcha.

==== Empaquetar la aplicación ====

El primer paso será empaquetar la aplicación en formato jar

<code bash>
santi@zenbook:$ mvn package
</code>

Eso hará que se genera un fichero jar del estilo a //myshop-0.0.1-SNAPSHOT.jar// en la carpeta //target// del proyecto, dependiendo de como hayamos definido las propiedades //artifactId// y //version// en el fichero //pom.xml//. Será el fichero que tendremos que llevar a la máquina donde queramos desplegar la aplicación. Hay que tener en cuenta que necesitaremos instalar el JDK en esa máquina para que pueda ejecutarla.

==== Desplegar la aplicación al servidor ====

Asi, si suponemos que nuestra máquina remota ya está en marcha y tiene asociado un dominio como //codeandcoke.com//, tendremos que copiar ese fichero jar (únicamente) a dicha máquina. Tendremos que asegurarnos de que nuestro usuario en la máquina tenga permisos sobre la carpeta que lo copiemos (en mi caso lo dejaré en la carpeta ''/opt'')

<code bash>
santi@zenbook:$ scp target/myshop-0.0.1-SNAPSHOT.jar santi@codeandcoke.com:/opt
</code>

> También podemos subirla al servidor usando cualquier aplicación de transferencia de ficheros del estilo a [[https://filezilla-project.org/|Filezilla]] o bien [[https://winscp.net/eng/download.php|WinSCP]]

==== Ejecutar la aplicación en el servidor ====

Ahora, iniciaremos sesión en la máquina remota para lanzar la aplicación:

<code bash>
santi@zenbook:$ ssh santi@codeandcoke.com
santi@codeandcoke.com:$ cd /opt
santi@codeandcoke.com:$ nohup java -jar myshop-0.0.1-SNAPSHOT.jar > myshop.log 2>&1 &
</code>

  * Utlizamos el comando ''nohup'' para evitar que la aplicación se detenga al cerrar la sesión de terminal desde donde la lanzamos
  * ''java -jar myshop-0.0.1-SNAPSHOT.jar'' lanza la aplicación
  * ''> myshop.log'' redirige toda la salida a un fichero que nos servirá de log de la aplicación
  * ''2>&1 &'' redirige toda la salida de error a la salida estándar (que irá al fichero log) y lo ejecuta en segundo plano, para dejar libre la terminal durante el resto de la sesión

También podemos prepararnos un script bash para evitar que escribir ese comando cada vez que queramos desplegar una nueva versión (puesto que además tendremos que detener la existente)

==== Acceder a la aplicación ====

Suponiendo que nuestra aplicación escucha en el puerto 8080, podremos comprobar que funciona sin problemas si accedemos, desde nuestro navegador a http://codeandcoke.com:8080

==== Modificar el puerto de acceso ====

El siguiente paso interesante sería evitar que el usuario tuviera que especificar el puerto a la hora de acceder a la aplicación desde el navegador. Eso podría evitarse, por ejemplo, modificando el puerto en el que ésta escucha (y pasarlo al 80). Esto no es ningún problema si la aplicación "vive" sola en la máquina remota.

==== Configurar Apache como Proxy para la aplicación ====

Si por el contrario tenemos algún servidor Apache funcionando, tendremos el puerto 80 ya ocupado. Si ocurre esto, podemos dejar que la aplicación siga escuchando en el puerto //8080// (o cualquier otro) y hacer que sea Apache quien nos haga de proxy. Podríamos definir un host virtual para el dominio ''codeandcoke.com'' indicando a Apache que lo que tiene que hacer es llevar a los usuarios al puerto 8080 que es donde está la aplicación. Asi, los usuarios accederán a http://codeandcoke.com para acceder a nuestra aplicación.

Para eso, definimos el host virtual en Apache de forma habitual:

<code apache>
<VirtualHost *:80>
    ServerAdmin info@codeandcoke.com
    ServerName codeandcoke.com
    ServerAlias www.codeandcoke.com
    ErrorLog "codeandcoke.com-error.log"
    CustomLog "codeandcoke.com-access.log" combined
</VirtualHost>
</code>

Y añadimos un par de líneas más para indicar que tiene que hacer de proxy con una aplicación ya desplegada:

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

Quedando la configuración del sitio virtual:

<code apache>
<VirtualHost *:80>
    ServerName codeandcoke.com
    ServerAlias www.codeandcoke.com
    ErrorLog "codeandcoke.com-error.log"
    CustomLog "codeandcoke.com-access.log" combined
    ProxyPass / ajp://localhost:8080/
    ProxyPassReverse / ajp://localhost:8080/
</VirtualHost>
</code>

Puede que tengamos que activar el módulo AJP de Apache si no lo está ya:

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

> Puedes ver [[https://despliegue.codeandcoke.com/doku.php?id=apuntes:servidores_web|aqui]] más información sobre cómo configurar Apache

> Si estamos desplegando la aplicación como paquete //war// con un Apache Tomcat, necesitaremos configurar tanto Apache para que haga de Proxy como Tomcat para activar el protocolo AJP. Puedes ver cómo hacerlo [[https://despliegue.codeandcoke.com/doku.php?id=apuntes:servidores_aplicaciones#como_configurar_el_proxy_ajp_para_conectar_tomcat_con_apache|aqui]]

----

(c) 2021 Santiago Faci