systemadmin.es > LAMP y web > Instalar nginx con php 5.3 mediante php-fpm y eAccelerator

Instalar nginx con php 5.3 mediante php-fpm y eAccelerator

Desde la versión 5.3.3 de PHP tenemos disponible PHP-FPM (PHP FastCGI Process Manager) dentro del core de PHP, por lo que no hace falta aplicar parches. Vamos a ver como instalarlo con nginx.

Descargamos la última versión de la rama 5.3 de PHP y lo compilamos con la opción –enable-fpm para instalarlo dentro de /opt/php53fpm para evitar entrar en conflicto con otros PHPs instalados en el sistema:

cd /usr/local/src/
wget 'http://fr2.php.net/get/php-5.3.5.tar.gz/from/this/mirror'
tar xzf php-5.3.5.tar.gz 
cd php-5.3.5
./configure --enable-fpm --prefix=/opt/php53fpm \
            --exec-prefix=/opt/php53fpm \
            --with-config-file-path=/opt/php53fpm/etc/ \
            --with-mysql=/usr/local/mysql/ --with-zlib \
            --with-gd --with-jpeg-dir=/usr/ --with-gettext \
            --with-mcrypt --with-iconv --enable-mbstring=all \
            --enable-mbregex --with-png-dir=/usr

Compilamos e instalamos:

make && make install

Veremos el resumen del make install al final de todo:

Installing PHP SAPI module:       fpm
Installing PHP CLI binary:        /opt/php53fpm/bin/
Installing PHP CLI man page:      /opt/php53fpm/man/man1/
Installing PHP FPM binary:        /opt/php53fpm/sbin/
Installing PHP FPM config:        /opt/php53fpm/etc/
Installing PHP FPM man page:      /opt/php53fpm/man/man8/
Installing build environment:     /opt/php53fpm/lib/php/build/
Installing header files:          /opt/php53fpm/include/php/
Installing helper programs:       /opt/php53fpm/bin/
  program: phpize
  program: php-config
Installing man pages:             /opt/php53fpm/man/man1/
  page: phpize.1
  page: php-config.1
Installing PEAR environment:      /opt/php53fpm/lib/php/
[PEAR] Archive_Tar    - already installed: 1.3.7
[PEAR] Console_Getopt - already installed: 1.2.3
[PEAR] Structures_Graph- already installed: 1.0.3
[PEAR] XML_Util       - already installed: 1.2.1
[PEAR] PEAR           - already installed: 1.9.1
Wrote PEAR system config file at: /opt/php53fpm/etc/pear.conf
You may want to add: /opt/php53fpm/lib/php to your php.ini include_path
/usr/local/src/php-5.3.5/build/shtool install -c ext/phar/phar.phar /opt/php53fpm/bin
ln -s -f /opt/php53fpm/bin/phar.phar /opt/php53fpm/bin/phar
Installing PDO headers:          /opt/php53fpm/include/php/ext/pdo/

A continuación crearemos el usuario nginx y prepararemos los ficheros de configuración:

useradd nginx
cp php.ini-production /opt/php53fpm/etc/php.ini
cp /opt/php53fpm/etc/php-fpm.conf.default /opt/php53fpm/etc/php-fpm.conf

A continuación añadimos descomentamos las opciones necesarias para arrancar PHP-FPM:

sed -e 's/^user = nobody/user = nginx/g' -e 's/^group = nobody/group = nginx/g' -i /opt/php53fpm/etc/php-fpm.conf
sed 's/^;pm.m\([a-z]\{2\}\)_spare_servers/pm.m\1_spare_servers/g' -i /opt/php53fpm/etc/php-fpm.conf
sed 's/;\(pm.start_servers\)/\1/g' -i /opt/php53fpm/etc/php-fpm.conf
sed 's/;\(daemonize = \)yes/\1no/' -i /opt/php53fpm/etc/php-fpm.conf
sed 's/^\(expose_php = O\)n/\1ff/g' -i /opt/php53fpm/etc/php.ini

La configuración queda como:

# grep -v "^;" /opt/php53fpm/etc/php-fpm.conf | grep -vP "^\s*$"
[global]
daemonize = no
[www]
listen = 127.0.0.1:9000
user = nginx
group = nginx
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35

Podemos comprobar la configuración mediante la opción -t del binario php-fpm:

# /opt/php53fpm/sbin/php-fpm -t
Feb 21 19:09:39.171929 [NOTICE] configuration file /opt/php53fpm/etc/php-fpm.conf test is successful

A continuación deberemos instalar eAccelerator usando el php-config de esta nueva instalación de PHP:

cd /usr/local/src
wget http://bart.eaccelerator.net/source/0.9.6.1/eaccelerator-0.9.6.1.tar.bz2
tar xjf eaccelerator-0.9.6.1.tar.bz2 
cd eaccelerator-0.9.6.1
/opt/php53fpm/bin/phpize
./configure --with-php-config=/opt/php53fpm/bin/php-config 
make && make install
cat >> /opt/php53fpm/etc/php.ini <<EOF
; eAccelerator
; Enable eAccelerator extension module
zend_extension = /opt/php53fpm/lib/php/extensions/no-debug-non-zts-20090626/eaccelerator.so
; Options for the eAccelerator module
eaccelerator.cache_dir = /var/www/eaccelerator.cache
eaccelerator.shm_size = 32
eaccelerator.enable = 1
eaccelerator.optimizer = 1
eaccelerator.check_mtime = 1
eaccelerator.filter = ""
eaccelerator.shm_max = 0
eaccelerator.shm_ttl = 3600
eaccelerator.shm_prune_period = 0
eaccelerator.shm_only = 1
eaccelerator.compress = 0
eaccelerator.compress_level = 9
eaccelerator.keys = "shm_only"
eaccelerator.sessions = "shm_only"
eaccelerator.content = "shm_only"
eaccelerator.debug = 0
EOF
mkdir -p /var/www/eaccelerator.cache
chown nginx. /var/www/eaccelerator.cache

Podemos verificar que esta bien instalado el eAccelerator mediante la opción -v:

# /opt/php53fpm/sbin/php-fpm -c /opt/php53fpm/etc/php.ini -v
PHP 5.3.5 (fpm-fcgi) (built: Feb 21 2011 12:46:30)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
    with eAccelerator v0.9.6.1, Copyright (c) 2004-2010 eAccelerator, by eAccelerator

A continuación deberemos instalar nginx. Primero debemos instalar las dependencias:

for i in pcre-devel openssl-devel zlib-devel; do yum install $i -y; done

A continuación descargamos nginx y lo compilamos:

cd /usr/local/src/
wget http://sysoev.ru/nginx/nginx-0.8.54.tar.gz
tar xzf nginx-0.8.54.tar.gz 
cd nginx-0.8.54
./configure --prefix=/usr/local/ --without-http_autoindex_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --conf-path=/usr/local/etc/nginx.conf --with-http_stub_status_module
make && make install

Una vez instalado deberemos preparar el entorno, primero creamos un directorio para almacenar los VirtualHosts por separado:

mkdir -p /usr/local/etc/nginx/vhosts

A continuación deberemos crear el fichero /usr/local/etc/nginx.conf con la siguiente configuración básica:

user  nginx;

worker_processes  4;

daemon off;

events
{
	worker_connections  1024;
}

