20 nov 2009

Linux NTP Server + SO Time Zone + Oracle Time Zone.

Tengo el siguiente dilema

Tengo un servidor Linux con DB Oracle 10g en el cual la fecha y hora son extremadamente criticas. Debido a algunas inconsistencias ( entre el soft de virtualización, la bios virtual y el server virtual) he decidido conectarlo a un NTP server de internet. Otro factor que afecta, es el cambio horario de forma no uniforme en distintas regiones de Argentina.

La pregunta es:

¿ Existe un método para cambiar el time zone del sistema operativo mediante NTP ?
¿ Como afecta el cambio de time zone del sistema operativo a Oracle ?

Después de investigar un rato encuentro este FAQ el cual explica que el protocolo NTP es independiente de la zona horaria (time zone); brinda siempre la hora en UTC/GTM +00:00. Por lo que la hora del equipo depende no solamente del servicio NTP sino tambien del time zone que le setemos al equipo. Decido a comprobar esto armo mi propio servidor NTP.

 #>apt-get install ntpd ntpdate

El archivo de configuracion del servicio esta en /etc/ntp.conf y queda asi

#> vi /etc/ntp.conf


# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help

driftfile /var/lib/ntp/ntp.drift


# Enable this if you want statistics to be logged.
statsdir /var/log/ntpstats/

statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable


# You do need to talk to an NTP server or two (or three).
#server ntp.ubuntu.com
server time.sinectis.com.ar iburst
server tock.nap.com.ar iburst
server 0.ar.pool.ntp.org iburst
server 1.south-america.pool.ntp.org iburst
server 0.south-america.pool.ntp.org iburst

Un articulo muy lindo de como configurar esto, esta en este link, aqui obvie las configuraciones de seguridad. Los pools en mi caso Argentina los saque de aqui y de aquí, esto es por que la selección del servidor a utilizar por NTP viene dada por varios factores entre ellos la distancia. Reiniciamos el daemon para actualizar las configuraciones:

#>/etc/init.d/ntp restart

Luego chequeamos si nuestro servidor esta sincronizando con los que les detallamos en su configuración:

#> ntpq -np

     remote              refid                  st t when poll reach   delay   offset  jitter
==========   ===============================
+216.244.192.3   62.117.76.142    2  u  167  512  377   26.525   33.572   2.619
-200.10.140.1       192.5.41.41        2   u  122  512  377   26.534   44.511  45.921
-200.63.112.9       192.43.244.18    2 u  655  512  376   44.753   48.853  55.039
*187.49.33.13       200.20.186.75   2 u  162  512  377  326.558   35.854   4.766
+190.202.98.221  150.214.94.5     2 u  145  512  377  241.681   33.767  11.175
 192.168.65.255   .BCST.               16 u    -   64    0    0.000    0.000   0.002

Aqui solamente destaco, que el asterisco (*) indica el servidor al cual estamos sincronizando y con signo más (+) los servidores candidatos a sincronizar en caso del que el preferido falle.
Otras opciones interesantes para debugear en ntpq son:



ntpq> as

ind assID status  conf reach auth condition  last_event cnt
====================================
  1 57640  9144   yes   yes  none falsetick   reachable  4
  2 57641  9444   yes   yes  none  candidat   reachable  4
  3 57642  9444   yes   yes  none  candidat   reachable  4
  4 57643  8053   yes   yes  none    reject  lost reach  5
  5 57644  9644   yes   yes  none  sys.peer   reachable  4
  6 57645  9344   yes   yes  none   outlyer   reachable  4
  7 57646  8000   yes   yes  none    reject

ntpq> rv
assID=0 status=06f4 leap_none, sync_ntp, 15 events, event_peer/strat_chg,
version="ntpd 4.2.4p4@1.1520-o Wed May 13 21:05:42 UTC 2009 (1)",
processor="i686", system="Linux/2.6.28-16-generic", leap=00, stratum=3,
precision=-19, rootdelay=351.872, rootdispersion=56.283, peer=57644,
refid=187.49.33.13,
reftime=ceb188e9.25b15a51  Sat, Nov 21 2009  2:00:17.147, poll=10,
clock=ceb18b4f.39f3287e  Sat, Nov 21 2009  2:10:31.226, state=4,
offset=-4.565, frequency=9.125, jitter=4.385, noise=16.777,
stability=0.047, tai=0

ntpq> pe
     remote           refid      st t when poll reach   delay   offset  jitter
========================================
 xtime.windows.co 0.0.0.0          2 u  593 1024  377    0.530  32852.8   0.073
