lunes, 19 de abril de 2010

Problemas con Favicon.ico

Hace unos días me contaron que en el log del servidor aparecía el siguiente error:

[error] [client 192.168.51.251] File does not exist: /opt/jboss-ews-1.0_A/httpd/www/html/favicon.ico

El error aparecía en el Apache http server el cual se utiliza como "load balancer" entre los distintos application server, Jboss.

A primera vista es obvio pensar que se esta referenciando al archivo favicon.ico en la ruta mencionada en el error y dicho archivo no se encuentra, lo cual se confirmó luego de mi prueba, pero de todos quise armar un ambiente y efectivamente obtener el mismo error, la única diferencia sería hacerlo en un ambiente Windows y no Linux.

Lo primero que necesitaba era poder contar con varios jboss de forma de poder hacer el balanceo de carga, pero la idea era hacer todo en mi máquina, así que configuré dos IP's virtuales de forma de levantar una instancia de jboss en cada una de ellas.

Para hacer esto agregué un nuevo Network adapter (Add new hardware device - > (manual) Network Adapter - > Microsoft Loopback Adapter) y le configuré dos IP's (que no estuvieran en el rango de mi red). Para hacer eso se debe ir a las propiedades de la conexión recién creada y en las properties de la sección Internet Protocol (TCP/IP) configurar una IP, ej: 192.168.1.140, y luego en Advanced agregar una nueva IP, ej: 192.168.1.141.

Lo siguiente fue instalarme el Apache Http Server, y luego el modulo mod_jk de forma tal que mi Apache http server se pueda encargar del load balancing. El archivo a bajar tendrá un nombre de la forma mod_jk-x.x.xx-httpd-x.x.xx.so, dependiendo de la versión, en mi caso me baje la última disponible en ese momento, 1.2.30. Para instalarlo se debe copiar al directorio APACHE_HOME/modules y renombrarlo a mod_jk.so.

Ya tenía instalado Jboss por lo cual no fue necesario instalarlo.

 A partir de este momento tenía todo lo necesario, ahora solo restaba comenzar con las configuraciones..

Configuraciones a hacer en Apache:

1. Editar el httpd.config ubicado en apache-home\conf y agregar:

#mod_jk setup
Include conf/extra/mod_jk.conf


2. Crear el archivo mod_jk.conf en apache-home\conf\extra y agregar lo siguiente:

# Load mod_jk module
# Specify the filename of the mod_jk lib
LoadModule jk_module modules/mod_jk.so

# Where to find workers.properties
JkWorkersFile conf/workers.properties

# Where to put jk logs
JkLogFile logs/mod_jk.log

# Set the jk log level [debug/error/info]
JkLogLevel info

# Select the log format
JkLogStampFormat  "[%a %b %d %H:%M:%S %Y]"

# JkOptions indicates to send SSK KEY SIZE
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories

# JkRequestLogFormat
JkRequestLogFormat "%w %V %T"
             
# Mount your applications
JkMount /MYAPP_NAME/* loadbalancer

# You can use external file for mount points.
# It will be checked for updates each 60 seconds.
# The format of the file is: /url=worker
# /examples/*=loadbalancer
JkMountFile conf/uriworkermap.properties             

# Add shared memory.
# This directive is present with 1.2.10 and
# later versions of mod_jk, and is needed for
# for load balancing to work properly
JkShmFile logs/jk.shm
            
# Add jkstatus for managing runtime data

    JkMount status
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1


Aquí se debe reemplazar MYAPP_NAME por el nombre de la webapp en la que queremos hacer load balancing.

3. Crear el archivo workers.properties en apache-home\conf\ con el siguiente contenido:

# Define list of workers that will be used
# for mapping requests
worker.list=loadbalancer,status

# Define Node1
# modify the host as your host IP or DNS name.
worker.node1.port=8009
worker.node1.host=192.168.1.140
worker.node1.type=ajp13
worker.node1.lbfactor=1


# Define Node2
# modify the host as your host IP or DNS name.
worker.node2.port=8009
worker.node2.host=192.168.1.141
worker.node2.type=ajp13
worker.node2.lbfactor=1


# Load-balancing behaviour
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=node1,node2
worker.loadbalancer.sticky_session=1
#worker.list=loadbalancer

# Status worker for managing load balancer
worker.status.type=status


Aquí estamos definiendo los nodos donde estarán nuestros jboss para hacer el load balancing entre ellos, en este caso el node1 estará en la IP 192.168.1.140 y el node2 en la IP 192.168.1.141, que son las IPs que configuré al principio, en caso de haber usado otras se deben colocar esos números de IP aqui.


4. Crear el archivo uriworkermap.properties en apache-home\conf\ con el siguiente contenido:

# Simple worker configuration file# Mount the Servlet context to the ajp13 worker
/MYAPP_NAME=loadbalancer
/MYAPP_NAME/*=loadbalancer


al igual que antes MYAPP_NAME es el nombre de la webapp que queremos "balancear".

Hasta acá todo lo necesario a configurar en el Apache HTTP Server.

Configuraciones a hacer en JBoss:

1. Como dije antes la idea es levantar dos instancias de JBoss en mi máquina, para hacer esto debemos hacer dos copias del dir jboss-home\server\default, llamar a una node1 y a la otra node2, estos nombres se corresponden con los que configuramos en el archivo workers.properties.

2. Editar el archivo jboss-home\server\node1\deploy\jboss-web.deployer\server.xml y  setear:

< Engine name="jboss.web" defaultHost="localhost" jvmRoute="node1" >


3. Editar el archivo jboss-home\server\node1\deploy\jboss-web.deployer\META-INF\jboss-service.xml y  setear:

< attribute name="UseJK" > true < /attribute >

4. Repetir el paso 2 y 3 para el node2

5. Debemos hacer el deploy de nuestra webapp, MYAPP_NAME, en ambas instancias del jboss, node1 y node2.

Por último solo nos resta levantar las dos instancias de JBoss, para hacer esto podemos hacer lo siguiente:

run.bat --host=192.168.1.140 --configuration=node1 -Djboss.messaging.ServerPeerID=1
run.bat --host=192.168.1.141 --configuration=node2 -Djboss.messaging.ServerPeerID=2

con esto tenemos las dos instancias de JBoss corriendo en nuestra máquina, una en la IP  192.168.1.140 y la otra en la IP 192.168.1.141.

Solo nos resta levantar Apache y comenzar a usar la app.

Cuando levantamos Apache podemos llegar a tener un error como este:

(OS 10048)Only one usage of each socket address (protocol/network address/por
is normally permitted.  : make_sock: could not bind to address localhost:
no listening sockets available, shutting down
Unable to open logs


Para solucionarlo podemos editar el archivo httpd.conf y setear la IP de nuestra máquina en lugar de localhost:

Listen 192.168.10.21:80

Lo mismo o un error similar puede pasar si tenemos corriendo el IIS en el mismo puerto (80).

Listo, cuando accedamos a http://localhost/MYAPP_NAME estaremos haciendo load balancing, podemos bajar un node y notar como seguirá funcionando nuestra app.

Volviendo al problema original, cuando accedemos a nuestra app el browser buscaba por el favicon.ico en apache-home\htdocs y el mismo no estaba allí, por lo cual copiando favicon.ico a dicho directorio el problema quedó resuelto.

No hay comentarios: