Cómo desplegar una aplicación web Clojure con Nginx en Ubuntu 20.04

Clojure es un lenguaje de programación moderno, dinámico y potente en la plataforma Java. Está basado en el lenguaje de programación LISP y dispone de compiladores que permiten ejecutarlo tanto en el entorno de ejecución Java como en el .Net. Clojure te ayuda a construir sistemas desde cero sin tocar directamente el código Java. Actualmente, lo utilizan muchas grandes empresas, como Walmart y Puppet Lab.

En este tutorial, explicaremos cómo desplegar una aplicación web Clojure en Ubuntu 20.04.

Requisitos previos

  • Un servidor con Ubuntu 20.04.
  • Un nombre de dominio válido apuntado con la IP de tu servidor.
  • Una contraseña de root configurada el servidor.

Cómo empezar

Antes de empezar, se recomienda actualizar los paquetes de tu sistema a la última versión. Puedes actualizarlos con el siguiente comando:

apt-get update -y

Una vez actualizados todos los paquetes, instala Java y otros paquetes necesarios ejecutando el siguiente comando:

apt-get install git curl default-jdk -y

Una vez instalados todos los paquetes, verifica la versión instalada de Java con el siguiente comando:

java -version

Deberías obtener la siguiente salida:

openjdk version "11.0.9.1" 2020-11-04
OpenJDK Runtime Environment (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.04)
OpenJDK 64-Bit Server VM (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.04, mixed mode, sharing)

Una vez que hayas terminado, puedes pasar al siguiente paso.

Instalar Nginx y Supervisor

A continuación, tendrás que instalar el servidor web Nginx y el Supervisor en tu sistema. Nginx es un servidor web utilizado para alojar aplicaciones en Internet. Supervisor es un sistema cliente/servidor que permite a sus usuarios monitorizar y controlar una serie de procesos en sistemas operativos basados en Linux.

Puedes instalar ambos paquetes con el siguiente comando:

apt-get install nginx supervisor -y

Una vez instalados ambos paquetes, puedes pasar al siguiente paso.

Descargar la aplicación Clojure

En primer lugar, tendrás que descargar la aplicación Clojure del repositorio Git. Puedes descargarla ejecutando el siguiente comando:

git clone https://github.com/do-community/do-clojure-web.git

Una vez completada la descarga, deberías obtener la siguiente salida:

Cloning into 'do-clojure-web'...
remote: Enumerating objects: 37, done.
remote: Total 37 (delta 0), reused 0 (delta 0), pack-reused 37
Unpacking objects: 100% (37/37), 6.25 KiB | 399.00 KiB/s, done.

A continuación, tendrás que instalar Leiningen en tu sistema. Leiningen es una herramienta de automatización de la construcción y de gestión de dependencias que se utiliza para crear proyectos escritos en el lenguaje de programación Clojure. Puedes descargar el paquete binario de Leiningen con el siguiente comando:

curl https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein -o /usr/bin/lein

Una vez completada la descarga, establece el permiso de ejecución con el siguiente comando:

chmod 755 /usr/bin/lein

A continuación, cambia el directorio a Clojure y compila el proyecto con el siguiente comando:

cd do-clojure-web
lein uberjar

Una vez compilado el proyecto, deberías obtener la siguiente salida:

Retrieving commons-codec/commons-codec/1.6/commons-codec-1.6.jar from central
Retrieving javax/servlet/servlet-api/2.5/servlet-api-2.5.jar from central
Retrieving org/clojure/java.jdbc/0.2.3/java.jdbc-0.2.3.jar from central
Retrieving com/h2database/h2/1.3.170/h2-1.3.170.jar from central
Retrieving org/eclipse/jetty/jetty-server/7.6.13.v20130916/jetty-server-7.6.13.v20130916.jar from central
Retrieving org/eclipse/jetty/orbit/javax.servlet/2.5.0.v201103041518/javax.servlet-2.5.0.v201103041518.jar from central
Retrieving org/eclipse/jetty/jetty-continuation/7.6.13.v20130916/jetty-continuation-7.6.13.v20130916.jar from central
Retrieving org/eclipse/jetty/jetty-http/7.6.13.v20130916/jetty-http-7.6.13.v20130916.jar from central
Retrieving org/eclipse/jetty/jetty-io/7.6.13.v20130916/jetty-io-7.6.13.v20130916.jar from central
Retrieving org/eclipse/jetty/jetty-util/7.6.13.v20130916/jetty-util-7.6.13.v20130916.jar from central
Retrieving medley/medley/0.5.3/medley-0.5.3.jar from clojars
Retrieving clout/clout/2.1.0/clout-2.1.0.jar from clojars
Retrieving compojure/compojure/1.3.1/compojure-1.3.1.jar from clojars
Retrieving ring/ring-core/1.3.2/ring-core-1.3.2.jar from clojars
Retrieving instaparse/instaparse/1.3.4/instaparse-1.3.4.jar from clojars
Retrieving crypto-random/crypto-random/1.2.0/crypto-random-1.2.0.jar from clojars
Retrieving crypto-equality/crypto-equality/1.0.0/crypto-equality-1.0.0.jar from clojars
Retrieving clj-time/clj-time/0.6.0/clj-time-0.6.0.jar from clojars
Retrieving ring/ring-codec/1.0.0/ring-codec-1.0.0.jar from clojars
Retrieving ring/ring-defaults/0.1.2/ring-defaults-0.1.2.jar from clojars
Retrieving ring/ring-ssl/0.2.1/ring-ssl-0.2.1.jar from clojars
Retrieving ring/ring-headers/0.1.1/ring-headers-0.1.1.jar from clojars
Retrieving ring/ring-anti-forgery/1.0.0/ring-anti-forgery-1.0.0.jar from clojars
Retrieving hiccup/hiccup/1.0.2/hiccup-1.0.2.jar from clojars
Retrieving ring/ring-jetty-adapter/1.3.2/ring-jetty-adapter-1.3.2.jar from clojars
Retrieving ring/ring-servlet/1.3.2/ring-servlet-1.3.2.jar from clojars
Compiling do-clojure-web.handler
Created /root/do-clojure-web/target/do-clojure-web-0.1.0.jar
Created /root/do-clojure-web/target/do-clojure-web-0.1.0-standalone.jar

Una vez que hayas terminado, puedes pasar al siguiente paso.

Crear una estructura de directorios para la aplicación Clojure

A continuación, tendrás que crear una estructura de directorios para la aplicación Clojure y colocar los archivos y directorios necesarios en una ubicación específica.

Primero, crea una estructura de directorios con el siguiente comando:

mkdir -p /var/www/html/do-clojure-web/app/db

A continuación, copia tu aplicación Clojure y la base de datos en el directorio específico con el siguiente comando:

cp /root/do-clojure-web/target/do-clojure-web-0.1.0-standalone.jar /var/www/html/do-clojure-web/app/
cp /root/do-clojure-web/db/do-clojure-web.h2.db /var/www/html/do-clojure-web/app/db/

A continuación, establece los permisos y la propiedad adecuados con el siguiente comando:

chown -R www-data:www-data /var/www/html/do-clojure-web/
chmod -R 775 /var/www/html/do-clojure-web/

A continuación, cambia el directorio a la aplicación Clojure y crea un enlace simbólico de tu aplicación clojure:

cd /var/www/html/do-clojure-web/app/
ln -s do-clojure-web-0.1.0-standalone.jar do-clojure-web.jar

A continuación, comprueba si tu aplicación funciona o no ejecutando el siguiente comando:

java -jar do-clojure-web.jar

Si todo va bien, deberías obtener la siguiente salida:

2020-11-25 10:19:51.456:INFO:oejs.Server:jetty-7.x.y-SNAPSHOT
2020-11-25 10:19:51.497:INFO:oejs.AbstractConnector:Started [email protected]:5000

Una vez que hayas terminado, puedes pasar al siguiente paso.

Configurar el supervisor de la aplicación Clojure

Hay varias formas de gestionar la aplicación Clojure como un servicio. En este tutorial, utilizaremos el Supervisor para gestionar la aplicación Clojure. Puedes configurarlo creando un archivo dentro del directorio de configuración de Supervisor:

nano /etc/supervisor/conf.d/do-clojure-web.conf

Añade las siguientes líneas:

[program:do-clojure-web]
command=/usr/bin/java -jar do-clojure-web.jar
directory=/var/www/html/do-clojure-web/app
user=www-data
autostart=true
autorestart=true
startretries=3
redirect_stderr=true
stdout_logfile=/var/log/do-clojure-web.app.log

Guarda y cierra el archivo y luego reinicia el servicio Supervisor para aplicar los cambios:

systemctl restart supervisor

A continuación, activa el servicio Supervisor para que se inicie al reiniciar el sistema:

systemctl enable supervisor

Ahora puedes verificar el estado del Supervisor con el siguiente comando:

systemctl status supervisor

