# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

Cómo compilar Apache y PHP en Linux

En este artículo voy a explicar los pasos básicos para compilar Apache y PHP (con soporte para MySQL y otros módulos) en GNU/Linux, concretamente bajo RHEL, aunque se puede aplicar a cualquier distribución (CentOS, Fedora, Debian, etc).

Lo primero que tenemos que comprobar es que tengamos instalados los compiladores necesarios (C / C++…) para poder empezar a trabajar, en RHEL y CentOS podemos instalarlos por yum, y en Debian y similar por apt:

# yum install gcc gcc-c++ autoconf make automake

Compilar Apache

Para compilar Apache lo primero que debemos hacer es bajarnos las fuentes de la versión que queramos instalar. En este caso vamos a bajar la última versión estable de la rama 2.2, la 2.2.17:

# wget http://apache.rediris.es//httpd/httpd-2.2.17.tar.gz

Descomprimimos (podéis hacerlo en el directorio /usr/src/ destinado a las fuentes o en donde más rabia os dé):

#  tar -xzvf httpd-2.2.17.tar.gz

Nos ubicamos en la ruta donde hayamos descomprimido las fuentes:

# cd /usr/src/httpd-2.2.17

Ya estamos listos para comenzar a configurar nuestra instalación. El primer paso de toda compilación es el script configure, básicamente es el momento en el que podemos personalizar como queramos nuestra instalación (lugar donde instalar apache, módulos a compilar, cómo cargar esos módulos, etc) también se realizan ciertos chequeos para verificar que la compilación se puede realizar correctamente.

Para ver todas las posibilidades que nos ofrece la configuración, siempre tendremos que ejecutar la ayuda, resultaría tedioso explicar aquí todas las opciones de compilación así que nos vamos a centrar en una instalación básica, para personalizar vuestras instalaciones:

# ./configure --help

Bien, en nuestro caso la línea de configure va a ser la siguiente:

# ./configure --prefix=/usr/local/apache --enable-headers --enable-rewrite --enable-expires --enable-so --disable-authz-default
  • –prefix=<ruta> será la ruta en la que vamos a instalar Apache, en este caso /usr/local/apache.
  • –enable-MODULO: para la activación de módulos utilizamos este parámetro. En la línea de configuración vemos que hemos activado mod_rewrite, mod_headers y mod_expires. Si no especificamos nada, los módulos se cargan de forma estática, para cargarlos de forma dinámica (DSO, explicado en el siguiente punto) utilizamos –enable-MODULO=shared.
  • –enable-so Permitimos a Apache cargar módulos compartidos (Dynamic Shared Object (DSO)), php será uno de ellos. Esta opción también nos permitirá añadir nuevos módulos sin necesidad de recompilar y de forma dinámica (añadiendo simplemente el módulo mediante “Load Module” en la configuración). Los modulos que añadamos a través de esta línea de compilación, y sin especificar shared se instalarán de forma estática.
  • –disable-MODULO: He puesto un ejemplo de deshabilitar un módulo en la línea de compilación para que veáis que se pueden deshabilitar módulos (por defecto Apache carga algunos módulos que quizás no te interesen), en el ejemplo desactivamos authz-default

Una vez que tengamos claro que queremos y que no queremos instalar, podemos construir nuestra compilación, para ello simplemente ejecutamos make (según la cantidad de módulos que hayas configurado le puede costar un rato, puedes ir a tomar un café mientras ;) ):

# make

Y una vez que haya terminado, finalizamos la compilación e instalamos apache:

# make install

Cuando haya terminado ya podemos probar nuestra instalación de apache, lo arrancamos:

# /usr/local/apache/bin/apachectl start

Si accedemos vía web, por ejemplo desde la IP del servidor o el host que tenga configurado, deberíamos visualizar lo siguiente:

It works!

Cómo actualizar Apache

La actualización por compilación de fuentes es bastante sencilla. Simplemente tendríamos que seguir este mismo proceso, pero en el punto del configure apache nos lo pone más fácil. En la ruta /usr/local/apache/build encontraréis un fichero llamado config.nice que guarda vuestros parámetros de compilación, con lo que podéis usar dicho fichero en lugar de crear un nuevo configure. El proceso sería entonces, bajar las fuentes de la nueva versión y:

# ./config.nice
# make
# make install

Nota: Los ficheros de configuración, logs y documentos no se sobreescribirán durante la actualización.

Compilar PHP

Ahora que ya tenemos Apache funcionando, es hora de instalar PHP. Vamos a seguir el mismo procedimiento que para compilar Apache. En este caso vamos a instalar PHP con soporte para MySQL y algún otro módulo que veremos más adelante.

Empezamos descargando las fuentes desde el sitio web de PHP. En este caso la última versión estable de la rama 5.3, la 5.3.6. De nuevo nos colocamos en el directorio src o donde queráis trabajar mientras instalamos:

# cd /usr/sr
# wget http://es2.php.net/get/php-5.3.6.tar.gz/from/es.php.net/mirror

Descomprimimos y nos colocamos dentro del directorio:

# tar -xzvf php-5.3.6.tar.gz
# cd php-5.3.6

Ahora, al igual que con Apache llega el momento de crear la línea de configuración, el configure. Del mismo modo podemos seleccionar la ruta de instalación, los módulos y una buena cantidad de parámetros para personalizar nuestra instalación. Es imprescindible pues revisar la ayuda:

# ./configure --help

Una vez que tenemos claro que y como queremos instalar, comenzamos con el configure:

# ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php --with-apxs2=/usr/local/apache/bin/apxs --with-mysql --enable-ftp --disable-pdo --disable-ctype

Pasamos a explicar esta línea de configure:

  • –prefix: al igual que con Apache especificamos la ruta en la que instalaremos php.
  • –with-config-file-path: especificamos la ruta donde se encontrará el fichero de configuración php.ini.
  • –with-apxs2: como vamos a compilar php como módulo dinámico (DSO) updatede apache especificamos la ruta a apxs.
  • –with-libxml2: para evitar el error provocado porque la compilación no encuentra xml2-config necesitaremos tener instalado libxml2-devel (yum install libxml2-devel. El error es configure: error: xml2-config not found. Please check your libxml2 installation.
  • –with-mysql: habilitamos soporte para MySQL. Por supuesto, antes de habilitar cualquier extensión, si depende de algún programa hay que instalarlo antes, en este caso el cliente MySQL y las headers (paquete devel):
    yum install mysql mysql-devel
  • –enable-ftp: habilitamos soporte para FTP. Podemos habilitar cualquier otro módulo con –enable-MODULO
  • –disable-pdo: deshabilitamos el soporte para PDO. Podemos deshabilitar cualquier otro módulo con –disable-MODULO

Una vez seleccionados los módulos a instalar y las opciones correspondientes podemos comenzar a compilar (puede tardar un rato):

# make

Si todo ha ido bien y no hemos recibido errores podemos finalizar la instalación:

# make install

Una vez instalado automáticamente habrá añadido la carga del módulo en nuestra configuración de apache (fichero httpd.conf):

LoadModule php5_module modules/libphp5.so

Ahora solo nos queda indicar a Apache como tiene que interpretar los ficheros php, tenemos que añadir la siguiente línea dentro del fichero httpd.conf. Podemos añadirla junto a los demás AddType, buscadlos y colocadla debajo:

AddType application/x-httpd-php .php

Ahora solo queda reiniciar apache y verificar el funcionamiento de php. Antes comprobamos que la sintaxis del fichero de configuración httpd.conf es correcta:

# /usr/local/apache/bin/apachectl configtest
Syntax OK

Reiniciamos apache:

# /usr/local/apache/bin/apachectl restart

Podemos crear un fichero de pruebas en php para verificar todos los parámetros y módulos de la instalación de php, el contenido es el siguiente:

<? phpinfo(); ?>

Lo colocamos en el DocumentRoot por defecto, en nuestro caso es /usr/local/apache/htdocs y lo ejecutamos desde el navegador, el resultado es el siguiente, ya tenemos Apache y php operativo:

php 5.3.6

Configurar Apache como Reverse Proxy (Proxy Inverso)

reverse proxy

Reverse Proxy / Proxy inverso

Un reverse proxy es un servidor proxy instalado en el domicilio de uno o más servidores web. Todo el tráfico entrante de Internet y con el destino de uno de esos servidores web pasa a través del servidor proxy. Hay varias razones para instalar un “reverse proxy”:

  • Seguridad: el servidor proxy es una capa adicional de defensa y por lo tanto protege los servidores web.
  • Cifrado / Aceleración SSL: cuando se crea un sitio web seguro, habitualmente el cifrado SSL no lo hace el mismo servidor web, sino que es realizado por el “reverse proxy”, el cual está equipado con un hardware de aceleración SSL (Security Sockets Layer).
  • Distribución de Carga: el “reverse proxy” puede distribuir la carga entre varios servidores web. En ese caso, el “reverse proxy” puede necesitar reescribir las URL de cada página web (traducción de la URL externa a la URL interna correspondiente, según en qué servidor se encuentre la información solicitada).
  • Caché de contenido estático: Un “reverse proxy” puede descargar los servidores web almacenando contenido estático como imágenes u otro contenido gráfico.

Definición Wikipedia

Configurando Apache como Reverse Proxy

Para poder utilizar el propio servidor web Apache como Proxy inverso, debemos tener compilados una serie de módulos. Los módulos básicos necesarios son los siguientes: mod_proxy, mod_proxy_http, mod_proxy_ftp, mod_proxy_connect, mod_proxy_html, mod_xml2enc y mod_headers.

Lo primero que deberíamos hacer es revisar cuales de estos módulos ya están compilados en nuestro servidor web apache, para ello al pasamos al binario httpd el parámetro

-l

:

# httpd -l

  mod_headers.c
  mod_proxy.c
  proxy_connect.c
  proxy_ftp.c
  proxy_http.c

En este caso vemos que varios de ellos ya están compilados, hay que decir que mod_proxy integra el resto que véis ( proxy_connect, proxy_ftp y proxy_http). En caso de no tener mod_proxy compilado, deberíais hacerlo a través de la línea de compilación, y en caso de haber instalado apache por gestor de paquetes (yum, apt, etc) deberíais instalar el módulo correspondiente.

Partiendo entonces de la base que tenemos mod_proxy compilado, ahora deberíamos preparar los módulos mod_proxy_html y mod_xml2enc, que permiten reescribes las URLs en formato HTML (tipo mod_rewrite) hacia la ruta del proxy y dar soporte internacional (i18n) respectivamente.

Ámbos módulos se pueden descargar desde http://apache.webthing.com/mod_proxy_html/, una vez descargados podemos añadirlos a apache de forma sencilla mediante apxs de forma dinámica (DSO). Nos ubicamos en la carpeta en la que se encuentren los ficheros mod_proxy_html.c y mod_xml2enc.c y ejecutamos el siguiente comando (puede variar según ruta de apxs):

# /usr/local/apache/bin/apxs -I . -cia mod_proxy_html.c  mod_xml2enc.c

Es posible que encontréis un problema relacionado con libxml, es debido a que para compilar el módulo se necesitan dichas librerías. Podéis hacer un include a dichas librerías con el parámetro -L o directamente hacer un enlace simbólico de forma temporal:

# /usr/local/apache/bin/apxs -L /usr/include/libxml2/libxml/ -I . -cia mod_proxy_html.c  mod_xml2enc.c

O el enlace simbólico:

# ln -s /usr/include/libxml2/libxml/ .

Tras realizar este paso de forma satisfactoria, en nuestro fichero de configuración de Apache httpd.conf deberían aparecer como cargados ámbos módulos:

LoadModule proxy_html_module  modules/mod_proxy_html.so
LoadModule xml2enc_module     modules/mod_xml2enc.so

Ahora añadimos también la carga del módulo xml:

LoadFile  /usr/lib/libxml2.so
LoadModule proxy_html_module  modules/mod_proxy_html.so
LoadModule xml2enc_module     modules/mod_xml2enc.so

Este paso finalizaría la parte de compilación/instalación. Para la configuración es recomendable revisar todas las directivas posibles en la documentación oficial de apache. Nosotros vamos a configurar un ejemplo sencillo. Vamos a hacer que al acceder a http://rm-rf.es/google se acceda a google.es mediante proxy inverso.

Vamos a desactivar lo primero el Forward Proxy porque no lo utilizamos, podemos añadir la siguiente directiva seguido de los LoadModule anteriores:

ProxyRequests Off

El virtualhost con el proxy inverso configurado quedaría de esta forma:

<VirtualHost *:80>
ServerName rm-rf.es
DocumentRoot /xxx/xxx/xxx
ServerAdmin xxx@xxxx
UseCanonicalName Off
CustomLog /xxxxx
ScriptAlias /xxxxx

<Location /google>
        SetOutputFilter proxy-html
        ProxyPass         http://google.es/
        ProxyHTMLURLMap         http://google.es /google
        ProxyPassReverse         http://google.es
        RequestHeader unset Accept-Encoding
</Location>

</VirtualHost>

Como veis, hemos añadido una nueva ubicación “Location” dentro del Virtualhost para especificar que ese es el punto desde el que se servirán las peticiones desde el proxy. Posteriormente mapeamos mediante ProxyPass la URL local contra la URL remota. La directiva ProxyPassReverse permite a apache ajustar la URL en las cabeceras HTTP Location, Content-Location y URI, mientras que ProxyHTMLURLMap es la directiva utilizada para hacer el rewrite de los enlaces HTML.

Finalmente hacemos un graceful o un syntax check (-t) a apache para recargar las configuraciones y verificar si el funcionamiento es correcto. Esta es una configuración básica de como utilizar mod_proxy para servir contenido, vuelvo a recomendar la revisión de la documentación para sacar el máximo partido a este servicio. Quizás en otro artículo explique como configurar este proxy reverso para servir contenido mediante SSL y otras curiosidades más.

Información sobre apache desde línea de comandos

Siguiendo el hilo de la Información sobre PHP desde línea de comandos hoy vamos a ver las posibilidades que nos ofrece el servidor web Apache en la línea de comandos:

En primera instancia revisamos si el binario httpd se encuentra en nuestro path o si debemos llamar a su ruta completa:

# whereis httpd
httpd: /usr/sbin/httpd /etc/httpd

En este caso podemos llamarlo directamente con “httpd”, vamos a ver algunas opciones que nos permiten sacar información sobre el servidor web:

Mostrar la versión de Apache:

# httpd -v
# httpd -v
Server version: Apache/X.X.XX
Server built:   Sep 21 2009 09:57:47

Mostrar información y ajustes de la compilación:

Como véis también muestra la información que sacábamos con httpd -v:

# httpd -V
Server version: Apache/X.X.XX
Server built:   Sep 21 2009 09:57:47
Server's Module Magic Number: ...
Server loaded: ...
Compiled using:  ...
Architecture:   32-bit
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/prefork"
 -D APR_HAS_SENDFILE
...
...

Mostrar módulos compilados:

# httpd -l
Compiled in modules:
  core.c
  mod_access.c
  mod_auth.c
  mod_include.c
  mod_log_config.c
  mod_logio.c
  mod_env.c
  mod_expires.c
...
...

Ejecutar una revisión de sintaxis para los ficheros de configuración:

# httpd -t
Syntax OK

Listar las directivas de configuración disponibles:

# httpd -L
Directory (core.c)
	Container for directives affecting resources located in the specified directories
	Allowed in *.conf only outside...
	Container for directives affecting resources accessed through the specified URL paths
	Allowed in *.conf only outside ...
VirtualHost (core.c)
	Container to map directives to a particular virtual host, takes one or more host addresses
	Allowed in *.conf only outside ..
Files (core.c)
...
...

Especificar un fichero de configuración alternativo:

# httpd -f fichero

Especificar un ServerRoot alternativo:

# httpd -d directorio

Listar las opciones en línea de comandos:

# httpd -h
Usage: /usr/local/apache/bin/httpd [-D name] [-d directory] [-f file]
                                   [-C "directive"] [-c "directive"]
                                   [-k start|restart|graceful|stop]
                                   [-v] [-V] [-h] [-l] [-L] [-G] [-t] [-S]
Options:
  -D name           : define a name for use in  directives
  -d directory      : specify an alternate initial ServerRoot
  -f file           : specify an alternate ServerConfigFile
  -C "directive"    : process directive before reading config files
  -c "directive"    : process directive after reading config files
  -e level          : show startup errors of level (see LogLevel)
  -E file           : log startup errors to file
  -v                : show version number
  -V                : show compile settings
  -h                : list available command line options (this page)
  -l                : list compiled in modules
  -L                : list available configuration directives
  -G                : list available configuration directives after loading conf file
  -t -D DUMP_VHOSTS : show parsed settings (currently only vhost settings)
  -S                : a synonym for -t -D DUMP_VHOSTS
  -t                : run syntax check for config files

Apache cPanel: UserDir “enable” keyword requires a list of usernames

En servidores web con cPanel y versiones 11.25.0-RELEASE_42399 y 11.25.0-CURRENT_42399 se ha detectado un problema de configuración que provoca errores de sintaxis en apache con mod_userdir tweak activado. El error que encontraréis en los logs al reiniciar apache es:

UserDir “enable” keyword requires a list of usernames

También veréis que las nuevas cuenta redireccionan siempre a defaultwebpage.cgi El problema se soluciona reconstruyendo la configuración de apache en el servidor, desde línea de comandos ejecutad:

/scripts/rebuildhttpdconf
/scripts/restartsrv_httpd

también:

/scripts/autorepair userdir_enable_fix
/scripts/restartsrv_httpd

O desde WHM:

Service Configuration -> Apache Configuration -> Global Configuration -> Save -> Rebuild Configuration and Restart Apache

Otra forma es actualizar la versión de cPanel a la 11.25.0-CURRENT_42400 o 11.25.0-RELEASE_42400:

/scripts/upcp

Comprobar funcionamiento servidor web vía TELNET

Seguimos con las comprobaciones a través de TELNET de los diferentes servicios que nos encontramos normalmente en un servidor. Ayer vimos como hacer pruebas contra un servidor SMTP, y hoy vamos a hacerlo contra un servidor web, concretamente contra un servidor web bajo Apache y otro bajo IIS, aunque el modo de operar es el mismo y muy sencillo.

Simplemente conectamos al servidor/host vía TELNET a través del puerto 80:

$ telnet www.apache.org 80
Trying 192.87.106.226...
Connected to www.apache.org.
Escape character is '^]'.

Ya estamos dentro, lo que es una buena señal, ahora vamos a lanzar una petición HTTP (HTTP/1.0, HTTP/1.1) en la que solicitamos solamente las cabeceras (HEAD) de la misma. Si quisieramos solicitar el documento completo en vez de HEAD utilizaríamos GET.

Nota: Hay que presionar ENTER dos veces tras escribir la petición HEAD/GET:

Ejemplo de un servidor Apache con respuesta correcta:

$ telnet www.apache.org 80
Trying 192.87.106.226...
Connected to www.apache.org.
Escape character is '^]'.
HEAD / HTTP/1.0

HTTP/1.1 200 OK
Date: Fri, 02 Oct 2009 09:26:01 GMT
Server: Apache/2.2.12 (Unix) mod_fcgid/2.3.2-dev
Last-Modified: Mon, 03 Aug 2009 13:41:54 GMT
ETag: "700a74-4e05-4703ceed30c80"
Accept-Ranges: bytes
Content-Length: 19973
Cache-Control: max-age=86400
Expires: Sat, 03 Oct 2009 09:26:01 GMT
Vary: Accept-Encoding
Connection: close
Content-Type: text/html

Ejemplo de un servidor IIS con respuesta correcta:

$ telnet www.microsoft.com 80
Trying 207.46.192.254...
Connected to lb1.www.ms.akadns.net.
Escape character is '^]'.
HEAD / HTTP/1.0

HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Length: 1020
Content-Type: text/html
Last-Modified: Mon, 16 Mar 2009 20:35:26 GMT
Accept-Ranges: bytes
ETag: "67991fbd76a6c91:0"
Server: Microsoft-IIS/7.5
P3P: CP="ALL IND DSP COR ADM CONo CUR CUSo IVAo IVDo PSA PSD TAI TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI"
X-Powered-By: ASP.NET
Date: Fri, 02 Oct 2009 09:27:36 GMT
Connection: keep-alive

Apache: Activar httpd fullstatus

Apache ofrece la posibilidad de mostrar un informe en el que indica si el servidor web está funcionando correctamente, la versión del mismo, estadísticas tiempo online, reinicios, cantidad de peticiones procesandose en el servidor, tipo de petición, su estado, usos de CPU etc.

En primera instancia existe la versión básica de “status“, que nos dice los PID de los procesos de apache y que está funcionando:

$ /etc/init.d/httpd status
httpd (pid 23922 23027 23015 22996 22984 22983 22982 22981 22980 22979 22978 22977 22975) is running...

Y la versión extendida que es de la que hablaba anteriormente, “fullstatus“:

$ /etc/init.d/httpd fullstatus
   Apache Server Status for localhost
   Server Version: Apache/2.2.0 (Debian)
   Server Built: Jul 14 2009 06:04:04
   --------------------------------------------------------------------------
   Current Time: Tuesday, 08-Sep-2009 22:51:45 CEST
   Restart Time: Tuesday, 08-Sep-2009 22:43:16 CEST
   Parent Server Generation: 0
   Server uptime: 8 minutes 29 seconds
   Total accesses: 2612 - Total Traffic: 23.4 MB
   CPU Usage: u120.23 s3.35 cu0 cs0 - 24.3% CPU load
   5.13 requests/sec - 47.1 kB/second - 9.2 kB/request
   1 requests currently being processed, 11 idle workers

 ___________W....................................................
 ................................................................
 ......................

   Scoreboard Key:
   "_" Waiting for Connection, "S" Starting up, "R" Reading Request,
   "W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
   "C" Closing connection, "L" Logging, "G" Gracefully finishing,
   "I" Idle cleanup of worker, "." Open slot with no current process

Srv   PID     Acc    M  CPU  SS Req  Conn Child Slot     Client                  VHost                                 Request
0-0  22977 0/234/234 _ 9.12  2  1143 0.0  1.65  1.65 xx.xx.xx.xx   xxxx.com                    GET Home/ HTTP/1.1
                                                                                                 GET
1-0  22978 0/242/242 _ 8.76  0  12   0.0  1.47  1.47 xx.xx.xx.xx    xxxxx.com                    /static/API/2/u5s8411hd3mjt2nemzdy.html
                                                                                                    HTTP/1.1
                                                                                                    GET
2-0  22979 0/246/246 _ 8.16  2  13   0.0  1.38  1.38 xx.xx.xx.xx   xxxxx.com                    /static/API/2/u5s8411hd3mjt2nemzdy.html
                                                                                                    HTTP/1.1
3-0  22980 0/224/224 _ 33.35 1  11   0.0  8.38  8.38 xx.xx.xx.xx   xxxxx.com                    GET /img/home_en-us.jpg HTTP/1.1
                                                                                                    GET
4-0  22981 0/245/245 _ 9.13  0  12   0.0  1.37  1.37 xx.xx.xx.xx   xxxxxx.com                    /static/API/2/b2250unz63ytqj3oz0fn.html
                                                                                                    HTTP/1.1
5-0  22982 0/244/244 _ 10.40 1  10   0.0  1.50  1.50 xx.xx.xx.xx   xxxxx.com                    GET /img/TEN_home_en-us.jpg HTTP/1.1
                                                                                                    GET
6-0  22983 0/247/247 _ 8.73  1  12   0.0  1.54  1.54 xx.xx.xx.xx  xxxxx.com                    /static/API/2/u5s8411hd3mjt2nemzdy.html
                                                                                                    HTTP/1.1
                                                                                                    GET
7-0  22984 0/230/230 _ 9.85  0  12   0.0  1.72  1.72 xx.xx.xx.xx    xxxxx.com                    /static/API/2/tq5x51nvb25gbp3tm22c.html

11-0 23922 0/54/54   W 2.03  0  0    0.0  0.30  0.30 127.0.0.1       xxxx.com GET /server-status HTTP/1.1

   --------------------------------------------------------------------------

    Srv  Child Server number - generation
    PID  OS process ID
    Acc  Number of accesses this connection / this child / this slot
     M   Mode of operation
    CPU  CPU usage, number of seconds
    SS   Seconds since beginning of most recent request
    Req  Milliseconds required to process most recent request
   Conn  Kilobytes transferred this connection
   Child Megabytes transferred this child
   Slot  Total megabytes transferred this slot

El “status” simple no es necesario activarlo, en cambio el “fullstatus” hay que permitirlo, tenéis que editar el fichero de configuración de apache httpd.conf y descomentar la siguiente línea:

ExtendedStatus On

Posteriormente, hay que indicar a quien vamos a dejar acceder a esta información, en este caso recomiendo siempre solo a localhost:
NOTA: Cambiar # por < y >, wordpress automáticamente elimina esa parte del código y no conseguía que se visualizara en la entrada…

#Location /server-status#
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from localhost 127.0.0.1
#/Location#

Reiniciamos apache y listo. Otras formas de visualizar el estado:

service httpd fullstatus
apachectl fullstatus

Apache: Semget: No space left on device

Si no conseguís arrancar apache y encontráis en el error_log entradas como estas:

[Fri Apr  3 19:25:05 2009] [warn] pid file /usr/local/apache/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run?
semget: No space left on device
[Fri Apr  3 19:50:05 2009] [warn] pid file /usr/local/apache/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run?
semget: No space left on device
[Fri Apr  3 20:00:05 2009] [warn] pid file /usr/local/apache/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run?
semget: No space left on device
[Fri Apr  3 20:17:12 2009] [warn] pid file /usr/local/apache/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run?
semget: No space left on device
[Fri Apr  3 20:17:34 2009] [warn] pid file /usr/local/apache/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run?
semget: No space left on device

El problema se centra en el kernel del sistema, significa que no queda espacio en el array de semáforos de Apache. Podéis ver el llenado ejecutando el siguiente comando:

# ipcs -s
------ Matrices semáforo -------
key        semid      propietario perms      nsems
0x00000000 3538944    nobody    600        1
0x00000000 3571713    nobody    600        1
0x00000000 3604482    nobody    600        1
0x00000000 3637251    nobody    600        1
0x00000000 3670020    nobody    600        1
0x00000000 3702789    nobody    600        1
0x00000000 3735558    nobody    600        1
0x00000000 3768327    nobody    600        1
0x00000000 3801096    nobody    600        1
0x00000000 3833865    nobody    600        1
0x00000000 7340143    nobody    600        1
0x00000000 7372912    nobody    600        1
0x00000000 7405681    nobody    600        1
0x00000000 7438450    nobody    600        1
0x00000000 7471219    nobody    600        1
0x00000000 7503988    nobody    600        1
0x00000000 7536757    nobody    600        1
0x00000000 7569526    nobody    600        1
0x00000000 7602295    nobody    600        1
0x00000000 7635064    nobody    600        1
0x00000000 7667833    nobody    600        1
0x00000000 7700602    nobody    600        1
0x00000000 7733371    nobody    600        1
0x00000000 7766140    nobody    600        1
0x00000000 7798909    nobody    600        1
0x00000000 7831678    nobody    600        1
0x00000000 7864447    nobody    600        1

Para no tener que reiniciar, la solución es vaciar este array, podéis hacerlo de este modo:

ipcs -s | awk '{print "ipcrm -s " $2}' | bash

Ahora ya podemos reiniciar apache sin problemas. Quizás ahora toca revisar si alguna aplicación está provocando este llenado.

Generar un certificado SSL propio con openssl

Gracias a OpenSSL, tenemos la posibilidad de crear certificados SSL “self-signed“, es decir, firmados por nosotros mismos para encriptar las conexiones a un sitio web bajo Apache. Normalmente, para un servidor en producción lo lógico es utilizar un certificado SSL firmado por una entidad autorizada y confiable “Trusted Certificate Authority“, no obstante, en servidores beta o de pruebas es muy útil para utilizar conexión segura sin necesitar un SSL autorizado.

Lo primero que debemos hacer es instalar mod_ssl y openssl para activar el soporte SSL en Apache (podemos hacerlo con yum, apt…):

yum install mod_ssl openssl

Una vez instalados los módulos, procederemos con la creación del certificado. En primera instancia generamos la llave privada(private-key):

openssl genrsa -out cert.key 1024

Ahora generamos el CSR (Certificate Signing Request), usando la key generada antes:

openssl req -new -key cert.key -out cert.csr

Y ahora generamos el certificado en sí utilizando la key y el CSR:

openssl x509 -req -days 365 -in cert.csr -signkey cert.key -out cert.crt

Ahora para mayor comodidad podéis mover los tres ficheros (cert.csr, cert.crt y cert.key) a la ruta donde guardéis los SSL, por ejemplo /etc/ssl/

Solamente falta configurar el sitio web o el servidor web entero para que utilice el SSL, si es solo para un sitio web bajo virtualhost, añadir lo siguiente dentro del <virtualhost>, son las rutas al certificado y su key correspondiente:

SSLCertificateFile /etc/ssl/cert.crt
SSLCertificateKeyFile /etc/ssl/cert.key

Si fuerais a hacerlo para todo el servidor web, lo normal es cambiar los valores indicados anteriormente en el fichero de configuración general del ssl, que suele ser:

/etc/httpd/conf.d/ssl.conf

Una vez hecho esto, reiniciad apache y ya deberíais navegar correctamente bajo SSL, tened en cuenta que navegadores como firefox o explorer no reconocerán el SSL ya que está firmado por nosotros mismos y no una firma autorizada, no obstante, aceptad el certificado y trabajad normalmente.

Para más información sobre OpenSSL, opciones de comando y personalización del certificado:

http://www.openssl.org/docs/apps/openssl.html