MP08 - UF2: Servidors d'aplicacions web
Sistema Gestor de Bases de Dades - MariaDB (i)
Nosaltres treballem amb una la plataforma LAMP per tant, la configuració que donarem és unica i exclusivament pel servidor web Apache. En altres implemetacions web (Linux vs Windows, Apache vs Nginx, MySQL/MariaDB vs PostgreSQL, PHP vs Perl vs Python, etc) caldrà buscar la forma d'implementació.
El servidor de bases de dades que instal·larem serà MariaDB.
Implementació
Repositori
Recorda que si cal (no troba els paquets, ...) hem d'actualitzar la llista del repositori amb la comanda
apt-get update
Se suposa que tenim iniciat el nostre servidor ubuntu i iniciarem una shell per a poder fer la instal·lació del que calgui. A partir d'aquí:
Instal·lem client i Servidor de Base de Dades
apt install -y mariadb-server mariadb-client
Iniciem el servidor de base de dades
service mariadb start
i ara si mirem els processos en marxa al nostre sistema, hi podrem veure els de l'apache i el del mariaDB.
root@xxxxx:~$ ps -ef | grep -e apache -e maria | grep -v grep
root 3432 1 0 09:50 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 3435 3432 0 09:50 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 3436 3432 0 09:50 ? 00:00:00 /usr/sbin/apache2 -k start
root 5095 1 0 10:08 pts/0 00:00:00 /bin/sh /usr/bin/mariadbd-safe
mysql 5220 5095 1 10:08 pts/0 00:00:00 /usr/sbin/mariadbd --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --skip-log-error --pid-file=/run/mysqld/mysqld.pid --socket=/run/mysqld/mysqld.sock
A partir d'aquí ja podriem treballar amb la instrucció mysql
per accedir al servidor i treballar amb ell però ens calen les credencials per a poder entrar i per això ens cal executar la comanda mysql_secure_installation
:
sudo mysql_secure_installation
Aquesta comanda ens farà diverses preguntes. Sempre es recomana tenir el mínim de permisos.
Si volem accedir des de la màquina local amb alguna eina client, recomano, ja que tenim habilitat el protocol ssh, deshabilitar l'accés remot de root
i accedir obrint el port de mariadb, 3306, amb la connexió ssh. Caldrà no tenir autenticació unix_socket.
sudo mysql_secure_installation
* * *
Switch to unix_socket authentication [Y/n] n
* * *
Disallow root login remotely? [Y/n] y
* * *
Possible sortida i respostes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
|
A partir d'aquest moment, podem entrar via comanda mysql
amb l'usuari root
i el password que li hagim posat.
Si volem accedir al servidor per ssh cal instal·lar-ne el servei. Això ens permetrà utilitzar eines locals per connectar-nos com si fossim localhost
.
apt install ssh
Client SSH |
---|
ssh root@localhost -L 3306:127.0.0.1:3306 |
No podem connectar-nos per ssh amb l'usuari root?
Correcte, per defecte, la connexió amb l'usuari root des del servei ssh està deshabilitat. Per això proposo:
-
Crear un nou usuari local amb password.
Creem un usuariuseradd -m -s /bin/bash usuari echo "usuari:password" | chpasswd
-
Utilitzar aquest usuari per la connexió.
Client SSH |
---|
ssh usuari@localhost -L 3306:127.0.0.1:3306 |
Ara podem accedir al servidor obrint un tunel ssh cap al servidor pel port 3306. podem fer-ho amb la comanda ssh o bé amb l'eina putty:
ssh usuari@localhost -L 3306:127.0.0.1:3306
Tunnelling amb Putty | DBeaver |
---|---|
![]() |
![]() |
Podem mapejar tants ports com ens interesssi
Ara sí que podem començar a treballar amb la shell de mariadb o amb el client que vulguem.
$ mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 69
Server version: 10.6.12-MariaDB-0ubuntu0.22.04.1 Ubuntu 22.04
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.001 sec)
MariaDB [(none)]> exit;
usuari root sense password?
Assegura't que l'usuari root tingui password ja que en cas contrari pot causar problemes de seguretat o d'accés a través de phpmyadmin, o altres eines, més endavant.
Connectem php i mariadb
Ens falta fer la connexió del php amb el mariadb, és a dir, instal·lar els mòduls que connecten php amb mariadb. Cal fer-ho a la versió de php on necessitem l'accés al servidor de base de dades.
Això podem fer-ho manualment o bé instal·lar el phpmyadmin i aquest ja ens en farà la instal·lació.
Connexió a la BD amb PDO
En aquest exemple i tots els del lloc web es farà la connexió amb el SGBD utilitzant PDO
Per veure-ho afegirem un fitxer, anomenat bdd.php
, a l'arrel del servidor web (on apunta el DocumentRoot
) amb el següent contingut:
És possible abans de poder editar-lo amb el Visual Studio Code, l'haguem de crear
docker exec PI touch /var/www/html/bdd.php
<?php
$servername = "ipdelservidor";
$username = "root";
$password = "passwordQueTinguiElRoot";
try {
$conn = new PDO("mysql:host=$servername;dbname=mysql", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully";
} catch(PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
?>
Accedim a la pàgina web http://ipdelservidor/bdd.php i al tenir el codi d'accés a la base de dades dins un try, el missatge que ens dóna és Connection failed: could not find driver
.
Si no tinguéssim el codi protegit per un try
caldria procedir de la següent forma:
-
Abans d'accedir a la pàgina web http://ipdelservidor/bdd.php podem executar la comanda
tail
al nostre servidor per a veure si es produeix algun error.tail -n 0 -f /var/log/apache2/error.log
L'error que ens donaria si no tinguéssim el codi dins el
try
seria:PHP Fatal error: Uncaught PDOException: could not find driver in /var/www/html/bdd.php
La qual cosa significa que ens falta instal·lar el mòdul de connexió del llengiatge php amb la base de dades mariadb.
Instal·lem els mòduls d'accés del php al servidor de base de dades
Cal instal·lar el mòdul php-mysql
. Segons la versió de php que tinguem, ens instal·larà els mòduls libapache2-mod-phpX.y phpX.y-cli phpX.y-common phpX.y-opcache phpX.y-readline
. Cal fixar-nos bé amb la versió de php. Si en volem una altra, el millor serà instal·lar el mòdul php7.4-mysql
per exemple.
apt install php-mysql
COMPTE a l'hora de la instal·lació. Cal que sigui la mateixa versió de php que tenim instal·lada i habilitada a l'apache.
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
libapache2-mod-phpX.y phpX.y-cli phpX.y-common phpX.y-opcache phpX.y-readline
Suggested packages:
php-pear
The following NEW packages will be installed:
phpX.y-mysql
The following packages will be upgraded:
libapache2-mod-phpX.y phpX.y-cli phpX.y-common phpX.y-opcache phpX.y-readline
5 upgraded, 1 newly installed, 0 to remove and 23 not upgraded.
Need to get 4,853 kB of archives.
After this operation, 138 kB of additional disk space will be used.
Do you want to continue? [Y/n]
Ara només ens cal reiniciar el servidor web, si no ens ho ha demanat la instal·lació,
service apache2 restart
per tal que l'apache s'executi havent carregat el php amb el mòdul d'accés al servidor de bases de dades mariaDB.
Si tornem a accedir a http://ipdelservidor/bdd.php veurem que intenta connectar-se; una altra cosa és que tinguem permisos per a fer-ho - Connection failed: SQLSTATE[HY000] [1698] Access denied for user 'root'@'localhost'
.
Es recomana crear sempre un usuari i una base de dades per cadascuna de les aplicacions que vulguem desenvolupar o instal·lar. No utilitzeu mai l'usuari root
.
Eina d'administració del MariaDB: phpmyadmin
Instal·larem el paquet phpmyadmin
per administrar remotament el servidor web, en cas necessari.
apt install -y phpmyadmin php-mbstring php-zip php-gd php-json php-curl
Altres extensions
Hem instal·lat algunes extensions de php però segons els CMS que instal·lem és possible que calgui instal·lar-ne d'altres.
Si no podem executar la instal·lació per no existir algun dels mòduls, podem treure'l de la llista.
I si no s'ha activat automàticament el phpmyadmin
?
Ara ens cal activar el paquet phpmyadmin
ja que en les proves fetes no el teniem activat. Per això caldrà afegir el fitxer /etc/phpmyadmin/apache.conf
dins el directori de configuracions disponibles de l'apache /etc/apache2/conf-available
per a posteriorment habilitar-la a2enconf
. Ho farem amb les següents instruccions:
ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf-available/phpmyadmin.conf
a2enconf phpmyadmin
systemctl reload apache2
Fixeu-vos que al fitxer de configuració l'hem anomenat phpmyadmin.conf
Provem-ho
Per a poder treballar amb el phpmyadmin, caldrà iniciar sessió a http://ipdelservidor/phpmyadmin però, per a no treballar amb l'usuari root, crearem un usuari administrador admin amb password daw. Això ho fem amb les següents comandes:
mysql -u root -p -e "CREATE USER 'admin'@'localhost' IDENTIFIED BY 'daw'; GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES;"
Després crearem un usuari i una base de dades per a provar que som capaços, des de php, d'accedir al servidor web. Creem un usuari m8 amb password m8 i una base on tingui tots els permisos anomenada, també, m8
mysql -u admin -pdaw -e "CREATE USER 'm8'@'localhost' IDENTIFIED BY 'm8'; CREATE DATABASE m8; GRANT ALL PRIVILEGES ON m8.* TO 'm8'@'localhost';"
mysql -u m8 -pm8 m8 -e "CREATE TABLE t1(ct1 INT AUTO_INCREMENT PRIMARY KEY, dt1 VARCHAR(50)); INSERT INTO t1(dt1) VALUES ('Un'),('Dos'),('Tres'),('Quatre'),('Cinc'),('Sis'),('Set');"
Puc connectar-me des d'eines externes com ara el dBeaver amb un usuari usuari@%
?
Aquesta NO ÉS una configuració recomanda sota cap concepte
La configuració que tenim, per defecte, al servidor mariadb només permet la connexió al servidor de bases de dades des de l'adreça 127.0.0.1.
Per a poder accedir des d'altres hosts cal canviar la configuració del servidor mariadb, tenint en compte que això provoca una menor seguretat, per tal que escolti les peticions des de qualsevol IP, o la que ens interessi.
Si volem fer-ho, però, cal canviar el fitxer /etc/mysql/mariadb.conf.d/50-server.cnf
, modificant la línia on especifiquem que el servidor només escolta per la ip ipdelservidor i posant-li que cal escoltar per la ip 0.0.0.0. Aquesta IP indica que escolta les peticions per totes les IPs que té el contenidor.
Així doncs, cal buscar la línia
bind-address = 127.0.0.1
i modificar-hi l'adreça així
bind-address = 0.0.0.0
A l'haver modificat el fitxer de configuració del mariadb cal reiniciar-ne el servei.
systemctl restart mariadb
Amb quin usuari accedeixo?
Per accedir des d'una màquina externa, cal crear un usuari que no sigui amb host localhost
. La següent comanda crea un usuari anomenat admin@'%'
amb password daw
que pot accedir, per tant, des de qualsevol host amb permisos de DBA.
mysql -u admin -pdaw -e "CREATE USER 'admin'@'%' IDENTIFIED BY 'daw'; GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;"
Aquesta NO ÉS una configuració recomanda sota cap concepte