Einrichten einer entfernten Datenbank zur Optimierung der Site-Leistung mit MySQL unter Ubuntu 16.04

Einführung

Wenn Ihre Anwendung oder Website wächst, sind Sie möglicherweise an einem Punkt angelangt, an dem Sie aus Ihrer aktuellen Serverkonfiguration herausgewachsen sind. Wenn Sie Ihren Webserver und das Datenbank-Backend auf demselben Computer hosten, ist es möglicherweise eine gute Idee, diese beiden Funktionen zu trennen, damit jede auf ihrer eigenen Hardware ausgeführt werden kann und die Last der Beantwortung der Anforderungen Ihrer Besucher aufteilt.

In diesem Handbuch wird erläutert, wie Sie einen Remote-MySQL-Datenbankserver konfigurieren, mit dem Ihre Webanwendung eine Verbindung herstellen kann. Wir werden WordPress als Beispiel verwenden, damit wir etwas zum Arbeiten haben, aber die Technik ist auf jede MySQL-gestützte Anwendung weithin anwendbar.

Voraussetzungen

Bevor Sie mit diesem Tutorial beginnen, benötigen Sie:

[[Schritt 1 - Installation von MySQL auf dem Datenbankserver]] == Schritt 1 - Installation von MySQL auf dem Datenbankserver

Die Speicherung unserer Daten auf einem separaten Server ist eine gute Möglichkeit, die Leistung einer Ein-Maschinen-Konfiguration zu steigern. Es bietet auch die grundlegende Struktur, die erforderlich ist, um den Lastenausgleich und die Erweiterung unserer Infrastruktur zu einem späteren Zeitpunkt weiter voranzutreiben.

Zunächst installieren wir MySQL auf dem Server, auf demdid notden LEMP-Stack installiert. Melden Sie sich bei diesem Server an, aktualisieren Sie Ihren Paket-Cache und installieren Sie die MySQL-Serversoftware:

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

Während des Installationsvorgangs werden Sie aufgefordert, einroot-Kennwort für MySQL festzulegen und zu bestätigen. Wählen Sie ein sicheres Passwort und notieren Sie es, da wir es später benötigen.

MySQL sollte jetzt installiert sein und ausgeführt werden. Überprüfen wir mitsystemctl:

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

Die ZeileActive: active (running)bedeutet, dass MySQL installiert ist und ausgeführt wird. Jetzt machen wir die Installation etwas sicherer. MySQL wird mit einem Skript geliefert, das Sie durch das Herunterfahren des Systems führt:

mysql_secure_installation

Hier werden Sie nach dem Passwort für MySQLrootgefragt, das wir gerade festgelegt haben. Geben Sie es ein und drücken SieENTER. Jetzt beantworten wir eine Reihe von Ja- oder Nein-Aufforderungen. Gehen wir sie durch:

Zunächst werden wir nachvalidate password plugin gefragt, einem Plugin, das automatisch bestimmte Regeln für die Kennwortstärke für Ihre MySQL-Benutzer erzwingen kann. Das Aktivieren dieser Option ist eine Entscheidung, die Sie je nach Ihren individuellen Sicherheitsanforderungen treffen müssen. Geben Siey undENTER ein, um es zu aktivieren, oder drücken Sie einfachENTER, um es zu überspringen. Wenn diese Option aktiviert ist, werden Sie außerdem aufgefordert, eine Stufe von 0 bis 2 für die strenge Kennwortüberprüfung auszuwählen. Wählen Sie eine Zahl und drücken SieENTER, um fortzufahren.

Als Nächstes werden Sie gefragt, ob Sie das Kennwort vonrootändern möchten. Da wir gerade das Passwort erstellt haben, als wir MySQL installiert haben, können wir dies sicher überspringen. Drücken SieENTER, um fortzufahren, ohne das Passwort zu aktualisieren.

