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:
-
Zwei Ubuntu 16.04-Server mit einem nicht root-fähigen sudo-fähigen Benutzer und aktivierter UFW-Firewall, wie inInitial Server Setup with Ubuntu 16.04 beschrieben.
-
Auf einem der Server muss der LEMP-Stack (Linux, Nginx, MySQL, PHP) installiert sein. Unser TutorialHow To Install Linux, Nginx, MySQL, PHP (LEMP stack) in Ubuntu 16.04 führt Sie durch den Prozess. Sie sollten Schritt 2 überspringen, bei dem es um die Installation von MySQL geht. In diesem Tutorial installieren wir stattdessen MySQL.
-
Optional (aber dringend empfohlen) können Sie Ihren LEMP-Webserver mit SSL-Zertifikaten sichern. Sie benötigen einen Domainnamen, die Zertifikate sind jedoch kostenlos. Unser LeitfadenHow To Secure Nginx with Let’s Encrypt on Ubuntu 16.04 zeigt Ihnen, wie.
[[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 vonmysqld
mit 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-address
die 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.cnf
konfiguriert 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.php
einfü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~/wordpress
in 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-data
gehö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:
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.