Archive for the ‘servidores’ category

30 de Julio día del SysAdmin

July 30th, 2010

Felicidades a todos los administradores de sistemas, incluyendo a los BOFH :D

http://www.sysadminday.com/

  • Share/Bookmark

[php] Depurando / Profiling en php ( II )

July 28th, 2010

En este caso analizamos un hecho real, una web que tarda en cargar aleatoriamente entre 10 y 12 segundos. El problema es que al medir los tiempos en otro servidor no llega a 2 segundos. Después de revisar conectividad, carga de sistema, carga de apache … y demás parámetros habituales; todo estaba perfecto. Así que decidimos relizar el profiling de la web para localizar el cuello de botella dentro de los scripts php.

En el artículo anterior [php] Depurando / Profiling en php ( I ) dejamos instalado el módulo APD para capturar la información necesaria y luego procesarla. Recordamos que hay que usar la función apd_set_pprof_trace(); para que se generen los datos. En nuestro caso hemos seleccionado la ruta /tmp en donde se almacenarán estos ficheros.

Ejecutamos unos cuantas veces el script php que nos interesa. Generamos una captura de una ejecución en 1-2 segundos (/tmp/pprof.32231.1) y seguimos ejecutando hasta que conseguimos una captura de datos de una ejecución que tardó unos 10-11 segundos (/tmp/pprof.01666.0)

Vamos a comparar la captura de los datos :

La ejecución buena :

# pprofp -R /tmp/pprof.32231.1

Trace for /var/www/vhosts/hostingaldescubierto.com/httpdocs/index.php
Total Elapsed Time = 0.36
Total System Time  = 0.03
Total User Time    = 0.07

Real         User        System             secs/    cumm
%Time (excl/cumm)  (excl/cumm)  (excl/cumm) Calls    call    s/call  Memory Usage Name
--------------------------------------------------------------------------------------
100.0 0.00 0.36  0.00 0.07  0.00 0.03     1  0.0000   0.3589            0 main
96.1 0.00 0.34  0.00 0.08  0.00 0.03     5  0.0000   0.0690            0 require_once
59.1 0.00 0.21  0.00 0.01  0.00 0.00     8  0.0000   0.0265            0 include
58.9 0.00 0.21  0.00 0.01  0.00 0.00     1  0.0000   0.2113            0 call_user_func_array
58.9 0.00 0.21  0.00 0.01  0.00 0.00     1  0.0000   0.2113            0 Pages->index
58.9 0.00 0.21  0.00 0.01  0.00 0.00     1  0.0000   0.2112            0 Pages->show
58.9 0.00 0.21  0.00 0.01  0.00 0.00     1  0.0000   0.2112            0 Template->build
58.8 0.00 0.21  0.00 0.01  0.00 0.00     2  0.0000   0.1054            0 MY_Loader->view
58.6 0.00 0.21  0.00 0.01  0.00 0.00     2  0.0000   0.1052            0 MY_Loader->_ci_load
56.8 0.00 0.20  0.00 0.00  0.00 0.00     1  0.0000   0.2038            0 weather_google_api
56.8 0.20 0.20  0.00 0.00  0.00 0.00     1  0.2037   0.2037            0 simplexml_load_file
29.4 0.00 0.11  0.00 0.05  0.00 0.02     1  0.0000   0.1054            0 Pages->Pages
29.2 0.00 0.10  0.00 0.05  0.00 0.02     1  0.0000   0.1048            0 Pages->Public_Controller
13.9 0.00 0.05  0.00 0.03  0.00 0.02     1  0.0000   0.0497            0 Pages->MY_Controller
13.4 0.00 0.05  0.00 0.02  0.00 0.03     2  0.0000   0.0241            0 MY_Loader->_ci_autoloader
12.2 0.00 0.04  0.00 0.01  0.00 0.00     3  0.0000   0.0146            0 Banners_model->get_by_section
11.7 0.00 0.04  0.00 0.00  0.00 0.00    25  0.0000   0.0017            0 CI_DB_mysql_driver->query
11.5 0.00 0.04  0.00 0.01  0.00 0.00     6  0.0000   0.0069            0 Banners_model->add_hit
11.4 0.04 0.04  0.03 0.03  0.01 0.01    65  0.0006   0.0006            0 defined
10.9 0.00 0.04  0.00 0.00  0.00 0.00    25  0.0000   0.0016            0 CI_DB_mysql_driver->simple_query

El fichero de 10-12 segundos :

# pprofp -R /tmp/pprof.01666.0

Trace for /var/www/vhosts/hostingaldescubierto.com/httpdocs/index.php
Total Elapsed Time = 10.34
Total System Time  = 0.02
Total User Time    = 0.08

Real         User        System             secs/    cumm
%Time (excl/cumm)  (excl/cumm)  (excl/cumm) Calls    call    s/call  Memory Usage Name
--------------------------------------------------------------------------------------
100.1 0.00 10.35  0.00 0.09  0.00 0.02     5  0.0000   2.0692            0 require_once
100.0 0.00 10.34  0.00 0.08  0.00 0.02     1  0.0000   10.3394            0 main
99.1 0.00 10.24  0.00 0.01  0.00 0.00     8  0.0000   1.2802            0 include
99.0 0.00 10.24  0.00 0.01  0.00 0.00     1  0.0000   10.2409            0 call_user_func_array
99.0 0.00 10.24  0.00 0.01  0.00 0.00     1  0.0000   10.2409            0 Pages->index
99.0 0.00 10.24  0.00 0.01  0.00 0.00     1  0.0000   10.2409            0 Pages->show
99.0 0.00 10.24  0.00 0.01  0.00 0.00     1  0.0000   10.2409            0 Template->build
99.0 0.00 10.24  0.00 0.01  0.00 0.00     2  0.0000   5.1202            0 MY_Loader->view
99.0 0.00 10.24  0.00 0.01  0.00 0.00     2  0.0000   5.1200            0 MY_Loader->_ci_load
99.0 0.00 10.23  0.00 0.00  0.00 0.00     1  0.0000   10.2335            0 weather_google_api
99.0 10.23 10.23  0.00 0.00  0.00 0.00     1  10.2333   10.2333            0 simplexml_load_file
0.7 0.00 0.08  0.00 0.06  0.00 0.01     1  0.0000   0.0766            0 Pages->Pages
0.7 0.00 0.08  0.00 0.05  0.00 0.01     1  0.0000   0.0761            0 Pages->Public_Controller
0.5 0.00 0.05  0.00 0.04  0.00 0.01     2  0.0000   0.0266            0 MY_Loader->_ci_autoloader
0.5 0.00 0.05  0.00 0.04  0.00 0.01     1  0.0000   0.0524            0 Pages->MY_Controller
0.4 0.04 0.04  0.04 0.04  0.01 0.01    65  0.0006   0.0006            0 defined
0.4 0.00 0.04  0.00 0.02  0.00 0.01    38  0.0000   0.0010            0 MY_Loader->helper
0.3 0.00 0.04  0.00 0.03  0.00 0.00    10  0.0000   0.0036            0 MY_Loader->model
0.3 0.00 0.03  0.00 0.02  0.00 0.01     1  0.0000   0.0312            0 Pages->Controller
0.3 0.00 0.03  0.00 0.02  0.00 0.01     1  0.0000   0.0311            0 Pages->_ci_initialize

Vemos claramente esta linea que es la que penaliza el tiempo de ejecución del script:

99.0 10.23 10.23  0.00 0.00  0.00 0.00     1  10.2333   10.2333            0 simplexml_load_file

Perfecto, ya sabemos lo que tenemos que buscar el uso de la función simplexml_load_file. Buscamos los ficheros que usan esta funcion, por ejemplo así :

find -name "*php" -exec grep -l simplexml_load_file {} \;

Entre los resultados encontramos uno, que llama especialmente la atención, en el que solicita un fichero xml de google http://www.google.com/ig/api?weather=madrid&oe=utf-8.
Vamos a medir cuanto tiempo tarda en descargarlo :

# time wget 'http://www.google.com/ig/api?weather=madrid&oe=utf-8'
--2010-07-26 18:27:47--  http://www.google.com/ig/api?weather=madrid&oe=utf-8
Resolving www.google.com... 66.249.92.104
Connecting to www.google.com|66.249.92.104|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/xml]
Saving to: `api?weather=madrid&oe=utf-8.1'

[ <=>                                                                                                                                      ] 1,291       --.-K/s   in 0s

2010-07-26 18:27:57 (12.0 MB/s) - `api?weather=madrid&oe=utf-8.1' saved [1291]

real    0m10.157s
user    0m0.002s
sys    0m0.001s

Parece bastante claro que la ejecución se ralentiza por la petición a google… una caché que se actualice cada día, hora o cada minuto solucionaría este problema.

  • Share/Bookmark

[php] Depurando / Profiling en php ( I )

July 23rd, 2010

Para poder diagnosticar qué sucede en la máquina cuando se ejecuta un script en php es necesario instalar un depurador o profiler. En este caso instalamos Advanced Php Debugger.

En máquinas Centos, como es usual no lo tenemos en el repositorio así lo instalaremos manualmente usando ‘pecl‘ que lo provee el paquete de php-pear .

pecl install apd

Será necesario tener instalado make, gcc  y autconf

Nos podemos encontrar con este error :

