Después de varios problemas con el mentado error 504 Gateway Timeout y algunas soluciones temporales como matar procesos de PHP CGI por fin he dado con la solución (por lo menos lleva semanas sin fallar).
Efectivamente el error es provocado por el interprete de PHP-CGI ya que tenia poco tiempo para procesar la solicitud y pues a veces se quedaba colgado el proceso.
Antes que nada tenemos que verificar que este correctamente configurado el interprete de PHP para FastCGI (PHP_FCGI), entramos al panel de control con el comando cherokee-admin y despues nos dirigimos a Origenes > PHP
Y verificamos que este en conexión: 127.0.0.1:47990 (el puerto pueden ponerle cualquiera que este libre)
Y también en interprete: /usr/bin/php-cgi -b 127.0.0.1:47990
Despues nos vamos a donde se especifica el tiempo máximo para cada respuesta del PHP FCGI, para eso nos pasamos a la consola y como root nos metemos al archivo /etc/cherokee/cherokee.conf
Y agregamos/modificamos el siguiente parámetro: PHP_FCGI_MAX_REQUESTS = 300
source!1!env!PHP_FCGI_CHILDREN = 5
source!1!env!PHP_FCGI_MAX_REQUESTS = 300
source!1!env_inherited = 1
source!1!host = 127.0.0.1:47990
source!1!interpreter = /usr/bin/php-cgi -b 127.0.0.1:47990
source!1!nick = PHP Interpreter
source!1!type = interpreter
Recordemos que si tenemos varios interpretes puede cambiar el parámetro después de source! por algún otro número.
Y listo! reiniciamos cherokee y en teoría no debería de fallar.
Por alguna extraña razón en el servidor web Cherokee, de repente sin motivo aparente empezaron a aparecer errores 504 Gateway Timeout en todas las páginas terminadas con extensión .PHP, las .HTML si se ven correctamente, entonces el error debe de estar en la configuración o proceso de PHP5.
Antes de mover la configuración (porque todo funcionaba bien antes), decidi matar los procesos de PHP,
con el ps -ax revise que existieron procesos de PHP:
2658 ? S 0:07 /usr/bin/php-cgi -b 127.0.0.1:47990
6592 ? Ss 0:06 /usr/sbin/sshd
11296 ? S 0:01 /usr/bin/php-cgi -b 127.0.0.1:47990
14097 ? S 0:17 /usr/bin/php-cgi -b 127.0.0.1:47990
Y bueno, a proceder con la eliminación de los mismos, pero para no irme de proceso en proceso pues elimino todos los que tengan la palabra php y despues reinicio cherokee webserver.
pkill -9 php
/etc/init.d/cherokee restart
Y voalaaa!, ahora ya funcionan bien las páginas!…, solo falta ver, el porque de esta falla para que no vuelva a suceder.
Despues de actualizar el servidor web Cherokee y querer reiniciar el servicio desde el panel de control, me aparecio el siguiente mensaje de error:
Duped suffix (case insensitive) ‘z’, pointing to ‘package.png’
An unexpected error has just occurred in the server. The cause of the issue is unknown. Please, do not hesitate to report it at http://bugs.cherokee-project.com/ so the developer team can fix it.
La solución es ingresar a la siguiente página: http://127.0.0.1:9090/general#Icons-4 (Ajustes generales > Iconos) y despues buscar en la lista de extensiones el icono de paquetes (esta abajo de musica y arriba de pdf) y eliminar la extensión llamada Z (con mayusculas), ya que existe una llamada z (en minusculas) y en la nueva versión de cherokee ya no es necesario especificar las 2.
No se si les ha pasado pero cuando se tiene Cherokee + PHP en ocasiones marca un error 504 Gateway Error, y por más que buscaba el porque del error no encontraba la respuestas, hasta que hoy di con la correcta!..
Resulta que un script de PHP que consume algo de tiempo hace que caduque la conexión de Cherokee…, en pocas palabras alenta al servidor cherokee y cherokee no sabe que hacer!…
Para probar esta teoría pueden poner un script que tenga algo como esto:
< ?php
sleep (25);
phpinfo();
?>
Y verán el error 504 Gateway Error., bueno para arreglarlo es necesario meterse a la configuración de Cherokee (en está página explico como entrar al panel de administrador), despues entramos a General y en la sección Comportamiento de Red, Tiempo de Espera (segs) cambiamos el valor a 60, ya con esto la mayoria de los script’s de PHP deberían de funcionar, reiniciamos el server y listo!!
Si tienes un servidor Cherokee pero no esta en tu maquina local y no tienes acceso fisico a la computadora, entonces esta información te es de ayuda.
Primero entras por SSH a tu servidor y como root activas la interfaz de configuración:
# cherokee-admin
Despues debes de entrar solamente por localhost ó 127.0.0.1 y luego puerto 9090
http://127.0.0.1:9090

Pero como estamos remotamente claro que no va a funcionar así que tenemos que abrir un tunel por ssh con:
$ ssh -L 9090:localhost:9090 IPREMOTA
Y listo, ya podemos entrar por
Si deseas prevenir un ataque de Denegación de servicio (DoS) cuyo objetivo es colapsar el servidor durante un periodo de tiempo para que este no esté en funcionamiento, ahora bien, si nuestro servidor es Apache podemos contar con el módulo llamado mod_evasive.
El módulo de seguridad para Apache, mod_evasive cuyo propósito no es otro que el de prevenir o anular ataques de Denegación de Servicio o de fuerza bruta basados en peticiones masivas al servidor de páginas web (HTTP DoS). A través del módulo tendremos la posibilidad de redirigir el tráfico malicioso hacia otra aplicación de control que terminará de filtrar las peticiones (firewalls, scripts personalizados, …).
El funcionamiento de mod_evasive se basa en la prevención de ataques mediante la comparación de la IP solicitante con una tabla dinámica que registra las páginas accedidas a nuestro servidor que provienen de dicha IP y la frecuencia de accesos. En el preciso instante en que una máquina solicita una dirección del servidor Apache, mod_evasive filtrará cualquier dirección IP que cumpla con los siguientes requisitos:
* La IP está en la lista de direcciones a filtrar.
* La IP cliente ha solicitado la misma dirección más veces que la cantidad máxima especificada en el fichero de configuración.
* El número de peticiones de la IP cliente excede del máximo permitido en un intervalo de tiempo predeterminado en la configuración.
Si una IP resulta filtrada por cumplir con alguna de las condiciones anteriores, recibirá un código 403 (Forbidden) en respuesta a su petición y le será denegado el acceso durante un periodo de tiempo configurable.
Ahora viene la parte interesante que es la instalación y configuración, antes de empezar debemos de contar con las herramientas necesarias para compilar programas en Linux y en especial para Apache, en este caso estamos usando una versión estilo apt (Debian, Ubuntu…)
apt-get install apache2-prefork-dev gcc
Despues procedemos a descargar el codigo fuente que encontramos en la página oficial del proyecto mod_evasive: (al momento de escribir esta nota la versión es la 1.10.1)
Ahora procedemos a descargar y descompactar el codigo, de preferencia en la carpeta temporal /temp
wget http://www.zdziarski.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz
tar xvzf mod_evasive_1.10.1.tar.gz
cd mod_evasive
/usr/bin/apxs2 -i -c mod_evasive20.c
Ahora vamos a crear el archivo de configuración de Apache2 dentro de la carpeta mods-enabled
nano /etc/apache2/mods-available/evasive.load
Y dentro del archivo ponemos la siguiente linea, que es donde esta nuestro modulo compilado (mod_evasive20.so)
LoadModule evasive20_module /usr/lib/apache2/modules/mod_evasive20.so
Despues sigue ligar la carpeta mods-available con los mods-enabled
ln -s /etc/apache2/mods-available/evasive.load /etc/apache2/mods-enabled/evasive.load
Y listo, solo falta configurar los parametros, tomando en cuenta la siguiente descripción:
* **DOSHashTableSize
* **DOSPageCount
* **DOSSiteCount
* **DOSPageInterval
* **DOSSiteInterval
* **DOSBlockingPeriod
* **DOSEmailNotify
* **DOSSystemCommand
DOSSystemCommand “/sbin/iptables -I INPUT -p tcp –dport 80 -s %s -j DROP”
O bien!! bloquear todooo el acceso al servidor, esto esta mejor.
DOSSystemCommand “sudo -u root /sbin/iptables -A INPUT -s %s -j DROP”
* **DOSLogDir
* **DOSWhitelist
DOSWhitelist 66.249.65.*
DOSWhitelist 66.249.66.*
Y bien, ya que conocen que significa cada parametro, aquí esta una configuración opcional que se debe de guardar en el archivo **/etc/apache2/conf.d/evasive**
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 600
#DOSEmailNotify clie...@servidor.com
#DOSSystemCommand "/sbin/iptables -I INPUT -p tcp --dport 80 -s %s -j DROP"
DOSSystemCommand "echo %s >> /tmp/mod_doesevasive.log"
#GoogleBot
DOSWhitelist 66.249.65.*
DOSWhitelist 66.249.66.*
Y para probar si realmente funciona todo, en la carpeta donde descompactamos el tar.gz viene un archivo llamado test.pl, solo es cosa de ejecutarlo con:
perl test.pl
Y despues de ciertas peticiones vamos a ver el famoso error **HTTP/1.1 403 Forbidden** y listo!!, eso significa que todo funciona a la perfección, ahora ya tenemos un Apache un poco mas protegido!..
Comic me dijo que si le ayudaba a traducir la documentación del servidor web Cherokee, lo cual primero me la pense por eso de la carga de trabajo, pero pues!, en mis ratos libres (que no son muchos) me pondre a traducir la documentación del ingles al español (sirve que practico mi ingles)
Si alguien desea ayudar a esta noble causa, pueden visitar el wiki-Cherokee
Ademas segun las pruebas es más rapido que el temible Apache! (a la mejor de ahi el nombre Cherokee), aqui tienen 2 pruebas:
* **Cherokee 0.4.3 pre6 benchmark:**
Cherokee: **20426.30**, Boa: 12287.60, thttpd: 4347.81, Apache: 3953.4 reqs/sec
* **Cherokee 0.3.0 Beta14 benchmark:**
Cherokee: **3785.01**, Boa: 3328.89, thttpd: 3167.56, Apache: 732.12 reqs/sec

Todo parece indicar que si el proyecto sigue como va!, le puede dar en la torre a Apache!, sobre todo por la velocidad que es algo sumamente importante en cualquier webserver ;-D ademas que van a tratar de tener la misma funcionalidad que Apache




