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

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

Activar pcntl para PHP en cPanel (easyapache)

Si necesitamos personalizar la compilación de un servidor web PHP + Apache en cPanel y el módulo que necesitamos no se incluye dentro de los disponibles dentro de easyapache podemos añadirlo del siguiente modo.

En este caso necesitaba activar pcntl, el procedimiento ha sido el siguiente:

  1. Crear un fichero llamado /var/cpanel/easy/apache/rawopts/PHP-X.X.X donde X.X.X es la versión de PHP que queremos compilar.
    En este caso era /var/cpanel/easy/apache/rawopts/PHP-5.2.13
  2. Dentro del fichero añadir:
    --enable-pcntl
  3. Guardar el fichero.
  4. Ejecutar easyapache y recompilar.

Una vez finalizado ya debería aparecer compilado el módulo correspondiente:

# php -m | grep pcntl
pcntl

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

ISAPI Rewrite: Alternativa a Mod Rewrite en IIS

ISAPI_Rewrite es un manipulador de URL basado en expresiones regulares para IIS (Microsoft Internet Information Server), es el equivalente a mod_rewrite para Apache. ISAPI_Rewrite actua prácticamente igual que mod_rewrite en apache, pero siendo designado exclusiva y específicamente para IIS. ISAPI_Rewrite es un filtro0 ISAPI escrito en C/C++, y es extremadamente rápido.

Las funcionalidades son las mismas que mod_rewrite, como por ejemplo la manipulación de URLs para que sean más amigables y mejoren el posicionamiento web de los sitios, siendo más amigables con los buscadores. Más información en la web oficial www.isapirewrite.com

Os dejo unos ejemplos sacados de la documentación de ISAPI_Rewrite para que veáis las similitudes con Mod_Rewrite:

[ISAPI_Rewrite]

#Fix missing slash char on folders
RewriteCond  Host:  (.*)
RewriteRule  ([^.?]+[^.?/]) http\://$1$2/ [I,R]

#Emulate site1
RewriteCond  Host:  (?:www\.)?site1\.com
RewriteRule  (.*)   /site1$1 [I,L]

#Emulate site2
RewriteCond  Host:  (?:www\.)?site2\.com
RewriteRule  (.*)   /site2$1 [I,L]
[ISAPI_Rewrite]

#Fix missing slash char on folders
RewriteCond  Host:  (.*)
RewriteRule  ([^.?]+[^.?/]) http\://$1$2/ [I,R]

RewriteCond  Host:  (www\.)?(.+)
RewriteRule  (.*)   /$2$3