3 feb 2010

Creación automática de sitios Webs, con Apache2 y Vsftp

Este post va dedicado, en contra del trabajo rutinario y/e aburrido. Estos últimos meses, he observado que existe gente que no le molesta hacer las cosas de forma repetitiva dia a dia, en particular es algo que me desespera ya que no solo se vuelve una tortura sino que también nos hace perder nuestro valioso tiempo.
Y que cosa mas aburrida que la creación de sitios en Apache y su correspondiente acceso via FTP. Desconozco la existencia de alguna herramienta que nos permita hacer esto de forma automatizada, por lo que decidí hacer la mia.

Como pre requisito es necesaria la instalación de los paquetes apache2, libapache2-mod-php5, vsftpd,db4. La configuación de los mismo no esta al alcance de este post.


#!/bin/bash
#+-----------------------------------------+
#| Developer by Alejandro Andino.  |
#+-----------------------------------------+

echo -n "Ingrese el nombre del sitio web, sin dominio,www ó http : "

read user_site

echo -n "Ingrese el nombre del dominio: "

read domain

password=`cat /dev/urandom | tr -dc A-Z-a-z-0-9-_ | head -c10`

ftp="/etc/vsftpd"

user_ftp=`echo "ftp_"$user_site`

apache="/etc/apache2"

sites=$apache"/sites-available"

sudo chmod o+rxw $ftp/users_db

echo $user_ftp >> $ftp/users_db

echo $password >> $ftp/users_db

if [ $? -ne 0 ]; then
echo "Problemas de acceso a  $ftp/users_db !!!"
exit
fi

sudo chmod o-wx $ftp/users_db

parametros="s/\(local_root=\/var\/www\)\/.*/\1\/$user_site/g"

if [ -f $ftp/virtual-users.db ]; then
sudo rm $ftp/virtual-users.db
sudo db4.4_load -T -t hash -f $ftp/users_db /etc/vsftpd/virtual-users.db
else
sudo db4.4_load -T -t hash -f $ftp/users_db /etc/vsftpd/virtual-users.db
fi

if [ -f $ftp/users/virtual1 ]; then
sudo cp -f $ftp/users/virtual1 $ftp/users/$user_ftp
sudo chmod o+rw $ftp/users/$user_ftp
cat $ftp/users/virtual1 | sed -e ${parametros} > $ftp/users/$user_ftp
sudo chmod o-r $ftp/users/$user_ftp
else
echo "No existe el template de acceso ftp !!!"
exit
fi

#cat $ftp/users/$user_ftp

if [ ! -f $ftp/users/$user_ftp ]; then
echo "ERROR al crear usuario FTP !!!"
exit
fi

################################################"

sudo mkdir -p /var/www/$user_site

sudo chown -R www-data:www-data /var/www/$user_site

if [ -f $sites/default00 ]; then
sudo cp $sites/default00 $sites/$user_site
sudo chmod o+rw $sites/default00
sed -e "s/^.*NameVirtualHost.*//g" $sites/default00 | \
sed -e 's/ServerAdmin.*/ServerAdmin aandino\@localhost/g' | \
sed -e "s/DocumentRoot.*/DocumentRoot \/var\/www\/`echo ${user_site}`\//g" | \
sed -e "s/ServerName.*/ServerName www\.`echo ${user_site}`\.`echo ${domain}`/g" | \
sed -e "s/ServerAlias.*/ServerAlias \*`echo ${user_site}`\.`echo ${domain}`/g" | \
sed -e "s///g" > $sites/$user_site
sudo chmod o-rw $sites/$user_site
else
echo "Verifique su instalacion de Apache2 !!!"
exit
fi

sudo a2ensite $user_site

if [ $? ]; then
sudo /etc/init.d/apache2 reload
else
echo " Un Error ha ocurrido al cargar el Site !!!"
exit
fi

sudo chmod o-rxw $ftp/users_db

echo "Operacion terminada con exito !!!"
echo ""
echo "###################################"
echo ""
echo "Usuario FTP: "$user_ftp
echo ""
echo "Password FTP: "$password

Este scripts nos dara como salida la creación del sitio web que le especifique os y su correspondiente acceso via FTP.

11 ene 2010

Problemas de sincronización entre varios procesadores - Linux SMP & VmWare Timekeeping

Este ultimo tiempo, me he encontrado "repentinamente" con problemas en un servidor virtualizado,  despúes de 250 días de actividad interrumpida el host invitado (guest) como se le suele llamar en la gerga de la virtualizacion entra en un estado inconsistente, se congela (hang) y es imposible accederlo remotamente e inutil hacerlo por la consola. Son varios los errores que he detectado en los logs tales como:

  •  ACPI: Looking for DSDT in initramfs... error, file /DSDT.aml not found.
  •  ifconfig[2844]: segfault at xxxxx error 4
  • Dec 21 13:55:05 hosting2-front02 kernel: Clocksource tsc unstable (delta = 4688700040 ns)
  • kernel: checking TSC synchronization [CPU#0 -> CPU#1]: passed.                              kernel: checking TSC synchronization [CPU#0 -> CPU#2]: passed.                                                  kernel: checking TSC synchronization [CPU#0 -> CPU#3]:                                                                kernel: Measured 6 cycles TSC warp between CPUs, turning off TSC clock.                                                       kernel: Marking TSC unstable due to: check_tsc_sync_source failed.                                                                                                         kernel: Brought up 4 CPUs
  • Haciendo vmstat o top: Floating point exception.
  • Al hacer df -h                                                                                                 overflow              1.0M  4.0K 1020K   1% /tmp
He googleado por semanas, tratando de atar cabos, y de encontrar el por que de este comportamiento aleatorio e inesperado. En la busqueda encontre indicios de DDoS (Denegación de servicio) mediante syn flooding, algo que corregi por medio de mod-evasive,iptables e tunning TCP en el kernel de Linux.
A pesar de haber hecho los ajustes necesarios, el comportamiento se sigue repitiendo, el sistema operativo se congela una vez al día, durante la madrugada donde las cargas son menores. Mi ambiente  de producción es el siguiente:
  • Linux 2.6.24-19-virtual #1 SMP Thu Aug 21 00:52:59 UTC 2008 i686 GNU/Linux
  • Ubuntu JeOS Server 8.04.3 LTS 
  • Servidor de aplicaciones web Apache 2.2.8 Server.
  • Cuatro procesadores Intel(R) Xeon(R) CPU X5450  @ 3.00GHz
  • 3805 Mb de RAM.
En uno de los mensajes anteriores del kernel.log, ya me estaba dando la pauta que algo extraño sucedia con la sincronizacion de los procesadores  y su clocksource
  • kernel: Marking TSC unstable due to: check_tsc_sync_source failed.
Al investigar al respecto, descubro que existe problemas de sincronizacion entre el host de virtualizacion (ESX 3.5 en mi caso) y los huespedes (Linux guest), existen salto de reloj o desincronización entre ambos, el clock real de las interrupciones y la BIOS virtual proporcionada al sistema invitado. En los kernel 2.6.X la correcciones se basan en algoritmos mejorados que pueden producir saltos hacia delante o hacia a tras en el Linux guest, lo que proboca descontinuidad en le sistema huesped. Estas versiones de kernels introducen la temporización y metodos de correccion mediante la API ACPI del kernel, el clocksource. Estas correcciones son las que provocan que nuestro servidor proporcione inexactitud a nuestras aplicaciones y hanging del servidor.
Como solucionarlo, esta documentado por vmeware aqui por lo que no voy a perder tiempo en explicarlo. En las recomendaciones de este documento esta la utilización del servicio NTP, lo cual en mi caso fue necesario para poder solucionar el problema, ya que al pasarle al kernel el clocksource=acpi_pm, no fue suficiente. Aclaro que la comunicación NTP es bidireccional en el puerto UDP 123, es decir nuestros firewalls deben dejar entrar y salir estos puertos para que la sincronización tenga efecto. Los comando NTP lo trate en un entrada anterior.

"La formulación de un problema, es más importante que su solución."
 EINSTEIN, Albert                


Referencias: