Clojure è un linguaggio di programmazione moderno, dinamico e potente sulla piattaforma Java. Si basa sul linguaggio di programmazione LISP e dispone di compilatori che rendono possibile l'esecuzione in ambiente runtime Java e .Net. Clojure ti aiuta a costruire sistemi da zero senza toccare direttamente il codice Java. Attualmente è utilizzato da molte grandi aziende, tra cui Walmart e Puppet Lab.
In questo tutorial, spiegheremo come distribuire un'applicazione Web Clojure su Ubuntu 20.04.
Prerequisiti
- Un server che esegue Ubuntu 20.04.
- Un nome di dominio valido puntato all'IP del tuo server.
- Una password di root è configurata sul server.
Per iniziare
Prima di iniziare, si consiglia di aggiornare i pacchetti di sistema all'ultima versione. Puoi aggiornarli con il seguente comando:
apt-get update -y
Una volta aggiornati tutti i pacchetti, installa Java e altri pacchetti richiesti eseguendo il comando seguente:
apt-get install git curl default-jdk -y
Una volta installati tutti i pacchetti, verifica la versione installata di Java con il seguente comando:
java -version
Dovresti ottenere il seguente output:
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 volta terminato, puoi procedere al passaggio successivo.
Installa Nginx e Supervisor
Successivamente, dovrai installare il server Web Nginx e Supervisor sul tuo sistema. Nginx è un server Web utilizzato per ospitare applicazioni su Internet. Supervisor è un sistema client/server che consente ai suoi utenti di monitorare e controllare una serie di processi su sistemi operativi basati su Linux.
Puoi installare entrambi i pacchetti con il seguente comando:
apt-get install nginx supervisor -y
Una volta installati entrambi i pacchetti, puoi procedere al passaggio successivo.
Scarica l'app Clojure
Innanzitutto, dovrai scaricare l'app Clojure dal repository Git. Puoi scaricarlo eseguendo il seguente comando:
git clone https://github.com/do-community/do-clojure-web.git
Una volta completato il download, dovresti ottenere il seguente output:
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.
Successivamente, dovrai installare Leiningen nel tuo sistema. Leiningen è uno strumento di automazione della compilazione e gestione delle dipendenze utilizzato per la creazione di progetti scritti nel linguaggio di programmazione Clojure. Puoi scaricare il pacchetto binario Leiningen con il seguente comando:
curl https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein -o /usr/bin/lein
Una volta completato il download, imposta il permesso di esecuzione con il seguente comando:
chmod 755 /usr/bin/lein
Quindi, cambia la directory in Clojure e compila il progetto con il seguente comando:
cd do-clojure-web
lein uberjar
Una volta che il progetto è stato compilato, dovresti ottenere il seguente output:
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 volta terminato, puoi procedere al passaggio successivo.
Crea una struttura di directory per l'applicazione Clojure
Successivamente, dovrai creare una struttura di directory per l'app Clojure e posizionare i file e le directory richiesti in una posizione specifica.
Innanzitutto, crea una struttura di directory con il seguente comando:
mkdir -p /var/www/html/do-clojure-web/app/db
Quindi, copia l'app e il database Clojure nella directory specifica con il seguente 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/
Quindi, imposta le autorizzazioni e la proprietà appropriate con il seguente comando:
chown -R www-data:www-data /var/www/html/do-clojure-web/
chmod -R 775 /var/www/html/do-clojure-web/
Quindi, cambia la directory nell'app Clojure e crea un collegamento simbolico della tua applicazione clojure:
cd /var/www/html/do-clojure-web/app/
ln -s do-clojure-web-0.1.0-standalone.jar do-clojure-web.jar
Quindi, verifica se la tua applicazione funziona o meno eseguendo il comando seguente:
java -jar do-clojure-web.jar
Se tutto va bene, dovresti ottenere il seguente output:
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 volta terminato, puoi procedere al passaggio successivo.
Configura supervisore per applicazione Clojure
Esistono diversi modi per gestire l'applicazione Clojure come servizio. In questo tutorial utilizzeremo Supervisor per la gestione dell'app Clojure. Puoi configurarlo creando un file all'interno della directory di configurazione del supervisore:
nano /etc/supervisor/conf.d/do-clojure-web.conf
Aggiungi le seguenti righe:
[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
Salva e chiudi il file, quindi riavvia il servizio Supervisore per applicare le modifiche:
systemctl restart supervisor
Quindi, abilita l'avvio del servizio Supervisore al riavvio del sistema:
systemctl enable supervisor
È ora possibile verificare lo stato del Supervisore con il seguente comando:
systemctl status supervisor
Dovresti ottenere il seguente output:
? 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 >
A questo punto il servizio Supervisor è avviato e la tua applicazione è in ascolto sulla porta 5000. Puoi verificarlo con il seguente comando:
ss -antpl | grep 5000
Dovresti ottenere il seguente output:
LISTEN 0 50 [::ffff:127.0.0.1]:5000 *:* users:(("java",pid=40946,fd=7))
Una volta terminato, puoi procedere al passaggio successivo.
Configura Nginx per l'applicazione Clojure
Successivamente, dovrai configurare Nginx come proxy inverso per servire l'app Clojure. Innanzitutto, crea un file di configurazione dell'host virtuale Nginx con il seguente comando:
nano /etc/nginx/sites-available/clojure.conf
Aggiungi le seguenti righe:
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; } }
Salva e chiudi il file quando hai finito. Quindi, abilita l'host virtuale Nginx con il seguente comando:
ln -s /etc/nginx/sites-available/clojure.conf /etc/nginx/sites-enabled/
Quindi, verifica Nginx per eventuali errori di sintassi con il seguente comando:
nginx -t
Dovresti ottenere il seguente output:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Infine, riavvia il servizio Nginx per applicare le modifiche:
systemctl restart nginx
Una volta terminato, puoi procedere con l'accesso all'app Clojure.
Accedi all'applicazione Clojure
Ora apri il tuo browser web e accedi all'applicazione Clojure utilizzando l'URL http://clojure.example.com . Dovresti vedere la dashboard dell'applicazione Clojure nella schermata seguente:
Fai clic su Aggiungi una posizione pulsante. Dovresti vedere la seguente schermata:
Fornisci i valori desiderati e fai clic su invia pulsante posizione. Dovresti vedere la seguente schermata:
Ora, fai clic su Visualizza tutte le posizioni pulsante. Dovresti vedere la tua posizione aggiunta nella schermata seguente:
Conclusione
Congratulazioni! hai distribuito con successo l'app Clojure con Nginx come proxy inverso sul server Ubuntu 20.04. Ora puoi provare a distribuire la tua applicazione personalizzata con Clojure.