Nov 262012
 
Artículo Apache

El servidor web Apache puede utililizar distintas estrategias de multiproceso para aprovechar las posibilidades de un servidor equipado con varios procesadores. De entre ellas, las más habituales son los módulos de multiproceso (mpm) “prefork” y “worker”:

Prefork – El mpm más común es el prefork. En este modo, el proceso principal de apache ejecuta un conjunto de subprocesos, y distribuye entre ellos las peticiones que recibe. Apache prefork es la configuración más habitual de una instalación de WordPress.

Worker – En el modo worker, el proceso principal también ejecuta un conjunto de subprocesos, pero además cada uno de estos subprocesos ejecuta un conjunto de hilos de ejecución (threads). De este modo se aumenta la capacidad de proceso, disminuyendo las necesidades de memoria RAM. El modo worker resulta en servidores más escalables, que son capaces de atender un volumen mayor de peticiones que su equivalente en modo prefork.

Pero para poder utilizar el modo worker, debemos asegurar que todos los módulos utilizados por el servidor son seguros (thread-safe) en un entorno multihilo. Un caso importante en el que esto no se cumple es el módulo mod_php para la ejecución de scripts en lenguaje PHP. Esto obliga a una instalación típica de WordPress, a utilizar el módulo de multiproceso prefork.

Sin embargo, es posible utilizar fcgid (Fast CGI) para ejecutar una instalación de WordPress  bajo un servidor apache en modo worker, como veremos en este artículo.

Cómo comprobar el tipo de mpm con el que se está ejecutando un servidor Apache

En un servidor Debian o Ubuntu, el nombre del ejecutable de apache es “apache2”. En otros servidores, como CentOS, el ejecutable se llama “httpd”. Para comprobar los módulos con los que ha sido compilado el servidor, basta con dar la opción “-l” o “-V” a este ejecutable:

$ /usr/sbin/apache2 -l
Compiled in modules:
  core.c
  mod_log_config.c
  mod_logio.c
  prefork.c
  http_core.c
  mod_so.c

En este caso, vemos que aparece el módulo “prefork.c”, indicando que el servidor utiliza el prefork mpm. Si utilizara el worker mpm, aparecería el módulo “worker.c” en su lugar.

Con la opción “-V”, obtenemos:

$ /usr/sbin/apache2 -V
Server version: Apache/2.2.16 (Debian)
Server built:   Aug 29 2011 19:19:32
Server's Module Magic Number: 20051115:24
Server loaded:  APR 1.4.2, APR-Util 1.3.9
Compiled using: APR 1.4.2, APR-Util 1.3.9
Architecture:   64-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/apache2"
 -D SUEXEC_BIN="/usr/lib/apache2/suexec"
 -D DEFAULT_PIDLOG="/var/run/apache2.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_LOCKFILE="/var/run/apache2/accept.lock"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="mime.types"
 -D SERVER_CONFIG_FILE="apache2.conf"

Cómo instalar apache en modo worker mpm con PHP y fcgid

En primer lugar, inhabilitamos los módulos mod_php4, mod_php5 de Apache, ya que no son compatibles con el modo worker:

$ sudo a2dismod php4
ERROR: Module php4 does not exist!
dev@squeeze:/web/blog$ sudo a2dismod php5
Module php5 disabled.
Run '/etc/init.d/apache2 restart' to activate new configuration!

Los paquetes que debemos tener instalados son:

  • apache2
  • apache2-mpm-worker
  • libapache2-mod-fcgid
  • php5-cli
  • php5-cgi

En Debian, utilizamos apt-get para instalar los paquetes que aún no estén instalados en el sistema. por ejemplo:

$ sudo apt-get install apache2-mpm-worker libapache2-mod-fcgid php5-cgi

Al instalar apache2-mpm-worker, el sistema desinstala apache2-mpm-prefork, y también actualiza otros paquetes relacionados a sus versiones compatibles con multihilo (thread-safe):

...
The following packages will be REMOVED:
  apache2-mpm-prefork libapache2-mod-php5 mysql-client-5.1 mysql-server-5.1 mysql-server-core-5.1
  php5-suhosin
The following NEW packages will be installed:
  apache2-mpm-worker libaio1 liblzma5 libmysqlclient18 mysql-client-5.5 mysql-server-5.5
  mysql-server-core-5.5
The following packages will be upgraded:
  apache2 apache2.2-bin apache2.2-common libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap
  libmysqlclient-dev libssl1.0.0 libxml2 libxml2-dev mysql-client mysql-common mysql-server php5-cli
  php5-common php5-curl php5-gd php5-mysql psmisc
19 upgraded, 7 newly installed, 6 to remove and 1254 not upgraded.
...

Después, habilitamos los módulos “actions” y “fcgid”:

$ sudo a2enmod actions
Enabling module actions.
$ sudo a2enmod fcgid
Module fcgid already enabled

A continuación, creamos un fichero “/etc/apache2/conf.d/php.conf” con el siguiente contenido:

<Directory /usr/share>
  AddHandler fcgid-script .php
  FCGIWrapper /usr/lib/cgi-bin/php5 .php
  Options ExecCGI FollowSymlinks Indexes
</Directory>

<Files ~ (.php)>
  AddHandler fcgid-script .php
  FCGIWrapper /usr/lib/cgi-bin/php5 .php
  Options +ExecCGI
  allow from all
</Files>

y por último, reiniciamos el servidor:

$ sudo /etc/init.d/apache2 restart

 

Referencias:

 Publicado por en 10:38 am

 Deja un comentario

(requerido)

(requerido)