Comment configurer une base de données distante pour optimiser les performances du site avec MySQL sous Ubuntu 18.04

introduction

À mesure que votre application ou votre site Web se développe, il se peut que vous deveniez trop grand pour la configuration actuelle de votre serveur. Si vous hébergez votre serveur Web et votre base de données sur le même ordinateur, il peut être judicieux de séparer ces deux fonctions afin que chacune puisse fonctionner sur son propre matériel et partager la charge de réponse aux demandes de vos visiteurs.

Dans ce guide, nous verrons comment configurer un serveur de base de données MySQL distant auquel votre application Web peut se connecter. Nous allons utiliser WordPress comme exemple pour avoir quelque chose à travailler, mais la technique est largement applicable à toute application supportée par MySQL.

Conditions préalables

Avant de commencer ce tutoriel, vous aurez besoin de:

  • Deux serveurs Ubuntu 18.04. Chacun doit avoir un utilisateur non root avec des privilèges sudo et un pare-feu UFW activé, comme décrit dans notre tutorielInitial Server Setup with Ubuntu 18.04. L'un de ces serveurs hébergera votre backend MySQL, et tout au long de ce guide, nous l'appelleronsdatabase server. L'autre se connectera à votre serveur de base de données à distance et agira comme votre serveur Web; de même, nous l'appelleronsweb server au cours de ce guide.

  • Nginx et PHP installéson your web server. Notre tutorielHow To Install Linux, Nginx, MySQL, PHP (LEMP stack) in Ubuntu 18.04 vous guidera tout au long du processus, mais notez que vous devez ignorer l'étape 2 de ce tutoriel, qui se concentre sur l'installation de MySQL, car vous installerez MySQL sur votre serveur de base de données.

  • MySQL a installéon your database server. SuivezHow To Install MySQL on Ubuntu 18.04 pour configurer cela.

  • En option (mais fortement recommandé), les certificats TLS / SSL de Let’s Encrypt ont installéon your web server. Vous devrez acheter un nom de domaine et posséderDNS records set up for your server, mais les certificats eux-mêmes sont gratuits. Notre guideHow To Secure Nginx with Let’s Encrypt on Ubuntu 18.04 vous montrera comment obtenir ces certificats.

[[step-1 -—- configuration-mysql-to-listen-for-remote-connections]] == Étape 1 - Configuration de MySQL pour écouter les connexions à distance

Le fait de disposer de ses données stockées sur un serveur séparé est un bon moyen de se développer normalement après avoir atteint le plafond de performances d’une configuration à une seule machine. Il fournit également la structure de base nécessaire pour équilibrer la charge et étendre encore davantage votre infrastructure ultérieurement. Après avoir installé MySQL en suivant le didacticiel requis, vous devrez modifier certaines valeurs de configuration pour autoriser les connexions à partir d’autres ordinateurs.

La plupart des modifications de configuration du serveur MySQL peuvent être effectuées dans le fichiermysqld.cnf, qui est stocké dans le répertoire/etc/mysql/mysql.conf.d/ par défaut. Ouvrez ce fichier sur votredatabase server avec les privilèges root dans votre éditeur préféré. Ici, nous utiliseronsnano:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Ce fichier est divisé en sections désignées par des étiquettes entre crochets ([ et]). Recherchez la section intituléemysqld:

/etc/mysql/mysql.conf.d/mysqld.cnf

. . .
[mysqld]
. . .

Dans cette section, recherchez un paramètre appelébind-address. Cela indique au logiciel de base de données l'adresse réseau sur laquelle écouter les connexions.

Par défaut, il est défini sur127.0.0.1, ce qui signifie que MySQL est configuré pour rechercher uniquement les connexions locales. Vous devez changer cela pour référencer une adresse IPexternal où votre serveur peut être atteint.

Si vos deux serveurs se trouvent dans un centre de données doté de fonctionnalités réseau privées, utilisez l’adresse IP du réseau privé de votre serveur de base de données. Sinon, vous pouvez utiliser son adresse IP publique:

/etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld]
. . .
bind-address = db_server_ip

Comme vous vous connecterez à votre base de données via Internet, il est recommandé d’exiger des connexions chiffrées pour protéger vos données. Si vous ne cryptez pas votre connexion MySQL, n'importe qui sur le réseau pourraitsniff informations sensibles entre votre serveur Web et vos serveurs de base de données. Pour crypter les connexions MySQL, ajoutez la ligne suivante après la lignebind-address que vous venez de mettre à jour:

/etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld]
. . .
require_secure_transport = on
. . .

Enregistrez et fermez le fichier lorsque vous avez terminé. Si vous utiliseznano, faites-le en appuyant surCTRL+X,Y, puis surENTER.

Pour que les connexions SSL fonctionnent, vous devez créer des clés et des certificats. MySQL est livré avec une commande qui les configurera automatiquement. Exécutez la commande suivante, qui crée les fichiers nécessaires. Il les rend également lisibles par le serveur MySQL en spécifiant l'UID de l'utilisateurmysql:

sudo mysql_ssl_rsa_setup --uid=mysql

Pour obliger MySQL à mettre à jour sa configuration et à lire les nouvelles informations SSL, redémarrez la base de données:

sudo systemctl restart mysql

Pour confirmer que le serveur écoute maintenant sur l'interface externe, exécutez la commandenetstat suivante:

sudo netstat -plunt | grep mysqld
Outputtcp        0      0 db_server_ip:3306     0.0.0.0:*               LISTEN      27328/mysqld

netstat imprime des statistiques sur le système réseau de votre serveur. Cette sortie nous montre qu'un processus appelémysqld est attaché auxdb_server_ip au port3306, le port standard de MySQL, confirmant que le serveur écoute sur l'interface appropriée.

Ensuite, ouvrez ce port sur le pare-feu pour autoriser le trafic via:

sudo ufw allow mysql

Ce sont toutes les modifications de configuration que vous devez apporter à MySQL. Nous verrons ensuite comment configurer une base de données et certains profils d’utilisateur, dont vous utiliserez l’un pour accéder au serveur à distance.

[[step-2 -—- setting-up-a-wordpress-database-and-remote-credentials]] == Étape 2 - Configuration d'une base de données WordPress et des informations d'identification à distance

Même si MySQL lui-même écoute maintenant sur une adresse IP externe, il n'y a actuellement aucun utilisateur ni base de données activée à distance configurée. Créons une base de données pour WordPress et une paire d’utilisateurs pouvant y accéder.

Commencez par vous connecter à MySQL en tant qu'utilisateur MySQLroot:

sudo mysql

[.Remarque]##

Note: Si vous avez activé l'authentification par mot de passe, comme décrit dansStep 3 of the prerequisite MySQL tutorial, vous devrez à la place utiliser la commande suivante pour accéder au shell MySQL:

mysql -u root -p

Après avoir exécuté cette commande, il vous sera demandé votre mot de passe MySQLroot et, après l'avoir entré, vous recevrez une nouvelle invitemysql>.

À partir de l'invite MySQL, créez une base de données que WordPress utilisera. Il peut être utile de donner à cette base de données un nom reconnaissable afin de pouvoir l'identifier facilement par la suite. Ici, nous le nommeronswordpress:

CREATE DATABASE wordpress;

Maintenant que vous avez créé votre base de données, vous devez créer deux utilisateurs. Nous allons créer un utilisateur local uniquement ainsi qu'un utilisateur distant lié à l'adresse IP du serveur Web.

Tout d'abord, créez votre utilisateur local,wpuser, et faites en sorte que ce compte corresponde uniquement aux tentatives de connexion locale en utilisantlocalhost dans la déclaration:

CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'password';

Accordez ensuite à ce compte un accès complet à la base de donnéeswordpress:

GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';

Cet utilisateur peut désormais effectuer toute opération sur la base de données pour WordPress, mais ce compte ne peut pas être utilisé à distance, car il ne correspond qu'aux connexions à partir de la machine locale. Dans cet esprit, créez un compte compagnon qui correspondra aux connexions exclusivement à partir de votre serveur Web. Pour cela, vous aurez besoin de l’adresse IP de votre serveur Web.

Veuillez noter que vous devez utiliser une adresse IP qui utilise le même réseau que celui que vous avez configuré dans votre fichiermysqld.cnf. Cela signifie que si vous avez spécifié une adresse IP de réseau privé dans le fichiermysqld.cnf, vous devrez inclure l'adresse IP privée de votre serveur Web dans les deux commandes suivantes. Si vous avez configuré MySQL pour utiliser l’Internet public, vous devez faire correspondre cela à l’adresse IP publique du serveur Web.

CREATE USER 'remotewpuser'@'web_server_ip' IDENTIFIED BY 'password';

Après avoir créé votre compte distant, accordez-lui les mêmes privilèges que votre utilisateur local:

GRANT ALL PRIVILEGES ON wordpress.* TO 'remotewpuser'@'web_server_ip';

Enfin, supprimez les privilèges afin que MySQL sache commencer à les utiliser:

FLUSH PRIVILEGES;

Puis quittez l’invite MySQL en tapant:

exit

Maintenant que vous avez configuré une nouvelle base de données et un utilisateur activé à distance, vous pouvez maintenant tester si vous pouvez vous connecter à la base de données à partir de votre serveur Web.

[[step-3 -—- testing-remote-and-local-connections]] == Étape 3 - Test des connexions distantes et locales

Avant de continuer, il est préférable de vérifier que vous pouvez vous connecter à votre base de données à la fois depuis la machine locale - votre serveur de base de données - et depuis votre serveur Web.

Tout d'abord, testez la connexion locale à partir de vosdatabase server en essayant de vous connecter avec votre nouveau compte:

mysql -u wpuser -p

Lorsque vous y êtes invité, entrez le mot de passe que vous avez configuré pour ce compte.

Si une invite MySQL vous est fournie, la connexion locale a réussi. Vous pouvez sortir à nouveau en tapant:

exit

Ensuite, connectez-vous à vosweb server pour tester les connexions à distance:

ssh sammy@web_server_ip

Pour pouvoir accéder à la base de données distante, vous devez installer des outils client pour MySQL sur votre serveur Web. Tout d’abord, mettez à jour votre cache de paquet local si vous ne l’avez pas fait récemment:

sudo apt update

Puis installez les utilitaires client MySQL:

sudo apt install mysql-client

Ensuite, connectez-vous à votre serveur de base de données en utilisant la syntaxe suivante:

mysql -u remotewpuser -h db_server_ip -p

Encore une fois, vous devez vous assurer que vous utilisez la bonne adresse IP pour le serveur de base de données. Si vous avez configuré MySQL pour écouter sur le réseau privé, entrez l'adresse IP du réseau privé de votre base de données. Sinon, entrez l’adresse IP publique de votre serveur de base de données.

Il vous sera demandé le mot de passe de votre compteremotewpuser. Après l'avoir entré, et si tout fonctionne comme prévu, vous verrez l'invite MySQL. Vérifiez que la connexion utilise SSL avec la commande suivante:

status

Si la connexion utilise effectivement SSL, la ligneSSL: l'indiquera, comme illustré ici:

Output--------------
mysql  Ver 14.14 Distrib 5.7.18, for Linux (x86_64) using  EditLine wrapper

Connection id:      52
Current database:
Current user:       [email protected]
SSL:         Cipher in use is DHE-RSA-AES256-SHA
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.7.18-0ubuntu0.16.04.1 (Ubuntu)
Protocol version:   10
Connection:     203.0.113.111 via TCP/IP
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:       3306
Uptime:         3 hours 43 min 40 sec