+ns2.sinectis.co 62.117.76.142    2 u  105 1024  277   26.006   -4.959   4.634
+200.10.140.1.ad 192.5.41.41      2 u  576 1024  377   26.477    0.399   6.288
 willie.norfe.ne 192.43.244.18    2 u 104m  512    0   44.753   48.853   0.000
*srv6.spbrasil.c 200.20.186.75    2 u  615 1024  377  329.167   -3.810   3.481
-190.202.98.221  150.214.94.5     2 u  599 1024  377  246.638  -18.083  25.978
 192.168.65.255  .BCST.          16 u    -   64    0    0.000    0.000   0.002

Bueno mi servidor NTP ya esta sincronizado y es stratum=3. Para demostrar que NTP solo provee UTC/GTM 00:00 sincronizo un cliente windows 2003 a este y cambio el time zone de mi server de -03:00 a -04:30. Y efectivamente mi server marca la 1am mientras que el cliente Windows dependiente de mi server NTP se mantiene en la misma hora, mas alla de haberse sincronizado manualmente y automáticamente. Lo que concluye que NTP brinda siempre la hora en UTC 00:00, independiente de donde estemos geográficamente, por lo que no es posible setear el time zone del sistema operativo mediante opciones o comandos del protocolo NTP. En este punto me doy cuenta que tendre que configurar en los cambios de horario invierno-verano la posición geográfica ( UTC/GTM) de cada uno de los servidores. Aunque lei que existe la opcion DTS para manejar las zonas horarias, la cual no me da mucha confianza ya que puede implicar cambios automaticos de time zone, pero la siguere analizando.


9 nov 2009

Integrando Apache2 + mod_jk + Tomcat Parte II

De mi entra anterior Integrando Apache2 + mod_jk + Tomcat me han surgido algunos inconvenientes que resolvere en este post. Además de aprovechar a plantear el ambiente y la necesidad que me lleva a realizar esta tarea.

Actualmente utilizo apache2 para el alojamiento de sitios con php, pero ha surgido el requerimiento de servir paginas jsp en el mismo server. Las antiguas paginas que contiene apache, en php deben seguir funcionando, como asi también los nuevos sitios jsp.

Siguiendo el post de instalacion de tomcat el cual fue bello, rápido, practico y demasiado automático se me crearon dos directorios para la administración de tomcat.

#ls -l /usr/share/tomcat5.5
    /usr/share/tomcat5.5/webapps2 --> /var/lib/tomcat5.5/

#ls -l /usr/share/tomcat5.5-webapps
    /usr/share/tomcat5.5-webapps/ROOT
    /usr/share/tomcat5.5-webapps/manager

Leyendo el archivo de configuración /etc/default/tomcat5  y de inicio /etc/init.d/tomcat podemos tener una buena vision sobre la instalación. Aunque la descompresion de archivos war se almacera en /var/lib/tomcat5.5/ en vez de /usr/share/tomcat5.5-webapps, cosa que no sucede  con los sites por default que estan en este ultimo directorio. Cosa que leyendo los scripts no pude descifrar (a lo mejor alguien pueda comentarlo), por lo opte por la desinstalación completa de tomcat 5.

# apt-get remove --purge tomcat5.5 tomcat5.5-admin tomcat5.5-webapps

 La instalacion de tomcat desde los binarios es muy sencilla, descargamos el archivo *.tar.gz desde tomcat, comprobamos que se haya descargado correctamente utilizando los hash md5 o gpg. Yo en mi caso los descomprimi en /usr/local/src

#tar xzvf apache-tomcat-6.0.20.tar.gz -C /usr/local/src
#ln -s /usr/local/src/apache-tomcat-6.0.20 /usr/local/apache-tomcat
Agregar las variables de entorno necesarias para la ejecucion de tomcat
JAVA_HOME = Directorio donde se encuentra la instalacion de java
CATALINA_HOME= Directorio donde se encuentra la instalación de tomcat

Una vez seteadas estas variables procedemos a inciar tomcat
#/usr/local/apache-tomcat/bin/start.sh
Chequeamos en el browser la pagina de inicio de tomcat, ingresando la dirección:
http://localhost:8080 ó http://localhost:8010

Instalamos el modulo libapache2-mod-jk
#apt-get install libapache2-mod-jk
Copiamos el archivo de ejemplo en mod-aviables
#cp /usr/share/doc/libapache2-mod-jk/httpd_example_apache2.conf /etc/apache2/mods-available/mod_jk.conf; cd /etc/apache2; ln -s mods-available/jk.conf mods-enabled/jk.conf; /etc/init.d/apache2 restart

Configuramos los worker's a los valores de las variables previamente configuradas.
#>vi /etc/libapache2-mod-jk/workers.properties

workers.tomcat_home=/usr/local/apache-tomcat #$CATALINA_HOME
workers.java_home=/usr/lib/jvm/java-6-sun #$JAVA_HOME
worker.list=ajp13_worker # El nombre de/los workes que utilizaremos.
worker.ajp13_worker.port=8009 # Puerto de comunicación apache - tomcat
worker.ajp13_worker.host=localhost #host
worker.ajp13_worker.type=ajp13 # Protocolo de comunicación

Configuramos el modulo de apache jk.conf. Aqui no hay demasiado de tocar, solamente el nivel de alerta y que directorio de $CATALINA_HOME/webapps sera mapeado de apache a tomcat.

#>vi /etc/apache2/mods-available/jk.conf

# Cambio a debug para chequear el funcionamiento lugo paso a error. Esto es
# debido que si los sitios que poseemos (en apache) generan demasiado trafico
#corremos el riesgo de que los logs nos llenen el disco/particion.
JkLogLevel      debug

#Aqui esta el quid de la cuestion, estas directivas le diran a apache que
#directorios seran mapeados a tomcat a traves del worker, en este caso
#ajp13_worker, usando el protocolo ajp3. Debido a un par de ensayos opte por deshabilitar esta opcion en este archivo y setearla en el virtualhost dentro de los sitios de apache, lo cual le ha dado mayor claridad al seteo de JkMount.

# send all requests ending in .jsp to ajp13_worker
#JkMount /*.jsp ajp13_worker
#JkMount /* ajp13_worker
#send all requests ending /servlet to ajp13_worker
#JkMount /*/servlet/ ajp13_worker

Con todo esto ya estoy en condiciones de volver a la configuración del post anterior, donde agregaba un virtualhost a apache para que fuese mapeado a tomcat. Obvio que tiene modificaciones tambien.

#>vi /etc/apache2/site-aviable/prueba

VirtualHost IP:80>


# No es necesario, JkMount determina el mapeo a $CATALINA_HOME/webapps
# y la expresion que le pasemos a JkMount
#DocumentRoot /usr/share/tomcat5.5/webapps 

ServerAdmin admin@midominio.com
ServerName  prueba.localdomain

#Los paths dentro de $CATALINA_HOME/webapps que serán manejados por el 
#protocolo ajp3.
JkMount /prueba/servlet/* ajp13_worker
JkMount /prueba/*.jsp ajp13_worker


/VirtualHost>

#> a2ensite prueba
#> /etc/init.d/apache2 restart

Y listo tenemos un nuevo sitio que servira paginas jsp en el mismo puerto que apache y el resto de los sitios.

Cabe destacar que se han obviado configuraciones de seguridad sobre tomcat, las cuales serán un próximo tema a tratar.

4 nov 2009

Integrando Apache2 + mod_jk + Tomcat

En este articulo voy a intentar un quick howto, de como configurar nuestro servidor web (Apache2) para que no solo atienda paginas html o php sino que tambien paginas JSP. Gracias a la modularidad de apache contamos con el modulo mod_jk, utilizare este, ya que es el proyecto con mayor actividad según dicen por ahi.
La idea es que apache pueda enviar las peticiones de paginas jsp  a un tomcat para que este ultimo las procese. Esta comunicacion entre apache y tomcat se logra a traves del modulo jk.

Lo necesario para instalar y configurar a secas apache2+mod_jk+tomcat esta en  esta pagina, bello, rapido y practico.  Con esto funcionando llaga la hora de decirle a apache que las paginas .jsp estan en $CATALINA_HOME/webapps y que utlice el worker ajp3_worker (worker.properties) para pasarle el trabajo a tomcat. Esto se logra mediante la utilizacion de virtualhosts dentro de apache (/etc/apache2/site-aviables/xxx) con el parametro jkMount como se muestra en el siguiente ejemplo:


<>
DocumentRoot /usr/share/tomcat5.5/webapps #El $catalina_home/webaaps
ServerAdmin admin@midominio.com
ServerName  asensos.localdomain
JkMount /*/servlet/* ajp13_worker #las llamadas que seran delegadas al protocolo ajp3

<>

Hasta el momento las pruebas han funcionado a la perfección, llamo tanto a paginas estáticas como a paginas jsp, todo desde el puerto 80 donde corre apache.

Fuentes: