apache e virtual host

ciao a tutti ho un piccolo problema di configurazione del mio pc con fedora.
ho installato un pc che uso per programmare e sto imparando ad utilizzare jboss.
Jboss risponde all’ip del mio pc es 192.168.0.2:8080 e io vorrei creare in virtual host ma non so come fare.
io ho configurato fedora come server dns e lui risponde a a 2 nomi uno “srv-fedora” e l’altro come “srv-test”
quello che vorrei fare è fare in modo che alla richiesta srv-test.domain.local vada direttamente sulla porta 8080…
come posso fare? chi mi può dare un aiuto per configurare vhost?
Grazie mille

Ciao,
devi utilizzare il mod_proxy_html per girare la richiesta verso la tua istanza jboss. Mi puoi girare la configurazione del tuo server e la versione di apache installata?

Ti scrivo poi la configurazione per il reverse proxy.

Marcello

Cosa vuoi sapere esattamente?
ho installato apache
ho installato jboss che risponde alla porta 8080
la versione di jboss 7.1

Mi serve l’output di questi comandi, lanciati come utente root se possibile.

  • /usr/sbin/apachectl -v
  • cat /etc/httpd/conf/httpd.conf
  • ls -latr /etc/httpd/conf.d/

Grazie mille,
Marcello

Poi fare il redirect da firewall della porta da 8080 a 80, in modo che il tuo server quando arriva sulla porta 80 la redirige sulla 8080. Tutto ciò lo puoi fare da riga di comando oppure installando la gui del firewall.
da riga di commando puoi usare:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

dopo di che verifica il comando con

iptables -t nat -L

ti dovrebbe comparire

Chain PREROUTING (policy ACCEPT) target prot opt source destination REDIRECT tcp -- anywhere anywhere tcp dpt:http redir ports 8080
Ovviamente devi avere i permessi di root per fare ciò.
Mentre se vuoi installare la gui del firewall

su -c 'yum install system-config-firewall'

Ciao Pagnolo,
se si utilizza un backend come JBoss, conviene non girare le richieste direttamente all’application server, per limitare l’accesso alle applicazioni direttamente dall’esterno in modo da avere una sicurezza in più e demandare il carico di rispondere alle richieste dei client ad un Apache dedicato. Inoltre conviene mantenere questa soluzione per rendere scalabile l’architettura per usi futuri (ad esempio aggiungere un’altra istanza di Jboss passando da mod_proxy a mod_proxy_balancer).

Cosa ne pensi?

Marcello

Marcello,sicuramente quella indicata da te è la soluzione migliore.
Ho solo indicato un’altra via, una più veloce, per fare ciò.
Se è un server per uso interno, diciamo un muletto per la programmazione e imparare l’uso di JBoss, va più che bene.
Poi se è visibile al mondo, allora consiglio pure io di usare Apache.

:slight_smile:

Per velocità posto due guide al volo. La prima è per abilitare il virtual hosting e la seconda per il reverse proxy per Apache 2.2 (per la versione Apache 2.4 ho messo le note).

Configurazione mod vhost alias su Apache 2.x (Virtualhosting)

Molti anni fa con la crescita dei siti web presenti sulla rete ed il numero ridotto/costi per gli IP pubblici presenti, è sorto il problema di poter ospitare più site sullo stetto webserver, in modo da ridurre i costi e la configurazione dei sistemi.
Per questo è stato introddo il mod_vhost_alias, che permette di far rispondere sullo stesso indirizzo IP/Porta, più di un website, permettendo di avere configurazioni separate all’interno di Apache.
Il webserver rimane in ascolta su una coppia indirizzo/porta per delle richieste e tramite al campo “Host” presente nel request header, riesce a rintracciare la configurazione del host da servire.

REQUEST HEADER BODY:
...
(Request-Line)	GET /index.php?title=-&action=raw&maxage=18000&smaxage=0&ts=20111108231105&gen=css HTTP/1.1
Host	cellowiki
...

Lato webserver è possibile identificare il nome del site tramite le direttive:

  • ServerName : hostname o nome identificato del nostro sito (solitamente record di tipo “A” su DNS)
  • ServerAlias : hostname o nomi aggiuntivi per definire ulteriormente il sito (solitamente record di tipo “CNAME” su DNS).

