SafeChildren Banner

Havoc Oracle Solaris Experts

viernes, 30 de abril de 2010

Instalación de squid como proxy reverso para Apache HTTP

Introducción
En esta serie de artículos, vamos a ver las diferentes formas que hay para definir una estructura de Apache Tomcat para su puesta en producción. Veremos cómo podemos configurar Apache Tomcat con Apache HTTP mediante <mod_jk> y cómo poner <squid-cache> como frontend haciendo de proxy reverso.

Como es una serie y no un unico post iremos viendo cómo montar la infraestructura, desde lo más básico, hasta -en las últimas entregas- cómo ponerlo en producción.

En esta tercera entrega, vamos a utilizar como base un post que escribí sobre Cómo poner Squid Cache como proxy reverso y haremos algunas modificaciones para adaptarlo a nuestras necesidades. Principalmente, modificaremos el inicio de squid-cache para gestionarlo mediante Solaris SMF e incluiremos acl para evitar el acceso al contenido.

Además, con esta entrega ya tenemos todo lo necesario para poner en producción nuestro tomcat de forma correcta.

Instalación de Squid-Cache como Proxy Reverso
Descargaremos la última versión stable de squid-cache en su branch 2.7 y la instalaremos
$ /usr/sfw/bin/wget http://www.squid-cache.org/Versions/v2/2.7/squid-2.7.STABLE9.tar.gz
$ /usr/sfw/bin/gtar zxpf squid-2.7.STABLE9.tar.gz
$ cd squid-2.7.STABLE9
$ export CFLAGS="-m64 -O3"
$ ./configure 
  --prefix=/opt/www/squid-2.7 \
  --with-large-files \
  --with-pthreads \
  --with-maxfd=16000 \
  --disable-internal-dns \
  --enable-large-cache-files \
  --enable-storeio=ufs,aufs \
  --enable-devpoll \
  --enable-x-accelerator-vary \
  --enable-cache-digests \
  --enable-http-violations \
  --enable-snmp
$ make
# make install

Comprobamos que todo está correcto
$ ldd /opt/www/squid-2.7/sbin/squid
        libpthread.so.1 =>       /lib/64/libpthread.so.1
        libmd.so.1 =>    /lib/64/libmd.so.1
        libm.so.2 =>     /lib/64/libm.so.2
        libsocket.so.1 =>        /lib/64/libsocket.so.1
        libnsl.so.1 =>   /lib/64/libnsl.so.1
        libresolv.so.2 =>        /lib/64/libresolv.so.2
        libthread.so.1 =>        /lib/64/libthread.so.1
        libc.so.1 =>     /lib/64/libc.so.1
        libmp.so.2 =>    /lib/64/libmp.so.2
        libscf.so.1 =>   /lib/64/libscf.so.1
        libuutil.so.1 =>         /lib/64/libuutil.so.1
        libgen.so.1 =>   /lib/64/libgen.so.1
        libsmbios.so.1 =>        /usr/lib/64/libsmbios.so.1
$ file /opt/www/squid-2.7/sbin/squid
squid:     ELF 64-bit LSB executable AMD64 Version 1 [SSE2 SSE FXSR CMOV FPU], dynamically linked, not stripped

Configuración Squid-Cache
A continuación vamos a configurar squid-cache para utilizar nuestro syslog y poder gestionarlo a través de Solaris SMF.

Para hacer que squid-cache escriba en el syslog deberemos utilizar las opciones <-s> o, si queremos utilizar una facility diferente <-l facility>, en nuestro caso vamos a utilizar <local6> como nuestra facility
# vi /etc/syslog.conf
   #
   # SQUID Cache
   #
   local6.debug                                    /var/log/squid.log
