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

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

Este tutorial muestra cómo puede instalar Nginx en un servidor CentOS 7 compatible con PHP (a través de PHP-FPM) y 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

Habilitar 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

Instalando 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. Ejecutar

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 

Ejecutar:

mysql_secure_installation

para establecer una contraseña para el usuario raíz (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] ~]#

[[correo electrónico protegido] ~]# mysql_secure_installation

Instalando 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 cortafuegos

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:

Instalando PHP

Podemos hacer que PHP 5 funcione con Nginx a través de PHP-FPM (FastCGI Process Manager). 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 establezca 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
[...]

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

y agregue 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]# cat /etc/sysconfig/clock
ZONE="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_time 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_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á la secuencia de comandos 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):

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:

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 haz 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;, p. 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

Descargar 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 forjar suscriptores.

Información 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 máquina virtual es 192.168.1.100

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/ 

Cent OS
  1. Cómo instalar LEMP Stack (Nginx, MySQL, PHP v7) en CentOS 7

  2. Cómo instalar Nextcloud con Nginx y PHP 7.3 en CentOS 8

  3. Cómo instalar ownCloud 9.1 con Nginx y MariaDB en CentOS 7

  4. Cómo instalar WordPress con HHVM y Nginx en CentOS 7

  5. Cómo instalar Linux, Nginx, MariaDB, PHP (LEMP Stack) en CentOS 7 / RHEL 7

Cómo instalar Nginx con PHP y MariaDB (LEMP Stack) en Fedora 31

Cómo instalar Nginx con PHP y MySQL (LEMP Stack) en Ubuntu 20.04 LTS

Cómo instalar Linux, Nginx, MariaDB, PHP (LEMP Stack) en CentOS 8 / RHEL 8

Cómo instalar Linux, Nginx, MySQL, PHP (LEMP Stack) en Ubuntu 18.04

Cómo instalar LEMP Stack (Nginx, MariaDB y PHP) en AlmaLinux 8

Cómo instalar LEMP en CentOS 7