Raspberry: Instalando Apache, PHP, MariaDB y phpMyAdmin

Junio de 2020. Vamos a revisar parte de esta entrada que si no luego van diciendo por algún foro poco menos que soy un brozas 😀 Y bueno, algo de razón llevan.

De todos modos, la configuración que hay aquí es “de andar por casa”, pero de forma literal. En mi caso tengo la raspi en casa para hacer pruebas que si funcionan luego subo a un sito o a otro. Si tu intención, amable lector, es la de poner una raspi en producción, tendrás que echar un ojo a alguna otra web o manual para implementar y configurar correctamente todo lo referente a la seguridad.

No obstante, sí que es posible acortar un poco la instalación, haciéndola más cómoda y de paso más segura, así que vamos a ello:

En esta entrada vamos a instalar en nuestra Raspberry los siguientes elementos y por este orden:

      • Apache
      • PHP
      • MariaDB
      • phpMyAdmin

Apache

Si continuamos desde la anterior entrada deberíamos tener el aparatejo actualizado, pero por si acaso podemos volver a introducir los comandos para ver si hay alguna actualización nueva y que esta se cargue. Para ello, bien abrimos una ventana de consola de comandos o bien nos conectamos con PuTTY a nuestra Rasberry. Sea cual sea la opción elegida tecleamos:

sudo apt-get update
sudo apt-get upgrade

Ahora toca instalar Apache, para ello tecleamos la siguiente instrucción:

sudo apt-get install apache2

Si todo ha ido bien, poniendo la ip de la Raspberry en el navegador nos tendría que salir una pantalla como esta:

Ahora aplicamos usuario y permisos:

sudo chown -R pi:www-data /var/www/html/
sudo chmod -R 770 /var/www/html/

Y ya está, con esto ya tenemos Apache instalado y funcionando. Nuestra Raspberry ya tiene instalado un servidor de páginas web.

PHP

Toca el turno a PHP. En este caso tecleamos:

sudo apt-get install php php-mbstring

Esto instalará PHP 7 Podemos comprobar que se ha instalado bien y está funcionando creando una sencilla página web que albergue la instrucción phpinfo() y nombrándola como queramos, por ejemplo info.php  Para ello el código de la página ha de ser el siguiente:

<?php
phpinfo ();
¿>

Hay dos formas de hacer esto, bien desde Windows con nuestro editor de código favorito subiendo después el archivo al directorio /var/www/html/ de nuestra Raspberry, o bien desde la consola, con PuTTY o desde la propia Raspberry, con la siguiente instrucción:

echo "<?php phpinfo ();?>" > /var/www/html/info.php

Para mi gusto mucho más cómodo así, aunque es un buen momento si queremos probar el editor de código y el funcionamiento de WinSCP, Filezilla o similar para subir el archivo.

Ahora podremos ver si el PHP se ha instalado correctamente accediendo por el navegador a la ip de la Raspberry seguido de / y nuestro fichero. Si todo va bien veremos algo así:

Para acabar con PHP vamos a instalar SSH2 que lo necesitaremos más adelante:

sudo apt-get install php-ssh2

Esto lo vamos a necesitar cuando conectemos con la Raspberry a través del móvil con la aplicación en App Inventor que realizaremos. De momento solo lo instalamos y a otra cosa.

MariaDB

Nos dejamos de literatura e instalamos MariaDB con las siguientes instrucciones:

sudo apt install mariadb-server
sudo apt install php-mysql

Ahora apañamos el usuario root para MariaDB.

Esta es la parte actualizada que se puede hacer más sencilla y de paso hacer más segura la instalación. Dejaré después el método publicado anteriormente porque también funciona, para tenerlo como alternativa si alguien tiene problemas. Tecleamos la siguiente instrucción:

sudo mysql_secure_installation

Ahora nos tocará responder a una serie de preguntas muy fáciles: En la primera nos pedirá el pass de root, que como no tiene dejaremos en blanco. Acto seguido nos preguntará si queremos asignar uno, le contestamos que sí y le ponemos el pass que queramos, confirmándolo a continuación:

El siguiente interrogatorio versará sobre si queremos borrar los usuarios anónimos e impedir a root el acceso remoto, se recomienda contestar afirmativamente a ambas preguntas:

Por último nos pregunta si deseamos eliminar la base de datos “test” y como no la queremos para nada, pues fuera. A la última pregunta de recargar permisos le contestamos también que sí:

Y con esto ya “casi” está todo. Casi, porque es muy posible que al intentar entrar ahora en MariaDB con:

mysql -u root -pnuestropassword

(Atención: “nuestropassword” es el password que hayamos puesto a root, y no hay que dejar espacio entre -p y el pass)

Obtengamos un bonito:

ERROR 1698 (28000): Access denied for user ‘root’@’localhost’

Bueno pues la solución perfectamente explicada está aquí:

Corregir ERROR 1698 (28000): Access denied for user ‘root’@’localhost’ en MariaDB (MySQL)

Conviene leer la entrada porque es corta y está muy bien explicada, así sabremos qué estamos haciendo, pero básicamente la solución es la siguiente:

Ingresamos con sudo:

sudo mysql -u root -pnuestropassword

Y una vez dentro vamos ejecutando por orden:

USE mysql;

UPDATE user SET plugin="mysql_native_password" WHERE user="root";

FLUSH PRIVILEGES;

exit;

Listo. Ahora deberíamos poder entrar normalmente. Probamos y para comprobar que root está correctamente configurado podemos probar la instrucción:

mysql> SELECT host,user,password,Grant_priv,Super_priv FROM mysql.user;

Deberíamos tener una respuesta como esta:

Y ya está. Verdaderamente es un método mucho más fácil y seguro.

Este es el método que había colgado antes. Funcionar… funciona, aunque es un poco más enrevesado pero lo dejo por si acaso alguien tiene problemas, no obstante el método anterior está probado y es más seguro. Todo lo que hay a continuación en rojo no hay que hacerlo si se ha realizado el paso anterior.

Este root no tiene nada que ver con el del sistema, es un usuario que tendrá todos los privilegios en la base de datos. Debemos ponerle un password, el que queramos y recordemos. A la base de datos nos conectaremos con ese usuario y su password, luego más adelante y por cuestiones de seguridad, ya crearemos otro usuario con menos privilegios, pero de momento configuramos root.

Y para ello lo primero que hacemos es conectar y esto se hace igual que con MySQL:

sudo mysql

Veréis un mensaje de bienvenida y que el prompt cambia. Hay que teclear tres comandos:

DROP USER ‘root’@’localhost’;

Con ese borraremos el usuario root

CREATE USER ‘root’@’localhost’ IDENTIFIED BY ‘aquí_pon_el_password’;

Con esto creamos el usuario y le asignamos un pass (creo que se ve claramente dónde ponerlo…)

GRANT ALL PRIVILEGES ON *.* TO ‘root’@’localhost’;

Y con esto le damos todos los privilegios para todo, parafraseando a José Mota: “todo, en to, pa siempre” (aunque luego veremos que no es del todo así).

No obstante fijaos en la captura de pantalla de la terminal:

Veréis primero cómo se ingresa en MySQL, el mensaje que se muestra y el prompt que queda. A continuación de este veréis cada una de las instrucciones y la respuesta.

“Query Ok” viene a decirnos que la “consulta” o “query”, que así se llaman las instrucciones que introducimos en MySQL, se ha ejecutado correctamente. “0 rows affected” dice que son cero los registros afectados, y así debe ser pues estas consultas no van contra ninguna tabla ni tiene que modificar registro alguno, tan sólo estamos borrando usuarios, creándolos y dando permisos.

