GNU/Linux >> Tutoriales Linux >  >> Cent OS

Instalación de Nginx con soporte PHP5 (y PHP-FPM) y MySQL en CentOS 6.4

Nginx (pronunciado "motor x") es un servidor HTTP gratuito, de código abierto y de alto rendimiento. Nginx es conocido por su estabilidad, rico conjunto de funciones, configuración simple y bajo consumo de recursos. Este tutorial muestra cómo puede instalar Nginx en un servidor CentOS 6.4 compatible con PHP5 (a través de PHP-FPM) y MySQL.

¡No emito ninguna garantía de que esto funcione para usted!

1 nota preliminar

En este tutorial utilizo el nombre de host server1.example.com con la dirección IP 192.168.0.100. Estas configuraciones pueden diferir para usted, por lo que debe reemplazarlas cuando corresponda.

2 Habilitar repositorios adicionales

php-fpm no está disponible en los repositorios oficiales de CentOS, sino en el repositorio Remi RPM, que a su vez depende del repositorio EPEL; podemos habilitar ambos repositorios de la siguiente manera:

rpm --import https://fedoraproject.org/static/0608B895.txt 
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
yum install yum-priorities

Edite /etc/yum.repos.d/epel.repo...

vi /etc/yum.repos.d/epel.repo

... y agregue la línea prioridad=10 a la sección [epel]:

Luego haga lo mismo para la sección [remi] en /etc/yum.repos.d/remi.repo, además cambie habilitado a 1:

vi /etc/yum.repos.d/remi.repo
[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
[...]

3 Instalación de MySQL 5

Primero instalamos MySQL 5 así:

yum install mysql mysql-server

Luego creamos los enlaces de inicio del sistema para MySQL (para que MySQL se inicie automáticamente cada vez que se inicia el sistema) e iniciamos el servidor MySQL:

chkconfig --levels 235 mysqld on
/etc/init.d/mysqld start

Ahora verifique que la red esté habilitada. Ejecutar

netstat -tap | grep mysql

Debería mostrar algo como esto:

[[email protected] ~]# netstat -tap | grep mysql
tcp        0      0 *:mysql                     *:*                         LISTEN      1799/mysqld
[[email protected] ~]#

Si no es así, edite /etc/my.cnf y comente la opción skip-networking:

vi /etc/my.cnf
[remi]
name=Les RPM de remi pour Enterprise Linux $releasever - $basearch
#baseurl=http://rpms.famillecollet.com/enterprise/$releasever/remi/$basearch/
mirrorlist=http://rpms.famillecollet.com/enterprise/$releasever/remi/mirror
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
failovermethod=priority

[remi-test]
name=Les RPM de remi en test pour Enterprise Linux $releasever - $basearch
#baseurl=http://rpms.famillecollet.com/enterprise/$releasever/test/$basearch/
mirrorlist=http://rpms.famillecollet.com/enterprise/$releasever/test/mirror
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

y reinicie su servidor MySQL:

/etc/init.d/mysqld restart

Ejecutar

mysql_secure_installation

para establecer una contraseña para el usuario root (¡de lo contrario, cualquiera puede acceder a su base de datos MySQL!):

[[email protected] ~]# mysql_secure_installation




NOTA: SE RECOMIENDA EJECUTAR TODAS LAS PARTES DE ESTE SCRIPT PARA TODOS MySQL
      SERVIDORES EN PRODUCCIÓN ! ¡POR FAVOR, LEA CADA PASO CUIDADOSAMENTE!


Para iniciar sesión en MySQL para protegerlo, necesitaremos la contraseña actual
del usuario root. Si acaba de instalar MySQL y
aún no ha establecido la contraseña raíz, la contraseña estará en blanco,
por lo que solo debe presionar Intro aquí.

Introducir contraseña actual para root (ingresar para ninguna):<-- ENTER
OK, contraseña utilizada con éxito, continuando...

Configurar la contraseña de root asegura que nadie pueda iniciar sesión en MySQL
usuario root sin la autorización adecuada.

¿Establecer contraseña root? [Y/n] <-- ENTRAR
Nueva contraseña: <-- turootsqlpassword
Vuelve a ingresar la nueva contraseña: <-- turootsqlpassword
¡La contraseña se actualizó correctamente!
Recargando tablas de privilegios. .
 ... ¡Éxito!


De forma predeterminada, una instalación de MySQL tiene un usuario anónimo, permitiendo que cualquier persona
inicie sesión en MySQL sin tener que tener una cuenta de usuario creado para
ellos. Esto solo está diseñado para realizar pruebas y para que la instalación
sea un poco más sencilla. Debe eliminarlos antes de pasar a un
entorno de producción.

¿Eliminar usuarios anónimos? [Y/n] <-- ENTRAR
 ... ¡Éxito!

Normalmente, la raíz solo debería permitirse conectarse desde 'localhost'. Esto
garantiza que nadie pueda adivinar la contraseña raíz de la red.

¿Deshabilitar el inicio de sesión raíz de forma remota? [S/n] <-- ENTRAR
 ... ¡Éxito!

De forma predeterminada, MySQL viene con una base de datos llamada 'prueba' a la que cualquiera puede
acceder. Esto también está diseñado solo para pruebas y debe eliminarse
antes de pasar a un entorno de producción.

¿Eliminar la base de datos de prueba y acceder a ella? [S/n] <-- ENTRAR
 - Eliminando la base de datos de prueba...
 ... ¡Éxito!
 - Eliminando privilegios en la base de datos de prueba...
 ... ¡Éxito !

Al volver a cargar las tablas de privilegios, se asegurará de que todos los cambios realizados hasta el momento
se apliquen de inmediato.

¿Recargar las tablas de privilegios ahora? [S/n] <-- ENTRAR
 ... ¡Éxito!

Limpiando ...



¡Todo hecho! Si completó todos los pasos anteriores, su instalación de MySQL
debería ser ahora segura.

¡Gracias por usar MySQL!


[[ correo electrónico protegido] ~]#

4 Instalación de Nginx

Nginx está disponible como paquete para CentOS 6.4 (de EPEL) que podemos instalar de la siguiente manera:

yum install nginx

Luego creamos los enlaces de inicio del sistema para nginx y lo iniciamos:

chkconfig --levels 235 nginx on
/etc/init.d/nginx start

Escriba la dirección IP o el nombre de host de su servidor web en un navegador (por ejemplo, http://192.168.0.100) y debería ver la página de bienvenida de nginx:

5 Instalación de PHP5

Podemos hacer que PHP5 funcione en nginx a través de PHP-FPM (PHP-FPM (FastCGI Process Manager) es una implementación alternativa de PHP FastCGI con algunas características adicionales útiles para sitios de cualquier tamaño, especialmente sitios más ocupados). Podemos instalar php-fpm junto con php-cli y algunos módulos PHP5 como php-mysql que necesita si desea usar MySQL desde sus scripts PHP de la siguiente manera:

yum install php-fpm php-cli php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-magickwand php-magpierss php-mbstring php-mcrypt php-mssql php-shout php-snmp php-soap php-tidy

APC es un caché de código de operación de PHP gratuito y abierto para almacenar en caché y optimizar el código intermedio de PHP. Es similar a otros cachés de código de operación de PHP, como eAccelerator y Xcache. Se recomienda encarecidamente tener uno de estos instalados para acelerar su página PHP.

APC se puede instalar de la siguiente manera:

yum install php-pecl-apc

Luego abra /etc/php.ini y establezca cgi.fix_pathinfo=0:

vi /etc/php.ini
[...]
#skip-networking
[...]

(Lea http://wiki.nginx.org/Pitfalls para averiguar por qué debería hacer esto).

Además de eso, para evitar errores como

[08-Aug-2011 18:07:08] PHP Warning: phpinfo(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Berlin' for 'CEST/2.0/DST' instead in /usr/share/nginx/html/info.php on line 2

... en /var/log/php-fpm/www-error.log cuando llama a un script PHP en su navegador, debe configurar date.timezone en /etc/php.ini:

[...]
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
cgi.fix_pathinfo=0
[...]

Puede encontrar la zona horaria correcta para su sistema ejecutando:

cat /etc/sysconfig/clock
[[email protected] nginx]# cat /etc/sysconfig/clock
ZONE="Europe/Berlin"
[[email protected] nginx]#

A continuación, cree los enlaces de inicio del sistema para php-fpm e inícielo:

chkconfig --levels 235 php-fpm on
/etc/init.d/php-fpm start

PHP-FPM es un proceso daemon (con el script de inicio /etc/init.d/php-fpm) que ejecuta un servidor FastCGI en el puerto 9000.

6 Configuración de nginx

La configuración de nginx está en /etc/nginx/nginx.conf que abrimos ahora:

vi /etc/nginx/nginx.conf

La configuración es fácil de entender (puede obtener más información aquí:http://wiki.codemongers.com/NginxFullExample y aquí:http://wiki.codemongers.com/NginxFullExample2)

Primero (esto es opcional) puede aumentar la cantidad de procesos de trabajo y establecer el tiempo de espera de keepalive_time en un valor razonable:

[...]
[Date]
; Defines the default timezone used by the date functions
; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
date.timezone = "Europe/Berlin"
[...]

Los hosts virtuales se definen en los contenedores del servidor {} en el directorio /etc/nginx/conf.d. Modifiquemos el host virtual predeterminado (en /etc/nginx/conf.d/default.conf) de la siguiente manera:

vi /etc/nginx/conf.d/default.conf
[...]
worker_processes  4;
[...]
    keepalive_timeout  2;
[...]

nombre del servidor _; lo convierte en un vhost catchall predeterminado (por supuesto, también puede especificar un nombre de host aquí como www.example.com).

En la ubicación / parte, agregué index.php a la línea de índice. raíz /usr/share/nginx/html; significa que la raíz del documento es el directorio /usr/share/nginx/html.

La parte importante para PHP es la ubicación ~ \.php$ {} estrofa. Descoméntalo para habilitarlo. Cambie la línea raíz a la raíz del documento del sitio web (por ejemplo, root /usr/share/nginx/html;). Tenga en cuenta que agregué la línea try_files $uri =404; para evitar exploits de día cero (ver http://wiki.nginx.org/Pitfalls#Passing_Unected_Requests_to_PHP y http://forum.nginx.org/read.php?2,88845,page=3). Asegúrese de cambiar la línea fastcgi_param a fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; porque, de lo contrario, el intérprete de PHP no encontrará el script PHP que llama en su navegador ($document_root se traduce como /usr/share/nginx/html porque eso es lo que hemos establecido como nuestro documento raíz).

PHP-FPM está escuchando en el puerto 9000 en 127.0.0.1 de forma predeterminada, por lo que le indicamos a nginx que se conecte a 127.0.0.1:9000 con la línea fastcgi_pass 127.0.0.1:9000;. También es posible hacer que PHP-FPM use un socket Unix; lo describiré en el capítulo 7.

Ahora guarde el archivo y vuelva a cargar nginx:

/etc/init.d/nginx reload

Ahora cree el siguiente archivo PHP en la raíz del documento /usr/share/nginx/html...

vi /usr/share/nginx/html/info.php
[...]
server {
    listen       80;
    server_name  _;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.php index.html index.htm;
    }

    error_page  404              /404.html;
    location = /404.html {
        root   /usr/share/nginx/html;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        root           /usr/share/nginx/html;
        try_files $uri =404;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    location ~ /\.ht {
        deny  all;
    }
}

Ahora llamamos a ese archivo en un navegador (por ejemplo, http://192.168.0.100/info.php):

Como puede ver, PHP5 funciona y funciona a través de FPM/FastCGI, como se muestra en la línea API del servidor. Si se desplaza hacia abajo, verá todos los módulos que ya están habilitados en PHP5, incluido el módulo MySQL:

7 Hacer que PHP-FPM use un socket Unix

De forma predeterminada, PHP-FPM escucha en el puerto 9000 en 127.0.0.1. También es posible hacer que PHP-FPM use un socket Unix que evita la sobrecarga de TCP. Para hacer esto, abra /etc/php-fpm.d/www.conf...

vi /etc/php-fpm.d/www.conf

... y haz que la línea de escucha tenga el siguiente aspecto:

<?php
phpinfo();
?>

Luego recarga PHP-FPM:

/etc/init.d/php-fpm reload

A continuación, revise su configuración de nginx y todos sus hosts virtuales y cambie la línea fastcgi_pass 127.0.0.1:9000; a fastcgi_pass unix:/tmp/php5-fpm.sock;, p. así:

vi /etc/nginx/conf.d/default.conf
[...]
;listen = 127.0.0.1:9000
listen = /tmp/php5-fpm.sock
[...]

Finalmente recargar nginx:

/etc/init.d/nginx reload

8 Enlaces

  • nginx:http://nginx.org/
  • Wiki de nginx:http://wiki.nginx.org/
  • PHP:http://www.php.net/
  • PHP-FPM:http://php-fpm.org/
  • MySQL:http://www.mysql.com/
  • CentOS:http://www.centos.org/

Sobre el autor

Falko Timme es el propietario de Timme Hosting (alojamiento web nginx ultrarrápido). Es el mantenedor principal de HowtoForge (desde 2005) y uno de los principales desarrolladores de ISPConfig (desde 2000). También ha contribuido al libro de O'Reilly "Administración del sistema Linux".


Cent OS
  1. Cómo instalar Laravel 5.x con Nginx y PHP-FPM 7.1 en CentOS 7

  2. Instalación de Nginx con PHP5 (y PHP-FPM) y compatibilidad con MySQL (LEMP) en Ubuntu 14.04 LTS

  3. Instalación de Lighttpd con soporte PHP5 (PHP-FPM) y MySQL en Ubuntu 14.04LTS

  4. Instalación de Apache2 con compatibilidad con PHP5 y MySQL en OpenSUSE 13.1 (LAMP)

  5. Instalación de Lighttpd con compatibilidad con PHP5 y MySQL en Ubuntu 10.04

Instalación de Lighttpd con PHP5 (PHP-FPM) y MySQL en Debian 8 (Jessie)

Instalación de Apache2 con compatibilidad con PHP5 y MySQL en CentOS 6.2 (LAMP)

Instalación de Apache2 con compatibilidad con PHP5 y MySQL en CentOS 6.3 (LAMP)

Instalación de Apache2 con compatibilidad con PHP5 y MySQL en CentOS 6.4 (LAMP)

Instalación de Nginx con soporte PHP5 (y PHP-FPM) y MySQL en Fedora 19

Instalación de Apache2 con compatibilidad con PHP5 y MySQL en Fedora 20 (LAMP)

    [...]
        location ~ \.php$ {
            root           /usr/share/nginx/html;
            try_files $uri =404;
            fastcgi_pass   unix:/tmp/php5-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    [...]