Instalar y Configurar Nginx, FastCGI, PHP5 y MySQL
Otro Post de servidores y testeado en mi ubuntu Karmic Koala
Esta vez he dedicado algunas horas, días… en simular lo que tengo instalado en mi servidor Debian Lenny. Gracias a la tercera edición del Creant Bits al Núvol, organizado por Antoni Aloy, y en esta exposición más concretamente, gracias a Ricardo Gallir (creador del Meneame, profesor de la Universidad de las Islas Baleares y gran profesional informático…), me di cuenta que tenía que imitar su trabajo, parte de los problemas que tenía Ricardo también los encuentro en mi servidor y se puede mejorar con las novedades explicadas en la charla sobre Menéame (enhorabuena).
Conclusión de esta introducción, todo cambio puede ir mejor, pero también a peor si no sabemos como llevarlo a cabo. Para ello, estoy simulando en mi Ubuntu Karmic Koala unas condiciones similares del Servidor Debian contratado.
Objetivo: cuando realice el cambio debe ser lo más breve posible y el impacto que pueda causar sea nulo (factor bastante imposible, porque ya esta peligrando el subversion con el paquete webdav).
Primer punto: Instalar NGINX en Ubuntu de cero.
La verdad es que su instalación es relativamente fácil, solamente con un sudo aptitude install nginx ya se instala. Pero nos aseguramos si realmente los repositorios que tenemos agregados en nuestro Karmic Koala contienen Nginx:
sudo aptitude search nginx
#Salida de la ejecución del comando
p nginx - small, but very powerful and efficient web server and mail proxy
Después de cerciorarnos que tenemos disponible el paquete nginx pasamos a su instalación, por lo tanto:
sudo aptitude install nginx
#Tendría que aparece algo similar a esto:
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Leyendo la información de estado extendido
Inicializando el estado de los paquetes... Hecho
Se instalarán los siguiente paquetes NUEVOS:
nginx
0 paquetes actualizados, 1 nuevos instalados, 0 para eliminar y 160 sin actualizar.
Necesito descargar 329kB de ficheros. Después de desempaquetar se usarán 803kB.
Escribiendo información de estado extendido... Hecho
Des:1 http://es.archive.ubuntu.com karmic/universe nginx 0.7.62-4ubuntu1 [329kB]
Descargados 329kB en 1s (313kB/s).
Seleccionando el paquete nginx previamente no seleccionado.
(Leyendo la base de datos ... 00%
126264 ficheros y directorios instalados actualmente.)
Desempaquetando nginx (de .../nginx_0.7.62-4ubuntu1_i386.deb) ...
Procesando disparadores para man-db ...
Procesando disparadores para ufw ...
Procesando disparadores para sreadahead ...
Configurando nginx (0.7.62-4ubuntu1) ...
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Leyendo la información de estado extendido
Inicializando el estado de los paquetes... Hecho
Escribiendo información de estado extendido... Hecho
En fin, hemos tardado ¿3 -5 minutos? No está mal. Para arrancar el server o pararlo, es parecido al servidor apache, pero cambiando el nombre del script:
sudo /etc/init.d/nginx start
#Salida en pantalla tras la ejecución del script
Starting nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
configuration file /etc/nginx/nginx.conf test is successful
nginx.
IMPORTANTE: este servidor utiliza por defecto el puerto 80, al igual que Apache2. No podemos pretender tener configurado el servidor apache en el puerto 80 y querer también el Nginx, por lo tanto, hay que cambiar el puerto del Apache, desinstalarlo, … eso ya va a vuestro gusto
Segundo punto: Instalación de PHP5 y los paquetes adicionales
Os pongo todos los paquetes que se deben instalar, algunos porque son dependecias u otros porque son plugins… en fin que se deben instalar. El comando completo es:
sudo aptitude install php5-cgi php5-mysql php5-curl php5-gd php5-idn php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-mhash php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl php5-json
Se descargarán bastantes kbytes de información.
Justo después de esto, debemos modificar el php.ini incluyendo el siguiente texto al final del fichero:
cgi.fix_pathinfo = 1
Esta línea es necesaria para que el PHP funcione correctamente como CGI.
Tercer punto: Instalación del FastCGI
En la instalación de este paquete tenemos un grave problema. En Ubuntu no tenemos ningún paquete explícito para instalar FastCGI, para ello necesitaremos instalar el lighttpd.
Debemos tener en cuenta que el lighttpd también es un servidor web y en su configuración está especificado que el puerto de escucha es el 80. Upss, pero el puerto 80 ya esta siendo utilizado, por lo tanto, fijáos bien en la salida por pantalla de la ejecución del siguiente comando:
sudo aptitude install lighttpd
#Salida de la instalación
........
Se instalarán los siguiente paquetes NUEVOS:
libterm-readline-perl-perl{a} lighttpd
0 paquetes actualizados, 2 nuevos instalados, 0 para eliminar y 160 sin actualizar.
Necesito descargar 371kB de ficheros. Después de desempaquetar se usarán 1245kB.
¿Quiere continuar? [Y/n/?] y
Escribiendo información de estado extendido... Hecho
Des:1 http://es.archive.ubuntu.com karmic/universe libterm-readline-perl-perl 1.0302-1 [52,0kB]
Des:2 http://es.archive.ubuntu.com karmic/universe lighttpd 1.4.22-1ubuntu4 [319kB]
Descargados 371kB en 1s (326kB/s).
Seleccionando el paquete libterm-readline-perl-perl previamente no seleccionado.
(Leyendo la base de datos ... 00%
126682 ficheros y directorios instalados actualmente.)
Desempaquetando libterm-readline-perl-perl (de .../libterm-readline-perl-perl_1.0302-1_all.deb) ...
Seleccionando el paquete lighttpd previamente no seleccionado.
Desempaquetando lighttpd (de .../lighttpd_1.4.22-1ubuntu4_i386.deb) ...
........
update-alternatives: usar /usr/bin/spawn-fcgi.lighttpd para proporcionar /usr/bin/spawn-fcgi (spawn-fcgi) en modo automático
Syntax OK
* Starting web server lighttpd
lighttpd
2010-02-27 10:50:38: (network.c.300) can't bind to port: 80 Address already in use
[fail]
invoke-rc.d: initscript lighttpd, action "start" failed.
.......
He señalado dos frases importantes:
- La primera: la he remarcado por la siguiente palabra, spawn-fcgi, que es lo que utilizaremos como el fast-CGI
- La segunda: importante porque nos indica que el puerto 80 ya está en uso
Para utilizar el spawn-cgi antes deberemos eliminar del fichero de arranque el lighttpd, que realmente no utilizaremos. Entonces, ejecutamos el comando:
sudo update-rc.d -f lighttpd remove
#Salida por pantalla
Removing any system startup links for /etc/init.d/lighttpd ...
/etc/rc0.d/K09lighttpd
/etc/rc1.d/K09lighttpd
/etc/rc2.d/S91lighttpd
/etc/rc3.d/S91lighttpd
/etc/rc4.d/S91lighttpd
/etc/rc5.d/S91lighttpd
/etc/rc6.d/K09lighttpd
Con la ejecución de este último comando, el cual necesita permisos de superusuario, elimina del inicio del sistema, el arranque del lighttpd.
Cuarto paso: Configuración del FastCGI (concretamente Spawn-cgi)
Principalmente este paso es importante porque tenemos que modificar scripts, crear de nuevos, etc.
- Para que el funcionamiento del PHP FastCGI sea correcta necesitaremos indicar: puerto de escucha, usuario y grupo. Se puede realizar mediante la siguiente línea de código:
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid - Pero esto TIENE UN PROBLEMA, cada vez que reiniciamos el servidor o mejor dicho el PC, necesitaremos ejecutar la línea anterior. Por ello, lo que haremos será modificar el fichero de administración local, llamado rc.local, incluyendo en el fichero la línea anterior. Esto nos permitirá no tener que añadir esta misma línea cada vez.
El fichero lo encontraremos en: /etc/rc.local, y tendría que quedar una cosa así:....... /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid exit 0 - Ahora tenemos que crear un script con el nombre php-fastcgi en el siguiente directorio:
/etc/init.d/php-fastcgi - Contenido del fichero deber ser el siguiente:
1 #! /bin/sh 2 ### BEGIN INIT INFO 3 # Provides: php-fastcgi 4 # Required-Start: $all 5 # Required-Stop: $all 6 # Default-Start: 2 3 4 5 7 # Default-Stop: 0 1 6 8 # Short-Description: Start and stop php-cgi in external FASTCGI mode 9 # Description: Start and stop php-cgi in external FASTCGI mode 10 ### END INIT INFO 11 12 # Author: Kurt Zankl <[EMAIL PROTECTED]> 13 14 # Do NOT "set -e" 15 16 PATH=/sbin:/usr/sbin:/bin:/usr/bin 17 DESC="php-cgi in external FASTCGI mode" 18 NAME=php-fastcgi 19 DAEMON=/usr/bin/php-cgi 20 PIDFILE=/var/run/$NAME.pid 21 SCRIPTNAME=/etc/init.d/$NAME 22 PHP_CONFIG_FILE=/etc/php5/cgi/php.ini 23 24 # Exit if the package is not installed 25 [ -x "$DAEMON" ] || exit 0 26 27 # Read configuration variable file if it is present 28 [ -r /etc/default/$NAME ] && . /etc/default/$NAME 29 30 # Load the VERBOSE setting and other rcS variables 31 . /lib/init/vars.sh 32 33 # Define LSB log_* functions. 34 # Depend on lsb-base (>= 3.0-6) to ensure that this file is present.Puedes descargar el fichero php-fastcgi.
El fichero tiene la extensión .txt para que el Wordpress no lo detectase como corrupto, por ello, cuando copiéis el fichero en la ruta /etc/init.d/ debéis eliminar la extensión .txt - Necesitamos que este script tenga permisos de ejecutable, por lo tanto, la ejecución del siguiente comando nos permitirá que lo sea:
chmod +x /etc/init.d/php-fastcgi
Quinto paso: Configuración de Nginx para que funcione con FastCGI
Ahora le toca a Nginx…debemos configurar a este servidor web, para que los ficheros php los pueda servir mediante FasfCGI. Pasemos entonces a configurar el virtualhost default de ngnix:
sudo vim /etc/nginx/sites-available/default
#Necesitamos añadir el texto siguente:
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/nginx-default$fastcgi_script_name;
include fastcgi_params;
}
Con todo esto ya tenemos instalado nginx – php5 – FastCGI, como prueba podríamos crear un fichero info.php en el directorio raix de nginx, que según el ejemplo y el virtualhost, lo encontraremos en: /var/www/nginx-default/
Espero que haya servidor para algo no????
