Deberías obtener la siguiente salida:

? supervisor.service - Supervisor process control system for UNIX
     Loaded: loaded (/lib/systemd/system/supervisor.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2020-11-25 10:22:31 UTC; 1min 12s ago
       Docs: http://supervisord.org
   Main PID: 40927 (supervisord)
      Tasks: 28 (limit: 2353)
     Memory: 104.6M
     CGroup: /system.slice/supervisor.service
             ??40927 /usr/bin/python3 /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
             ??40946 /usr/bin/java -jar do-clojure-web.jar

Nov 25 10:22:31 ubuntu2004 systemd[1]: Started Supervisor process control system for UNIX.
Nov 25 10:22:31 ubuntu2004 supervisord[40927]: 2020-11-25 10:22:31,603 CRIT Supervisor is running as root.  Privileges were not dropped becaus>
Nov 25 10:22:31 ubuntu2004 supervisord[40927]: 2020-11-25 10:22:31,603 INFO Included extra file "/etc/supervisor/conf.d/do-clojure-web.conf" d>
Nov 25 10:22:31 ubuntu2004 supervisord[40927]: 2020-11-25 10:22:31,608 INFO RPC interface 'supervisor' initialized
Nov 25 10:22:31 ubuntu2004 supervisord[40927]: 2020-11-25 10:22:31,608 CRIT Server 'unix_http_server' running without any HTTP authentication >
Nov 25 10:22:31 ubuntu2004 supervisord[40927]: 2020-11-25 10:22:31,609 INFO supervisord started with pid 40927
Nov 25 10:22:32 ubuntu2004 supervisord[40927]: 2020-11-25 10:22:32,612 INFO spawned: 'do-clojure-web' with pid 40946
Nov 25 10:22:33 ubuntu2004 supervisord[40927]: 2020-11-25 10:22:33,615 INFO success: do-clojure-web entered RUNNING state, process has stayed >

En este momento, el servicio Supervisor está iniciado y su aplicación está escuchando en el puerto 5000. Puedes comprobarlo con el siguiente comando:

ss -antpl | grep 5000

Deberías obtener la siguiente salida:

LISTEN   0        50          [::ffff:127.0.0.1]:5000                  *:*       users:(("java",pid=40946,fd=7)) 

Una vez que hayas terminado, puedes pasar al siguiente paso.

Configurar Nginx para la aplicación Clojure

A continuación, tendrás que configurar Nginx como proxy inverso para servir la aplicación Clojure. En primer lugar, crea un archivo de configuración del host virtual Nginx con el siguiente comando:

nano /etc/nginx/sites-available/clojure.conf

Añade las siguientes líneas:

upstream http_backend {
    server 127.0.0.1:5000;
    keepalive 32;
}
server {
        listen 80;
        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;

        server_name clojure.example.com;

    location / {
        proxy_pass http://http_backend;

        proxy_http_version 1.1;
        proxy_set_header Connection "";

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;

        access_log /var/log/do-clojure-web.access.log;
        error_log /var/log/do-clojure-web.error.log;
    }
}

Guarda y cierra el archivo cuando hayas terminado. A continuación, habilita el host virtual Nginx con el siguiente comando:

ln -s /etc/nginx/sites-available/clojure.conf /etc/nginx/sites-enabled/

A continuación, verifica que Nginx no tenga ningún error de sintaxis con el siguiente comando:

nginx -t

Deberías obtener la siguiente salida:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Por último, reinicia el servicio Nginx para aplicar los cambios:

systemctl restart nginx

Una vez que hayas terminado, puedes proceder a acceder a la aplicación Clojure.

Acceder a la aplicación Clojure

Ahora, abre tu navegador web y accede a la aplicación Clojure utilizando la URL http://clojure.example.com. Deberías ver el panel de control de la aplicación Clojure en la siguiente pantalla:

Acceder a una aplicación Clojure

Haz clic en el botón Añadir una ubicación. Deberías ver la siguiente pantalla:

Añadir ubicación

Proporciona los valores que desees y haz clic en el botón de enviar ubicación. Deberías ver la siguiente pantalla:

CRUD

Ahora, haz clic en el botón Ver todas las ubicaciones. Deberías ver tu ubicación añadida en la siguiente pantalla:

Resultado

Conclusión

Enhorabuena! has desplegado con éxito la aplicación Clojure con Nginx como proxy inverso en el servidor Ubuntu 20.04. Ahora puedes intentar desplegar tu aplicación personalizada con Clojure.

También te podría gustar...