26 jul 2012

Optimización de MySQL (Parte 1)

Las bases de datos crecen y crecen a lo largo del tiempo, cada día almacenan más y más información. Por lo que es necesario asegurarse que los resultados solicitados sean entregados en el menor tiempo posible.

Medio segundo puede significar la perdida de un 20% del tráfico del sitio, así que es muy importante mejorar el rendimiento de las bases de datos.

Se pueden usar índices y particiones para limitar la cantidad de registros que MySQL tiene que procesar para entregar un resultado.

Para una consulta frecuente, la creación de un índice es la mejor manera de acelerar las cosas. Por ejemplo, si tenemos una tabla con 40 columnas, de las cuales una columna es accesada frecuentemente, se puede crear un índice para dicha columna y acelerar el proceso de búsqueda. Si no existen índices, MySQL hará un "escaneo" completo para obtener los datos, es decir, se examinan todos los registros en la tabla, uno a uno, hasta el último registro o se satisfaga la consulta.

En otros términos, podemos pensar en el índice de un libro. Maravilloso, no?

Cuando creamos un índice para un campo, MySQL registra toda la información de la columna en particular, la ordena y luego la almacena en un objeto único o archivo, separado de la tabla, junto con referencias a la tabla original con los datos sin ordenar.

El mantenimiento de los índices no requiere cosas adicionales. Si creamos un índice para tabla que es actualizada con frecuencia, todos los DELETE, INSERT o UPDATE también serán actualizados en el índice.

Cuidado, el manejo incorrecto de los índices ocasionará una carga extra al servidor y puede generar lentitud en otros procesos, por lo que no deben crear índices para todos los campos. Sólo creen índices para las consultas mas frecuentes o para tablas muy grandes (con miles y miles de registros)

Ahora, la forma de indexar va a depender del engine (motor de almacenamiento) que hayan usando al momento de crear las tablas de la base de datos. Anteriomente, MyISAM era el engine por default en mysql server, pero a partir de la versión 5.5 InnoDB a tomado su lugar. Pero no se preocupen, esto es algo que se puede manipular en el archivo de configuración (my.cnf) o se puede especificar mientras se crean las tablas.

Hay varios tipos de índices que se pueden utilizar, tales como B-Tree o Hash . La elección del índice depende del motor de almacenamiento que esté en uso.

UTILIZAR INDICES

Se puede crear un índice para una tabla (mientras se crea la tabla), o bien crearlo para las tablas existentes. Por ejemplo:

CREATE TABLE records (
     name VARCHAR(50),
     age INT,
     id_num INT, INDEX (id)
         );

Esto crea un índice llamada id para la columna id_num. Para una tabla existente el comando podría ser:

CREATE INDEX id ON records(id_num);

Para crear múltiples índices para una tabla:

ALTER TABLE records ADD INDEX id(id_num), ADD INDEX name(name);

Como MySQL desconoce la naturaleza exacta de los datos almacenados en un campo, se creará un índice con toda la longitud de los datos. Por lo tanto, si tenemos una tabla de artículos, y crear un índice en el campo de título de 50 caracteres, MySQL almacena la longitud total del nombre de cada artículo en la base de datos. En un caso como éste, es sabio almacenar sólo los primeros 20 caracteres en el índice, en lugar de la longitud total. Para grandes bases de datos con columnas muy largas, sería un desperdicio de espacio almacenar todo el nombre en el índice.

Puede limitar la longitud de los datos a 20 caracteres especificandolo junto con el nombre de la columna, de este modo:

ALTER TABLE records ADD INDEX id(id_num), ADD INDEX name(name(20));

Recuerden que un índice mal creado puede ocasionar un consumo excesivo de los recursos del servidor, sobre todo si se usa InnoDB.

En el próximo post hablaremos de las particiones.

12 jun 2012

Particionar y Formatear un nuevo disco duro con ext3

Recientemente me informaron acerca de la configuración de discos duros de los nuevos servidores, la necesidad es crear una partición primaria con ext3 y montarla en el directorio /data02.

Manos a la obra:

Lo primero que necesitamos es consultar la tabla de particiones y ubicar el disco que vamos a ocupar, aquí mucho cuidado, cualquier error nos puede arruinar el día. Por lo tanto ejecutamos fdisk de la siguiente forma:
# /sbin/fdisk -l
Disk /dev/cciss/c0d0: 299.9 GB, 299966445568 bytes
255 heads, 63 sectors/track, 36468 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/cciss/c0d0p1 * 1 16 128488+ 83 Linux
/dev/cciss/c0d0p2 17 36468 292800690 8e Linux LVM

Disk /dev/cciss/c0d1: 599.9 GB, 599932844032 bytes
255 heads, 32 sectors/track, 143596 cylinders
Units = cylinders of 8160 * 512 = 4177920 bytes


Disk /dev/cciss/c0d1 doesn't contain a valid partition table
El disco a trabajar es /dev/cciss/c0d1, y tal como lo dice el mensaje: No contiene una tabla de partición válida. Para comenzar, usamos nuevamente el comando fdisk de la siguiente forma (Se resaltan las opciones en negritas):
# /sbin/fdisk /dev/cciss/c0d1
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.

The number of cylinders for this disk is set to 143596.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help):n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-143596, default 1): 1
Last cylinder or +size or +sizeM or +sizeK (1-143596, default143596 ): 143596

Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): 83

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
No olviden la "w", de lo contrario los cambios no se escribirán en la tabla de particiones.

Ahora vamos a crear el sistema de archivos ext3 (o formatear, como normalmente se dice)
# /sbin/mkfs.ext3 -b 4096 /dev/cciss/c0d1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
73236480 inodes, 146467979 blocks
7323398 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
4470 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000


Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done


This filesystem will be automatically checked every 33 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
Ahora que el disco está particionado y formateado, el último paso es "montarlo", recordemos que el directorio donde deseo montar mi nuevo disco es /data02. Primero creamos el directorio /data02.

# mkdir /data02
Y luego editamos el archivo /etc/fstab para agregar la entrada (en azul):
/dev/vg_root/lv_root   /        ext3   defaults       1 1
/dev/vg_root/lv_tmp    /tmp     ext3   defaults       1 2
/dev/vg_root/lv_data01 /data01  ext3   defaults       1 2
/dev/vg_root/lv_usr    /usr     ext3   defaults       1 2
/dev/vg_root/lv_var    /var     ext3   defaults       1 2
LABEL=/boot            /boot    ext3   defaults       1 2
tmpfs                  /dev/shm tmpfs  defaults       0 0
devpts                 /dev/pts devpts gid=5,mode=620 0 0
sysfs                  /sys     sysfs  defaults       0 0
proc                   /proc    proc   defaults       0 0
/dev/vg_root/lv_swap            swap   swap defaults  0 0
/dev/cciss/c0d1        /data02  ext3   defaults       1 1
Después de crear la entrada, lo que resta es montar el disco:
# mount /data02
Verificamos que todo quedó bien:
# /bin/df -h
Filesystem                     Size Used Avail Use% Mounted on
/dev/mapper/vg_root-lv_root    2.0G 399M 1.5G   22% /
/dev/mapper/vg_root-lv_tmp     3.9G 137M 3.6G    4% /tmp
/dev/mapper/vg_root-lv_data01  250G 188M 237G    1% /data01
/dev/mapper/vg_root-lv_usr     5.9G 1.1G 4.5G   20% /usr
/dev/mapper/vg_root-lv_var     5.9G 292M 5.3G    6% /var
/dev/cciss/c0d0p1              122M  13M 103M   11% /boot
tmpfs                           16G     0 16G    0% /dev/shm
/dev/cciss/c0d1                550G 198M 522G    1% /data02

15 may 2012

Concatenar comandos en linux

Concatenar comandos:

con | hace que la salida del primero se convierta en la entrada del segundo.

[root@server ~]# cmd1 | cmd2

Con & hará que los dos (o más) comandos se ejecuten de manera simultanea.

[root@server ~]# cmd1 & cmd2

Con || El segundo comando se ejecutará si el primero termina sin éxito.

[root@server ~]# cmd1 || cmd2

Con && El segundo comando se ejecutará solo si el primero termina con éxito.

[root@server ~]# cmd1 && cmd2

Con ; El segundo comando se ejecutará sin importar el resultado del primero.

[root@server ~]# cmd1 ; cmd2

13 feb 2012

PHP vs. PYTHON vs. RUBY

16 ene 2012

httpd.conf VirtualHost Splitter

Sin duda, ser ordenados nos lleva a tener una mejor administración de los
recursos. Y más, si estamos hablando de una gran infraestructura de servidores Apache que alojan cientos de hosts virtuales.

Por esta razón he creado un script python el cual ayudará en ésta tarea. La filosofía fue la siguiente:


  1. Generar un archivo de configuración por cada VirtualHost, usando la directiva de Apache "ServerName" por ejemplo: "ServerName".conf 
  2. Guardar cada archivo creado en en nuevo directorio: /etc/httpd/vhosts/ 
  3. Incluir el nuevo directorio en la configuración principal de Apache: Include vhost/*.conf
  4. Finalmente, comentar todos los VirtualHosts del archivo de configuración principal. 
  5. Refrescar la configuración de Apache.
El script ejecuta algunos comandos de sistema, el primero respalda el
httpd.conf original por cualquiero cosa (no está de más). Y otros comandos cambian permisos de carpetas y archivos para poder ser usados con otros propósitos (Una interfaz Web)

Bien, aquí les dejo el script, espero sea de su utilidad.
#!/usr/bin/python
# AUTHORS:     ANGEL CABRERA, ALEJANDRO GUADARRAMA
# DATE:      11/01/2012
# DESCR:      HTTPD.CONF SPLITTER


import re, sys, os

vhost_dir = "/etc/httpd/vhost/"
os.system('cp -rp %s %s.bak' % (sys.argv[1], sys.argv[1]))
print "\nRespaldando configuracion actual..."

if os.path.exists(vhost_dir):
    print "\nYa existe el directorio ", vhost_dir, "\n"
else:
    print "\nCreando el directorio ", vhost_dir, "\n"
    os.makedirs(vhost_dir)
    os.chmod(vhost_dir,0775)

if len(sys.argv) == 1:
  print "Uso: split.py <httpd.conf>"
  sys.exit(1)

input = open(sys.argv[1], "rb")
p_include = re.compile(r"[I,i]nclude /etc/httpd/conf.d/vhosts/\*.conf")
p_comment = re.compile(r"[\s\t]*#.*")
p_begin = re.compile(r"<VirtualHost[^>]+>")
p_end = re.compile(r"</VirtualHost>")
p_server = re.compile(r"[S,s]erver[N,n]ame[\s\t]*(.*)")
file_name = "default"
found = False
commented = False
servers = {}
new_lines = []
archivo_comentado = []
n_total = 0
n_commented = 0
num_servers = 0
n_include = []
total_lineas = 0
iniciando = True
primer_host = 0

for line in input:
  total_lineas += 1
  if not found:
    i = p_include.search(line)
    if i:
      n_include.append(line)
    m = p_begin.search(line)
    if m:
      found = True
      if iniciando:
        primer_host = total_lineas
    iniciando  = False         
      file_name = "default"
      new_lines.append(line)
      m = p_comment.search(line)
      commented = False
      archivo_comentado.append("#"+line)
      if m:
        commented = True
  else:
    archivo_comentado.append("#"+line)
    new_lines.append(line)
    m = p_server.search(line)
    if m:
      file_name = m.group(1).strip()
    m = p_end.search(line)
    if m:
      found = False
      if num_servers == 0 and not commented:
    prefijo = "1_"
      else:
    prefijo = ""
      nombre_arch = vhost_dir+prefijo+file_name+".conf"
      if file_name in servers:
        servers[file_name] += 1
        file_name += "-%d" % servers[file_name]
      else:
        servers[file_name] = 0
      if commented:
        n_commented += 1
        print "Omitiendo virtual host... %s" % nombre_arch +"\n"
      else:
    num_servers += 1
        print "Creando virtual host... %s" % nombre_arch +"\n"
        output = open(nombre_arch, "wb")
        output.writelines(new_lines)
        output.close()
    os.chmod(nombre_arch,0664)
        new_lines = []
      n_total += 1

input.close()
os.system('chown -R root:reloadapache %s' % vhost_dir)
print "\n%d virtual hosts encontrados. %d comentados no creados| %d creados.\n" % (n_total, n_commented,num_servers)

arch = open(sys.argv[1], "rb")
contenido_original = arch.readlines()
arch.close()
del contenido_original[primer_host:(total_lineas+1)]

arch_modif = open(sys.argv[1], "w")
arch_modif.writelines(contenido_original)
arch_modif.writelines(archivo_comentado)
arch_modif.write("\nInclude vhost/*.conf\n")
arch_modif.writelines(n_include)
arch_modif.close()
os.system('/sbin/service httpd reload')
Nos vemos en la siguiente entrada!

16 nov 2011

Apache mod_status


El módulo de estado permite a un administrador averiguar qué tan bien está funcionando su servidor. Una página HTML presenta las estadísticas del servidor actual en una forma fácilmente legible. Se puede hacer que esta página se actualice automáticamente. Los datos recogidos son los siguientes:


  • El número solicitudes (request)
  • El número de procesos ociosos (idle)
  • La situación de cada proceso, el número de solicitudes que se han realizado y la cantidad total de bytes(*)
  • El total de accesos y la cantidad de bytes servidos (*)
  • El tiempo de inició del servidor y el tiempo que ha estado en funcionamiento
  • Promedios, dando el número de solicitudes por segundo, el número de bytes por segundo y el número promedio de bytes por solicitud (*)
  • El porcentaje actual de uso del CPU y el total por Apache (*)
  • Los hosts actuales y peticiones en trámite (*)
Las líneas marcadas con "(*)" sólo están disponibles si ExtendedStatus está activado. Verifique que la línea ExtendedStatus del archivo httpd.conf esté descomentada.

Habilitar la compatibilidad de Estado

Para habilitar los informes de estado sólo para los navegadores del dominio foo.com añadir este código a su httpd.conf.

<Location /server-status>
   SetHandler server-status

   Order Deny,Allow 
   Deny from all
   Allow from .foo.com
</Location>

Ahora puede acceder a las estadísticas del servidor mediante el uso de un navegador web para acceder a la página http://your.server.name/server-status

Actualizaciones automáticas

Usted puede hacer que la página de estado se actualice automáticamente si usted tiene un navegador que soporte "refresh". Acceder a la página http://your.server.name/server-status?refresh=N para actualizar la página cada N segundos.

Nota: Este ajuste se aplica a todo el servidor, y no puede ser activada o desactivada por host virtual. El uso de esta caracteristica de apache puede ralentizar el servidor.

27 oct 2011

Fedora 16 + Gnome 3.2: Eficiencia y Facilidad de uso.

El proyecto Fedora anunció que el próximo lanzamiento de Fedora 16 (Verne), incorporará la última versión del popular entorno de escritorio GNOME.

Fedora tiene como objetivo ofrecer la mejor tecnología de código libre y abierto, integrado en una distribución de Linux que cualquier persona puede descargar libremente, usar, modificar y redistribuir. El lanzamiento de Fedora 16 también incluirá nuevas funciones y mejoras para los usuarios finales, administradores, desarrolladores y entusiastas.

Fedora 16 incluirá GNOME 3.2 o GNOME Shell como se le llama comúnmente. El lanzamiento de GNOME 3.2 ofrece varias mejoras, se destacan:


  • Nuevo diseño para GDM, y el gestor de inicio de sesión de GNOME
  • Mejoras a la apariencia del escritorio, incluyendo barras de títulos más pequeños y ventanas que son más fáciles de cambiar el tamaño
  • Cuentas de usuario en línea para que sea más fácil interactuar con documentos, contactos, calendarios y gestionado por un proveedor en línea
  • Contactos, nueva aplicación para el seguimiento de los detalles de sus amigos y colegas
  • Documentos, nueva aplicación para encontrar, organizar y visualizar los documentos más utilizados
  • Mejoras en el teclado en pantalla y otras funciones de accesibilidad.

El Proyecto Fedora es un proyecto comunitario patrocinado por Red Hat.

Listo, nos vemos en la siguiente entrada.

11 oct 2011

Linux - Comando chmod (Parte 1)

El comando chmod en Linux/Unix se deriva de CHange MODe, y se utiliza para cambiar los permisos de archivos y carpetas.

Los permisos de Archivos/Carpetas son: lectura (r), escritura (w) y ejecución (x) y aplican para cada usuario (u), grupo (g) y otros (o).

Este tipo de restricción es útil para la correcta administración de archivos y carpetas, proporciona seguridad y nivel de acceso a archivos/carpetas.

Pero, ¿por qué necesitamos cambiar los permisos de archivos/carpetas ?
  1. Para ejecutar un script
  2. Cuando una aplicación requiere aceso a archivos/carpetas para trabajar adecuadamente
  3. Para dar la posibilidad a un usuario de editar un archivo.
¿Cómo podemos cambiar los persmisos de archivos/carpetas?

Los permisos pueden ser: ejecución, escritura y lectura y se pueden aplicar de dos formas:
  1. Método Numérico: Usando números (1, 2 y 4)
  2. Método Alfa: Usando caracteres (w, x, r, u, o, g, a, -, +, =, s, t
Método Numérico

2^0=1   -->  Ejecución  (x)
2^1=2   -->  Escritura  (w)
2^2=4   -->  Lectura     (r)

Método Alfa

w -  escritura
x  -  ejecución
r  -  lectura
u  -  usuario
g  -  grupo
o  -  otros
a  -  todos
+ -  agregar los permisos al usuario/grupo/otros mencionado
-   -  remover los permidos al usuario/grupo/otros mencionado
= -  replicar los permisos a otra clase de usuario/grupo/otros

Adicional a esto, hay otros conceptos que van ligados al método numérico y alfa (SUID, SGID, Sticky Bit). Mas adelante, en otro post explicaré esto. 

A continuación veremos como cambiar los permisos básicos a un archivo. Para esto, será necesario entender la salida del comando ls.

[angel@angelcm ~]$ ls -al
Total 36
-rw-------.  1 angel angel     39913 Oct 11 11:05 .bash_history
-rw-r--r--.  1 angel   500        18 Jun 22 08:49 .bash_logout
-rw-r--r--.  1 angel   500       193 Jun 22 08:49 .bash_profile
-rw-r--r--.  1 angel   500       124 Jun 22 08:49 .bashrc


La primer columna puede ser divida en dos partes, en negro - y en azul rw-r--r--.
  1. Tipo de archivo 
  2. Permisos para el archivo (dividido en tres partes)
    a) Permisos para el usuario: rw
    b) Permisos para el grupo: r
    c) Permisos para otros: r
Ejemplo usando el método numérico:

El archivo debe tener permisos de lectura, escritura y ejecución para el usuario, permisos de lectura y ejecución para el grupo y lectura y ejecución para otros.

Entonces:

permisos de lectura, escritura y ejecución para el usuario = 7
permisos de lectura y ejecución para el grupo = 5
permisos de lectura y ejecución para otros = 5

Los permisos serán 755

[angel@angelcm ~]$ chmod 755 archivo

Ejemplos usando el método alfa:

Ejemplo: asignando permisos de escritura al usuario

[angel@angelcm ~]$ chmod w+u archivo

Ejemplo: asignando permisos de escritura al grupo

[angel@angelcm ~]$ chmod w+g archivo

Ejemplo: asignando permisos de ejecución a otros.

[angel@angelcm ~]$ chmod x+o archivo

Ejemplo: asignando permisos de ejecución y escritura a todos.

[angel@angelcm ~]$ chmod xw+a archivo

 Ejemplo: removiendo permisos de ejecución a usuario.

[angel@angelcm ~]$ chmod u-x archivo

Ejemplo: replicando los permisos del usuario al grupo.

[angel@angelcm ~]$ chmod u=g archivo

Listo, nos vemos en la siguiente entrada.

6 oct 2011

News - Kernel.org fue hackeado (linux.com, linuxfoundation.org y mysql.com también)

El sitio web que hospeda el kernel Linux fue comprometido en su seguridad al haber sido vulnerado y tomado controles de root.

El ataque fue realizado el 12 de agosto pasado, y el 28 del mismo mes se pudieron notar los primeros problemas. Los más importantes fueron los que atacaron al sistema de credenciales digitales del protocolo SSH, dentro del equipo de desarrollo.

De cualquier manera desde la Linux Foundation salieron a tranquilizar las cosas:  “… no hay necesidad de preocuparse por la integridad del código fuente del kernel o de cualquier otro software alojado en los sistemas de kernel.org”,  palabra de Jonathan Corbet.


Lo mismo pasó con linux.com, linuxfoundation.org y mysql.com

Listo, nos vemos en la siguiente entrada.

22 sept 2011

Linux - Ejecutar comandos remotos con ssh


El comando ssh es un programa increíble. Se puede usar para abrir sesiones entre servidores o bien se puede usar para ejecutar comandos en un sistema remoto.

Un ejemplo sencillo sería para conocer el uso del disco duro de un servidor:

[angel@angelcm ~]$ ssh user@server ' /bin/df -h'
user@server's password: 
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_root-lv_root
                      2.0G  410M  1.5G  22% /
/dev/mapper/vg_root-lv_tmp
                      2.0G   70M  1.8G   4% /tmp
/dev/mapper/vg_root-lv_var
                      2.0G  378M  1.5G  21% /var
/dev/mapper/vg_root-lv_data01
                      6.7G  982M  5.4G  16% /data01
/dev/mapper/vg_data-lv_data02
                      247G   15G  219G   7% /data02
/dev/mapper/vg_root-lv_usr
                      3.0G  1.5G  1.3G  55% /usr
/dev/sda1             122M   13M  103M  11% /boot
tmpfs                 3.9G     0  3.9G   0% /dev/shm
[angel@angelcm ~]$ 

Esto es muy bueno, pero se vuelve más útil cuando "automatizamos" mediante el intercambio de llaves SSH, esto lo pueden aprender en otro post:

Mientras tanto, podemos ejecutar algunos otros comandos. Por ejemplo, para contar el número de procesos de apache que están corriendo en el servidor web. Todo lo que necesitamos hacer es escribir el comando entre comillas. El siguiente comando se conecta a un servidor web, luego lista todos los procesos ps -ef, después busca y cuenta las coincidencias con apache grep -c apach[e] :

[angel@angelcm ~]$ ssh user@server 'ps -ef | grep -c apach[e]'
34
[angel@angelcm ~]$

El resultado es 34 procesos de apache corriendo en el servidor.

También podemos mostrar algunas estádisticas sobre el uso de CPU del servidor:

[angel@angelcm ~]$ ssh user@server ' top -b -n 1 | head -n 8'
top - 10:15:40 up 117 days,  6:24,  2 users,  load average: 1.43, 1.52, 1.64
Tasks: 165 total,   1 running, 164 sleeping,   0 stopped,   0 zombie
Cpu(s): 10.2%us,  1.5%sy,  0.2%ni, 87.1%id,  0.1%wa,  0.3%hi,  0.7%si,  0.0%st
Mem:  16436872k total, 13376292k used,  3060580k free,   943720k buffers
Swap:  4194296k total,        0k used,  4194296k free,  5637000k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
16619 apache    15   0  350m  16m 5308 S 30.8  0.1   0:33.63 httpd              
[angel@angelcm ~]$

Para ver quien está loggeado en el servidor:

[angel@angelcm ~]$ ssh user@server 'who'
juanito   pts/0        2011-09-20 16:50 (10.177.65.41)
pepito    pts/1        2011-09-21 10:13 (10.177.65.209)
[angel@angelcm ~]$

Nuevamente, les recomiendo la lectura de los posts:

Listo, nos vemos en la siguiente entrada.

21 sept 2011

Linux - Sorry, you must have a tty to run sudo

Estaba intentando actualizar unos paquetes de forma remota con ssh, para lo que usé el siguiente comando:

[root@server ~]# ssh user@192.168.1.100 "sudo yum update httpd"

Pero recibí un mensaje de error:

Sorry, you must have a tty to run sudo

Solución.

Esto funciona en Fedora, RHEL y CEntOS.

[root@server ~]# ssh -t user@192.168.1.100 "sudo yum update httpd"

El switch '-t' nos permitirá interactuar mediante una TTY (terminal) tal como si estuvieramos de forma local en el servidor.

Listo, nos vemos en la siguiente entrada.

14 sept 2011

Red Hat - Cómo cambiar el password de root en MySQL (Red Hat, Fedora, CEntOS)

Odio decir "te lo dije", pero te lo dije. Aquí en la editorial administramos múltiples servidores MySQL, cientos de bases de datos y usuarios, de tal forma que debemos contar con una buena administración de passwords.

Muy a pesar de tener una buena administración de passwords, no estamos exentos de perder u olvidar una clave importante, cómo es la del usuario root de MySQL. Por esta razón, aquí les presento los pasos que debemos seguir para cambiar la clave, de verdad que esto es útil.

Este procedimiento aplica para Red Hat, Fedora, CEntOS.

1. Detener el proceso mysql

[root@server ~]# /etc/init.d/mysqld stop

2. Iniciar el proceso mysql con la opción --skip-grant-tables y --skip-networking , así no pedirá el password y no aceptará conexiones remotas a MySQL.

[root@server ~]# /usr/bin/mysqld_safe --skip-grant-tables --skip-networking &

3. Ingresar a MySQL con el usuario root.


[root@server ~]# mysql -u root

4. Actualizar el password de root (en este paso no olviden el uso de las comillas)


mysql> use mysql;
mysql> update user set password=PASSWORD('NUEVO_PASSWORD') where User='root';
mysql> flush privileges;
mysql> quit

5. Detener el proceso mysql

[root@server ~]# /etc/init.d/mysqld stop

6. Iniciar MySQL y probar con la nueva clave.

[root@server ~]# /etc/init.d/mysqld start
[root@server ~]# mysql -u root -p

Muy bien, nos vemos en la siguiente entrada.

13 sept 2011

Linux - Login SSH sin password

En mi estancia en GEE he encontrado que los desarrolladores crean scripts para distribuir archivos a los mirrors, haciendo una especie de mirroring "charro", pero con la magia de no requerir la intervención de un admin y, además, automático.

Supongamos que deseamos usar Linux y OpenSSH para automatizar algunas tareas (cómo la mencionada arriba). Por lo tanto, necesitamos hacer login desde un host "A" con Usuario "a" hacia el host "B" con Usuario "b", y cómo estamos usando ssh desde un script no deseamos introducir el password.

Manos a la obra:

Primero debemos hacer log in en "A" y generar las llaves de autenticación. No introducir passphrase:

a@A:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/angel/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/angel/.ssh/id_rsa.
Your public key has been saved in /home/angel/.ssh/id_rsa.pub.
The key fingerprint is:
dd:1a:a1:bf:28:02:2d:d1:ac:c8:94:7d:cd:7f:a7:28 a@A
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|  oo  o   .      |
| o..o. o o o     |
|o. +.   S o .    |
|..+ .    o + .   |
|   o      = o    |
|    . .E o o     |
|     . .o .      |
+-----------------+


Ahora usaremos ssh para crear el directorio ~/.ssh como el usuario "b" en "B" (el directorio ya puede existir):

a@A:~$ ssh b@B mkdir -p .ssh
b@B's password:


Finalmente agregamos la llave pública generada en "A" a b@B:.ssh/authorized_keys e introducir el password de "b" una vez más:

a@A:~$ cat .ssh/id_rsa.pub | ssh b@B 'cat >> .ssh/authorized_keys'
b@B's password: 
a@A:~$


A partir de este momento podremos hacer log in en "B" como "b" desde "A" sin password.

a@A:~$ ssh b@B
Last login: Thu May 19 12:23:06 2011 from 192.168.1.33
[b@B ~]$


También funciona para hacer scp (Secure Copy)

a@A:~$ touch test
a@A:~$ scp test b@B:.
test                                          100%    0     0.0KB/s   00:00    
a@A:~$


Genial!! Nos vemos en la siguiente entrada!!!

12 sept 2011

Fedora 15 - Instalar Lighttpd con PHP y MySQL

Lighttpd (pronunciado lighty) es un servidor web diseñado para ser rápido, seguro, flexible, y fiel a los estándares. Está optimizado para entornos donde la velocidad es muy importante, y por eso consume menos CPU y memoria RAM que otros servidores. Por todo lo que ofrece, lighttpd es apropiado para cualquier servidor que tenga problemas de carga.

En este tutorial usaremos el hostname servidor.dominio.com con la dirección IP 192.168.0.100 (ustedes usen su propia información)

1. Instalación de MySQL

# yum install mysql mysql-server

Ahora creamos los links de inicio para MySQL e iniciamos MySQL.

# chkconfig --levels 235 mysqld on
# /etc/init.d/mysqld start

Ahora continuamos con la post instalación de MySQL

# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): <-- ENTER
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n] <-- ENTER
New password: <-- Escribir el Password
Re-enter new password: <-- Confirmar el Password
Password updated successfully!
Reloading privilege tables..
 ... Success!

By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them.  This is intended only for testing, and to make the installation go a bit smoother.  You should remove them before moving into a production environment.

Remove anonymous users? [Y/n] <-- ENTER
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] <-- ENTER
 ... Success!

By default, MySQL comes with a database named 'test' that anyone can access.  This is also intended only for testing, and should be removed before moving into a production environment.

Remove test database and access to it? [Y/n] <-- ENTER
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far will take effect immediately.

Reload privilege tables now? [Y/n] <-- ENTER
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!

2. Instalación de Lighttpd

# yum install lighttpd



Ahora creamos los links de inicio para Lighttpd e iniciamos Lighttpd.

# chkconfig --levels 235 lighttpd on
# /etc/init.d/lighttpd start

Para comprobar que todo vaya bien, abrimos el navegador y nos dirigimos a http://192.168.0.100/ y veremos la página de inicio de Lighttpd.


En Fedora, el directorio default de Lighttpd es /var/www/lighttpd y el archivo de configuración /etc/lighttpd/lighttpd.conf.

3. Instalación de PHP5

Podemos hacer que PHP5 trabaje en Lighttpd por medio de FastCGI. Por tanto, instalamos los paquetes lighttpd-fastcgi y php-cli.

# yum install lighttpd-fastcgi php-cli

4. Configurando Lighttpd y PHP5.

Para habilitar PHP5 en Lighttpd, debemos modificar dos archivos, /etc/php.ini y /etc/lighttpd/lighttpd.conf. Primero abrimos /etc/php.ini descomentamos la línea cgi.fix_pathinfo=1:

[...]
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
cgi.fix_pathinfo=1
[...]


Luego abrimos /etc/lighttpd/lighttpd.conf y descomentamos "mod_fastcgi", en la sección server.modules:

[...]
server.modules              = (
#                               "mod_rewrite",
#                               "mod_redirect",
#                               "mod_alias",
                                "mod_access",
#                               "mod_trigger_b4_dl",
#                               "mod_auth",
#                               "mod_status",
#                               "mod_setenv",
                                "mod_fastcgi",
#                               "mod_proxy",
#                               "mod_simple_vhost",
#                               "mod_evhost",
#                               "mod_userdir",
#                               "mod_cgi",
#                               "mod_compress",
#                               "mod_ssi",
#                               "mod_usertrack",
#                               "mod_expire",
#                               "mod_secdownload",
#                               "mod_rrdtool",
                                "mod_accesslog" )
[...]

Luego, mas abajo en el archivo existe una sección fastcgi.server y descomentamos como se muestra a continuación:

[...]
#### fastcgi module
## read fastcgi.txt for more info
## for PHP don't forget to set cgi.fix_pathinfo = 1 in the php.ini
fastcgi.server             = ( ".php" =>
                               ( "localhost" =>
                                 (
                                   "socket" => "/var/run/lighttpd/php-fastcgi.socket",
                                   "bin-path" => "/usr/bin/php-cgi"
                                 )
                               )
                            )
[...]

Luego reiniciamos Lighttpd:

# /etc/init.d/lighttpd restart

5. Probar la instalación.

En el document root /var/www/lighttpd creamos un archivo PHP (info.php) y lo invocamos desde el navegador:

# cd /var/www/lighttpd
# vi info.php

<?php
phpinfo();
?>

Al invocar el archivo desde el navegador http://192.168.1.100/info.php, veremos:


Como podemos observar, PHP está trabajando, y lo está haciendo vía FastCGI como lo indica la línea Server API.

6. Instalación de MySQL y soporte con PHP5.

Para dar soporte MySQL en PHP solo necesitamos el paquete php-mysql. Es buena idea instalar algunos otros modulos de acuerdo a nuestras necesidades, por ejemplo:

# yum install php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc

Por último, reiniciar Lighttpd:

# /etc/init.d/lighttpd restart

Ahora refrescamos la página http://192.168.1.100/info.php y validamos los nuevos módulos instalados.


Listo, nos vemos en la siguiente entrada.