Falta una cosilla, y es comprobar los privilegios de root para no tener problemas luego. Para ello realizamos la siguiente consulta (por cierto, que si habéis salido ahora ya no se puede entrar con “sudo mysql” ahora hay que identificarse, usaremos: mysql -u root -pnuestropassword Y fijaos que no hay ninguna comilla y entre -p y el password que hayamos puesto no hay espacio):

mysql> SELECT host,user,password,Grant_priv,Super_priv FROM mysql.user;

Si en la tabla que nos salga vemos que en Grant_priv aparece una “N”

Hay que cambiarlo, actualizando la tabla así:

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';

Si realizamos ahora esa misma consulta veremos que Grant_priv está a “Y”.

Y a continuación:

FLUSH PRIVILEGES;

Para salir, simplemente “exit”

Comparando ambos métodos, es ciertamente mejor, más simple y seguro el primero.

phpMyAdmin

La instalación también es un proceso sencillo, lo único a lo que tenemos que prestar especial atención es a las dos preguntas que se nos formularán:

    • Marcaremos el servidor “apache2” cuando nos dé a elegir el servidor a configurar (Podemos hacer uso de la barra espaciadora para ello. Cuando lo tengamos correctamente seleccionado aparecerá un asterisco)
    • Seleccionaremos “NO” cuando nos dé la opción de usar dbconfig-common, pues ya tenemos una base de datos instalada

Damos la instrucción y fijaos en las capturas de pantalla para cuando os salgan:

sudo apt install phpmyadmin

Para comprobar el funcionamiento procedemos de forma parecida a las anteriores, en el navegador ponemos la ip de la raspberry seguida de /phpmyadmin. Nos debería salir una pantalla como esta:

Para ingresar, ponemos como usuario root y el password que hayamos establecido en MariaDB, y de momento si vemos una pantalla como la siguiente es que phpMyAdmin está instalado y funciona.

Aunque como en este caso, lo más probable es que no esté todavía funcionando correctamente, pues vemos un mensaje de error en la parte baja de la pantalla.

Si buscamos información sobre este error veremos que afecta a las relaciones de tablas del tipo InnoDB, así que vamos a apañarlo para evitarnos posibles futuros quebraderos de cabeza. Esto en paquetes como WAMPP ya viene configurado y no hay que hacerlo, pero aquí, al instalar los componentes uno a uno pues toca.

Básicamente se trata de crear unas tablas, un usuario y modificar un fichero de configuración. Para la creación de las tablas phpMyAdmin incluye el script create_tables.sql Habremos de ejecutar este script y él sólo hará todo el trabajo. Si queréis, podéis descargarlo antes y abrirlo con vuestro editor favorito para echarle un ojo. La ruta en la que se encuentra en la versión que acabamos de instalar es la siguiente:  usr/share/phpmyadmin/sql

Así que nos colocamos en ese directorio y ejecutamos la consulta correspondiente tal que así:

mysql –u root –ppassword < create_tables.sql

La palabra “password” la tenéis que sustituir por el pass que tengáis para root, o no ponerla y os la pedirá tras ejecutar el comando; prestad atención a que entre –p y password no hay espacio.

Y como veréis, no nos va a decir ni esta boca es mía ¿Habrá hecho algo?

Por supuesto que sí. Si queremos comprobarlo podemos pinchar en la casita y desde el home ir a “Bases de datos”, veremos que ahora aparece “phpmyadmin”, que corresponde con la que crea el script, podéis pinchar sobre el nombre y veréis todas las tablas que se han creado, pero si aún con todo queremos asegurarnos de que todo lo que aparece ahí lo ha creado ese script y no estaba ya, podéis ir a la pestaña SQL e introducir la siguiente consulta: SHOW TABLE STATUS; Esto os mostrará información sobre las distintas tablas que incluye la fecha y hora de creación.

Como segundo paso toca modificar el fichero config.inc.php Este se encuentra en la ruta:  etc/phpmyadmin

La modificación de este fichero se puede hacer con cualquier editor. En este caso lo vamos a hacer con nano realizándole antes unos pequeños ajustes gracias a la información sacada de aquí:

https://www.atareao.es/software/programacion/nano-un-editor-de-texto-para-la-terminal/

Se trata de hacer un par de pequeños ajustes en el fichero de configuración de nano, que se encuentra en /etc y se llama nanorc  Hay que descomentar las líneas:

set linenumbers

set rebindkeypad

Con la primera conseguiremos que se nos muestren los números de línea en la izquierda, y nos será mucho más fácil localizar el texto “a borrar”. Con la segunda opción lo que hacemos es que el teclado numérico funcione correctamente. Esto se puede hacer también arrancando nano con la opción “-K”, pero es que a mi se me olvida siempre… En cualquier caso, si por aquellos azares del destino vuestro teclado numérico funciona correctamente con nano o no lo usáis, pasad de comentar esa línea.

Bien, con el nano ya bien configurado, o con vuestro editor favorito dispuesto, nos vamos a etc/phpmyadmin y por seguridad sacamos una copia de config.inc.php antes de ponernos a editar el fichero.

Como es cierto que la edición del fichero tal como aparecía antes resultaba un tanto liosa, vamos a ver si la puedo aclarar un poquito. Comenzamos buscando  primero el trozo que vamos a configurar y descomentar. Supongo que en posteriores versiones puede cambiar de línea, pero ahora mismo comienza en la 109. Entramos al fichero:

sudo nano config.inc.php

Vamos a la línea 109, o a la que contenga lo siguiente:

/* Authentication type */

A partir de ahí tenemos el bloque en el que debemos ir descomentando y configurando ciertas líneas, desde la 110 a la 150 (insisto, en esta versión, comprobad el contenido de las líneas puesto que podrían cambiar de sitio en futuras versiones), para dejarlo así:

Fijaos en los valores que hay que poner al principio, en las líneas “auth_type”, “host” y “port”, y luego en el siguiente bloque: “controlhost”, “controlport”, “controluser” y “controlpass”, en estas dos últimas hay que poner pma y el pass con el que queramos conectar, que será el mismo que usaremos luego.

El resto de líneas sólo es descomentarlas.

Ahora, justo encima del bloque que acabamos de configurar, tenemos otro que vamos a borrar. Es el que “actualmente” comienza en la línea 61 hasta la 107. No obstante, y a riesgo de hacerme “pesao”, no os fiéis de la numeración, el bloque que buscamos comienza con:

Línea 61:    /* Configure according to dbconfig-common if enabled */

En la siguiente línea a la mencionada veremos que se abre un “if” y una llave, hemos de bajar hasta localizar el cierre de la llave y borrar todo eso.

Línea 62     if (!empty($dbname)) {

Línea 107     }

Con nano vamos marcando las líneas con alt+a, las cortamos con ctrl+k y líneas eliminadas.

Todo el bloque que se muestra en la imagen, fuera. Es fácil entenderlo, vemos que el comentario de inicio nos dice “si dbconfig-common está activado”, y le hemos dicho que no.

Con estos cambios ya realizados, guardamos el fichero y salimos (ctrl-o para guardar y ctrl-x para salir, si estamos usando nano, claro)

Por último se trata de crear al usuario para la base de datos phpmyadmin y darle todos los privilegios para ella, sólo para ella.

Vamos a lo fácil y lo hacemos con phpMyAdmin:

Creamos el usuario con su clave (la misma que hemos puesto en el fichero de configuración). Fijaos en la imagen, desde la pantalla principal, pestaña Cuentas de Usuario: Nombre -> pma, host -> localhost, contraseña -> la que hayamos puesto antes en el fichero que acabamos de editar.

Los privilegios globales los dejamos en blanco

Seleccionamos la base de datos phpmyadmin

