Configurare Tomcat7 in una macchina virtuale Linux con Azure

Apache Tomcat (o semplicemente Tomcat, precedentemente chiamato anche Jakarta Tomcat) è un server Web e contenitore di servlet open source sviluppato da Apache Software Foundation (ASF). Tomcat implementa le specifiche Java Servlet e Java Server Pages (JSP) di Sun Microsystems. Tomcat fornisce un ambiente server Web HTTP Java puro in cui eseguire codice Java. Nella configurazione più semplice, Tomcat viene eseguito in un singolo processo del sistema operativo. Questo processo esegue una macchina virtuale Java (JVM). Ogni richiesta HTTP da un browser a Tomcat viene elaborata nel processo di Tomcat come un thread separato.

Importante

Azure offre due diversi modelli di distribuzione per creare e usare le risorse: Azure Resource Manager e classico. Questo articolo descrive come usare il modello di distribuzione classica. Per le distribuzioni più recenti si consiglia di usare il modello di Resource Manager. Per informazioni su come usare un modello di Resource Manager per distribuire una VM Ubuntu con Openjdk e Tomcat, vedere questo articolo.

In questo articolo si installerà Tomcat7 su un'immagine Linux e la si distribuirà in Azure.

Si acquisiranno le nozioni seguenti:

  • Come creare una macchina virtuale in Azure.
  • Come preparare la macchina virtuale per Tomcat7.
  • Come installare Tomcat7.

La procedura presuppone che l'utente disponga già di una sottoscrizione di Azure. In caso contrario è possibile registrarsi per una versione di valutazione gratuita sul sito Web di Azure. Se si ha un abbonamento MSDN, vedere Offerte speciali di Microsoft Azure: vantaggi per i membri di MSDN, MPN e Bizspark. Per altre informazioni su Azure, vedere Cos'è Microsoft Azure?.

Questo articolo presuppone che l'utente abbia una conoscenza pratica di base di Tomcat e Linux.

Fase 1: creare un'immagine.

In questa fase si creerà una macchina virtuale usando un'immagine Linux in Azure.

Passaggio 1: generare una chiave di autenticazione SSH

SSH è uno strumento importante per gli amministratori di sistema. Non è consigliabile tuttavia configurare la protezione di accesso in base a una password stabilita da una persona fisica. Con un nome utente e una password debole, il sistema può essere esposto all'attacco da parte di utenti malintenzionati.

L'aspetto positivo è che esiste un modo per lasciare aperto l'accesso remoto e non doversi preoccupare delle password. Il metodo consiste nell'autenticazione con crittografia asimmetrica. La chiave privata dell'utente è quella che concede l'autenticazione. È anche possibile bloccare l'account dell'utente per impedire l'autenticazione tramite password.

Un altro vantaggio di questo metodo è che non sono necessarie password diverse per accedere a server diversi. È possibile autenticarsi tramite la chiave privata personale in tutti i server, perciò non è necessario ricordare diverse password.

Attenersi a questa procedura per generare la chiave di autenticazione SSH.

  1. Scaricare e installare PuTTYgen dal percorso seguente: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
  2. Eseguire Puttygen.exe.
  3. Fare clic su Generate per generare le chiavi. Nel processo è possibile aumentare la casualità spostando il puntatore del mouse sull'area vuota della finestra.
    Schermata di PuTTY Key Generator che mostra il pulsante per generare una nuova chiave
  4. Dopo il processo di generazione Puttygen.exe visualizzerà la nuova chiave pubblica.
    Schermata di PuTTY Key Generator che mostra la nuova chiave pubblica e il pulsante per salvare la chiave privata
  5. Selezionare e copiare la chiave pubblica e salvarla in un file denominato publicKey.pem. Non fare clic su Save public key, poiché il formato di file della chiave pubblica salvata è diverso dalla chiave pubblica richiesta.
  6. Fare clic su Save private key e salvarla in un file denominato privateKey.ppk.

Passaggio 2: creare l'immagine nel portale di Azure

  1. Nel portale fare clic su Nuovo nella barra delle applicazioni per creare un'immagine. Scegliere quindi l'immagine Linux in base alle esigenze. Il seguente esempio usa l'immagine Ubuntu 14.04. Schermata del portale che mostra il pulsante Nuovo

  2. In Nome host specificare il nome per l'URL che verrà usato dall'utente e dai client Internet per accedere a questa macchina virtuale. Definire l'ultima parte del nome DNS, ad esempio tomcatdemo. Azure genera quindi l'URL tomcatdemo.cloudapp.net.

  3. In Chiave di autenticazione SSH copiare il valore della chiave dal file publicKey.pem che contiene la chiave pubblica generata da PuTTYgen.
    Casella Chiave di autenticazione SSH nel portale

  4. Configurare altre impostazioni in base alle esigenze, quindi fare clic su Crea.

Fase 2: preparare la macchina virtuale per Tomcat7

In questa fase si configurerà un endpoint per il traffico in Tomcat e ci si connetterà alla nuova macchina virtuale.

Passaggio 1: aprire la porta HTTP per consentire l'accesso web

Gli endpoint di Azure sono costituiti da un protocollo TCP o UDP, insieme a una porta pubblica e privata. La porta privata è la porta ascoltata dal servizio sulla macchina virtuale. La porta pubblica è la porta ascoltata esternamente dal servizio cloud di Azure per il traffico in ingresso basato su Internet.

La porta TCP 8080 è la porta predefinita su cui Tomcat è in ascolto. Se si apre questa porta con un endpoint di Azure, l'utente e altri client Internet potranno accedere alle pagine Tomcat.

  1. Nel portale di Azure fare clic su Sfoglia > Macchine virtuali e quindi fare clic sulla macchina virtuale che è stata creata.
    Schermata della directory Macchine virtuali
  2. Per aggiungere un endpoint alla macchina virtuale, scegliere la casella Endpoint . Schermata che mostra la casella Endpoint
  3. Fare clic su Aggiungi.

    1. In Endpoint digitare un nome per l'endpoint, quindi digitare 80 nel campo Porta pubblica.

      Se la porta viene impostata su 80, non occorre includere il numero di porta nell'URL che si usa per accedere a Tomcat. Ad esempio, http://tomcatdemo.cloudapp.net.

      Se si imposta la porta su un altro valore, come 81, è necessario aggiungere il numero di porta all'URL per accedere a Tomcat. Ad esempio http://tomcatdemo.cloudapp.net:81/.

    2. Digitare 8080 in Porta privata. Per impostazione predefinita Tomcat è in ascolto sulla porta TCP 8080. Se è stata modificata la porta di ascolto predefinita di Tomcat, è necessario aggiornare la porta privata in modo che corrisponda alla porta di ascolto di Tomcat.
      Schermata dell'interfaccia utente che mostra il comando Aggiungi, Porta pubblica e Porta privata
  4. Fare clic su OK per aggiungere l'endpoint alla macchina virtuale.

Passaggio 2: effettuare la connessione all'immagine creata

È possibile scegliere qualsiasi strumento SSH per connettersi alla macchina virtuale. In questo esempio viene usato PuTTY.

  1. Ottenere il nome DNS della macchina virtuale dal portale.

    1. Fare clic su Sfoglia > Macchine virtuali.
    2. Selezionare il nome della macchina virtuale e quindi fare clic su Proprietà.
    3. Nel riquadro Proprietà osservare la casella Nome di dominio per ottenere il nome DNS.
  2. Ricavare il numero di porta per le connessioni SSH dalla casella SSH .
    Schermata che mostra il numero di porta della connessione SSH

  3. Scaricare PuTTY.

  4. Dopo il download fare clic sul file eseguibile Putty.exe. Nella configurazione di PuTTY impostare le opzioni di base con il nome host e il numero di porta ottenuto dalle proprietà della macchina virtuale.
    Schermata che mostra le opzioni di configurazione di PuTTY relative a nome host e porta

  5. Nel riquadro a sinistra fare clic su Connessione > SSH > Autenticazione e quindi fare clic su Sfoglia per specificare il percorso del file privateKey.ppk. Il file PrivateKey contiene la chiave privata generata da PuTTYgen in precedenza nella sezione "Fase 1: creare un'immagine" di questo articolo.
    Schermata che mostra la gerarchia di directory di connessione e il pulsante Sfoglia

  6. Fare clic su Apri. Si potrebbe ricevere un avviso da una finestra di messaggio. Se il nome DNS e il numero di porta sono stati configurati correttamente, fare clic su Yes. Schermata che mostra la notifica

  7. Viene chiesto di inserire il nome utente.
    Schermata che mostra dove inserite il nome utente

  8. Inserire il nome utente utilizzato per creare la macchina virtuale nella sezione "Fase 1: creare un'immagine" di questo articolo. Verrà visualizzata una schermata simile alla seguente:
    Schermata che mostra la conferma dell'autenticazione

Fase 3: installare il software

In questa fase saranno installati l'ambiente di runtime Java, Tomcat7 e altri componenti di Tomcat7.

Ambiente di runtime Java

Tomcat è scritto in Java. Esistono due tipi di Java Development Kit (JDK): OpenJDK e Oracle JDK. È possibile scegliere quello preferito.

Nota

Il codice contenuto dai due JDK per le classi nell'API Java è praticamente identico, mentre il codice per la macchina virtuale è diverso. OpenJDK tende a usare librerie aperte mentre Oracle JDK tende a usare librerie chiuse. Oracle JDK dispone di più classi e include alcuni bug corretti, inoltre è più stabile di OpenJDK.

Installare OpenJDK

Usare il comando seguente per scaricare OpenJDK.

sudo apt-get update  
sudo apt-get install openjdk-7-jre  
  • Per creare una directory in cui includere i file di JDK:

      sudo mkdir /usr/lib/jvm  
    
  • Per estrarre i file di JDK nella directory /usr/lib/jvm/:

      sudo tar -zxf jdk-8u5-linux-x64.tar.gz  -C /usr/lib/jvm/
    

Installare Oracle JDK

Usare il comando seguente per scaricare Oracle JDK dal sito Web di Oracle.

 wget --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u5-b13/jdk-8u5-linux-x64.tar.gz  
  • Per creare una directory in cui includere i file di JDK:

      sudo mkdir /usr/lib/jvm  
    
  • Per estrarre i file di JDK nella directory /usr/lib/jvm/:

      sudo tar -zxf jdk-8u5-linux-x64.tar.gz  -C /usr/lib/jvm/  
    
  • Per impostare Oracle JDK come macchina virtuale Java predefinita:

      sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_05/bin/java 100  
    
      sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_05/bin/javac 100  
    

Verificare che l'installazione di Java sia riuscita

Per verificare se l'ambiente di runtime Java è stato installato correttamente, è possibile usare un comando simile al seguente:

java -version  

Se è stato installato OpenJDK, si dovrebbe vedere un messaggio simile al seguente: installazione di OpenJDK riuscita

Se è stato installato Oracle JDK, si dovrebbe vedere un messaggio simile al seguente: installazione di Oracle JDK riuscita

Installare Tomcat7

Usare il seguente comando per installare Tomcat7.

sudo apt-get install tomcat7  

Se non si usa Tomcat7, modificare il comando in modo appropriato.

Verificare che l'installazione di Tomcat7 sia riuscita

Per verificare se Tomcat7 è stato installato correttamente, passare al nome DNS del server Tomcat. In questo articolo l'URL di esempio è http://tomcatexample.cloudapp.net/. Se viene visualizzato un messaggio simile al seguente, Tomcat7 è stato installato correttamente. Messaggio con l'avviso che l'installazione di Tomcat7 è riuscita

Installare altri componenti di Tomcat7

Esistono altri componenti facoltativi di Tomcat che è possibile installare.

Usare il comando sudo apt-cache search tomcat7 per visualizzare tutti i componenti disponibili. Usare i seguenti comandi per installare alcuni utili componenti.

sudo apt-get install tomcat7-admin      #admin web applications

sudo apt-get install tomcat7-user         #tools to create user instances  

Fase 4: configurare Tomcat7

In questa fase si amministra Tomcat.

Avviare e arrestare Tomcat7

Il server Tomcat7 si avvia automaticamente durante l'installazione. È possibile anche avviarlo con il seguente comando:

sudo /etc/init.d/tomcat7 start

Per arrestare Tomcat7:

sudo /etc/init.d/tomcat7 stop

Per visualizzare lo stato di Tomcat7:

sudo /etc/init.d/tomcat7 status

Per riavviare i servizi Tomcat:

sudo /etc/init.d/tomcat7 restart

Amministrazione di Tomcat7

È possibile modificare il file di configurazione utente di Tomcat per configurare le proprie credenziali di amministratore. Usare il comando seguente:

sudo vi  /etc/tomcat7/tomcat-users.xml   

Di seguito è fornito un esempio:
Schermata che mostra l'output del comando sudo vi

Nota

Creare una password complessa per il nome utente dell'amministratore.

Dopo avere modificato questo file, è necessario riavviare i servizi Tomcat7 con il seguente comando per rendere effettive le modifiche:

sudo /etc/init.d/tomcat7 restart  

Aprire il browser e immettere l'URL http:///manager/html. Ad esempio, in questo articolo l'URL è http://tomcatexample.cloudapp.net/manager/html.

Dopo la connessione, si dovrebbe visualizzare una schermata simile alla seguente:
Schermata di Tomcat Web Application Manager

Problemi comuni

Impossibile accedere alla macchina virtuale con Tomcat e Moodle da Internet

Sintomo

Tomcat è in esecuzione ma non è possibile visualizzare la pagina predefinita di Tomcat con il browser.

Possibile causa principale

  • La porta di ascolto di Tomcat non corrisponde alla porta privata dell'endpoint della macchina virtuale per il traffico in Tomcat.

    Controllare le impostazioni dell'endpoint della porta pubblica e privata e assicurarsi che la porta privata corrisponda alla porta di ascolto di Tomcat. Per istruzioni sulla configurazione degli endpoint per la macchina virtuale vedere la sezione di questo articolo "Fase 1: creare un'immagine".

    Per determinare la porta di ascolto di Tomcat, aprire /etc/httpd/conf/httpd.conf (versione Red Hat) o /etc/tomcat7/server.xml (versione Debian). Per impostazione predefinita la porta di ascolto di Tomcat è 8080. Di seguito è fornito un esempio:

    <Connector port="8080" protocol="HTTP/1.1"  connectionTimeout="20000"   URIEncoding="UTF-8"            redirectPort="8443" />  
    

    Se si usa una macchina virtuale come Debian o Ubuntu e si vuole modificare la porta di ascolto di Tomcat predefinita (ad esempio 8081), è necessario aprire la porta anche per il sistema operativo. Aprire innanzitutto il profilo:

    sudo vi /etc/default/tomcat7  
    

    Rimuovere quindi i commenti dall’ultima riga e modificare “no” in “sì”.

    AUTHBIND=yes
    
  • Il firewall ha disabilitato la porta di ascolto di Tomcat.

    È possibile visualizzare la pagina predefinita di Tomcat solo dall'host locale. Molto probabilmente il problema è che la porta su cui è in ascolto Tomcat è bloccata dal firewall. È possibile usare lo strumento w3m per passare alla pagina Web. I seguenti comandi consentono di installare w3m e di passare alla pagina predefinita di Tomcat:

    sudo yum install w3m w3m-img


    w3m http://localhost:8080  

Soluzione

  • Se la porta di ascolto di Tomcat non corrisponde alla porta privata dell'endpoint per il traffico nella macchina virtuale, è necessario modificare la porta privata dell'endpoint affinché corrisponda alla porta di ascolto di Tomcat.
  • Se il problema è causato dal firewall o dagli iptable, aggiungere le seguenti righe a /etc/sysconfig/iptables. La seconda riga è necessaria solo per il traffico https:

    -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

    -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

    Importante

    Assicurarsi che le righe precedenti siano posizionate sopra eventuali righe che limiterebbero globalmente l'accesso, come la seguente: -A INPUT -j REJECT --reject-with icmp-host-prohibited

Per ricaricare gli iptable, eseguire il seguente comando:

service iptables restart

Questa installazione è stata effettuata su CentOS 6.3.

Autorizzazione negata quando si caricano i file di progetto in /var/lib/tomcat7/webapps/

Sintomo

Quando si usa un client FTP sicuro (ad esempio FileZilla) per connettersi alla macchina virtuale e passare a /var/lib/tomcat7/webapps/ per pubblicare il sito, si ottiene un messaggio di errore simile al seguente:

 status:    Listing directory /var/lib/tomcat7/webapps
 Command:    put "C:\Users\liang\Desktop\info.jsp" "info.jsp"
 Error:    /var/lib/tomcat7/webapps/info.jsp: open for write: permission denied
 Error:    File transfer failed

Possibile causa principale

Non si dispone delle autorizzazioni di accesso alla cartella /var/lib/tomcat7/webapps.

Soluzione

È necessario ottenere l'autorizzazione dall'account radice. È possibile cambiare la proprietà di tale cartella dalla radice al nome utente usato per il provisioning della macchina. Di seguito è riportato un esempio con il nome dell'account azureuser:

 sudo chown azureuser -R /var/lib/tomcat7/webapps

Usare l'opzione -R per applicare le autorizzazioni per tutti i file anche all'interno di una directory.

Questo comando funziona anche per le directory. L'opzione -R modifica le autorizzazioni per tutti i file e le directory all'interno della directory. Di seguito è fornito un esempio:

 sudo chown -R username:group directory  

Questo comando cambia la proprietà (sia utente che gruppo) per tutti i file e le directory che si trovano all'interno della directory stessa.

Il comando seguente modifica l'autorizzazione solo per la directory della cartella. I file e cartelle all'interno della directory non vengono modificati.

 sudo chown username:group directory