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

introduction

Au fur et à mesure que votre application ou votre site Web se développe, vous risquez de ne plus être à la hauteur de 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 expliquerons comment configurer un serveur de base de données MySQL distant auquel votre application Web peut se connecter. Nous utiliserons WordPress à titre d'exemple afin d'avoir quelque chose à travailler, mais la technique est largement applicable à toute application basée sur MySQL.

Conditions préalables

Avant de commencer ce tutoriel, vous aurez besoin de:

[[step-1 -—- Installing-mysql-on-the-database-server]] == Étape 1 - Installation de MySQL sur le serveur de base de données

Le stockage de nos données sur un serveur distinct est un bon moyen de se développer en douceur lorsque nous atteignons le plafond de performances d’une configuration à une seule machine. Il fournit également la structure de base nécessaire pour équilibrer la charge et développer notre infrastructure encore plus tard.

Pour commencer, nous allons installer MySQL sur le serveur sur lequel nous installonsdid notla pile LEMP. Connectez-vous à ce serveur, puis mettez à jour le cache de votre paquet et installez le logiciel serveur MySQL:

sudo apt-get update
sudo apt-get install mysql-server

Il vous sera demandé de définir et de confirmer un mot de passeroot pour MySQL pendant la procédure d'installation. Choisissez un mot de passe fort et prenez-en note, car nous en aurons besoin plus tard.

MySQL devrait être installé et en cours d'exécution maintenant. Vérifions avecsystemctl:

systemctl status mysql
Output● mysql.service - MySQL Community Server
   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2017-05-23 14:54:04 UTC; 12s ago
 Main PID: 27179 (mysqld)
   CGroup: /system.slice/mysql.service
           └─27179 /usr/sbin/mysqld

La ligneActive: active (running) signifie que MySQL est installé et en cours d'exécution. Nous allons maintenant rendre l’installation un peu plus sécurisée. MySQL est livré avec un script qui vous guide tout au long du verrouillage du système:

mysql_secure_installation

Cela vous demandera le mot de passe MySQLroot que nous venons de définir. Tapez-le et appuyez surENTER. Nous allons maintenant répondre à une série d’invitations oui ou non. Passons à travers eux:

Tout d'abord, on nous pose des questions survalidate password plugin, un plugin qui peut appliquer automatiquement certaines règles de force de mot de passe pour vos utilisateurs MySQL. L’activation de cette option est une décision que vous devrez prendre en fonction de vos besoins de sécurité individuels. Tapezy etENTER pour l'activer, ou appuyez simplement surENTER pour l'ignorer. Si cette option est activée, vous serez également invité à choisir un niveau de 0 à 2 indiquant le degré de rigueur de la validation du mot de passe. Choisissez un nombre et appuyez surENTER pour continuer.

Ensuite, il vous sera demandé si vous souhaitez modifier le mot de passe deroot. Comme nous venons de créer le mot de passe lors de l'installation de MySQL, nous pouvons le sauter en toute sécurité. Appuyez surENTER pour continuer sans mettre à jour le mot de passe.

Le reste des invites peut être réponduyes. Vous serez invité à supprimer l'utilisateur MySQL deanonymous, à interdire la connexion à distance deroot, à supprimer la base de donnéestest et à recharger les tables de privilèges pour garantir que les modifications précédentes prennent effet correctement. Ce sont tous une bonne idée. Tapezy et appuyez surENTER pour chacun.

Le script se ferme une fois que toutes les invites ont été traitées. Maintenant, notre installation de MySQL est raisonnablement sécurisée. Dans la prochaine étape, nous allons configurer MySQL pour permettre l’accès depuis des connexions distantes.

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

Maintenant que votre base de données est opérationnelle, nous devons modifier certaines valeurs de configuration pour autoriser les connexions à partir d'autres ordinateurs.

Ouvrez le fichier de configuration demysqld avec les privilèges root dans votre éditeur:

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

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

mysqld.cnf

. . .
[mysqld]

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

Actuellement, MySQL est configuré pour rechercher uniquement les connexions locales. Nous devons changer cela pour référencer une adresse IP deexternal à laquelle votre serveur peut être atteint.

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

/etc/mysql/my.cnf

[mysqld]
. . .
bind-address = db_server_ip

Comme nous allons nous connecter à la base de données via Internet, nous aurons besoin de connexions cryptées pour protéger nos données. Si vous ne chiffrez pas votre connexion MySQL, n’importe qui sur le réseau pourrait renifler des informations sensibles entre votre serveur Web et votre serveur de base de données. Ajoutez la ligne suivante après la lignebind-address que nous venons de mettre à jour:

/etc/mysql/my.cnf

. . .
require_secure_transport = on

Enregistrez et fermez le fichier lorsque vous avez terminé.

Pour que les connexions SSL fonctionnent, nous devons créer des clés et des certificats. MySQL est livré avec une commande qui configure automatiquement tout ce dont nous avons besoin:

sudo mysql_ssl_rsa_setup --uid=mysql

Cela créera les fichiers nécessaires et les rendra lisibles par le serveur MySQL (--uid=mysql).

Pour forcer 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, vérifiez avecnetstat:

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 notre serveur. Cette sortie nous montre qu'un processus appelémysqld est attaché auxdb_server_ip au port3306, le port MySQL standard.

Ouvrez maintenant ce port sur le pare-feu pour autoriser le trafic via:

sudo ufw allow mysql

Nous allons ensuite configurer les utilisateurs et la base de données nécessaire pour accéder au serveur à distance.

[[step-3 -—- setting-up-a-wordpress-database-and-remote-credentials]] == Étape 3 - 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 un utilisateur pouvant y accéder.

Commencez par vous connecter à MySQL en utilisant le compte MySQLroot:

mysql -u root -p

On vous demandera votre mot de passe MySQLroot, puis vous recevrez une nouvelle invitemysql>.

Nous pouvons maintenant créer la base de données que WordPress utilisera. Nous appellerons simplement cewordpress afin de pouvoir l'identifier facilement plus tard:

CREATE DATABASE wordpress;

[.note] #Note: Toutes les instructions SQL doivent se terminer par un point-virgule (;). Si vous appuyez surENTER sur une commande MySQL et ne voyez qu'une nouvelle ligne avec une invite->, vous avez probablement oublié le point-virgule. Tapez-le simplement sur la nouvelle ligne et appuyez à nouveau surENTER pour continuer.
#

Maintenant que nous avons une base de données, nous devons créer votre utilisateur. Un aspect différent dans la création de notre utilisateur est que nous devons définir deux profils différents en fonction de la connexion de l'utilisateur. Nous allons créer un utilisateur local uniquement et un utilisateur distant liés à l'adresse IP de notre serveur Web.

Tout d'abord, nous créons notre utilisateur localwordpressuser et faisons en sorte que ce compte ne corresponde qu'aux tentatives de connexion locale en utilisantlocalhost dans la déclaration:

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

Continuons et donnons à ce compte un accès complet à notre base de données:

GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'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.

Créez maintenant un compte compagnon qui correspondra aux connexions exclusivement à partir de notre serveur Web. Pour cela, vous aurez besoin de l’adresse IP de votre serveur Web. Nous pourrions nommer ce compte à tout moment, mais pour une expérience plus cohérente, nous allons utiliser exactement le même nom d'utilisateur que ci-dessus, avec uniquement la partie hôte modifiée.

Gardez à l'esprit 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 utilisez une adresse IP de réseau privée, vous souhaiterez créer la règle ci-dessous pour utiliser l’adresse IP privée de votre serveur Web. Si vous avez configuré MySQL pour utiliser l’Internet public, vous devez faire correspondre cela à l’adresse IP publique du serveur Web.

CREATE USER 'wordpressuser'@'web-server_ip' IDENTIFIED BY 'password';

Maintenant que nous avons notre compte distant, nous pouvons lui donner les mêmes privilèges que l'utilisateur local:

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

Videz les privilèges pour les écrire sur le disque et commencez à les utiliser:

FLUSH PRIVILEGES;

Puis quittez l’invite MySQL en tapant:

exit

Maintenant que nous avons configuré une nouvelle base de données et un nouvel utilisateur activé à distance, testons la base de données et les connexions.