Threads: 1  Questions: 1858  Slow queries: 0  Opens: 276  Flush tables: 1  Open tables: 184  Queries per second avg: 0.138
--------------

Après avoir vérifié que vous pouvez vous connecter à distance, continuez et quittez l'invite suivante:

exit

Avec cela, vous avez vérifié l’accès local et l’accès à partir du serveur Web, mais vous n’avez pas vérifié que d’autres connexions seraient refusées. Pour une vérification supplémentaire, essayez de faire la même chose à partir d'un troisième serveur pour lequel vous avez configurénot un compte utilisateur spécifique afin de vous assurer que cet autre serveur est autorisé ànot.

Notez qu'avant d'exécuter la commande suivante pour tenter la connexion, vous devrez peut-être installer les utilitaires client MySQL comme vous l'avez fait ci-dessus:

mysql -u wordpressuser -h db_server_ip -p

Cela ne devrait pas aboutir et devrait renvoyer une erreur semblable à celle-ci:

OutputERROR 1130 (HY000): Host '203.0.113.12' is not allowed to connect to this MySQL server

Ceci est attendu, car vous n'avez pas créé d'utilisateur MySQL autorisé à se connecter à partir de ce serveur, mais également souhaité, car vous voulez être sûr que votre serveur de base de données empêchera les utilisateurs non autorisés d'accéder à votre serveur MySQL.

Après avoir testé avec succès votre connexion à distance, vous pouvez installer WordPress sur votre serveur Web.

[[step-4 -—- Installing-wordpress]] == Étape 4 - Installation de WordPress

Pour démontrer les capacités de votre nouveau serveur MySQL à distance, nous allons passer par le processus d'installation et de configuration de WordPress - le système de gestion de contenu populaire - sur votre serveur Web. Pour ce faire, vous devrez télécharger et extraire le logiciel, configurer vos informations de connexion, puis exécuter l’installation Web de WordPress.

Sur vosweb server, téléchargez la dernière version de WordPress dans votre répertoire personnel:

cd ~
curl -O https://wordpress.org/latest.tar.gz

Extrayez les fichiers, ce qui créera un répertoire appeléwordpress dans votre répertoire personnel:

tar xzvf latest.tar.gz

WordPress comprend un exemple de fichier de configuration que nous utiliserons comme point de départ. Faites une copie de ce fichier en supprimant-sample du nom de fichier pour qu'il soit chargé par WordPress:

cp ~/wordpress/wp-config-sample.php ~/wordpress/wp-config.php

Lorsque vous ouvrez le fichier, votre première tâche à accomplir consistera à ajuster certaines clés secrètes afin de renforcer la sécurité de votre installation. WordPress fournit un générateur sécurisé pour ces valeurs afin que vous n'ayez pas à essayer de créer vous-même de bonnes valeurs. Celles-ci sont uniquement utilisées en interne, il n’est donc pas gênant d’avoir des valeurs complexes et sûres.

Pour récupérer les valeurs sécurisées du générateur de clé secrète WordPress, tapez:

curl -s https://api.wordpress.org/secret-key/1.1/salt/

Cela imprimera quelques touches à votre sortie. Vous allez les ajouter à votre fichierwp-config.php momentanément:

[.warning] #Warning! Il est important que vous demandiez vos propres valeurs uniques à chaque fois. Do not copie les valeurs affichées ici!
#

