Java >> Programma Java >  >> Tag >> Tomcat

Esercitazione sulla configurazione del proxy inverso Apache Tomcat

Nelle reti di computer, un proxy inverso è un tipo di server proxy che recupera le risorse per conto di un client da uno o più server. Queste risorse vengono quindi restituite al client come se provenissero dal server proxy stesso. Un proxy inverso funge da intermediario per consentire ai suoi server associati di essere contattati da qualsiasi client.








Molto spesso, i server Web più diffusi utilizzano la funzionalità del proxy inverso, fungendo da scudo per i framework delle applicazioni con capacità HTTP più deboli.

Sommario

1. Gli strumenti
2. Introduzione
3. Prerequisiti
4. Scarica Tomcat
5. Scarica il server httpd Apache
6. Installazione Tomcat
6.1 Decomprimi Apache Tomcat
6.2 Installa il servizio Tomcat
6.3 Avvia il servizio Tomcat
6.4 Verifica che Tomcat sia in esecuzione
7. Installazione httpd di Apache
7.1 Decomprimi il server httpd Apache
7.2 Modifica la radice del server
7.3 Installa il servizio httpd
7.4 Avvia il servizio Tomcat
7.5 Verifica che Tomcat sia in esecuzione
8. Supporto proxy HTTPD Apache
9. Problemi tipici
10. AJP come soluzione
11. Gestione URL
11.1 Riscrittura URL
11.1.1 Configura valvola in Tomcat context.xml
11.1.2 Configura valvola su un singolo host
11.1.3 Riscrivi regole
7.4 Avvia il servizio Tomcat
7.5 Verifica che Tomcat sia in esecuzione
11.2 Codifica URL
12. Conclusione

1. Gli strumenti

  • Java JDK
  • Apache Tomcat
  • Server httpd di Apache
  • connettore mod_jk

2. Introduzione

Il modulo Apache HTTP Server mod_jk e le sue varianti di reindirizzamento ISAPI e NSAPI per Microsoft IIS e iPlanet Web Server collegano il server Web a un back-end Tomcat utilizzando il protocollo AJP. Il server web riceve una richiesta HTTP/HTTPS e il modulo inoltra la richiesta a Tomcat. Questa funzione è solitamente chiamata gateway o proxy, nel contesto di HTTP è chiamata proxy inverso.

3. Prerequisiti

  • JDK installato

4. Scarica Tomcat

Vai alla pagina https://tomcat.apache.org/download-80.cgi e scarica il server Tomcat come file compresso zip per Windows.

1 Scarica Tomcat per Windows

5. Scarica il server httpd Apache

Vai alla pagina http://www.apachehaus.com/cgi-bin/download.plx e scarica il server httpd come file compresso zip per Windows.
La base Apache non fornisce binari per il server httpd . Utilizzeremo una distribuzione binaria dai siti consigliati nel sito Web di Apache.

2 scarica il server httpd

6. Installazione Tomcat

6.1 Decomprimi Apache Tomcat

Scegli una directory di installazione e decomprimi il server Tomcat nella sua directory.

3 Decomprimi Tomcat

6.2 Installare il servizio Tomcat

Apri il terminale di Windows e vai alla directory bin di installazione di Tomcat.

Directory di installazione di Tomcat

C:\Java\Apache Tomcat 8.0.15\bin>

Installa il servizio con il seguente comando:

Installa il servizio Tomcat

C:\Java\Apache Tomcat 8.0.15\bin>service install

Dovresti ottenere un output simile a questo:

installa l'output di Tomcat

Installing the service 'Tomcat8' ...
Using CATALINA_HOME:    "C:\Java\Apache Tomcat 8.0.15"
Using CATALINA_BASE:    "C:\Java\Apache Tomcat 8.0.15"
Using JAVA_HOME:        "C:\Java\jdk1.8.0_40"
Using JRE_HOME:         "C:\Java\jre1.8.0_40"
Using JVM:              "C:\Java\jre1.8.0_40\bin\client\jvm.dll"
The service 'Tomcat8' has been installed.

6.3 Avvia il servizio Tomcat

Avvia il servizio con il seguente comando:

Avvia output Tomcat

C:\Java\Apache Tomcat 8.0.15\bin>sc start Tomcat8

Dovresti ottenere un output simile al seguente:

console