Per prima cosa verificare che il modulo mod_vhost_alias.so, sia presente tra i moduli installati sul sistema.

[root@cellopc-mini ~]# ls -l /etc/httpd/modules/mod_vhost_alias.so 
-rwxr-xr-x 1 root root 9544 Oct 27  2010 /etc/httpd/modules/mod_vhost_alias.so

Nella configurazione del file httpd.conf. verificare che il modulo sia caricato tramite la direttiva “LoadModule”.

[root@cellopc-mini ~]# vim /etc/httpd/conf/httpd.conf
...
LoadModule vhost_alias_module modules/mod_vhost_alias.so
...

Mettere in ascolto Apache sulla porta che accetterà le richieste per i virtualhost tramite la direttiva “Listen”, e nel caso sia già attiva non bisognerà svolgere alcuna modfica.

[root@cellopc-mini ~]# vim /etc/httpd/conf/httpd.conf
...
Listen 8888
...

Per poter abilitare ora il virtualhosting sulla porta in ascolto si dovrà abilitare la direttiva “NameVirtualHost” sulla copia indirizzo porta desiderata. Sarà possibile lasciare in ascolto il webserver su tutti gli indirizzi. ma specificando solo una porta, per poter configurare molto più tranquillamente il nostro server.

[root@cellopc-mini ~]# vim /etc/httpd/conf/httpd.conf
....
NameVirtualHost *:8888
...

NOTA : a partire da Apache 2.4 la direttiva NameVirtualHost non è più utilizzata perché ogni porta specificata nella direttiva LISTEN permetterà di gestire i VirtualHost!!!

Ora si potrà configurare all’interno delle direttive “” la porta e l’indirizzo dove accettano le richieste (solitamente la stessa messa nella direttiva NameVirtualHost). Sarà possibile creare per ogni sito presente sul nostro webserver, un file di configurazione separato sotto la directory /etc/httpd/conf.d (verrà eseguito l’include automaticamente dei file con il suffisso “.conf”).

[root@cellopc-mini ~]# vim/etc/httpd/conf.d/tattletale.conf 
<VirtualHost *:8888>
...
</VirtualHost>
[root@cellopc-mini ~]# vim/etc/httpd/conf.d/mediawiki.conf 
<VirtualHost *:8888>
...
</VirtualHost>

All’interno delle direttive " si dovrà impostare configurare per prima cosa serie di ServerName e ServerAlias, che verranno ricercati quando verranno inoltrate le richieste al webserver. Infatti non appena verrà eseguito una match con un ServerName o ServerAlias presenti quelli configuarati, verranno eseguite tutte le impostazioni presenti nella conf del VirtualHost.

[root@cellopc-mini ~]# cat /etc/httpd/conf.d/tattletale.conf 
<VirtualHost *:8888>

	ServerName tattletest

	CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/tattletest_acces_log.%Y-%m-%d-%H_%M_%S 86400" combined
	ErrorLog  "|/usr/sbin/rotatelogs /var/log/httpd/tattletest_error_log.%Y-%m-%d-%H_%M_%S 86400"

 	DocumentRoot /data/results/

	<Directory /data/results/>
    		Options Indexes FollowSymLinks
    		AllowOverride None
    		Order allow,deny
    		Allow from all
	</Directory>

</VirtualHost>
[root@cellopc-mini ~]# cat /etc/httpd/conf.d/mediawiki.conf 
<VirtualHost *:8888>

	ServerName cellowiki

	DocumentRoot /data/mediawiki/mediawiki/

	CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/mediawiki_acces_log.%Y-%m-%d-%H_%M_%S 86400" combined
	ErrorLog  "|/usr/sbin/rotatelogs /var/log/httpd/mediawiki_error_log.%Y-%m-%d-%H_%M_%S 86400"

	<Location /data/mediawiki/mediawiki/config>
		Order allow,deny
		Allow from all
	</Location>

	<Location /data/mediawiki/mediawiki/includes>
	   	Deny from all
	</Location>

	<Location /data/mediawiki/mediawiki/languages>
		Deny from all
	</Location>

	<Location /data/mediawiki/mediawiki/maintenance>
		Deny from all
	</Location>

	<Location /data/mediawiki/mediawiki/math>
		Deny from all
	</Location>
</VirtualHost>

Al termine delle configurazioni eseguire il restart di Apache per rileggere la configurazioni e poter collegarsi ai nostri siti passando dallo stesso Apache.

[root@cellopc-mini conf.d]# service httpd restart

Se per caso viene abilitato la funzionalità di virtualhosting su una porta ma non viene configurato alcun vhost, in fase di startup del server si potrà avere la seguente eccezione:

[Wed Nov 09 00:07:03 2011] [warn] NameVirtualHost *:8887 has no VirtualHosts

Configurazione mod proxy su Apache 2.x (Reverse Proxy)

Viene detto reverse-proxy un server proxy-cache “montato al contrario”, cioè un server proxy che permette non agli utenti di accedere alla rete internet ma bensì agli utenti di internet di accedere indirettamente ad alcuni server interni. Il reverse-proxy serve anche da collegamento per gli utenti internet che desiderano accedere ad un sito web interno trasmettendogli indirettamente le richieste. Grazie al reverse-proxy, il server web è protetto dagli attacchi diretti dall’esterno, cosa che rinforza la sicurezza della rete interna. D’altra parte, la funzione di cache del reverse-proxy può alleggerire il carico del server per cui è previsto, ed è la ragione per cui un server simile è talvolta detto acceleratore (server accelerator). Infine, grazie a degli algoritmi perfezionati, il reverse-proxy può servire per ripartire il carico reindirizzando le richieste verso diversi server equivalenti; si parla allora di ripartizione del carico.
Con Apache è possibile sfruttare il modulo mod_proxy per implementare questa tipologia di proxy per poter aumentare la sicurezza di un webserver di backend. Per prima cosa verificare che sia installato una versione di Apache 2.x sul nostro server.

[root@cellopc-mini ~]# rpm -qa | grep httpd
httpd-2.2.17-1.fc14.i686

Verificare che il modulo mod_proxy.so sia presente all’interno della directory /etc/httpd/modules e poi verificare che ci sia la entry “LoadModules” di questo modulo all’interno del file httpd.conf. Se menca la entry aggiunta come riportato di seguito:

[root@cellopc-mini ~]# ls -l /etc/httpd/modules/mod_proxy.so 
-rwxr-xr-x 1 root root 79168 Oct 27 12:05 /etc/httpd/modules/mod_proxy.so
[root@cellopc-mini ~]# vim /etc/httpd/conf/httpd.conf
LoadModule proxy_module modules/mod_proxy.so

Per la configurazione del reverse proxy converrà creare un file di configurazione separato con un VirtualHost creato ad hoc per questa configurazione. Così diventerà più leggibile la configurazione.

[root@cellopc-mini conf.d]# touch /etc/httpd/conf.d/proxy.conf

Per prima cosa se non si utilizzerà un proxy Forward su questa macchina si dovrà disabilitare la funzionalità per questioni di sicurezza tramite la direttiva “ProxyRequests” ad “Off”. Disabilitato questa direttiva non verrà disablitata la funzione della direttiva “ProxyPass”!

[root@cellopc-mini conf.d]# vim /etc/httpd/conf.d/proxy.conf
...
        ProxyRequests Off
...

Con la direttiva “<Proxy *>” sarà possibile aggiungere altre direttive da implementare sui contenuti che passano via proxy. Risulta utile per eseguire il blocco di alcuni domini o host per non farli accedere ai contenuti del server di backend. Nel nostro esempio verrà applicato l’allow per tutti gli hosts.

[root@cellopc-mini conf.d]# vim /etc/httpd/conf.d/proxy.conf
...
        <Proxy *>
                Order Allow,Deny
                Allow from all
        </Proxy>
...

Per ovviare a problemi di hang del server di backend è possibile impostare un timeout sulle richieste in proxy, in modo che vengano abbattute nel caso non si riceva una risposta dal server. Specificando la direttiva “ProxyTimeout” con il timeout in secondi si limiterà il tempo massimo di attesa per le richieste.

[root@cellopc-mini conf.d]# vim /etc/httpd/conf.d/proxy.conf
...
        ProxyTimeout 120
...

E’ possibile implementare un filtraggio sui domini o hosts che tentano di accedere al nostro server tramite la direttiva “ProxyBlock”. Questa direttiva accetta una lista di parole o domini che vengono intercettati e non vengono abilitati ad accedere al nostro server. Basterà ad esempio specificare la parola chiave “hacker” per bloccare ad esempio tutte le richieste proveniente dal dominio “hacker.com”.

