Instalar un servidor web local Ubuntu 18.04 LTS en el subsistema Linux de Windows 10 WSL2

Se puede instalar un Servidor Web Local en el nuevo SubSistema Linux WSL2 que viene integrado en las últimas versiones de Windows 10 que permite tener un verdadero sistema Linux integrado y con sus ficheros accesibles desde Windows y con aplicaciones Windows un portapapeles compartido para copiar y pegar entre los 2 sistemas (Ctrl +C / Ctrl + V) de una manera más ágil que con una máquina virtual VMWare o VirtualBox.

WSL2 no es un Linux en entorno gráfico según se instala por defecto (por ahora en estos momentos) pero como servidor web no es necesario en ningún momento, aun así hay tutoriales en Internet para darle ese entorno gráfico de usuario.

Se accede al servidor desde el navegador en Windows como localhost ó 127.0.0.1 pero también se puede acceder desde cualquier otro equipo en la Red Local disponiendo la ip de wsl2 siguiendo unas instrucciones que no son objeto de esta GUÍA.

En la BIOS del ordenador hay que tener habilitada la Virtualización al igual que ocurre para ejecutar las máquinas virtuales de VMWare y VirtualBOX.

Para ver cual es el estado de nuestro hardware abriremos el administrador de tareas pulsando a la vez las teclas Ctrl+Shift+Esc o haciendo clic derecho en la barra de tareas y seleccionando la opción del administrador de tareas. Una vez hecho esto, expandimos la vista e iremos a la pestaña de Rendimiento, en la que podremos ver las distintas vistas del hardware de nuestro equipo y se puede ver el texto Virtualización: Habilitado.

Administrador de tareas


Si no es así hay que arrancar el ordenador y acceder al menú de la BIOS para habilitar esa característica del Hardware, hay sistemas que tienen capada esta opción lo cual hace imposible la instalación de máquinas virtuales en el sistema.

Hay que comprobar que la versión de Windows 10 es versión 1903 o posterior haciendo lo siguiente:

Tecla Windows + R
winver

botón Aceptar
Aparecerá un cuadro con los datos de la versión de Windows instalada en el ordenador.

Acerca de Windows


En Windows 10 se habilita la opción Modo Programador.
Tecla Windows + I para abrir el menú de Configuración.
Luego seleccionar la opción Actualización y seguridad.
Luego seleccionar la opción Para programadores.
Luego activar la opción Modo Programador.

==============================================================================
Habilitar el subsistema linux wsl 2 en Windows 10 Pro
==============================================================================
HABILITAR WSL OPCION-1
Activar características opcionales de Windows 10
Ir a panel de control
opción Programas y Características
opción activar o desactivar las características de windows
check on Subsistema de Windows para Linux
check on Plataforma de máquina virtual
check on Hyper-V
check on Windows PowerShell 2.0

Características de Windows


Reiniciar sistema Windows 10
==============================================================================
HABILITAR WSL OPCION-2
Abrir PowerShell
Haga clic con el botón derecho en windows "PowerShell" y seleccione Ejecutar como administrador
En la consola powershell de windows 10 ejecutar:
Habilitación del Subsistema de Windows para Linux:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
Habilitación de la característica Máquina virtual:
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
==============================================================================
Reiniciar sistema Windows 10

En el navegador de internet bajar la ultima versión del subsistema linux:

https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

Ejecutar la instalación del fichero descargado (botón derecho "e instalar)

Abrir PowerShell
Haga clic con el botón derecho "en Windows PowerShell y seleccione Ejecutar como administrador
En la consola powershell de windows 10:
Establecer wsl2 como sistema linux predeterminado introduciendo:

wsl --set-default-version 2

Desde la Windows Store buscar LINUX y se puede elegir cualquier distro ubuntu u otras más.
Hay 3 distros Ubuntu la versión básica, versión 18.04 LTS y versión 20.04 LTS todas ellas gratuitas.
Escoger UBUNTU 18.04 LTS
Obtener, Instalar e Iniciar

En la instalación definir un usuario "XXXXXXXX" y su contraseña "YYYYYYYY" (mínimo 8 caracteres)

En la consola PowerShell de windows se puede comprobar que versión de wsl y que distro está instalado con el comando:

wsl --list --verbose

Aparecerá en la consola
NAME STATE VERSION
* Ubuntu-18.04 Running 2
==============================================================================
NOTA:
Ver ayuda comandos wsl con:
wsl --help
Para desinstalar
wsl --unregister Ubuntu-18.04
para apagar wsl
wsl --shutdown

================================== I M P O R T A N T E ==============================


Para acceder desde WINDOWS 10 a los ficheros en la distro UBUNTU de wsl2:
Abrir el explorador de windows e introducir \\wsl$
Aparece el sistema de ficheros de la distro Ubuntu instalada en wsl2

Explorador de archivos


Se pueden copiar, borrar y editar cualquier fichero o carpeta en Ubuntu desde Windows
y usando aplicaciones de Windows.

Una vez instalado Ubuntu en WSL2 se podrá arrancar desde varios sitios:
1.-Pulsando en el icono de Ubuntu en las aplicaciones de Windows con la Interfaz Metro (en el menú inicio si se ha dispuesto previamente)
2.-Pulsando en el acceso directo en la barra de tareas (si se ha dispuesto previamente)
3.-Abriendo PowerShell y con el comando wsl.exe
4.-Abriendo la consola CMD y con el comando wsl.exe

Símbolo del sistema


Se abrirá la ventana de Ubuntu con el prompt del sistema.

==============================================================================

Volvamos a la ventana de Ubuntu después de su instalación. (VER 2ª PARTE)
 
2ª PARTE

Nos situamos en el prompt de Ubuntu 18.04 LTS en WSl2


Vamos a concentrar todo lo básico e inicialmente automatizable en un único fichero "batch"
ejecutable desde el "prompt" del sistema.

Cambiar a SuperUsuario con el comando:
sudo su
Introducir la contraseña "YYYYYYYY" del usuario "XXXXXXXX" definido en la instalación de Ubuntu

Cambiar al directorio raíz del sistema con el comando:
cd /

Ejecutar el comando "cat" para crear el fichero:
cat > runme.sh

Añadir (copiar y pegar) las "líneas de comandos" que están más abajo (ver 3ª parte)

Para salvar el fichero:
pulsamos la tecla ctrl + tecla "D"

Para visualizar el fichero:
cat runme.sh

Hacer el fichero ejecutable con:
chmod +x runme.sh

Finalmente ejecutar con:
./runme.sh
o
sh runme.sh

VER 3ª PARTE
 
3ª PARTE

===================== L I N E A S D E C O M A N D O S ==================================
Copiar y pegar desde la siguiente línea donde empieza el código:


#!/bin/bash
sudo apt-get update # actualizar la base de datos de programas instalados
sudo apt-get upgrade # actualizar los programas instalados con las últimas versiones
echo "*****************************************************************************************"
echo "* INSTALACION DEL SISTEMA APACHE *"
echo "*****************************************************************************************"
sudo apt install apache2 # instalar Apache2
sudo ufw app list
sudo ufw app info "Apache Full"
sudo ufw allow in "Apache Full"
sudo service apache2 start # iniciar el servicio Apache
echo "*****************************************************************************************"
echo "En Windows 10 vaya al navegador:"
echo "localhost"
echo "Tiene que aparecer la página de presentación de APACHE"
echo "*****************************************************************************************"
read -p "Luego Pulsar la tecla [Enter] para continuar..."
echo "*****************************************************************************************"
echo "*****************************************************************************************"
echo "* INSTALACION DE MYSQL SERVER *"
echo "*****************************************************************************************"
echo "* Enter password:ZZZZZZZZ para el usuario root de MySQL *"
echo "*****************************************************************************************"
sudo apt install mysql-server # instalar MySQL
sudo usermod -d /var/lib/mysql/ mysql
sudo /etc/init.d/mysql start # iniciar MySQL
echo "*****************************************************************************************"
echo "* INSTALACION DE LA SEGURIDAD EN MYSQL SERVER *"
echo "*****************************************************************************************"
echo " Preguntas durante la instalación de la Seguridad de Mysql"
echo " VALIDATE PASSWORD PLUGIN can be used to test passwords"
echo " and improve security. It checks the strength of password"
echo " and allows the users to set only those passwords which are"
echo " secure enough. Would you like to setup VALIDATE PASSWORD plugin?"
echo " "
echo " Press y|Y for Yes, any other key for No: [ N ]"
echo " "
echo " Please set the password for root here."
echo " New password:ZZZZZZZZ"
echo " Re-enter new password:ZZZZZZZZ"
echo "*****************************************************************************************"
echo " By default, a MySQL installation has an anonymous user,"
echo " allowing anyone to log into MySQL without having to have"
echo " a user account created for them. This is intended only for"
echo " testing, and to make the installation go a bit smoother."
echo " You should remove them before moving into a production"
echo " environment."
echo " "
echo " Remove anonymous users? (Press y|Y for Yes, any other key for No) :[ Y ]"
echo "*****************************************************************************************"
echo " Normally, root should only be allowed to connect from"
echo " 'localhost'. This ensures that someone cannot guess at"
echo " the root password from the network."
echo " "
echo " Disallow root login remotely? (Press y|Y for Yes, any other key for No) :[ N ]"
echo "*****************************************************************************************"
echo " By default, MySQL comes with a database named 'test' that"
echo " anyone can access. This is also intended only for testing,"
echo " and should be removed before moving into a production"
echo " environment."
echo " "
echo " Remove test database and access to it? (Press y|Y for Yes, any other key for No) :[ N ]"
echo "*****************************************************************************************"
echo " ... skipping."
echo " Reloading the privilege tables will ensure that all changes"
echo " made so far will take effect immediately."
echo " "
echo " Reload privilege tables now? (Press y|Y for Yes, any other key for No) :[ Y ]"
echo "*****************************************************************************************"
read -p "Apunte las respuestas ( N Y N N Y ) y luego Pulsar la tecla [Enter] para continuar..."
echo "*****************************************************************************************"
sudo mysql_secure_installation # Establecer la seguridad en MySQL
sudo service mysql start # Iniciar el servicio MySQL
echo "*****************************************************************************************"
echo "* ENTRAR EN LA CONSOLA DE MYSQL *"
echo "*****************************************************************************************"
echo "* Enter password:ZZZZZZZZ para el usuario root de MySQL *"
echo "*****************************************************************************************"
echo " - Instrucciones a introducir en la consola MySQL (copiar y pegar una a una)"
echo " - Crear un usuario 'tu-usuario' diferente al root para acceder con todos los privilegios"
echo " - tanto para acceder con phpmyadmin como a un webservice para establecer la conexión"
echo " CREATE USER 'tu-usuario'@'%' IDENTIFIED BY 'tu-contraseña';"
echo " GRANT ALL PRIVILEGES ON *.* TO 'tu-usuario'@'%' WITH GRANT OPTION;"
echo " FLUSH PRIVILEGES;"
echo " exit; "
echo "*****************************************************************************************"
sudo mysql -u root -p # acceder a la consola MySQL
echo "*****************************************************************************************"
echo " INSTALAR PHP *"
echo "*****************************************************************************************"
sudo apt install php libapache2-mod-php php-mysql
sudo apt install php-zip php-gd php-json php-curl
echo "*****************************************************************************************"
echo "Crear el fichero phpinfo.php in /var/www/html"
echo "*****************************************************************************************"
cat <<EOF >var/www/html/phpinfo.php
<?php phpinfo(); ?>
EOF
sudo service apache2 restart
sudo service apache2 status
echo "*****************************************************************************************"
echo "En Windows 10 vaya al navegador:"
echo "localhost/phpinfo.php"
echo "Se verán las características de PHP instaladas"
echo "*****************************************************************************************"
read -p "Luego Pulsar la tecla [Enter] para continuar..."
echo "*****************************************************************************************"
echo "* INSTALAR phpMyAdmin *"
echo "*****************************************************************************************"
echo " 1) En la primera pantalla para elegir Apache2 "
echo " Pulsar la barra espaciadora luego la tecla TAB y luego la tecla ENTER"
echo " 2) En la segunda pantalla"
echo " Pulsar la tecla ENTER"
echo " 3) En la tercera pantalla"
echo " MySQL application password for phpmyadmin:"
echo " introducir WWWWWWWW"
echo " luego pulsar la tecla TAB y luego la tecla ENTER"
echo " 4) En la cuarta pantalla"
echo " Password confirmation:"
echo " introducir WWWWWWWW"
echo " luego pulsar la tecla TAB y luego la tecla ENTER"
echo "*****************************************************************************************"
read -p "Apunte las respuestas y luego Pulsar la tecla [Enter] para continuar..."
echo "*****************************************************************************************"
sudo apt install phpmyadmin php-mbstring php-gettext
sudo phpenmod mbstring
sudo service apache2 restart
echo "*****************************************************************************************"
echo "En Windows 10 vaya al navegador:"
echo "localhost/phpmyadmin"
echo "introduzca tu-usuario con tu-contraseña"
echo "*****************************************************************************************"
read -p "Luego Pulsar la tecla [Enter] para continuar..."
echo "*****************************************************************************************"
echo "* FIN DE LA INSTALACION APACHE-PHP-MYSQL *"
echo "*****************************************************************************************"
read -p "Pulsar la tecla [Enter] para continuar..."

Copiar y pegar hasta la anterior línea donde termina el código:
===================== F I N D E L I N E A S D E C O M A N D O S =====================

VER 4ª PARTE
 
4ª PARTE

******************* REALIZACION MANUAL POSTERIOR INSTALACION PHPMYADMIN ***********************************
* Después de la instalación de phpMyAdmin hay que editar manualmente ficheros de *
* la configuración debido a errores o advertencias del tipo: *
* Warning in ./libraries/plugin_interface.lib.php#551 *
* count(): Parameter must be an array or an object that implements Countable *
* del paquete de phpmyadmin *
* Al pulsar en la opción <importar> datos SQL o hacer consultas *
****************************************************************************************
Primera solución:
Editar el fichero de la librería con el comando (desde Windows o desde Ubuntu):
Ubuntu:
sudo nano /usr/share/phpmyadmin/libraries/plugin_interface.lib.php

-------------------------------------------------------------
Buscar "if ($options != null && count($options) > 0) {" con ctrl+W
- Editar: "if ($options != null && count($options) > 0) {"
- Por esto: "if (! is_null($options) && count((array)$options) > 0) {"
-------------------------------------------------------------
guardar:
ctrl + X -->Y --->ENTER
-------------------------------------------------------------
Luego reiniciar el servicio de MySQL con el comando:
sudo service mysql restart
-------------------------------------------------------------
Segunda solución:
Editar el fichero de la librería con el comando (desde Windows o desde Ubuntu):
Ubuntu:
sudo nano /usr/share/phpmyadmin/libraries/sql.lib.php

-------------------------------------------------------------
Buscar "|| (count($analyzed_sql_results['select_expr'] == 1)" con ctrl+W
- Editar: "|| (count($analyzed_sql_results['select_expr'] == 1)"
- Por esto: "|| (count($analyzed_sql_results['select_expr']) == 1)"
------------------------------------------------------------
Buscar "&& ($analyzed_sql_results['select_expr'][0] == '*')))" con ctrl+W
- Editar: "&& ($analyzed_sql_results['select_expr'][0] == '*')))"
- Por esto: "&& ($analyzed_sql_results['select_expr'][0] == '*'))"
-------------------------------------------------------------
guardar:
ctrl + X -->Y --->ENTER
-------------------------------------------------------------
Luego reiniciar el servicio de MySQL con el comando:
sudo service mysql restart
-------------------------------------------------------------
Después en Windows 10 en el navegador introducir:
localhost/phpmyadmin
Luego el usuario: tu-usuario
Contraseña: tu-contraseña
Crear una base de datos, tablas, definir campos, consultas, importar/exportar datos, etc.
-------------------------------------------------------------
Otras características.
Establecer en Apache la prioridad de archivos PHP sobre archivos HTML
sudo nano /etc/apache2/mods-enabled/dir.conf
cambiar:
DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm
por:
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
Reiniciar el servidor Apache para que los cambios sean reconocidos:
sudo service apache2 restart
sudo service apache2 status


En caso de que se tengan problemas al ejecutar esta GUIA o se observen errores o mejoras a realizar, ruego que se comenten en este POST para darles solución.

Muchas gracias.
 
He creado otro post para utilizar las últimas versiones que creo más adecuadas en previsión futura para testar las páginas en desarrollo:

Ubuntu 20.04 LTS
PHP 7.4 y MySQL 8.0


El procedimiento es más sencillo, ya que no hay que hacer correcciones a la instalación de phpMyAdmin.

RECOMIENDO ESTE PROCEDIMIENTO PARA UN SERVIDOR WEB LOCAL MEJOR QUE EL ANTERIOR con Ubuntu 18.04 LTS.
 
Para trabajar desde el file explorer de windows o cualquier otra aplicación de windows sobre ficheros del wsl2 debemos tener arrancado el sistema wsl2 previamente para no tener problemas de corrupción si accedemos a esos ficheros.

Siempre acceder a través de \\wsl$

Hay que arrancar el sistema wsl2 con el usuario root de linux para ello debemos de ejecutar con privilegios de administrador una consola de comandos en windows (cmd, powershell, windows terminal) e introducir el siguiente comando:

Código:
Establecer como usuario por defecto para ahora y siguientes sesiones:
ubuntu1804 config --default-user root & ubuntu1804.exe

posteriormente con wsl.exe también seria el usuario root
Código:
Como usuario en la sesión que se abré
wsl --user root

las siguientes veces sino se indica nada será con el usuario por defecto que este definido.


A partir de ese momento podemos editar un fichero en Linux con:

En la consola de windows:
Código:
notepad.exe \\wsl$\Ubuntu-18.04\var\www\html\phpinfo.php
En la consola de Linux :
Código:
root@DESKTOP-C0JHKLC:~# notepad.exe /var/www/html/phpinfo.php

Desde el explorador de windows podemos acceder a las carpetas y ficheros de windows así como a las carpetas y ficheros de linux y copiar, mover, borrar, editar entre ambos sistemas como si fueran uno solo.

Con WSL2 se crea un entorno de desarrollo mucho mas confortable utilizando las herramientas de windows de edición de código y de mantenimiento de los ficheros involucrados y ejecutando en el servidor web de Linux Ubuntu

Esto mismo también se consigue evidentemente en desarrollo en windows con otras utilidades como xampp, Uniform Server Zero XIV , etc...
 
Arriba