Introduzione

Clojure è un linguaggio di programmazione moderno, dinamico e potente sulla piattaforma Java. Si basa sul linguaggio di programmazione LISP e dispone di compilatori che ne consentono l'esecuzione su ambienti 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 LTS.

Prerequisiti

  • Un server che esegue Ubuntu 20.04 LTS.
  • Un nome di dominio valido puntato con l'IP del server.

Se desideri fare il Deploy di un app Web Clojure su un server in remoto continua a leggere, altrimenti salta il primo paragrafo "Connessione al Server" e leggi il successivo.

Connessione al Server

Per accedere al server, è necessario conoscere l'indirizzo IP. Avrai anche bisogno dell'username e della password per l'autenticazione. Per connettersi al server come utente root digitare il seguente comando:

ssh [email protected]_DEL_SERVER

Successivamente sarà necessario inserire la password dell'utente root.

Se non utilizzate l'utente root potete connettervi con un'altro nome utente utilizzando lo stesso comando, quindi modificare root con il vostro nome_utente:

ssh [email protected]_DEL_SERVER

Successivamente vi verrà chiesto di inserire la password del vostro utente.

La porta standard per connettersi tramite ssh è la 22, se il vostro server utilizza una porta diversa, sarà necessario specificarla utilizzando il parametro -p, quindi digitare il seguente comando:

ssh [email protected]_DEL_SERVER -p PORTA

Installare le dipendenze

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 seguente comando:

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.

Installare Nginx e Supervisor

Successivamente, sarà necessario installare il server Web Nginx e il supervisore sul 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.

Scaricare 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 creare progetti scritti nel linguaggio di programmazione Clojure. Puoi scaricare il pacchetto binario di Leiningen con il seguente comando curl:

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

Successivamente, cambia la directory in Clojure e compila il progetto con il seguente comando cd:

cd do-clojure-weblein uberjar
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.

Creare struttura di directory per l'applicazione Clojure

Successivamente, dovrai creare una struttura di directory per l'app Clojure e posizionare i file e la directory richiesti in una posizione specifica.

Innanzitutto, crea una struttura di directory con il seguente comando mkdir:

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

Successivamente, 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:

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

Successivamente, 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

Successivamente, verifica se la tua applicazione funziona o meno eseguendo il seguente comando:

java -jar do-clojure-web.jar

Se tutto va bene, dovresti ottenere il seguente output:

2020-12-05 16:11:09.603:INFO:oejs.Server:jetty-7.x.y-SNAPSHOT
2020-12-05 16:11:09.730:INFO:oejs.AbstractConnector:Started [email protected]:5000

Una volta terminato, puoi procedere al passaggio successivo.

Configurare il Supervisor per l'applicazione Clojure

Esistono diversi modi per gestire l'applicazione Clojure come servizio. In questo tutorial, useremo Supervisor per gestire l'app Clojure. Puoi configurarlo creando un file all'interno della directory di configurazione di Supervisor.

Creiamo il seguente file con il vostro editor preferito, qui utilizziamo nano:

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

Salvare e chiudere il file, quindi riavviare il servizio Supervisor per applicare le modifiche:

systemctl restart supervisor

Successivamente, abilita l'avvio del servizio Supervisor 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 Sat 2020-12-05 16:12:48 CET; 6s ago
       Docs: http://supervisord.org
   Main PID: 6341 (supervisord)
      Tasks: 21 (limit: 2286)
     Memory: 101.1M
     CGroup: /system.slice/supervisor.service

A questo punto viene avviato il servizio Supervisor 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=6359,fd=5))

Una volta terminato, puoi procedere al passaggio successivo.

Configurare 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, modifica il parametro server_name aggiungendo il tuo dominio:

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 tuo_dominio.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 qualsiasi errore 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.

Accedere all'applicazione Clojure

Ora apri il tuo browser web e accedi all'applicazione Clojure utilizzando l'URL http://tuo_dominio.com . Dovresti vedere il dashboard dell'applicazione Clojure.

Fare clic sul pulsante Add a Location.

Fornisci i valori desiderati e fai clic sul pulsante submit location.

Ora, fai clic sul pulsante View All Locations. Dovresti vedere la tua posizione aggiunta.

Conclusione

Congratulazioni! hai fatto il deploy correttamente l'app Clojure con Nginx come proxy inverso sul server Ubuntu 20.04 LTS Focal Fossa. Ora puoi provare a distribuire la tua applicazione personalizzata con Clojure.