Clojure es un lenguaje de programación moderno, dinámico y poderoso en la plataforma Java. Se basa en el lenguaje de programación LISP y tiene compiladores que hacen posible su ejecución en entornos de tiempo de ejecución Java y .Net. Clojure lo ayuda a construir sistemas desde cero sin tocar el código Java directamente. Actualmente, lo utilizan muchas grandes empresas, incluidas Walmart y Puppet Lab.
En este tutorial, explicaremos cómo implementar una aplicación web Clojure en Ubuntu 20.04.
Requisitos
- Un servidor con Ubuntu 20.04.
- Un nombre de dominio válido apuntado con la IP de su servidor.
- Se configura una contraseña de root en el servidor.
Cómo empezar
Antes de comenzar, se recomienda actualizar los paquetes de su sistema a la última versión. Puede actualizarlos con el siguiente comando:
apt-get update -y
Una vez que todos los paquetes estén actualizados, instale Java y otros paquetes necesarios ejecutando el siguiente comando:
apt-get install git curl default-jdk -y
Una vez que todos los paquetes estén instalados, verifique la versión instalada de Java con el siguiente comando:
java -version
Deberías obtener el siguiente resultado:
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 haya terminado, puede continuar con el siguiente paso.
Instalar Nginx y Supervisor
A continuación, deberá instalar el servidor web Nginx y Supervisor en su sistema. Nginx es un servidor web que se utiliza para alojar aplicaciones en Internet. Supervisor es un sistema cliente/servidor que permite a sus usuarios monitorear y controlar una serie de procesos en sistemas operativos basados en Linux.
Puede instalar ambos paquetes con el siguiente comando:
apt-get install nginx supervisor -y
Una vez que ambos paquetes estén instalados, puede continuar con el siguiente paso.
Descargar aplicación Clojure
Primero, deberá descargar la aplicación Clojure del repositorio de Git. Puede descargarlo ejecutando el siguiente comando:
git clone https://github.com/do-community/do-clojure-web.git
Una vez que se complete la descarga, debería obtener el siguiente resultado:
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, deberá instalar Leiningen en su sistema. Leiningen es una herramienta de gestión de dependencias y automatización de compilaciones que se utiliza para crear proyectos escritos en el lenguaje de programación Clojure. Puede 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 que se complete la descarga, establezca 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 que se haya compilado el proyecto, debería obtener el siguiente resultado:
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 haya terminado, puede continuar con el siguiente paso.
Crear estructura de directorio para la aplicación Clojure
A continuación, deberá crear una estructura de directorios para la aplicación Clojure y colocar los archivos y el directorio necesarios en una ubicación específica.
Primero, cree una estructura de directorio con el siguiente comando:
mkdir -p /var/www/html/do-clojure-web/app/db
A continuación, copie su aplicación y base de datos de Clojure 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, establezca 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, cambie el directorio a la aplicación Clojure y cree un enlace simbólico de su 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, verifique si su aplicación funciona o no ejecutando el siguiente comando:
java -jar do-clojure-web.jar
Si todo está bien, debería obtener el siguiente resultado:
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 haya terminado, puede continuar con el siguiente paso.
Configurar supervisor para la aplicación Clojure
Hay varias formas de administrar la aplicación Clojure como un servicio. En este tutorial, utilizaremos Supervisor para administrar la aplicación Clojure. Puede configurarlo creando un archivo dentro del directorio de configuración de Supervisor:
nano /etc/supervisor/conf.d/do-clojure-web.conf
Agregue 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
Guarde y cierre el archivo, luego reinicie el servicio de Supervisor para aplicar los cambios:
systemctl restart supervisor
A continuación, habilite el servicio de Supervisor para que se inicie al reiniciar el sistema:
systemctl enable supervisor
Ahora puede verificar el estado del Supervisor con el siguiente comando:
systemctl status supervisor
Deberías obtener el siguiente resultado:
? 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 punto, se inicia el servicio de Supervisor y su aplicación está escuchando en el puerto 5000. Puede verificarlo con el siguiente comando:
ss -antpl | grep 5000
Deberías obtener el siguiente resultado:
LISTEN 0 50 [::ffff:127.0.0.1]:5000 *:* users:(("java",pid=40946,fd=7))
Una vez que haya terminado, puede continuar con el siguiente paso.
Configurar Nginx para la aplicación Clojure
A continuación, deberá configurar Nginx como un proxy inverso para servir la aplicación Clojure. Primero, cree un archivo de configuración de host virtual Nginx con el siguiente comando:
nano /etc/nginx/sites-available/clojure.conf
Agregue 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; } }
Guarde y cierre el archivo cuando haya terminado. Luego, habilite el host virtual Nginx con el siguiente comando:
ln -s /etc/nginx/sites-available/clojure.conf /etc/nginx/sites-enabled/
Luego, verifique el Nginx para cualquier error de sintaxis con el siguiente comando:
nginx -t
Deberías obtener el siguiente resultado:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Finalmente, reinicie el servicio Nginx para aplicar los cambios:
systemctl restart nginx
Una vez que haya terminado, puede proceder a acceder a la aplicación Clojure.
Acceder a la aplicación Clojure
Ahora, abra su navegador web y acceda a la aplicación Clojure usando la URL http://clojure.example.com . Debería ver el panel de la aplicación Clojure en la siguiente pantalla:
Haga clic en Agregar una ubicación botón. Debería ver la siguiente pantalla:
Proporcione los valores deseados y haga clic en enviar botón de ubicación. Debería ver la siguiente pantalla:
Ahora, haga clic en Ver todas las ubicaciones botón. Debería ver su ubicación agregada en la siguiente pantalla:
Conclusión
¡Felicidades! Ha implementado con éxito la aplicación Clojure con Nginx como proxy inverso en el servidor Ubuntu 20.04. Ahora puede intentar implementar su aplicación personalizada con Clojure.