Der Rest der Eingabeaufforderungen kann mityes beantwortet werden. Sie werden gefragt, ob Sie den MySQL-Benutzer vonanonymousentfernen, die Remote-Anmeldung vonrootnicht zulassen, die Datenbank vontestentfernen und Berechtigungstabellen neu laden möchten, um sicherzustellen, dass die vorherigen Änderungen ordnungsgemäß wirksam werden. Das sind alles gute Ideen. Geben Siey ein und drücken Sie jeweilsENTER.

Das Skript wird beendet, nachdem alle Eingabeaufforderungen beantwortet wurden. Jetzt ist unsere MySQL-Installation einigermaßen gesichert. Im nächsten Schritt konfigurieren wir MySQL so, dass der Zugriff über Remoteverbindungen möglich ist.

[[Schritt-2 - Konfigurieren von MySQL zum Abhören von Remoteverbindungen] == Schritt 2 - Konfigurieren von MySQL zum Abhören von Remoteverbindungen

Nachdem Sie Ihre Datenbank eingerichtet haben, müssen wir einige Konfigurationswerte ändern, um Verbindungen von anderen Computern zuzulassen.

Öffnen Sie die Konfigurationsdatei vonmysqldmit Root-Rechten in Ihrem Editor:

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

Diese Datei ist in Abschnitte unterteilt, die durch Wörter in Klammern ([und]) gekennzeichnet sind. Suchen Sie den Abschnitt mit der Bezeichnungmysqld:

mysqld.cnf

. . .
[mysqld]

In diesem Abschnitt müssen Sie einen Parameter namensbind-address finden. Dies teilt der Datenbanksoftware mit, welche Netzwerkadresse auf Verbindungen überwacht werden soll.

Derzeit ist MySQL so konfiguriert, dass nur nach lokalen Verbindungen gesucht wird. Wir müssen dies ändern, um auf die IP-Adresse vonexternalzu verweisen, unter der Ihr Server erreichbar ist.

Wenn sich beide Server in einem Rechenzentrum mit privaten Netzwerkfunktionen befinden, verwenden Sie die private Netzwerk-IP Ihres Servers. Andernfalls können Sie die öffentliche IP-Adresse verwenden:

/etc/mysql/my.cnf

[mysqld]
. . .
bind-address = db_server_ip

Da wir uns über das Internet mit der Datenbank verbinden, benötigen wir verschlüsselte Verbindungen, um unsere Daten zu schützen. Wenn Sie Ihre MySQL-Verbindung nicht verschlüsseln, kann jeder im Netzwerk vertrauliche Informationen zwischen Ihrem Web- und Datenbankserver aufspüren. Fügen Sie nach der gerade aktualisierten Zeilebind-addressdie folgende Zeile hinzu:

/etc/mysql/my.cnf

. . .
require_secure_transport = on

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Damit SSL-Verbindungen funktionieren, müssen einige Schlüssel und Zertifikate erstellt werden. MySQL wird mit einem Befehl geliefert, der automatisch alles einrichtet, was wir brauchen:

sudo mysql_ssl_rsa_setup --uid=mysql

Dadurch werden die erforderlichen Dateien erstellt und vom MySQL-Server (--uid=mysql) lesbar gemacht.

Starten Sie die Datenbank neu, um zu erzwingen, dass MySQL seine Konfiguration aktualisiert und die neuen SSL-Informationen einliest:

sudo systemctl restart mysql

Überprüfen Sie mitnetstat, um zu bestätigen, dass der Server jetzt die externe Schnittstelle abhört:

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

netstat druckt Statistiken über das Netzwerksystem unseres Servers. Diese Ausgabe zeigt uns, dass ein Prozess namensmysqld andb_server_ip an Port3306, dem Standard-MySQL-Port, angehängt ist.

Öffnen Sie nun diesen Port in der Firewall, um Datenverkehr zuzulassen:

sudo ufw allow mysql

Als Nächstes richten wir die Benutzer und die Datenbank ein, die für den Remotezugriff auf den Server erforderlich sind.

[[Schritt 3 - Einrichten einer WordPress-Datenbank und Remote-Anmeldeinformationen] == Schritt 3 - Einrichten einer WordPress-Datenbank und Remote-Anmeldeinformationen

Obwohl MySQL selbst jetzt eine externe IP-Adresse überwacht, sind derzeit keine remote-fähigen Benutzer oder Datenbanken konfiguriert. Erstellen wir eine Datenbank für WordPress und einen Benutzer, der darauf zugreifen kann.

Beginnen Sie mit der Verbindung zu MySQL über das Konto von MySQLroot:

mysql -u root -p

Sie werden nach dem Kennwort Ihres MySQLrootgefragt und erhalten dann eine neue Eingabeaufforderung vonmysql>.

Jetzt können wir die Datenbank erstellen, die WordPress verwenden wird. Wir werden diesewordpress einfach aufrufen, damit wir sie später leicht identifizieren können:

CREATE DATABASE wordpress;

[.note] #Note: Alle SQL-Anweisungen müssen mit einem Semikolon (;) enden. Wenn Sie in einem MySQL-BefehlENTER drücken und nur eine neue Zeile mit der Eingabeaufforderung-> sehen, haben Sie wahrscheinlich das Semikolon vergessen. Geben Sie es einfach in die neue Zeile ein und drücken Sie erneutENTER, um fortzufahren.
#

Nachdem wir eine Datenbank haben, müssen wir Ihren Benutzer erstellen. Eine Wendung bei der Erstellung unseres Benutzers besteht darin, dass wir zwei unterschiedliche Profile definieren müssen, je nachdem, von wo aus der Benutzer eine Verbindung herstellt. Wir erstellen einen lokalen Benutzer und einen Remote-Benutzer, der an die IP-Adresse unseres Webservers gebunden ist.

Zuerst erstellen wir unseren lokalen Benutzerwordpressuser und stellen sicher, dass dieses Konto nur mit lokalen Verbindungsversuchen übereinstimmt, indem wirlocalhost in der Deklaration verwenden:

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

Lassen Sie uns diesem Konto vollständigen Zugriff auf unsere Datenbank gewähren:

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

Dieser Benutzer kann jetzt alle Vorgänge in der Datenbank für WordPress ausführen, dieses Konto kann jedoch nicht remote verwendet werden, da es nur Verbindungen vom lokalen Computer abbildet.

Erstellen Sie nun ein Begleitkonto, das Verbindungen ausschließlich von unserem Webserver entspricht. Dazu benötigen Sie die IP-Adresse Ihres Webservers. Wir können diesem Konto einen beliebigen Namen geben. Für eine einheitlichere Darstellung verwenden wir jedoch genau denselben Benutzernamen wie oben, wobei nur der Host-Teil geändert wird.

Beachten Sie, dass Sie eine IP-Adresse verwenden müssen, die dasselbe Netzwerk verwendet, das Sie in der Dateimysqld.cnfkonfiguriert haben. Wenn Sie also eine private Netzwerk-IP verwendet haben, möchten Sie die folgende Regel erstellen, um die private IP Ihres Webservers zu verwenden. Wenn Sie MySQL für die Nutzung des öffentlichen Internets konfiguriert haben, sollten Sie dies mit der öffentlichen IP-Adresse des Webservers abgleichen.

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

Nachdem wir unser Remote-Konto haben, können wir ihm dieselben Berechtigungen wie dem lokalen Benutzer zuweisen:

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

Löschen Sie die Berechtigungen, um sie auf die Festplatte zu schreiben, und verwenden Sie sie:

FLUSH PRIVILEGES;

Beenden Sie dann die MySQL-Eingabeaufforderung, indem Sie Folgendes eingeben:

exit

Nachdem wir eine neue Datenbank und einen remote-fähigen Benutzer eingerichtet haben, testen wir die Datenbank und die Verbindungen.

[[Schritt 4 - Testen von Remote- und lokalen Verbindungen] == Schritt 4 - Testen von Remote- und lokalen Verbindungen

Bevor wir fortfahren, überprüfen Sie am besten, ob Sie mit demwordpressuser-Konto sowohl vom lokalen Computer als auch von Ihrem Webserver aus eine Verbindung zu Ihrer Datenbank herstellen können.

Testen Sie zunächst die lokale Verbindung von Ihremdatabase machineaus, indem Sie versuchen, sich mit unserem neuen Konto anzumelden:

mysql -u wordpressuser -p

Geben Sie das Kennwort ein, das Sie für dieses Konto eingerichtet haben, wenn Sie dazu aufgefordert werden.

Wenn Sie eine MySQL-Eingabeaufforderung erhalten, war die lokale Verbindung erfolgreich. Sie können den Vorgang wieder beenden, indem Sie Folgendes eingeben:

exit

Melden Sie sich beiweb serveran, um Remoteverbindungen zu testen.

Auf Ihrem Webserver müssen Sie einige Client-Tools für MySQL installieren, um auf die entfernte Datenbank zugreifen zu können. Aktualisieren Sie Ihren lokalen Paket-Cache und installieren Sie dann die Client-Dienstprogramme:

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

Jetzt können wir mit der folgenden Syntax eine Verbindung zu unserem Datenbankserver herstellen:

mysql -u wordpressuser -h db_server_ip -p

Auch hier müssen Sie sicherstellen, dass Sie die richtige IP-Adresse für den Datenbankserver verwenden. Wenn Sie MySQL für die Überwachung des privaten Netzwerks konfiguriert haben, geben Sie die private Netzwerk-IP Ihrer Datenbank ein, andernfalls die öffentliche IP-Adresse Ihres Datenbankservers.

Sie werden nach dem Passwort für Ihrwordpressuser-Konto gefragt, und wenn alles gut geht, erhalten Sie eine MySQL-Eingabeaufforderung. Mit dem folgenden Befehl können wir überprüfen, ob die Verbindung SSL verwendet:

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

Die ZeileSSL:zeigt an, ob eine SSL-Verschlüsselung verwendet wird. Sie können die Eingabeaufforderung jetzt schließen, da Sie überprüft haben, dass Sie eine Remoteverbindung herstellen können:

exit

Für eine zusätzliche Überprüfung können Sie versuchen, dasselbe von einem dritten Server aus zu tun, um sicherzustellen, dass diesem anderen Servernotder Zugriff gewährt wird. Sie haben den lokalen Zugriff und den Zugriff vom Webserver überprüft, aber Sie haben nicht überprüft, dass andere Verbindungen abgelehnt werden.

Versuchen Sie dasselbe Verfahren auf einem Server, für den Sienot ein bestimmtes Benutzerkonto konfiguriert haben. Möglicherweise müssen Sie die Client-Dienstprogramme wie oben beschrieben installieren:

mysql -u wordpressuser -h db_server_ip -p

Dies sollte nicht erfolgreich abgeschlossen werden. Es sollte einen Fehler zurückgeben, der ungefähr so ​​aussieht:

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

Das erwarten wir und wollen wir.

Wir haben unsere Remoteverbindung erfolgreich getestet und können jetzt mit der Installation von WordPress fortfahren.

[[Schritt 5 - Installation von WordPress]] == Schritt 5 - Installation von WordPress

Um die Funktionen unseres neuen Remote-fähigen MySQL-Servers zu demonstrieren, installieren und konfigurieren wir WordPress - die beliebte Blogging-Plattform - auf unserem Webserver. Dazu müssen wir die Software herunterladen und extrahieren, unsere Verbindungsinformationen konfigurieren und dann die webbasierte Installation von WordPress ausführen.

Laden Sie auf Ihrenweb server die neueste Version von WordPress in Ihr Home-Verzeichnis herunter:

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

Extrahieren Sie die Dateien, wodurch ein Verzeichnis mit dem Namenwordpress in Ihrem Home-Verzeichnis erstellt wird:

tar xzvf latest.tar.gz

WordPress enthält eine Beispielkonfigurationsdatei, die wir als Ausgangspunkt verwenden. Wir erstellen eine Kopie dieser Datei und entfernen-sample aus dem Dateinamen, damit sie von WordPress geladen wird:

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

Wenn wir die Datei öffnen, müssen wir zunächst einige geheime Schlüssel anpassen, um die Sicherheit unserer Installation zu gewährleisten. WordPress bietet einen sicheren Generator für diese Werte, damit Sie nicht versuchen müssen, selbst gute Werte zu finden. Diese werden nur intern verwendet, daher schadet es nicht der Benutzerfreundlichkeit, hier komplexe, sichere Werte zu haben.

Geben Sie Folgendes ein, um sichere Werte aus dem WordPress-Generator für geheime Schlüssel abzurufen:

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

Dadurch wird eine Konfiguration ausgedruckt, die wir kopieren und in die Dateiwp-config.phpeinfügen können.

[.warning] #Warning! Es ist wichtig, dass Sie jedes Mal eindeutige Werte anfordern. Do not kopieren die unten gezeigten Werte!
#

Outputdefine('AUTH_KEY',         '1jl/vqfs

Kopieren Sie die empfangene Ausgabe in Ihre Zwischenablage und öffnen Sie die Konfigurationsdatei in Ihrem Texteditor:

nano ~/wordpress/wp-config.php

Suchen Sie den Abschnitt, der die Dummy-Werte für diese Einstellungen enthält. Es wird ungefähr so ​​aussehen:

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');
. . .

Löschen Sie diese Zeilen und fügen Sie die Werte ein, die Sie über die Befehlszeile kopiert haben.

Als nächstes müssen wir die Verbindungsinformationen für unsere entfernte Datenbank eingeben. Diese Konfigurationszeilen befinden sich oben in der Datei, genau über der Stelle, an der wir unsere Schlüssel eingefügt haben. Denken Sie daran, dieselbe IP-Adresse zu verwenden, die Sie zuvor in Ihrem Test der entfernten Datenbank verwendet haben:

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');
. . .

Fügen Sie abschließend an einer beliebigen Stelle in der Datei die folgende Zeile ein, die WordPress anweist, eine SSL-Verbindung zu unserer MySQL-Datenbank herzustellen:

wp-config.php

define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

Speichern und schließen Sie die Datei.

Als Nächstes müssen wir die Dateien und Verzeichnisse in unserem Verzeichnis~/wordpressin das Dokumentstammverzeichnis von Nginx kopieren. Wir verwenden das Flag-a, um sicherzustellen, dass unsere Berechtigungen beibehalten werden:

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

Jetzt sind alle unsere Dateien vorhanden. Sie müssen nur noch den Dateibesitz ändern. Wir werden alle Dateien im Dokumentstamm so einstellen, dass sie unserem Webserver-Benutzerwww-datagehören. S:

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

WordPress sollte nun installiert und bereit sein, um die webbasierte Setup-Routine auszuführen. Das machen wir im nächsten Schritt.

[[Schritt 6 - Einrichten von WordPress über das Webinterface]] == Schritt 6 - Einrichten von Wordpress über das Webinterface

WordPress verfügt über eine webbasierte Setup-Routine, die einige Fragen stellt und die benötigten Tabellen in unserer Datenbank installiert. Beginnen wir jetzt damit.

Navigieren Sie zu dem Domainnamen (oder der öffentlichen IP-Adresse), der Ihrem Webserver zugeordnet ist:

http://example.com

Sie sehen einen Sprachauswahlbildschirm für das WordPress-Installationsprogramm. Wählen Sie die entsprechende Sprache und klicken Sie sich durch zum Hauptinstallationsbildschirm:

WordPress install screen

Nachdem Sie Ihre Informationen übermittelt haben, müssen Sie sich mit dem gerade erstellten Konto bei der WordPress-Administrationsoberfläche anmelden. Sie werden dann zu einem Dashboard weitergeleitet, in dem Sie Ihre Site anpassen und bedienen können.

Fazit

In diesem Tutorial haben wir eine MySQL-Datenbank eingerichtet, die SSL-geschützte Verbindungen von einer Remote-Wordpress-Installation akzeptiert. Die Befehle und Techniken, die wir verwendet haben, gelten für alle Webanwendungen, die in einer beliebigen Programmiersprache geschrieben wurden. Die spezifischen Implementierungsdetails unterscheiden sich jedoch. Weitere Informationen finden Sie in der Dokumentation zu Ihrer Anwendung oder Sprache.