Ricerca nel sito web

Come distribuire un'applicazione Web Clojure con Nginx su Ubuntu 20.04


Su questa pagina

  1. Prerequisiti
  2. Per iniziare
  3. Installa Nginx e Supervisor
  4. Scarica l'app Clojure
  5. Crea struttura di directory per l'applicazione Clojure
  6. Configura il supervisore per l'applicazione Clojure
  7. Configura Nginx per l'applicazione Clojure
  8. Accedi all'applicazione Clojure
  9. Conclusione

Clojure è un linguaggio di programmazione moderno, dinamico e potente su piattaforma Java. È basato sul linguaggio di programmazione LISP e dispone di compilatori che ne consentono l'esecuzione su entrambi gli ambienti di 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 indicato con l'IP del tuo server.
  • Il server è configurato con una password di root.

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

apt-get install git curl default-jdk -y

Una volta installati tutti i pacchetti, verifica la versione di Java installata 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 e il supervisore Nginx 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 creare 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 la 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/

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

Una volta terminato, puoi procedere al passaggio successivo.

Configurare il supervisore per l'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 di Supervisor:

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 Supervisor per applicare le modifiche:

systemctl restart supervisor

Successivamente, abilita il servizio Supervisor per l'avvio al riavvio del sistema:

systemctl enable supervisor

Ora puoi 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 ubunt4 systemd[1]: Started Supervisor process control system for UNIX.
Nov 25 10:22:31 ubunt4 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 ubunt4 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 ubunt4 supervisord[40927]: 2020-11-25 10:22:31,608 INFO RPC interface 'supervisor' initialized
Nov 25 10:22:31 ubunt4 supervisord[40927]: 2020-11-25 10:22:31,608 CRIT Server 'unix_http_server' running without any HTTP authentication >
Nov 25 10:22:31 ubunt4 supervisord[40927]: 2020-11-25 10:22:31,609 INFO supervisord started with pid 40927
Nov 25 10:22:32 ubunt4 supervisord[40927]: 2020-11-25 10:22:32,612 INFO spawned: 'do-clojure-web' with pid 40946
Nov 25 10:22:33 ubunt4 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/

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

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:

Fare clic sul pulsante Aggiungi una posizione. Dovresti vedere la seguente schermata:

Fornisci i valori desiderati e fai clic sul pulsante Invia posizione. Dovresti vedere la seguente schermata:

Ora, fai clic sul pulsante Visualizza tutte le posizioni. Dovresti vedere la tua posizione aggiunta nella seguente schermata:

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.