[[step-4 -—- testing-remote-and-local-connections]] == Étape 4 - 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 à partir de l'ordinateur local et de votre serveur Web à l'aide des compteswordpressuser.

Tout d'abord, testez la connexion locale depuis vosdatabase machine en essayant de vous connecter avec notre nouveau compte:

mysql -u wordpressuser -p

Tapez le mot de passe que vous avez configuré pour ce compte lorsque vous y êtes invité.

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

exit

Connectez-vous à vosweb server pour tester les connexions à distance.

Sur votre serveur Web, vous devrez installer des outils client pour MySQL afin d’accéder à la base de données distante. Mettez à jour votre cache de paquet local, puis installez les utilitaires client:

sudo apt-get update
sudo apt-get install mysql-client

Nous pouvons maintenant nous connecter à notre serveur de base de données en utilisant la syntaxe suivante:

mysql -u wordpressuser -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 comptewordpressuser, et si tout se passe bien, vous recevrez une invite MySQL. Nous pouvons vérifier que la connexion utilise SSL avec la commande suivante:

status
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
--------------

La ligneSSL: indiquera si un chiffrement SSL est utilisé. Vous pouvez continuer et quitter l’invite maintenant, après avoir vérifié que vous pouvez vous connecter à distance:

exit

Pour une vérification supplémentaire, vous pouvez essayer de faire la même chose à partir d'un troisième serveur pour vous assurer que cet autre serveur estnot autorisé à accéder. Vous avez vérifié l'accès local et l'accès à partir du serveur Web, mais vous n'avez pas vérifié que les autres connexions seraient refusées.

Allez-y et essayez la même procédure sur un serveur pour lequel vous avez configuré un compte d'utilisateur spécifique pournot. Vous devrez peut-être installer les utilitaires clients comme vous l'avez fait ci-dessus:

mysql -u wordpressuser -h db_server_ip -p

Cela ne devrait pas se terminer avec succès. Cela devrait renvoyer une erreur qui ressemble à quelque chose comme:

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

C'est ce à quoi nous nous attendons et ce que nous voulons.

Nous avons testé avec succès notre connexion à distance et pouvons maintenant procéder à notre installation WordPress.

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

Pour démontrer les capacités de notre nouveau serveur MySQL à distance, nous allons installer et configurer WordPress - la plate-forme de blogs populaire - sur notre serveur Web. Cela nécessitera le téléchargement et l'extraction du logiciel, la configuration des informations de connexion, puis l'exécution de 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. Nous faisons 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 nous ouvrirons le fichier, notre première tâche à accomplir consistera à ajuster certaines clés secrètes afin de sécuriser notre 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 une configuration que nous pouvons copier et coller dans notre fichierwp-config.php.

[.warning] #Warning! Il est important que vous demandiez des valeurs uniques à chaque fois. Do not copie les valeurs ci-dessous!
#

Outputdefine('AUTH_KEY',         '1jl/vqfs

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:

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, nous devons entrer les informations de connexion pour notre base de données distante. Ces lignes de configuration sont en haut du fichier, juste au-dessus de l'endroit où nous avons collé nos 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:

wp-config.php

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

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

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

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

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

wp-config.php

define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

Enregistrez et fermez le fichier.

Ensuite, nous devrons copier les fichiers et répertoires trouvés dans notre répertoire~/wordpress vers la racine du document de Nginx. Nous utilisons l'indicateur-a pour nous assurer que nos autorisations sont maintenues:

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

Maintenant, tous nos fichiers sont en place. La seule chose à faire est de modifier la propriété du fichier. Nous allons définir tous les fichiers de la racine du document comme appartenant à notre utilisateur de serveur Web,www-data:

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

WordPress devrait maintenant être installé et prêt à fonctionner via sa routine d'installation basée sur le Web. Nous ferons cela à la prochaine étape.

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

WordPress a une routine d'installation basée sur le Web qui pose quelques questions et installe les tables nécessaires dans notre base de données. Commençons cela maintenant.

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 et exploiter votre site.

Conclusion

Dans ce tutoriel, nous avons 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 que nous avons utilisées s’appliquent à toute application Web écrite dans n’importe quel langage de programmation, mais les détails de la mise en oeuvre 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.

Related