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:
Haz clic en el botón Añadir una ubicación. Deberías ver la siguiente pantalla:
Proporciona los valores que desees y haz clic en el botón de enviar ubicación. Deberías ver la siguiente pantalla:
Ahora, haz clic en el botón Ver todas las ubicaciones. Deberías ver tu ubicación añadida en la siguiente pantalla:
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.