Nota: recordar que debe ser un "tabulador" el separador entre <local6.debug> y </var/log/squid.log>
# touch /var/log/squid.log
# chmod 600 /var/log/squid.log
# chown root:root /var/log/squid.log
# svcadm restart system-log
A continuación configuraremos nuestro squid-cache para poder gestionarlo mediante Solaris SMF, para ello, deberemos importar el manifest de Squid Cache 2 para Solaris SMF y el method para Squid Cache 2. He creado dos archivos manifest uno con sólo manifest para squid como proxy reverso y otro con manifest para squid como proxy reverso y http proxy para que podáis utilizarlo en varias instalaciones -pero sólo uno de los dos al mismo tiempo-, en nuestro caso utilizaremos el de proxy reverso, además, deberemos crear -si no lo hemos hecho antes- el directorio </var/svc/manifest/application/cache>
# mkdir -p /var/svc/manifest/application/cache
# cd /var/svc/manifest/application/cache
# /usr/sfw/bin/wget http://blog.sfchildren.com/blogger/put-tomcat-online/squid-conf/squid2_reverse.xml
# mv squid2_reverse.xml squid_2.xml
# svccfg
svc:> validate squid_2.xml
svc:> import squid_2.xml
svc:> quit
# svcs squid_2
STATE          STIME    FMRI
disabled       11:48:01 svc:/application/cache/squid_2:reverse_proxy
Ahora el method 
# cd /lib/svc/method
# /usr/sfw/bin/wget http://blog.sfchildren.com/blogger/put-tomcat-online/squid-conf/squid2
# chmod 555 squid2
# chown root:root squid2

Creación y Configuración de project
Una vez importada la configuración para Solaris SMF, necesitamos crear los project que hemos definido en nuestro archivo <squid_2.xml> en la propiedad <method_context project='squid.reverse'>, en nuestro caso squid.reverse
# projadd -c 'SQUID Reverse Proxy' squid.reverse
# projmod -sK 'process.max-file-descriptor=(priv,8192,deny)' squid.reverse
# projmod -sK 'task.max-lwps=(priv,250,deny)' squid.reverse
Configuración <$SQUID_HOME/etc/squid.conf>
Vamos a utilizar una configuración básica de squid y sobre ella realizaremos los cambios necesarios, puedes encontrar más información aquí sobre la instalación de squid cache en Solaris 10.

Para poder hacer que squid funcione como proxy reverso debemos realizar los siguientes cambios -vamos a continuar con el ejemplo de la serie y tenemos un VirtualHost (www.test.com) :
  • visible_hostname _hostname_, debe ser nuestro dns público, es decir, <www.test.com>
  • http_port _localip_:80 defaultsite=_default_virtual_host_ accel vhost, aquí indicaremos a squid que queremos que haga de proxy reverso donde <localip> será nuestra IP y &lt:default virtual host> será nuestro virtual host por defecto, en nuestro caso <test.com>
Ahora viene algo un poco más complicado, pero intentaré explicarlo de forma sencilla. Vamos a hacer que squid utilice como caché padre <cache_peer> a nuestro servidor Apache HTTP, y por lo tanto, definiremos qué VirtualHost irá a cada Apache HTTP. 

El formato de  <cache_peer> es:
cache_peer hostname type http_port icp_port options
Donde <hostname> será el dns/ip de nuestro servidor Apache HTTP,  <type> será siempre parent, <http_port> será el puerto donde escucha nuestro Apache HTTP, <icp_port> lo estableceremos a 0 para que no utilice peticiones icp y por último, las opciones. En las opciones deberemos declarar un nombre único <name> para cada cache_peer y la opción <login=PASS> para indicarle a squid que si tiene una petición de login la envíe al padre, no la trate el.
Por lo tanto, para nuestro ejemplo -teniendo en cuenta que <htt1.test.com> es nuestro servidor Apache HTTP- quedará de la siguiente forma:
cache_peer http1.test.com parent 80 0 no-query originserver round-robin login=PASS name=primary
acl sites_public dstdomain www.test.com app1.test.com app2.test.com
cache_peer_access primary allow sites_public
cache_peer_access primary deny all
Y si quiero que el virtual host <app1.test.com> lo proces <http1.test.com> y que el virtual host <app2.test.com> lo procese <http2.test.com>? Bien, pues declararemos dos cache_peer, de esta forma
cache_peer http1.test.com parent 80 0 no-query originserver round-robin login=PASS name=app1
acl sites_public_app1 dstdomain app1.test.com
cache_peer_access app1 allow sites_public_app1

cache_peer http2.test.com parent 80 0 no-query originserver round-robin login=PASS name=app2
acl sites_public_app2 dstdomain app2.test.com
cache_peer_access app2 allow sites_public_app2

cache_peer_access app1 deny all
cache_peer_access app2 deny all
Tener en cuenta, que ahora los controles para denegar el acceso a la caché a los dominios que no son nuestros, debe ir en última posición

Como la configuración puede ser un poco dificil si se empieza desde cero, os dejo un archivo de configuración de ejemplo para squid cache como proxy reverso

Configuración DNS y Puesta en Marcha
Nuestro reverse proxy no debe tener resolución por dns -o mejor dicho, tiene que tener unos propios- por ello, una solución sencilla -en vez de montar un servidor dns exclusivo- si no tenemos muchos hosts es declararlos en nuestro </etc/hosts>

Pero, qué debemos declarar? Bueno todos los host que tengamos en nuestros <cache_peer>, es decir, nuestro servidores Apache http. Continuando con nuestro ejemplo, el archivo </etc/hosts> contendrá las siguientes entradas:
# vi /etc/hosts
  # reverse proxy
  172.26.17.20    www.test.com      www.test.com
  # real http server
  172.26.17.1     http1.test.com        http1.test.com
  172.26.17.2     http2.test.com        http2.test.com
Ya sólo nos queda verificar que las configuraciones están correctas, crear la caché de squid y activar el servicio.

Comprobamos la sintaxis del archivo <squid.conf>

# /opt/www/squid-2.7/sbin/squid -k parse
Creamos la estrucutra de la caché
# mkdir -p /opt/www/squid-2.7/var/cache
# mkdir -p /opt/www/squid-2.7/var/run
# cd /opt/www/squid-2.7/var/
# chmod -R 700 cache logs
# chown -R nobody:nobody cache logs
# /opt/www/squid-2.7/sbin/squid -z
2010/04/30 13:14:57| Creating Swap Directories
Activamos el servicio squid-cache utilizando Solaris SMF
# svcs squid_2
STATE          STIME    FMRI
disabled       12:47:56 svc:/application/cache/squid_2:reverse_proxy
# svcadm enable squid_2
# svcs -p squid_2
STATE          STIME    FMRI
online         12:48:23 svc:/application/cache/squid_2:reverse_proxy
               12:48:23     6164 squid
               12:48:23     6166 squid
               12:48:24     6167 dnsserver
               12:48:24     6168 dnsserver
               12:48:24     6169 dnsserver
               12:48:24     6170 dnsserver
               12:48:24     6171 dnsserver
               12:48:24     6172 unlinkd
Ahora vamos a comprobar que nuestra instalación está correcta, para ello, utilizaremos el comando <squidclient> para realizar una petición http
# /opt/www/squid-2.7/bin/squidclient -h www.test.com -p 80 -r http://www.test.com
HTTP/1.0 200 OK
Accept-Ranges: bytes
Last-Modified: Tue, 09 Mar 2010 17:06:21 GMT
Content-Length: 7777
Content-Type: text/html
Date: Fri, 30 Apr 2010 10:49:55 GMT
Server: Apache/2.2.15 (Unix) mod_jk/1.2.30
ETag: W/"7777-1268154381000"
Age: 1770
Connection: close
Podemos comprobar el registro de squid-cache en el archivo <access.log> para ver que, realmente ha ido por la caché
# tail /opt/www/squid-2.7/var/logs/access.log
172.26.17.20 - - [30/Apr/2010:13:25:51 +0200] "GET http://www.test.com/ HTTP/1.1" 200 8041 TCP_CLIENT_REFRESH_MISS:ROUNDROBIN_PARENT
Rotación Logs de Squid
Por último, vamos a hacer que squid rote los archivos de logs utilizando una entrada en nuestro crontab que llame a squid con la opción <-k rotate> -puedes ver cómo editar el crontab en Solaris, si tienes problemas-:
# export EDITOR=vi
# crontab -e
  ##########################################
  ## ROTATE SQUID LOG
  ##########################################
  00 0 * * * /opt/www/squid-2.7/sbin/squid -k rotate
:wq

Conclusiones
Con esta entrega hemos concluido los requistos necesarios para poder poner nuestro tomcat en producción de forma eficiente. Ahora ya podemos explicar cómo se hace!

En las próximas entregas, veremos como configurar Solaris 10 utilizando zonas -para reverse proxy, http y j2ee- y cómo hacerlo con OpenSolaris y Crossbow. Esto nos servirá para ver las principales diferencias entre hacerlo con Solaris 10 y con OpenSolaris -es muy interesante-



<< Instalación de Apache HTTP como frontend de Tomcat
<< Instalación de Apache Tomcat como stand alone con VirtualHosts
 

Referencias

No hay comentarios:

Publicar un comentario en la entrada