Cómo instalar nginx, php, mysql y wordpress en Ubuntu 16.04 (Xenial Xerus), (LEMP)

Vamos a hacer una instalación de un LEMP (Linux, Nginx, MySQL y PHP) en Ubuntu 16.04 (Xenial Xerus).

Pre requisitos:

Si lo van a hacer local tener Ubuntu 16.04 (Xenial Xerus) instalado en su equipo, si lo van a instalar en un servidor o VPS, tener contratado el VPS o Servidor en la nube, configurar y probar los accesos vía ssh tener Ubuntu 16.04 (Xenial Xerus) instalado en el Servidor o VPS.

vamos a conectarnos por ssh a la maquina remota para poder hacer la instalación, los que lo van a hacer en local no necesitan conectarse a ningún servidor.

en este primer paso explico por separado.

si estas en local te vas a la consola y sigues los pasos a partir del siguiente punto.

si vas a un servidor vas al terminal y nos conectamos vía ssh.

ssh root@direccion_ip_maquinaRemota

les va a pedir contraseña del usuario en este caso el administrador, cuando teclean la contraseña no se ve nada en la consola.

luego que estamos conectados vía ssh a el Servidor remoto vamos a hacer alguna cosas primero actualizar la versión de Ubuntu y después instalar todo lo que necesitamos.

apt update & apt full-upgrade

este comando nos actualiza el sistema operativo ahora vamos a instalar nginx, php, mysql y correremos un wordpress allí.

instalamos nginx, para instalar nginx en Ubuntu debes desinstalar apache2 que no se porque lo instala por defecto.

apt remove --purge apache2*

luego de eso instalamos nginx.

apt install nginx

luego instalamos MySQL

apt install mysql-server mysql-client

les va a pedir la contraseña de administrador de mysql.

asegurar MYSQL

mysql_secure_installation
Enter current password for root (enter for none):
Change the root password? [Y/n] <--N
Remove anonymous users? [Y/n] <-- Y
Disallow root login remotely? [Y/n] <-- Y 
Remove test database and access to it? [Y/n] <-- Y
Reload privilege tables now? [Y/n] <-- Y
Thanks for using MySQL!

Instalamos php-fpm.

apt install php-fpm php-common php-mbstring php-xmlrpc php-soap php-gd php-xml php-intl php-mysql php-cli php-mcrypt php-zip php-curl git

ahora vamos a configurar todo para que nginx y php-fpm se puedan ver en nuestro navegador sin problemas, para esto editamos el fichero /etc/php/7.0/fpm/php.ini con tu editor favorito y modificamos los parámetros.

file_uploads = On
allow_url_fopen = On
memory_limit = 256M
upload_max_filesize = 100M
cgi.fix_pathinfo=0
max_execution_time = 360
date.timezone = America/Caracas

vamos a nuestro browser o navegador web, si están en local y solo en local http://localhost o http://127.0.0.1 allí verán el mensaje de bienvenida de nginx, si es un servidor remoto o VPS o cualquier otro contenedor en la nube http://direcciónIP del servidor y por dirección IP se entiende (dirección del servidor, dominio, subdominio, etc.) allí también deberíamos ver la pagina de bienvenida de nginx.

para saber si tenemos php instalado vamos a crearnos un archivo en el documen root de nginx por ahora para probar que tenemos instalado php esto es en /var/www/html/ allí se encuentra por defecto el archivo index.nginx-debian.html que no es mas que el que trae por defecto nginx, para ejecutar php en nginx debemos hacer y configurar algunas cosas, primero configurar nuestro virtualhost para nginx este se encuentra en /etc/nginx/sites-avaliable/default

##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# http://wiki.nginx.org/Pitfalls
# http://wiki.nginx.org/QuickStart
# http://wiki.nginx.org/Configuration
#
# Generally, you will want to move this file somewhere, and start with a clean
# file but keep this around for reference. Or just disable in sites-enabled.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##

# Default server configuration
#
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        # SSL configuration
        #
        # listen 443 ssl default_server;
        # listen [::]:443 ssl default_server;
        #
        # Note: You should disable gzip for SSL traffic.
        # See: https://bugs.debian.org/773332
        #
        # Read up on ssl_ciphers to ensure a secure configuration.
        # See: https://bugs.debian.org/765782
        #
        # Self signed certs generated by the ssl-cert package
        # Don't use them in a production server!
        #
        # include snippets/snakeoil.conf;

        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.php index.html index.htm index.nginx-debian.html;

        server_name dominio.com o ip;


        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
        #
        #       # With php7.0-cgi alone:
        #       fastcgi_pass 127.0.0.1:9000;
        #       # With php7.0-fpm:
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        }

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

con esta configuración ya deberíamos ver scripts php en nuestro servidor, para ello vamos a crearnos un archivo info.php en nuestro root de nginx que esta en /var/www/html/info.php

vim /var/www/html/info.php

este archivo añadimos lo siguiente:

<?php
   phpinfo();

guardamos el archivo y listo reiniciamos nginx y php-fpm

systemctl restart nginx.service
systemctl restart php7.0-fpm.service

ahora vamos al navegador web y vamos a la dirección: si estas en local http://localhost/info.php o http://127.0.0.1/info.php y se debe ver la configuración de nuestro equipo, si estas en la nube debes poner en el browser http://tu_dominio.com/info.php o http://tu_direccion_ip/info.php

ahora vamos a configurar un virtualhost y crear un directorio para nuestro wordpress, a descargarlo e instalarlo, para esto debemos crearnos un directorio para que se entienda lo voy a hacer en /var/www/ pero por costumbre debe hacerse en /home/usuario/public_html/

mkdir /var/www/wordpress/public_html

con esto creamos el directorio wordpress y public_html en /var/www/ ingresamos al directorio wordpress/poublic_html y allí nos descargamos la ultima versión de wordpress

wget http://wordpress.org/latest.tar.gz

después de descargar wordpress lo descomprimimos.

tar -xvf latest.tar.gz

nos creamos una base de datos para el blog

mysql -u root -p

les pedirá el password de el usuario de mysql lo teclean, ingresan a la consola de mysql y allí vamos a crear las base de datos para el blog

create database wordpress;

con esto creamos la base de datos

create user usuarioblog@localhost identified by '*****';

con este comando creamos un usuario y le damos una contraseña, cambiar los ***** por la contraseña que le quieran asignar al usuario para el blog.

grant all privileges on wordpress.* to usuarioblog@localhost identified by '*****';

con esto asignamos el usuario creado en MySQL a la base de datos y le damos los privilegios que necesita

flush privileges;

limpiamos los privilegios de MySQL

exit;

salimos de MySQL

ya tenemos los datos que necesitamos para la instalación de wordpress, ahora vamos a modificar el archivo wp–config–sample.php de wordpress

cp wp-config-sample.php wp-config.php

editamos el wp-config.php y le damos los parámetros de base de datos

 * @package WordPress
 */

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'Nombre_de_la_base_de_datos');

/** MySQL database username */
define('DB_USER', 'nombre_de_usuario_creado_en_mysql_para_la_base_de_datos_del_wordpress');

/** MySQL database password */
define('DB_PASSWORD', 'contraseña');

/** MySQL hostname */
define('DB_HOST', 'localhost');

listo la configuración del wordpress y la Base de datos, ahora vamos con el virtualhost para mostrar nuestro wordpress, esto lo modificamos en sites-avaliables del nginx

vim /etc/nginx/sites-available/wordpress
# Default server configuration
#
server {
        listen 80 default_server;
        listen [::]:80 default_server;
        client_max_body_size 5000M;
        # SSL configuration
        #
        # listen 443 ssl default_server;
        # listen [::]:443 ssl default_server;
        #
        # Self signed certs generated by the ssl-cert package
        # Don't use them in a production server!
        #
        # include snippets/snakeoil.conf;

        root /var/www/wordpress/public_html;

        # Add index.php to the list if you are using PHP
        index index.php index.html index.htm index.nginx-debian.html;

        server_name nombre_del_servidor.com;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                #try_files $uri $uri/ =404;
                try_files $uri $uri/ /index.php?q=$uri&$args;
        }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
        #
        #       # With php7.0-cgi alone:
        #       fastcgi_pass 127.0.0.1:9000;
        #       # With php7.0-fpm:
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        }

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

debemos crear un enlace simbólico de sites-avaliable a sites-enabled

ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/wordpress

a mi en la primera vez no me corrió wordpress, lo que hice fue habilitar el modulo mcrypt y después reinicie los servicios de nginx y php-fpm

sudo phpenmod mcrypt
sudo systemctl restart php7.0-fpm.service
sudo systemctl restart nginx.service

listo con esto tendrán su wordpress corriendo en nginx, espero les sirva como a mi.

Happy Hacking!