Y aquí le damos todos los privilegios.

Ya está, ahora cuando volvamos a entrar a phpMyAdmin veremos que el mensaje de error ha desaparecido.

Con esto ya tenemos instalado en nuestra Raspberry un servidor web con soporte para PHP y MySQL, instalado el phpMyAdmin y configurado para el uso de tablas InnoDB que son las que usa por defecto. Si más adelante nos hace falta algún módulo más para PHP o lo que sea, ya lo instalaremos y configuraremos, pero de momento, si no he metido la pata, con esto ya debería de bastar y sobrar para los primeros proyectos.

Anexo: Acceso remoto a MariaDB

Esto no es en absoluto necesario. Únicamente si quieres usar una interfaz gráfica como MySQL Workbench, HeidiSQL o similar, si no es tu caso, te lo puedes saltar.

Como medida de seguridad MariaDB tiene deshabilitado por defecto el acceso remoto y sólo admite conexiones locales, por eso no tenemos ningún problema en conectarnos a MariaDB desde consola o desde phpMyAdmin, pero si lo intentamos a pelo desde MySQL Workbench, por ejemplo, no podremos conectarnos.

La explicación detallada, aquí:

https://mariadb.com/kb/en/configuring-mariadb-for-remote-client-access/

Conviene leerla porque afecta a la seguridad. Si la Raspberry la vamos a tener, como en mi caso, en la calidez del hogar y destinada a las más variopintas pruebas, no habrá mucho problema, pero para desarrollos “serios” conviene valorar la necesidad de modificar esto y ser prudentes.

Para permitir conexiones externas modificamos el fichero /etc/mysql/my.cnf añadiendo al final del mismo las tres líneas que nos indicaban en el link anterior:

[mysqld]
skip-networking=0
skip-bind-address

Tras salvar los cambios reiniciamos el servicio con

sudo service mysql restart

Ahora, para la base de datos a la que queramos acceder bastará crear un usuario con phpMyAdmin dejando la configuración de Nombre de Host así:

“Nombre de Host” -> “Cualquier servidor” -> “%”

para que dicho usuario pueda conectarse desde cualquier sitio con esa base de datos (también podríamos especificar una IP o un rango).

Los campos que aparecen en blanco los rellenaríamos con el nombre de usuario y el pass que queramos, continuaríamos con la configuración igual que hemos hecho antes, seleccionando la DB y otorgando los permisos que debamos y con esto ya tendríamos a un usuario capaz de acceder a una determinada base de datos desde cualquier sitio.

7 respuestas a «Raspberry: Instalando Apache, PHP, MariaDB y phpMyAdmin»

    1. Vaya, siento haber estado ausente tanto tiempo. A estas alturas imagino que ya tienes el problema solucionado, pero si no me dices y te intento echar una mano.
      Edito: Visto los problemas que has tenido, he modificado el apartado de la cuenta de root. El proceso actual es más seguro y fácil.

  1. Sin querer me sale antes de ejecutar esta orden y ahora no me deja ejecutarla ya que me da un error de acceso denegado
    ¿Como puedo arreglarlo?

    GRANT ALL PRIVILEGES ON *.* TO ‘root’@’localhost’;

    Muchas gracias de antemano

  2. excelente nada mas que decir funciono casi todo la parte final del editor quedo un poco engorrosa pero leyendo con calma se entiende.

    1. Aunque con bastante retraso, pero Gracias 😉 Me alegro de que te haya podido ser útil.
      Edito: Tienes razón que a veces me explico fatal fatal… He modificado este apartado, espero que ahora se comprenda mejor.

Deja una respuesta

No está permitida la inserción de ningún dato de carácter personal (mail, tef...). Cualquier comentario que los contenga será editado o eliminado.

Por favor, si dejas un comentario pon cualquier nombre para poderme dirigir a ti pero que no te identifique

El comentario es totalmente privado. No se almacena la IP