[root@cellopc-mini conf.d]# vim /etc/httpd/conf.d/proxy.conf
...
        ProxyBlock hacker pippo.com 
...

Per una questione di sicurezza è possibile mettere un limite al numero di forward che una richiesta può fare attraverso il reverse proxy in modo da evitare proxy loop infiniti o attacchi per abbattere il server di backend (DoS), per fare questo basterà specificare la direttiva “ProxyMaxForwards” con il numero di tentativi massimi.

[root@cellopc-mini conf.d]# vim /etc/httpd/conf.d/proxy.conf
...
        ProxyMaxForwards 100
...

E’ possibile mantenere gli HTTP Request Header originari da inoltrare al backend server utilizzando la direttiva “ProxyPreserveHost” ad “On”. Questa direttiva risulta utile nel caso in cui sul server di backend si utilizzino dei VirtualHost e sia necessario mantenere i request header originari, che contengono le informazioni per raggiungere un determinato VirtualHost. (parametro “Host” del request Header).

[root@cellopc-mini conf.d]# vim /etc/httpd/conf.d/proxy.conf
...
        ProxyPreserveHost On
...

Per eseguire la mappatura di un context root verso il server di backend si dovranno utilizzare le direttive “ProxyPass” e “ProxyPassReverse” specificando il context root del server di frontend e la destinazione sul server di backend. La direttiva “ProxyPass” permette di inoltrare le richieste verso il server backend mentre la direttiva "ProxyPassReverse serve al proxy per eseguire la rimappatire delle Location negli HTTP Header per ritornare una URL valida verso il client.

[root@cellopc-mini conf.d]# vim /etc/httpd/conf.d/proxy.conf
...
        ProxyPass / http://bckserver:8889/
        ProxyPassReverse / http://bckserver:8889/
...

Se il server di backend non sarà raggiungibile al path indicato nelle direttive in precedenza citate verrà restituito un HTTP Error 503 (Service Temporary Unavailable).

[root@cellopc-mini httpd]# tail -f acces_log.2010-12-03-00_00_00 
127.0.0.1 - - [03/Dec/2010:19:33:09 +0100] "GET / HTTP/1.1" 503 286 "-" 05317

Una direttiva utile per il monitoraggio dello status del mod_proxy è la “ProxyStatus” che settata a “On”, permette di visualizzare le informazioni dei vari forward all’interno del context root /server-status (fornito dal mod_status se abilitato).

[root@cellopc-mini conf.d]# vim /etc/httpd/conf.d/proxy.conf
...
        ProxyStatus On
...

La configurazione finale sarà la seguente:

[root@cellopc-mini httpd]# vim /etc/httpd/conf.d/proxy.conf 
<VirtualHost *:80>
	ServerName testapache

	DocumentRoot /data/apache/htdocs/

	ProxyRequests Off
	ProxyStatus On
	ProxyTimeout 120
	ProxyMaxForwards 100 
	ProxyPreserveHost On

	<Proxy *>
		Order Allow,Deny
		Allow from all
	</Proxy> 

        ProxyPass / http://bckserver:8889/
        ProxyPassReverse / http://bckserver:8889/

</VirtualHost>

Se la configurazione è corretta eseguire un validate tramite il servizio httpd e poi un reload della stessa configurazione per applicarne le modifiche.

[root@cellopc-mini httpd]# service httpd configtest
Syntax OK
[root@cellopc-mini httpd]# service httpd reload

Reverse proxy e backend Server HTTPS

In alcuni casi si potranno avere degli Origin Server che rispondono con protocollo HTTPS quindi si dovrà bilanciare la direttia ProxyPass su percorsi “https://…”. Per poter far questo si dovrà installare il mod_ssl seguendo la procedura Installazione mod ssl su Apache 2.x, e poi definire all’interno del virtualhost dedicato all’HTTPS la direttiva “SSLProxyEngine” e poi cambiare i percorsi di destinazione da HTTP ad HTTPS (con relative porte).

[root@cellopc-mini httpd]# vim /etc/httpd/conf.d/proxy.conf 
<VirtualHost *:80>
...
        SSLProxyEngine On

        ProxyPass / https://bckserver:8443/
        ProxyPassReverse / https://bckserver:8443/

</VirtualHost>