# pecl install apd
WARNING: channel "pear.php.net" has updated its protocols, use "channel-update pear.php.net" to update
downloading apd-1.0.1.tgz ...
Starting to download apd-1.0.1.tgz (36,643 bytes)
..........done: 36,643 bytes
15 source files, building
running: phpize
Configuring for:
PHP Api Version:         20041225
Zend Module Api No:      20060613
Zend Extension Api No:   220060519
building in /var/tmp/pear-build-root/apd-1.0.1
running: /tmp/pear/download/apd-1.0.1/configure
checking for egrep... grep -E
checking for a sed that does not truncate output... //bin/sed
checking for cc... cc
checking for C compiler default output file name... a.out
checking whether the C compiler works... configure: error: cannot run C compiled programs.
If you meant to cross compile, use `--host'.
See `config.log' for more details.
ERROR: `/tmp/pear/download/apd-1.0.1/configure' failed

Normalmente es debido a que tenemos /var y /var/tmp con la opcion de noexec. Para poder ejecutarlo correctamente pondremos temporalmente estos puntos de montaje con permisos de ejecución y luego lo restauramos:

mount -o,remount,rw,exec /var/tmp
mount -o,remount,rw,exec /tmp
pecl install apd
mount -o,remount,rw,noexec /var/tmp
mount -o,remount,rw,noexec /tmp

Nos insteresa quedarnos con este contenido para configurar el fichero .ini :

running: make INSTALL_ROOT="/var/tmp/pear-build-root/install-apd-1.0.1" install
Installing shared extensions:     /var/tmp/pear-build-root/install-apd-1.0.1/usr/lib64/php/modules/
running: find "/var/tmp/pear-build-root/install-apd-1.0.1" | xargs ls -dils
  12   1 drwxr-xr-x 3 root root   1024 Jul 23 18:33 /var/tmp/pear-build-root/install-apd-1.0.1
2057   1 drwxr-xr-x 3 root root   1024 Jul 23 18:33 /var/tmp/pear-build-root/install-apd-1.0.1/usr
4113   1 drwxr-xr-x 3 root root   1024 Jul 23 18:33 /var/tmp/pear-build-root/install-apd-1.0.1/usr/lib64
6169   1 drwxr-xr-x 3 root root   1024 Jul 23 18:33 /var/tmp/pear-build-root/install-apd-1.0.1/usr/lib64/php
8225   1 drwxr-xr-x 2 root root   1024 Jul 23 18:33 /var/tmp/pear-build-root/install-apd-1.0.1/usr/lib64/php/modules
8226 129 -rwxr-xr-x 1 root root 130196 Jul 23 18:33 /var/tmp/pear-build-root/install-apd-1.0.1/usr/lib64/php/modules/apd.so

Build process completed successfully
Installing '/usr/lib64/php/modules/apd.so'
install ok: channel://pear.php.net/apd-1.0.1

Tendremos que crear un fichero en /etc/php.d/apd.ini con este contenido

zend_extension = /usr/lib64/php/modules/apd.so
apd.dumpdir = /tmp
apd.statement_tracing = 0

y comprobamos que el modulo carga con php -m

#php -m

....

[Zend Modules]
Advanced PHP Debugger (APD)
Zend Optimizer

Ahora ya podemos lanzar el profiling en nuestras páginas, para ello podemos incrustar este fragmento de código y activarlo sólamente cuando accedamos nosotros y no los clientes:

 <?php
 $DEBUGIPS = array('93.174.6.8','192.168.1.1');
 if(array_search($_SERVER[REMOTE_IP], $DEBUGIPS)) {
   apd_set_pprof_trace();
 }
?>

Y con esto acabamos la primera parte, atentos a la segunda :D

  • Share/Bookmark

contratar un vps con server4you.de

April 23rd, 2010

Una empresa Alemana suele ser sinónimo de seriedad y calidad. Por lo menos en lo personal siempre me ha dado la sensación de tratar con gente muy preocupada por la imagen de su producto y ofrecer un buen servicio. No digo, precio, si no servicio.

Tras oir hablar hace tiempo de server4you.de y ver el catálogo de productos decidimos contratar un vps. La oferta inmejorable, vps 1024 de ram 25 gb de disco, 5 tb de trafico al mes por 8,85 euros al mes y una oferta de 6 meses gratis si contratas 1 año. Total con impuestos unos 57 euros un año !!!! increible.

Pues eso que no os lo creais, nos registramos esperamos 24 horas, no tenemos el alta. Miramos en las transacciones del banco y nos cobran 2 euros. Bueno, puede ser normal para comprobar que la tarjeta sea real. Mandamos correo preguntando y nada, a esperar ,  a las 48 horas nos contestan que envíemos una copia del dni o carnet de conducir. Vale, aceptamos también y lo envíamos.

Otras 24 horas después nos contestan que tardan un mínimo de 48 horas en tramitar los correos de gestion y seguimos esperando. Al día siguiente contestan que como no hemos enviado la documentación cancelan el pedido y hasta otra.

Evidentemente enviamos una contestación indicando que el envío de la documentación estaba realizada, bla bla bla bla. Y la contestación hasta el día de hoy ha sido nula. También reclamamos nuestros 2 eurazos !!! que hasta hoy no hemos recuperado.

Visto lo visto nuestra recomendaciń es que no hagais negocios con server4you.de seguramente haya clientes en españa con sus productos, pero si no hubiera sido por que me fué recomendada por un cliente. pensaría que es una estafa y server4you una empresa fantasma.

  • Share/Bookmark

La Rebelión de los spammers

March 30th, 2010

La Rebelión de los spammers es un interesante artículo de David Barroso que leí hace años y ahora lo he vuelto a encontrar por casualidad. El documento habla de la metodología que usa para localizar e identificar procesos maliciosos, cómo identifica el fallo de seguridad, y análisis del enemigo. Se detalla el uso de herramientas de sistema lsof, strace, etc.. etc… Aunque para muchos este tipo de tareas es trivial por realizarlas a diario, no deja de ser un documento interesante para leer.

Dejo copia en el servidor del documento que he localizado en http://his.sourceforge.net/proy_his/papers/spammers/spammers.es.html del proyecto Honeynet In Spanish aparantemente muerto en 2006

El documento lo podeis encontrar en http://www.hostingaldescubierto.com/rebelion-spammers/spammers.es.html

  • Share/Bookmark

He migrado mi web y ahora no me salen los acentos !!!

November 20th, 2009

Suele ocurrir cuando migramos de un sistema a otro que el juego de caracteres del sistema no es el mismo. Esto unido a que la mayoría de los no profesionales ni saben ni les interesa codificar sus webs correctamente genera horror y caos tras una migración.

Frases célebres :

  • me han hackeado la web, las eñes (ñ) no salen
  • no salen los acentos, arreglamelo
  • algo pasa con el office que me salen símbolos en vez de tildes , eñes y exclamaciones.
  • y la mítica de no me funciona internet…

Para evitar que esta tortura se dilate en el tiempo tengo un copy paste bastante elegante que ahorra tiempo:

cd /var/www/vhosts/tudominio.ext/httpdocs
alias cp='cp'

for file in $( find -name "*.htm*" ); do echo "convirtiendo $file.."; cat $file |iconv -flatin1 -t utf8> ../tmp.htm; cp ../tmp.htm $file ; done ;

rm -f ../tmp.htm

Basicamente convertimos todos los ficheros de latin1 a utf8 usando un fichero temporal fuera del httpdocs para que no nos convierta el propio fichero temporal.

RECOMENDACIÓN:
Elegir un fichero, hacer el iconv a mano y ver que aparece correctamente en el explorador ya que apache también puede estar configurado para usar por defecto un juego de caracteres u otro. O que el cambio no sea de latin1 a utf8 sino al revés. Eso ya es cosa vuestra.

  • Share/Bookmark

Ejemplo de configuracion de ipmi

November 26th, 2008

Algunos servidores ofrecen la posibilidad de usar IPMI 1.0 o 2.0 para manejar algunas características o información del hardware.

Aquí dejo una chuleta corta para ver la información de los interfaces y configurar uno de ellos copiando y pegando.

Inforamcion del channel 1 ( interface )

ipmitool> channel info 1
Channel 0x1 info:
  Channel Medium Type   : 802.3 LAN
  Channel Protocol Type : IPMB-1.0
  Session Support       : multi-session
  Active Session Count  : 0
  Protocol Vendor ID    : 7154
  Volatile(active) Settings
    Alerting            : enabled
    Per-message Auth    : enabled
    User Level Auth     : enabled
    Access Mode         : disabled
  Non-Volatile Settings
    Alerting            : enabled
    Per-message Auth    : enabled
    User Level Auth     : enabled
    Access Mode         : disabled

Configuración del interface

 sudo ipmitool shell
lan set 1 access on
lan set 1 ipsrc static
lan set 1 ipaddr 10.10.10.1
lan set 1 netmask 255.0.0.0.0
lan set 1 defgw ipaddr 10.10.10.0

lan set 1 arp respond on
lan set 1 arp generate on
lan set 1 arp interval 5

Solo falta crear un usuario

set user pepe plain-text password

sencillo y rápido.

Muy recomendable también las herramientas freeipmi

  • Share/Bookmark

reset drac dell server / cuando el control remoto se queda colgado

November 11th, 2008

Lo mejor que uno puede hacer al adquirir un servidor dedicado es añadirle un control remoto ( KVM, Drac, BMC, IPMI, Megarac … ) Con este hardware tenemos la tranquilidad de que sea la hora que sea y sin tener que esperar al servicio técnico, podemos reinstalar la máquina, reiniciarla, chequearla, actualizar firmware… como si la máquina la tuvieramos delante de nosotros.

De todos los controles remotos que he podido probar, me quedo con el DRAC4 de Dell, practicamente no da problemas y corre bajo java. Drac5 sí da problemas y ademas requiere instalar un OCX.

El caso crítico en que tu servidor se cuelge y el DRAC esté completamente costado y no se pueda visualizar el arranque, desespera y mucho. El problema de DRAC5 si no recuerdo mal viene dado de un bug que no ha sido corredigo con el que se pueden tostar los DRAC5 de Dell. No es demasiado problema si accedemos a nuestro hardware de control remoto via ssh y lanzamos el comando racadm racreset. Podeis consultar este enlace http://hostingaldescubierto.com/wordpress/2008/04/11/error-unable-to-connect-to-vkvm-press-ok-to-exit/

En unos segundos el drac habrá reiniciado y será totalmente operativo de nuevo.

En cuanto a los servicios de control remoto de otras marcas como Fujitsu, no están mal, pero son bastante más lentos y dan algún que otro problema con el video. Creo que alguna acutalización reciente en el firm ha subsanado estos problemas.


Aparte está Supermicro que usa un kvm exactamente identico al que usan en lantronix ( spider ). En el caso de lantronix es externo y el de supermicro interno con un hardware adicional sus servidores y muy importante, funcionan bajo java.

Para los más valientes, con impi quizás os sirva, tan solo servirá para hacer ping y reiniciar el servidor, más alguna funcionalidad como temperaturas, etc…

Lo que si hay que tener en cuenta es que casi todos dan problemas con el teclado a la hora de marcar algunos caracteres.

  • Share/Bookmark

Protegiendo el servidor: APF (Advanced Policy Firewall)

September 5th, 2008

Un paquete de software muy usado para defender nuestros servidores es APF. La instalación es muy rápida por lo que podemos ver en seguida si resulta eficaz ante un ataque. Se basa en filtros usando iptables y listas de ips para bloquear. Es muy completo, pero lo más importante es que es rápido de instalar y no da problemas. Solución rápida en momentos de crisis

Para instalarlo :

cd /usr/src
wget http://www.r-fx.ca/downloads/apf-current.tar.gz
tar zxvf apf-current.tar.gz
cd apf-*
sh install.sh

La instalación es así:

# sh install.sh
Installing APF 9.6-5: Completed.

Installation Details:
  Install path:         /etc/apf/
  Config path:          /etc/apf/conf.apf
  Executable path:      /usr/local/sbin/apf

Other Details:
  Listening TCP ports: 111
  Listening UDP ports: 111,45188,45234,46761,48062
  Note: These ports are not auto-configured; they are simply presented for information purposes. You must manually configure all port options.

Iniciar el servicio apf

apf -s

Los logs están en /var/log/apf_log

más información en http://rfxnetworks.com/apf.php

  • Share/Bookmark

Plesk con más de 300 dominios = apache + “Too many open files”

May 7th, 2008

En Plesk 8.X existe una limitación a 300 dominios, a partir de la cual habría que recompilar apache para dar soporte a más dominios sin problemas.
Cuando un servidor con Plesk llega a este volumen, puede ocasionar problemas como “Too many open files” y no arraca el servicio.

Este problema puede ser solucionado de varias formas.

Una es ampliar el numero de ficheros que se pueden abrir usando:

ulimit -n 2048
/etc/init.d/apache restart

Para configurar estos parámetros se usa el fichero /etc/security/limits.conf o ficheros de configuracion en /etc/security/limits.d

Por ejemplo para todos los usuarios poner un limite de ficheros abiertos 1024 y 65535 sería:

* soft nofile 1024
* hard nofile 65535

O directamente por consola:

ulimit -nH 65535
ulimit -nS 1024

La opción que recomienda Plesk para no tener que reiniciar apache y que está disponible desde la version 8.2 es esta:

http://kb.parallels.com/en/2066

mysql -uadmin -p`cat /etc/psa/.psa.shadow` psa -e "replace into misc (param,val) values ('apache_pipelog', 'true');"
/usr/local/psa/admin/sbin/websrvmng -v -a
/etc/init.d/apache restart

Otra opción alternativa es mirar los limites del kernel con sysctl

Se podría forzar de las siguientes formas:

echo 65535 > /proc/sys/fs/file-max

O bien agregar en /etc/sysctl.conf la linea

fs.file-max=65535

Si el error no es aplicable a Plesk, se puede intentar eliminar los semaforos que usa apache con esta linea :

ipcs -s | grep apache | awk '{print $2}' | xargs ipcrm -s

  • Share/Bookmark