SERVICE_NAME: Tomcat8
        TYPE               : 10  WIN32_OWN_PROCESS
        STATUS             : 2  START_PENDING
                                (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_OUTPUT_CODE  : 0  (0x0)
        SERVICE_OUTPUT_CODE: 0  (0x0)
        CHECK-POINT        : 0x0
        START-INDICATOR    : 0x7d0
        PID                : 5552
        MARKS              :

6.4 Verifica che Tomcat sia in esecuzione

Apri il browser nell'URL:http://localhost:8080 e dovresti vedere la schermata di benvenuto di Tomcat.

4 Benvenuto Tomcat

7. Installazione di Apache httpd

7.1 Decomprimi il server httpd Apache

Scegli una directory e decomprimi il server httpd Apache.

5 Decomprimere il server httpd Apache

7.2 Modifica la radice del server

Prima di eseguire il server httpd Apache, dobbiamo dire ad Apache dov'è la radice del server. Apri il file di configurazione del server httpd e modifica il SRVROOT parametro utilizzando la directory appropriata.

SRVROOT

Define SRVROOT "C:\Java\Apache24"

7.3 Installa il servizio httpd

Apri il terminale di Windows e vai alla directory bin di installazione del server httpd.

directory di installazione del cestino del server httpd

C:\Java\Apache24\bin>

Installa il servizio con il seguente comando:

Installa il servizio server httpd

C:\Java\Apache24\bin>httpd -k install

Dovresti ottenere un output simile a questo:

installa l'output di Tomcat

Installing the 'Apache2.4' service
The 'Apache2.4' service is successfully installed.
Testing httpd.conf....
Errors reported here must be corrected before the service can be started.

7.4 Avvia il servizio Apache

Avvia il servizio con il seguente comando:

Avvia l'output di Apache

C:\Java\Apache24\bin>sc start Apache2.4

Dovresti ottenere un output simile al seguente:

Uscita Apache

SERVICE_NAME: Apache2.4
        TYPE               : 10  WIN32_OWN_PROCESS
        STATUS             : 2  START_PENDING
                                (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_OUTPUT_CODE  : 0  (0x0)
        SERVICE_OUTPUT_CODE: 0  (0x0)
        CHECK-POINT        : 0x0
        START-INDICATOR    : 0x7d0
        PID                : 3268
        MARKS              :

7.5 Verifica che Apache sia in esecuzione

Apri il browser nell'URL:localhost e dovresti vedere la schermata di benvenuto del server httpd.

6 Schermata di benvenuto del server httpd Apache

8. Supporto proxy HTTPD Apache

Apache HTTPD supporta un modulo opzionale (mod_proxy) che configura il server Web in modo che funga da server proxy. Può essere utilizzato per inoltrare richieste per una particolare applicazione Web a un'istanza Tomcat, senza dover configurare un connettore Web come mod_jk. Per fare ciò, è necessario eseguire le seguenti attività:

Configura la tua copia di Apache in modo che includa il modulo mod_proxy. Se stai compilando dal sorgente, il modo più semplice per farlo è includere la direttiva –enable-module=proxy sulla riga di comando ./configure.
Se non è già stato aggiunto per te, assicurati di caricare il file modulo mod_proxy all'avvio di Apache, utilizzando le seguenti direttive nel file httpd.conf:

mod_proxy

LoadModule proxy_module  {path-to-modules}/mod_proxy.so
AddModule  mod_proxy.c

Includere due direttive nel file httpd.conf per ciascuna applicazione Web che si desidera inoltrare a Tomcat. Ad esempio, per inoltrare un'applicazione al percorso di contesto /javacodegeeks:

ProxyPass

ProxyPass         /javacodegeeks  http://localhost:8080/app/javacodegeeks
ProxyPassReverse  /javacodegeeks  http://localhost:8080/app/javacodegeeks

che dice ad Apache di inoltrare gli URL nel formato http://localhost/javacodegeeks/* al connettore Tomcat in ascolto sulla porta 8080. Configura la tua copia di Tomcat per includere uno speciale Connector elemento, con impostazioni proxy appropriate, ad esempio:

Connettore

<Connector port="8081" ...
           proxyName="www.mycompany.com"
           proxyPort="80"/>

il che farà pensare ai servlet all'interno di questa applicazione Web che tutte le richieste proxy siano state indirizzate a www.javacodegeeks.com sulla porta 80.
È legale omettere l'attributo proxyName da Connector elemento. In tal caso, il valore restituito da request.getServerName() sarà dal nome host su cui Tomcat è in esecuzione. Nell'esempio sopra, sarebbe localhost Se hai anche un Connector ascoltando sulla porta 8080, le richieste su una delle porte condivideranno lo stesso set di host virtuali e applicazioni Web.

Potresti voler utilizzare le funzionalità di filtraggio IP del tuo sistema operativo per limitare le connessioni alla porta 8080 ( in questo esempio) da consentire solo dal server che esegue Apache. Quando le richieste vengono inviate tramite proxy da Apache, il server web registrerà queste richieste nel suo registro di accesso. Pertanto, in genere vorrai disabilitare qualsiasi registrazione degli accessi eseguita da Tomcat stesso.

Quando le richieste vengono inoltrate in questo modo, tutte le richieste per le applicazioni Web configurate verranno elaborate da Tomcat comprese le richieste di contenuto statico. Puoi migliorare le prestazioni utilizzando il connettore web mod_jk invece di mod_proxy. mod_jk può essere configurato in modo che il server Web serva contenuto statico che non viene elaborato da filtri o vincoli di sicurezza definiti all'interno del descrittore di distribuzione dell'applicazione Web (/WEB-INF/web.xml).

A questo punto il server httpd Apache funziona come front-end proxy inverso dell'istanza Tomcat.

9. Problemi tipici

Un proxy inverso non è totalmente trasparente per l'applicazione sul back-end. Ad esempio, il nome host e la porta che il client originale deve comunicare per appartenere al server Web e non al back-end, quindi il proxy inverso comunica con un nome host e una porta diversi. Quando l'applicazione sul back-end restituisce contenuto che include URL autoreferenziali utilizzando il proprio indirizzo e porta di back-end, il client in genere non sarà in grado di utilizzare questi URL.

Un altro esempio è l'indirizzo IP del client, che per il web server è l'IP sorgente della connessione in entrata, mentre per il backend la connessione proviene sempre dal web server. Questo può essere un problema, quando l'IP del client viene utilizzato dall'applicazione back-end.

10. AJP come soluzione

La maggior parte di questi problemi viene gestita automaticamente dal protocollo AJP e dai connettori AJP del backend. Il protocollo AJP trasporta questi metadati di comunicazione e il connettore back-end presenta questi metadati ogni volta che l'applicazione lo richiede utilizzando i metodi dell'API Servlet.

L'Apache JServ Protocol (AJP) è un protocollo binario che può inoltrare richieste in entrata da un server Web a un server delle applicazioni che si trova dietro il server Web.

Supporta anche un certo monitoraggio in quanto il server Web può eseguire il ping del server delle applicazioni. Gli implementatori Web in genere utilizzano AJP in una distribuzione con bilanciamento del carico in cui uno o più server Web front-end inviano le richieste a uno o più server delle applicazioni. Le sessioni vengono reindirizzate al server delle applicazioni corretto utilizzando un meccanismo di routing in cui ciascuna istanza del server delle applicazioni ottiene un nome (denominato route). In questo scenario il server Web funge da proxy inverso per il server delle applicazioni.

AJP viene eseguito in Apache HTTP Server utilizzando il plug-in mod_jk e in Apache utilizzando insieme i moduli Proxy AJP, mod_proxy e proxy balancer forniti.

In alcune situazioni però questo non basta. Supponiamo che ci sia un altro proxy inverso meno intelligente davanti al tuo server web, ad esempio un bilanciatore del carico HTTP o un dispositivo simile che funge anche da acceleratore SSL.

Quindi sei sicuro che tutti i tuoi client utilizzino HTTPS, ma il tuo server web non lo sa. Tutto ciò che può vedere sono le richieste provenienti dall'acceleratore utilizzando un semplice HTTP.

Un altro esempio potrebbe essere un semplice proxy inverso davanti al tuo server web, in modo che l'indirizzo IP del client che vede il tuo server web sia sempre l'indirizzo IP di questo proxy inverso e non del client originale. Spesso tali proxy inversi generano un'intestazione HTTP aggiuntiva, come X-Forwareded-for che contiene l'indirizzo IP del client originale o un elenco di indirizzi IP, se sono presenti più proxy inversi a cascata davanti. Sarebbe bello, se potessimo usare il contenuto di un'intestazione come l'indirizzo IP del client per passare al back-end.

Quindi potremmo aver bisogno di manipolare alcuni dei dati che AJP invia al back-end. Quando si utilizza mod_jk all'interno del server HTTP Apache, è possibile utilizzare diverse variabili di ambiente Apache per far sapere a mod_jk quali dati deve inoltrare. Queste variabili d'ambiente possono essere impostate dalle direttive di configurazione SetEnv o SetEnvIf, ma anche in modo molto flessibile usando mod_rewrite.

11. Gestione URL

11.1 Riscrittura URL

È necessario includere la classe della valvola di riscrittura org.apache.catalina.valves.rewrite.RewriteValve nel contesto della tua applicazione. Può essere nel global context.xml o nel blocco di contesto di un host in server.xml.  Crea un rewrite.config file contenente le tue riscritture nella tua applicazione WEB-INF cartella.

11.1.1 Configura valvola in Tomcat context.xml

Utilizzando il context.xml globale interesserà tutto l'host virtuale.

Contesto RewriteValve

<?xml version='1.0' encoding='utf-8'?>
<!-- The contents of this file will be loaded for each web application -->
<Context>
    <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
</Context>

11.1.2 Configurare la valvola su un singolo host

Se vogliamo impostare la regola di riscrittura della valvola solo su un singolo host, dobbiamo modificare il server.xml e aggiungere la classe RewriteValve all'host virtuale.

Host virtuale RewriteValve

<Host name="JavaCodeGeeks.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
  <Context path="" docBase="C:/devel/java/www">
    <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
  </Context>
</Host>

11.1.3 Riscrivi le regole

Come abbiamo detto in precedenza, la valvola di riscrittura è simile a mod_rewrite HTTPD di Apache, quindi possiamo utilizzare regole di espressione regolare simili per far funzionare la riscrittura.

Se stai utilizzando una riscrittura globale per applicare tutti gli host virtuali, possiamo eliminare il tuo rewrite.config nel WEB-INF . Per i singoli host virtuali, dovremo individuare il WEB-INF della nostra applicazione.

Creeremo una regola di riscrittura per rendere il nostro URL carino

quindi ad esempio:

URL originale

http://localhost:8080/w/index.jsp?title=javacodegeeks

Vengono riscritti in

URL riscritto

http://localhost:8080/app/javacodegeeks

La nostra regola sarà:

RewriteRule   ^app/(.+)$   w/index.jsp?title=$1   [L]

Ricorda che possiamo utilizzare questa regola sul contesto del nostro server o su un singolo host virtuale.

Il nostro URL pubblico sarà:

URL proxy

 http://localhost/app/javacodegeeks

Questo viene reindirizzato all'interno di Apache Tomcat utilizzando il proxy ATTPD e Tomcat riscrive nell'URL originale.

11.2 Codifica URL

Alcuni tipi di problemi sono causati dall'uso di URL codificati. Per la stessa posizione esistono molti URL diversi che sono equivalenti. Il proxy inverso deve ispezionare l'URL per applicare le proprie regole di autenticazione e decidere a quale back-end inviare la richiesta. Pertanto l'URL della richiesta viene prima normalizzato:i caratteri codificati in percentuale vengono decodificati, /./ viene sostituito da /, /XXX/../ viene sostituito da / e vengono eseguite manipolazioni simili dell'URL.

Dopo che, il server web potrebbe applicare regole di riscrittura per modificare ulteriormente l'URL in modi meno ovvi. Infine non c'è più modo di inserire l'URL risultante in una codifica, che è "simile" a quella utilizzata per l'URL originale.

12. Conclusione

Un server proxy inverso è un tipo di server proxy che in genere si trova dietro il firewall in una rete privata e indirizza le richieste dei client al server back-end appropriato.
Un proxy inverso fornisce un ulteriore livello di astrazione e controllo per garantire un flusso regolare del traffico di rete tra client e server.

Gli usi comuni per un server proxy inverso includono:

Bilanciamento del carico:un server proxy inverso può fungere da supervisore del traffico, posizionandosi di fronte ai server back-end e distribuendo le richieste dei client su un gruppo di server in modo da massimizzare la velocità e l'utilizzo della capacità assicurando che nessun server sia sovraccarico, il che può degradarsi prestazione. Se un server si interrompe, il sistema di bilanciamento del carico reindirizza il traffico ai server online rimanenti.

Accelerazione Web:i proxy inversi possono comprimere i dati in entrata e in uscita, nonché memorizzare nella cache i contenuti comunemente richiesti, accelerando entrambi il flusso di traffico tra client e server. Possono anche eseguire attività aggiuntive come la crittografia SSL per alleggerire il carico dei tuoi server Web, aumentando così le loro prestazioni.

Sicurezza e anonimato:intercettando le richieste dirette ai tuoi server back-end, un server proxy inverso protegge le loro identità e funge da difesa aggiuntiva contro gli attacchi alla sicurezza. Garantisce inoltre che sia possibile accedere a più server da un singolo record locator o URL indipendentemente dalla struttura della rete locale.Apache Tomcat

Etichetta Java