http
{
	include			mime.types;
	default_type		application/octet-stream;

	server_tokens		off;
	log_not_found		off;

	sendfile		on;
	tcp_nopush		on;
	tcp_nodelay		off;

	keepalive_timeout   	5;
	gzip			off;

	include 		/usr/local/etc/nginx/vhosts/*.conf;

	server
	{
        	listen        80 default;
	        server_name   localhost;

        	access_log    off;
		error_log     off;

		location /server-status
		{
			stub_status on;
			access_log   off;
			allow 127.0.0.1;
			deny all;
		}


	        location /
        	{
	                root   /var/www/void;
        	}
	}
}

A continuación crearemos un fichero llamado /usr/local/etc/nginx/fastcgi.conf con las opciones comunes del fastcgi:

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param  PATH_INFO $fastcgi_script_name;
 
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
 
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
 
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;

Finalmente crearemos un VirtualHost para probar la aplicación:

server
{
        listen 80;

        server_name     systemadmin.es;

        location /
        {
                root    /var/www/systemadmin.es/www;
                index   index.php;

                location ~* ^.+\.(css|js|gif|jpeg|jpg|png|ico)$
                {
                        expires 8760h;
                }

                try_files $uri $uri/ /index.php?$query_string;

                location ~ \.php$
                {
                        include         /usr/local/etc/nginx/fastcgi.conf;
                        fastcgi_index index.php;
                        fastcgi_pass 127.0.0.1:9000;
                }

        }

}

A continuación podemos comprobar la configuración del nginx con la opción -t:

# nginx -t
the configuration file /usr/local/etc/nginx.conf syntax is ok
configuration file /usr/local/etc/nginx.conf test is successful

Con la configuración correcta lo arrancamos:

mkdir -p /usr/local/supervise/nginx/
cat > /usr/local/supervise/nginx/run <<EOF
#!/bin/bash
exec /usr/local/sbin/nginx
EOF
chmod +x /usr/local/supervise/nginx/run
ln -s /usr/local/supervise/nginx/ /service/

Y lo mismo para el PHP-FPM:

mkdir -p /usr/local/supervise/php-fpm
cat > /usr/local/supervise/php-fpm/run <<EOF
#!/bin/bash
exec /opt/php53fpm/sbin/php-fpm -c /opt/php53fpm/etc/php.ini
EOF
chmod +x /usr/local/supervise/php-fpm/run
ln -s /usr/local/supervise/php-fpm/ /service/

A continuación ya tendremos levantado el nginx y listo para ejecutar código PHP mediante PHP-FPM.

4 comments to “Instalar nginx con php 5.3 mediante php-fpm y eAccelerator”

  1. Espectacular! Muchas gracias por la receta, quería ver las bondades de nginx con fpm para servir php…y dejar de usar un server windows.

    Algunos detalles

    La secuencia

    "for i in pcre-devel openssl-devel zlib-devel; do yum install $i -y; done"
    

    requiere la previa instalacion de yum con apt-get pero incluso asi no encontro esos paquetes… termine instalandolos con aptitude y nginx no se “quejo”.

    Al comienzo:

    ./config.nice --enable-fpm --prefix=/opt/php53fpm --exec-prefix=/opt/php53fpm --with-config-file-path=/opt/php53fpm/etc/
    

    no lo encontre y termine haciendo

    ./configure --enable-fpm --prefix=/opt/php53fpm --exec-prefix=/opt/php53fpm --with-config-file-path=/opt/php53fpm/etc/
    

    Algunos detalles al final:
    ln -s /usr/local/supervise/nginx/ /service/
    deberia ser
    ln -s /usr/local/supervise/nginx/ /service
    Asi como
    ln -s /usr/local/supervise/php-fpm/ /service/
    deberia ser
    ln -s /usr/local/supervise/php-fpm/ /service

    Por otro lado
    “Finalmente crearemos un VirtualHost para probar la aplicación:”
    falta indicar el path, quedaria
    “Finalmente crearemos un /usr/local/etc/nginx/vhosts/misitioweb.conf para probar la aplicación:”

    Muchas gracias de vuelta!
    Andrew

  2. Este paso a paso estaba pensado para una CentOS, pero para una debian-like te vale, como dices, cambiando yum por aptitude

    Lo del configure, cierto, pero faltarian añadir más opciones tipicas de PHP, lo actualizo en el post

    Los ln son correctos, simplemente pasa que no debes tener instaladas las daemontools

  3. Hola

    preguntas que me surgen

    1. porque no configurarl como simple demonio
    2. como tú haces para configurar ese “servicio” necesitas las daemontools? Es que no entiendo como lo “levantas”

    ln -s /usr/local/supervise/nginx/ /service/

    3. siguiendo esta guía, ¿podríamos llegar a instalarlo como daemon sin que afectase demasiado al funcionamiento? sería compatible entiendo…

    Gracias!

  4. Cuestión de gustos, pero el procedimiento sirve lo mismo para instalarlo como daemon quitando todo lo relacionado con las daemontools

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>