Outputdefine('AUTH_KEY',         'L4|2Yh(giOtMLHg3#] DO NOT COPY THESE VALUES %G00o|te^5YG@)');
define('SECURE_AUTH_KEY',  'DCs-k+MwB90/-E(=!/ DO NOT COPY THESE VALUES +WBzDq:7U[#Wn9');
define('LOGGED_IN_KEY',    '*0kP!|VS.K=;#fPMlO DO NOT COPY THESE VALUES +&[%8xF*,18c @');
define('NONCE_KEY',        'fmFPF?UJi&(j-{8=$- DO NOT COPY THESE VALUES CCZ?Q+_~1ZU~;G');
define('AUTH_SALT',        '@qA7f}2utTEFNdnbEa DO NOT COPY THESE VALUES t}Vw+8=K%20s=a');
define('SECURE_AUTH_SALT', '%BW6s+d:7K?-`C%zw4 DO NOT COPY THESE VALUES 70U}PO1ejW+7|8');
define('LOGGED_IN_SALT',   '-l>F:-dbcWof%4kKmj DO NOT COPY THESE VALUES 8Ypslin3~d|wLD');
define('NONCE_SALT',       '4J(<`4&&F (WiK9K#] DO NOT COPY THESE VALUES ^ZikS`es#Fo:V6');

Copiez le résultat que vous avez reçu dans votre presse-papiers, puis ouvrez le fichier de configuration dans votre éditeur de texte:

nano ~/wordpress/wp-config.php

Recherchez la section contenant les valeurs factices pour ces paramètres. Cela ressemblera à ceci:

/wordpress/wp-config.php

. . .
define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');
. . .

Supprimez ces lignes et collez les valeurs que vous avez copiées à partir de la ligne de commande.

Ensuite, entrez les informations de connexion pour votre base de données distante. Ces lignes de configuration se trouvent en haut du fichier, juste au-dessus de l'endroit où vous avez collé vos clés. N'oubliez pas d'utiliser la même adresse IP que celle que vous avez utilisée précédemment dans votre test de base de données distante:

/wordpress/wp-config.php

. . .
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');

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

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

/** MySQL hostname */
define('DB_HOST', 'db_server_ip');
. . .

Et enfin, n'importe où dans le fichier, ajoutez la ligne suivante qui indique à WordPress d'utiliser une connexion SSL à notre base de données MySQL:

/wordpress/wp-config.php

define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

Enregistrez et fermez le fichier.

Ensuite, copiez les fichiers et répertoires trouvés dans votre répertoire~/wordpress vers la racine du document de Nginx. Notez que cette commande inclut l'indicateur-a pour vous assurer que toutes les autorisations existantes sont reportées:

sudo cp -a ~/wordpress/* /var/www/html

Après cela, il ne reste plus qu’à modifier la propriété du fichier. Changez la propriété de tous les fichiers de la racine du document enwww-data, l'utilisateur du serveur Web par défaut d'Ubuntu:

sudo chown -R www-data:www-data /var/www/html

Avec cela, WordPress est installé et vous êtes prêt à exécuter sa routine d’installation Web.

[[step-5 -—- setting-up-wordpress-through-the-web-interface]] == Étape 5 - Configuration de Wordpress via l'interface Web

WordPress a un processus d'installation basé sur le Web. Au fur et à mesure, il posera quelques questions et installera toutes les tables nécessaires dans votre base de données. Ici, nous allons passer en revue les étapes initiales de la configuration de WordPress, que vous pouvez utiliser comme point de départ pour créer votre propre site Web personnalisé utilisant un système de base de données distant.

Accédez au nom de domaine (ou adresse IP publique) associé à votre serveur Web:

http://example.com

Vous verrez un écran de sélection de langue pour le programme d'installation de WordPress. Sélectionnez la langue appropriée et cliquez sur pour accéder à l'écran principal d'installation:

WordPress install screen

Une fois que vous avez soumis vos informations, vous devez vous connecter à l'interface d'administration de WordPress à l'aide du compte que vous venez de créer. Vous serez ensuite amené à un tableau de bord où vous pourrez personnaliser votre nouveau site WordPress.

Conclusion

En suivant ce didacticiel, vous avez configuré une base de données MySQL pour accepter les connexions protégées par SSL à partir d’une installation Wordpress distante. Les commandes et techniques utilisées dans ce guide sont applicables à toute application Web écrite dans n'importe quel langage de programmation, mais les détails de la mise en œuvre spécifiques différeront. Reportez-vous à la documentation de la base de données de votre application ou de votre langue pour plus d’informations.