Cómo instalar Nginx con PHP y MySQL (LEMP Stack) en CentOS 7.6

La p√°gina de bienvenida de Nginx.

Este tutorial muestra cómo puede instalar Nginx en un servidor CentOS 7 con soporte para PHP (a través de PHP-FPM) y soporte para MySQL (MariaDB).

¬ŅQu√© es LEMP?

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.

Requisitos previos de LEMP

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

Usaré el editor nano en este tutorial para editar archivos de configuración. Nano se puede instalar así.

yum -y install nano

Recomiendo tener un firewall instalado. Si a√ļn no tiene firewalld instalado y desea usar un firewall, inst√°lelo con estos comandos:

yum -y install firewalld

inicie el cortafuegos y permita que se inicie en el momento del arranque.

systemctl start firewalld.service
systemctl enable firewalld.service

A continuación, abra su puerto SSH para asegurarse de que podrá conectarse al servidor mediante SSH.

firewall-cmd --permanent --zone=public --add-service=ssh
firewall-cmd --reload

Habilitación de repositorios adicionales de CentOS

El √ļltimo Nginx no est√° disponible en los repositorios oficiales de CentOS, por lo que incluimos el repositorio del proyecto Nginx para instalarlo:

nano /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

Instalación de MySQL (MariaDB)

Primero, instalamos MariaDB como reemplazo de MySQL. MariaDB es una bifurcación libre de MySQL. Ejecute este comando en el shell para instalar el servidor de base de datos MariaDB:

yum -y install mariadb mariadb-server net-tools

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

systemctl enable mariadb.service
systemctl start mariadb.service

Ahora verifique que la red esté habilitada. Tenga en cuenta que el servicio MraiDB se llama mysql porque es un servidor de base de datos compatible. Correr

netstat -tap | grep mysql

Debería mostrar algo como esto:

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

Correr:

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
/usr/bin/mysql_secure_installation: line 379: find_mysql_client: command not found
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.
Set root password? [Y/n] <-- ENTER
New password: <-- yourrootsqlpassword
Re-enter new password: <-- yourrootsqlpassword
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] <-- ENTER
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] <-- ENTER
... Success!
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] <-- ENTER
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] <-- ENTER
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
[[email protected] ~]#

[[email protected] ~]# mysql_secure_installation

Instalación de Nginx

Nginx está disponible como un paquete de nginx.org que podemos instalar así:

yum -y install nginx

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

systemctl enable nginx.service
systemctl start nginx.service

Hay posibilidades de que reciba un error de que el puerto 80 ya está en uso, el mensaje de error será así:

[[email protected] ~]# service nginx start
Starting nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
                                                           [FAILED]
[[email protected] ~]#

Esto significa que otro servidor web (probablemente Apache) ya se est√° ejecutando en este servidor. Detenga el servicio Apache y luego inicie el servicio para NGINX:

systemctl stop httpd.service
yum remove httpd
systemctl disable httpd.service

Luego intente iniciar Nginx nuevamente.

systemctl start nginx.service

Abra los puertos HTTP y HTTPS en el firewall

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

La salida resultante en el shell se verá así:

[[email protected] ~]# firewall-cmd --permanent --zone=public --add-service=http
success
[[email protected] ~]# firewall-cmd --permanent --zone=public --add-service=https
success
[[email protected] ~]# firewall-cmd --reload
success
[[email protected] ~]#

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

La p√°gina de bienvenida de Nginx.

Anuncio publicitario

Instalando PHP

Podemos hacer que PHP 5 funcione con Nginx a trav√©s de PHP-FPM (Administrador de procesos FastCGI). PHP-FPM 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 -y install php-fpm php-cli php-mysql php-gd php-ldap php-odbc php-pdo php-pecl-memcache php-pear php-mbstring php-xml php-xmlrpc php-mbstring php-snmp php-soap

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.

Instalaré APC desde el repositorio PHP pecl. PECL requiere que se instalen las herramientas de desarrollo de Centos para compilar el paquete APC.

yum -y install php-devel
yum -y groupinstall 'Development Tools'

e instalar APC:

pecl install apc
[[email protected] ~]# pecl install apc
downloading APC-3.1.13.tgz ...
Starting to download APC-3.1.13.tgz (171,591 bytes)
.................done: 171,591 bytes
55 source files, building
running: phpize
Configuring for:
PHP Api Version: 20100412
Zend Module Api No: 20100525
Zend Extension Api No: 220100525
Enable internal debugging in APC [no] : <-- ENTER
Enable per request file info about files used from the APC cache [no] : <-- ENTER
Enable spin locks (EXPERIMENTAL) [no] : <-- ENTER
Enable memory protection (EXPERIMENTAL) [no] : <-- ENTER
Enable pthread mutexes (default) [no] : <-- ENTER
Enable pthread read/write locks (EXPERIMENTAL) [yes] : <-- ENTER
building in /var/tmp/pear-build-rootVrjsuq/APC-3.1.13
......

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

nano /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
[...]

(Por favor lee http://wiki.nginx.org/Trampas para averiguar por qué debería hacer esto.)

y agrega la línea:

[...]
extension=apc.so

al final del archivo /etc/php.ini.

Adem√°s de eso, para evitar errores de zona horaria como

[28-June-2016 14:21:01] 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:

[...]
[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"
[...]

Puede encontrar la zona horaria correcta para su sistema ejecutando:

gato /etc/sysconfig/reloj

[[email protected] nginx]# gato /etc/sysconfig/reloj
ZONA=¬ĽEuropa/Berl√≠n¬Ľ
[[email protected] nginx]#

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

systemctl enable php-fpm.service
systemctl start php-fpm.service

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.

Configuración de Nginx

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

nano /etc/nginx/nginx.conf

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

[...]
worker_processes  4;
[...]
    keepalive_timeout  2;
[...]

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:

nano /etc/nginx/conf.d/default.conf
[...]
server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;

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

    #error_page  404              /404.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;
    }
}

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_Uncontrolled_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 escucha 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:

systemctl restart nginx.service

Ahora cree el siguiente archivo PHP en la ra√≠z del documento /usr/share/nginx/html…

nano /usr/share/nginx/html/info.php
<?php
phpinfo();
?>

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

La información de PHP de nuestro servidor nginx.

Como puede ver, PHP 5 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:

El controlador MySQL se ha activado en PHP.

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…

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

… y hacer que la l√≠nea de escucha tenga el siguiente aspecto:

[...]
;listen = 127.0.0.1:9000
listen = /var/run/php-fpm/php5-fpm.sock
[...]

Luego recarga PHP-FPM:

systemctl restart php-fpm.service

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;, por ejemplo, así:

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

Finalmente, recarga Nginx:

systemctl restart nginx.service

Descarga este servidor CentOS 7 como m√°quina virtual

Esta configuración está disponible como descarga de máquina virtual en formato ova/ovf (compatible con VMWare y Virtualbox) para suscriptores de howtoforge.

Detalles de inicio de sesión para la máquina virtual

  • La contrase√Īa de root es: howtoforge
  • La contrase√Īa del usuario ¬ęadministrador¬Ľ es: howtoforge

Cambie ambas contrase√Īas en el primer inicio de sesi√≥n.

  • La direcci√≥n IP de la VM es 192.168.1.100

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *