Usare Apache come frontend per Glassfish 3.x (o Tomcat)

Apache frontend per Glassfish o Tomcat
Apache frontend per Glassfish o Tomcat
Apache frontend Glassfish/Tomcat

Avete appena terminato lo sviluppo di una bellissima e rivoluzionaria web application J2EE e vi apprestate a metterla online facendone il deploy su un application server come Glassfish o un servlet container come Apache Tomcat. Avete già pronto il dominio www.lamiapp.com ma vorreste che i contenuti statici già presenti vengano serviti da Apache, mentre il vostro application server si occupi solo di servire i contenuti dinamici, rispondendo alle richieste dell’utente in modo per lui del tutto trasparente.

In altre parole vorreste rimuovere sia il numero di porta (e.g. :8080) sia il nome del war eventualmente presente nella URL, cambiandolo con qualcosa di più adeguato da un punto di vista SEO o semplicemente più user friendly. Ad esempio, volete che la pagina http://www.lamiaapp.com:8080/LaMiaApp/index.xhtml sia servita dal vostro server come http://www.lamiaapp.com/app/index.xhtml, e tenere le risorse statiche in una cartella con nome web.

A questo scopo è possibile utilizzare Apache come frontend per le richieste HTTP, e poi proxare verso Glassfish o Tomcat quelle destinate ad essere servite dinamicamente. I requisiti minimi per poter utilizzare le tecniche descritte sotto sono di disporre di un web server Apache con il supporto per i moduli mod_proxy e mod_rewrite.

A questo punto basta includere in un file .htaccess nella root del dominio, o in un file di configurazione incluso nella sezione virtualhost (in Plesk si tratta dei file vhost.conf) il seguente pezzo di configurazione:

ProxyPreserveHost	on
RewriteEngine		on
Options +FollowSymLinks

ServerAlias "www.lamiaapp.com"

# tutte le richieste che non iniziano per 'app' sono 301-redirette a /app/$1
# tranne quelle che iniziano per web (cartella per contenuti statici)
RewriteCond %{REQUEST_URI} !^/app
RewriteCond %{REQUEST_URI} !^/web
RewriteRule ^/(.*)$ http://www.lamiaapp.com/app/$1 [R=301,L]

# tutte le richieste per app/* vengono proxate verso un server in ascolto sulla 8080, con contesto "LaMiaApp"
RewriteRule ^/app/(.*) http://www.lamiaapp.com:8080/LaMiaApp/$1 [P,L]

I vantaggi di una operazione di questo tipo sono numerosi, e vanno ben oltre la rimozione dell’antiestico numero di porta dalle URL:

  1. SEO – utilizzare mod_rewrite consente di rendere SEO friendly le URL dinamiche, con possibilità di inserire keyword ed aumentare l’efficacia in termini sia di leggibilità (aumentare il rate fra impression nelle SERP e click) che di posizionamento
  2. Load Balancing  –  Apache come frontend può prestarsi anche a gestire il load balancing fra diverse istanze di Glassfish in ascolto su porte diverse, migliorando i tempi di risposta alle richieste utente.
  3. Security  –  Tecnicamente è possibile evitare di esporre Glassfish direttamente, consentendo esclusivamente da localhost, il proxy delle richieste verso di esso
  4. Nascondere tecnologia web usata  –  La maggior parte degli attacchi su tecnologie web viene portata sfruttando falle note dei prodotti utilizzati (backend autenticazione, server, sql injection su CMS, etc). Avere URL all’apparenza statiche permette di nascondere la tecnologia utilizzata e complicare le tecniche di attacco.
L’obiettivo minimo (nascondere il numero di porta di Glassfish o Tomcat) può essere risolto anche sfruttando AJP, ma con prestazioni più difficili da ottimizzare in caso di ingenti risorse multimediali inserite nella web application (e.g. immagini, odiati video Flash, etc). Per questo ci sarà un altro post 🙂

Autore: Luca Adamo

Luca Adamo si è laureato con lode in Ingegneria delle Telecomunicazioni all'Università degli studi di Firenze ed è dottorando in Ingegneria Informatica, Multimedialità e Telecomunicazioni, sempre nella stessa facoltà. Le sue competenze tecniche includono lo sviluppo software, sia orientato al web che desktop, in C/C++ e Java (J2EE, J2SE, J2ME), l'amministrazione di macchine Unix-based, la gestione di reti di telecomunicazioni, ed il design di database relazionali.

Un pensiero riguardo “Usare Apache come frontend per Glassfish 3.x (o Tomcat)”

  1. Thank you for your alcitre. It safed me a lot of time.But I have still a prolem getting Tomcat 6.0.18 running after I copied the mentioned jar files and renamed it. Now Tomcat can’t create the resource instance processing the Global JNDI Resources.Any idea what’s wrong here or how you solved this problem?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *