Tips Apache: ver configuración desde la línea de comandos

Apache Web Server

A veces queremos saber algunas cosas de la configuración de Apache, pero no queremos revisar el httpd.conf ni seguir sus includes. El binario httpd acepta algunos parámetros que nos pueden servir, proveyéndonos esa información. Dejo un par de ejemplos.

Verificar sintaxis de los archivos de configuración

Muy facilmente podemos pedirle al Apache que verifique la sintaxis de los archivos de configuración. Esto es útil por si hicimos una modificación de la que no estamos seguros y queremos verificarla antes de reiniciar el servicio (y dejar a los clientes sin servicio hasta que lo resolvamos).

Comando:

httpd -t

Salida:

Syntax OK

Obtener versión de Apache

La más sencilla y obvia, para ver la versión de Apache sólo basta con:

httpd -v

Y la salida es algo así:

Server version: Apache/2.2.14 (Unix)
Server built:   Jan 28 2010 12:43:06

Ver información de compilación

Eventualmente podemos querer tener algunos datos sobre cómo fue compilado Apache.
Esta es una versión más completa de lo que ofrece httpd -v.
Entre otros datos, nos sirve para saber qué módulo de MPM está usando Apache.

Comando:

httpd -V

Salida:

Server version: Apache/2.2.14 (Unix)
Server built:   Jan 28 2010 12:43:06
Server's Module Magic Number: 20051115:23
Server loaded:  APR 1.3.9, APR-Util 1.3.9
Compiled using: APR 1.3.9, APR-Util 1.3.9
Architecture:   32-bit
Server MPM:     Prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/prefork"
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=128
 -D HTTPD_ROOT="/etc/httpd"
 -D SUEXEC_BIN="/usr/sbin/suexec"
 -D DEFAULT_PIDLOG="/var/logs/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_LOCKFILE="/var/logs/accept.lock"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

Ver módulos

Hay dos alternativas diferentes para ver los módulos. Por un lado podemos ver todos los módulos que están compilados con Apache. Por otro lado, podemos ver todos los módulos que carga Apache (esto incluye módulos compilados aparte).

Módulos compilados

httpd -l

Esto no muestra el listado de módulos compilados en el binario de Apache:

Compiled in modules:
  core.c
  mod_authn_file.c
  mod_authn_default.c
  mod_authz_host.c
  mod_authz_groupfile.c
  mod_authz_user.c
  mod_authz_default.c
  mod_auth_basic.c
  mod_include.c
  mod_filter.c
  mod_deflate.c
  mod_log_config.c
  mod_logio.c
  mod_env.c
  mod_headers.c
  mod_unique_id.c
  mod_setenvif.c
  mod_version.c
  mod_proxy.c
  mod_proxy_connect.c
  mod_proxy_ftp.c
  mod_proxy_http.c
  mod_proxy_scgi.c
  mod_proxy_ajp.c
  mod_proxy_balancer.c
  mod_ssl.c
  prefork.c
  http_core.c
  mod_mime.c
  mod_dav.c
  mod_status.c
  mod_autoindex.c
  mod_asis.c
  mod_suexec.c
  mod_cgi.c
  mod_dav_fs.c
  mod_dav_lock.c
  mod_negotiation.c
  mod_dir.c
  mod_actions.c
  mod_userdir.c
  mod_alias.c
  mod_rewrite.c
  mod_so.c

Módulos cargados:

httpd -M

Así veremos todos los módulos que carga Apache:

Loaded Modules:
 core_module (static)
 authn_file_module (static)
 authn_default_module (static)
 authz_host_module (static)
 authz_groupfile_module (static)
 authz_user_module (static)
 authz_default_module (static)
 auth_basic_module (static)
 include_module (static)
 filter_module (static)
 deflate_module (static)
 log_config_module (static)
 logio_module (static)
 env_module (static)
 headers_module (static)
 unique_id_module (static)
 setenvif_module (static)
 version_module (static)
 proxy_module (static)
 proxy_connect_module (static)
 proxy_ftp_module (static)
 proxy_http_module (static)
 proxy_scgi_module (static)
 proxy_ajp_module (static)
 proxy_balancer_module (static)
 ssl_module (static)
 mpm_prefork_module (static)
 http_module (static)
 mime_module (static)
 dav_module (static)
 status_module (static)
 autoindex_module (static)
 asis_module (static)
 suexec_module (static)
 cgi_module (static)
 dav_fs_module (static)
 dav_lock_module (static)
 negotiation_module (static)
 dir_module (static)
 actions_module (static)
 userdir_module (static)
 alias_module (static)
 rewrite_module (static)
 so_module (static)
 python_module (shared)
 evasive20_module (shared)
 qos_module (shared)
 php5_module (shared)
Syntax OK

Aquí se puede notar la diferencia entre los módulos compilados con el Apache (linkeados como ‘static’) y los compilados como objetos compartidos que se cargan en tiempo de ejecución (‘shared’).

Ver virtual hosts

También podemos ver todos los virtual hosts que están configurados en el Apache.

httpd -S

Esto nos va a mostrar una lista como esta:

VirtualHost configuration:
1.1.1.1:80       is a NameVirtualHost
         default server localhost (/etc/httpd/conf/extra/httpd-vhosts.conf:29)
         port 80 namevhost localhost (/etc/httpd/conf/extra/httpd-vhosts.conf:29)
         port 80 namevhost www.midominio.com (/usr/local/directadmin/data/users/usuario/httpd.conf:11)
1.1.1.1:443      is a NameVirtualHost
         default server localhost (/etc/httpd/conf/extra/httpd-vhosts.conf:38)
         port 443 namevhost localhost (/etc/httpd/conf/extra/httpd-vhosts.conf:38)
         port 443 namevhost www.midominio.com (/usr/local/directadmin/data/users/usuario/httpd.conf:48)

En el ejemplo vemos un hipotético servidor (usando Directadmin) con IP 1.1.1.1, y los virtual hosts para el puerto 80 y el 443, tanto los default como los que corresponden al dominio “www.midominio.com” del usuario llamado “usuario”.

Nota sobre diferentes distribuciones

El artículo lo escribí pensando en CentOS y otras distros donde el binario de Apache se llama httpd. En Debian y sus derivados, el binario es apache o apache2. Todos los comandos que comenté acá se pueden correr invocando esos binarios o apachectl (que en algunos casos puede ser apache2ctl).

Apache Subversion

Me entero leyendo VivaLinux que después de haber sido “incubado” desde finales del año pasado en la Apache Software Foundation (ASF), el sistema de control de versiones centralizado de Subversion (SVN) finalmente ya es oficialmente un proyecto de primer nivel en la prestigiosa organización sin fines de lucro.

El 17 de febrero, un comité de directores de la ASF así lo votó. La comunidad de SVN se apresuró a festejarlo poco después. El nuevo hogar de Subversion ahora puede encontrarse en subversion.apache.org.

Queda abierta la pregunta de Cristian, si con esta incorporación ¿se está convirtiendo Apache en el cementerio de elefantes de los proyectos de código abierto?

Apache: 15 años

Un 23 de Febrero, pero del año 1995, nacía Apache, el servidor HTTP multiplataforma y de código abierto más usado en el mundo.

En sus inicios, Apache consistía solamente en un conjunto de parches a aplicar al servidor de NCSA, pero luego su código fue reescrito por completo.

Dicen que su nombre se debe a que querían que tuviese la connotación de algo que es firme y enérgico pero no agresivo, y la tribu Apache fue la última en rendirse al que pronto se convertiría en gobierno de EEUU, y en esos momentos la preocupación de su grupo era que llegasen las empresas y “civilizasen” el paisaje que habían creado los primeros ingenieros de internet.

En el blog de la Fundación Apache, comentan hoy el aniversario y relatan un poco su historia.

Tomado de Ubuntips.

Aburrido en San Valentín

Python

Mientras algunos salían a divertirse y celebrar el amor en San Valentín, algunos estabamos aburridos en casa, estudiando. Y como estaba aburrido de estudiar, hice este pequeño (y muy estúpido script) en Python que comparto con ustedes.

Lo que hace es buscar la cantidad de apariciones de una palabra/frase en el código de una página web. Pero no busca que exista exactamente esa cadena en el texto, sino que va buscando que aparezcan en orden las letras que componen esa palabra. Por ejemplo, si uno busca “abc” en la cadena “había una vez una casa”, el script va a tomar las letras que marqué en negrita para decir que “abc” existe una vez en la cadena.

¿Y dónde está el amor?

Hasta el momento, San Valentín no entró en la ecuación. Bueno, justamente la idea me surgió para ver cuántas veces una página decía “te amo” y “te odio”. Antes de que se lo pregunten: no, no estaba drogado ni pensando en amores perdidos. De hecho creo que se me ocurrió en el baño jaja.

A continuación, el script:

#!/usr/bin/env python
import sys
import urllib2

if len(sys.argv) < 3:
    print "Please provide a URL an a string to search"
    print "Example: %s ‘http://www.microsoft.com’ ‘i hate u’" % sys.argv[0]
    sys.exit(1)
url = sys.argv[1]
phrase = sys.argv[2]
c = 0
stack = list(phrase)
stack2 = []
string = urllib2.urlopen(url).read()
needle = stack.pop(0)
for char in string:
    if char == needle:
        stack2.append(needle)
        if stack:
            needle = stack.pop(0)
        else:
            stack = stack2
            stack2 = []
            needle = stack.pop(0)
            c = c + 1
print "The URL ‘%s’  says ‘%d’ times ‘%s’" % (url, c, phrase)

Alternativamente, si quieren ignorar los espacios en la cadena a buscar (por ejemplo en “te amo”), es cuestión de reemplazar la línea 12 por esto:

stack = list(phrase.replace(" ", ""))

Y ahora, el ejemplo analizando la página principal de este blog:

$ python valentine.py "http://www.tail-f.com.ar" "te amo"
The URL 'http://www.tail-f.com.ar'  says '238' times 'te amo'
$ python valentine.py "http://www.tail-f.com.ar" "te odio"
The URL 'http://www.tail-f.com.ar'  says '166' times 'te odio'

Parece que este blog está inspirado por más sentimientos de amor que de odio jajaja.

mod_wsgi + Python 2.6 en CentOS

Python

Hace algún tiempo publiqué un artículo donde explicaba cómo instalar mod_python con Python 2.6 en CentOS, por el problemita que tiene yum que no funciona con la última versión de Python. Pues bien, últimamente por lo que he venido leyendo, una alternativa mejor a mod_python es mod_wsgi, pues aparentemente funciona bastante mejor, más rápido y es la opción recomendada para usar con Apache y Django.

Por lo tanto, dejo esta guía muy sencilla de cómo instalar mod_wsgi con Python 2.6 en CentOS.

Descargar mod_wsgi, descomprimir y configurar

# cd /usr/src
# wget http://modwsgi.googlecode.com/files/mod_wsgi-3.1.tar.gz
# tar zxvf mod_wsgi-3.1.tar.gz
# cd mod_wsgi-3.1
# ./configure --with-python=/usr/bin/python2.6

Esa última línea es la clave para que utilice la instalación correcta de Python (ver el artículo anterior para saber cómo instalar Python 2.6 sin pisar la versión actual).

Luego compilamos e instalamos

# make && make install

Agregamos la línea para cargar el módulo en el httpd.conf

LoadModule wsgi_module        lib/apache/mod_wsgi.so

Y reiniciamos el Apache

service httpd restart

Luego para configurar un virtual host para que utilice mod_wsgi no es tan sencillo, pero tampoco es demasiado complicado. Básicamente hay que generar un archivo .wsgi, que no es más que un archivo Python que va a ser el que se integre con mod_wsgi y luego configurarlo en el httpd.conf. Lo que hay que tener en cuenta es que mod_wsgi no sirve contenido estático, por lo cual uno debe configurar por un lado el handling del código python y por otro los archivos estáticos. Si bien es algo distinto a lo que solemos hacer con mod_php, es algo bastante lógico y es una buena práctica pensar en servir por separado el contenido dinámico y el estático.

Como es un poco complejo, lo mejor es leer la guía correspondiente. En el sitio de mod_wsgi van a ver que hay mucha documentación. Particularmente, la guía de integración con Django es muy útil.