Einführung
Heutige Webanwendungen mit hohem Datenaufkommen basieren auf schnellen und schnellen Webservern, skalierbaren Datenbanken der Enterprise-Klasse und dynamischen Inhalten, die von funktionsreichen Skriptsprachen bereitgestellt werden. Ein typischer Linux-Webanwendungsstapel folgt der LAMP-Architektur (Linux, Apache, MySQL und PHP / Python). Umfangreiche Tutorials zeigen, wie diese Komponenten auf einem einzigen Server installiert und konfiguriert werden können.
Das ist im wirklichen Leben selten der Fall. Bei einer professionellen dreistufigen Konfiguration wird das Datenbank-Back-End auf einem eigenen Server gespeichert. Der Webserver sendet seine Anforderungen an eine App-Ebene, die als Middleware zwischen der Datenbank und der Website fungiert.
Obwohl Apache immer noch der mit Abstand am häufigsten verwendete Webserver ist, hat Nginx aufgrund seines geringen Platzbedarfs und seiner schnellen Reaktionszeit schnell an Beliebtheit gewonnen. Die MySQL Community Edition ist nach wie vor eine beliebte Wahl für Datenbanken. Viele Websites verwenden jedoch auch eine andere Open-Source-Datenbankplattform namens PostgreSQL.
Tore
In diesem Lernprogramm erstellen wir eine einfache Webanwendung in einer zweistufigen Architektur. Unser Basisbetriebssystem für beide Knoten wird CentOS 7 sein. Die Site wird von einem Nginx-Webserver mit PHP-Code betrieben, der mit einer PostgreSQL-Datenbank kommuniziert.
Anstatt einen "Top-Down" -Ansatz zu verwenden, der in anderen LAMP- oder LEMP-Lernprogrammen verwendet wird, verwenden wir einen "Ground-Up" -Ansatz: Zuerst erstellen wir eine Datenbankschicht, dann den Webserver und sehen, wie der Webserver eine Verbindung herstellen kann in die Datenbank.
Wir werden diese Konfiguration als LEPP-Stack (Linux, Nginx, PHP, PostgreSQL) bezeichnen.
Voraussetzungen
Um diesem Tutorial zu folgen, benötigen Sie Folgendes:
-
Zwei CentOS 7-Droplets mit mindestens 2 GB RAM und 2 CPU-Kernen, jeweils eines für den Datenbankserver und den Webserver.
Wir bezeichnen die IP-Adressen dieser Maschinen als "" bzw. "". Die tatsächlichen IP-Adressen dieser Geräte finden Sie auf dem DigitalOcean-Bedienfeld.
-
Sudo-Benutzer ohne Rootberechtigung auf beiden Droplets. Folgen Sie dazu dieses Tutorial.
Erster Schritt - PostgreSQL installieren
In diesem Schritt installieren wir PostgreSQL auf dem Datenbankserver.
Stellen Sie eine Verbindung zu der leeren, frisch installierten CentOS 7-Box her, in der Sie PostgreSQL installieren möchten. Das Repository wird standardmäßig nicht mit CentOS 7 geliefert, daher müssen Sie zuerst das RPM für das YUM-Repository herunterladen.
sudo wget http://yum.postgresql.org/9.4/redhat/rhel-7Server-x86_64/pgdg-centos94-9.4-1.noarch.rpm
Nachdem das RPM gespeichert wurde, installieren Sie das Repository.
sudo yum install pgdg-centos94-9.4-1.noarch.rpm -y
Zum Schluss installieren Sie den PostgreSQL 9.4-Server und seine Contrib-Module.
sudo yum install postgresql94-server postgresql94-contrib -y
Zweiter Schritt - Konfigurieren von PostgreSQL
In diesem Schritt passen wir eine Reihe von Konfigurationen nach der Installation für PostgreSQL an.
In CentOS 7 lautet der Standardspeicherort für PostgreSQL 9.4-Daten- und -Konfigurationsdateien "+ / var / lib / pgsql / 9.4 / data / " und der Speicherort für Programm-Binärdateien " / usr / pgsql-9.4 / bin / " . Das Datenverzeichnis ist am Anfang leer. Wir müssen das Programm " initdb +" ausführen, um den Datenbankcluster zu initialisieren und die erforderlichen Dateien darin zu erstellen:
sudo /usr/pgsql-9.4/bin/postgresql94-setup initdb
Nach der Initialisierung des Datenbankclusters befindet sich eine Datei mit dem Namen "+ postgresql.conf " im Datenordner, der Hauptkonfigurationsdatei für PostgreSQL. In dieser Datei werden zwei Parameter geändert. Öffnen Sie die Datei mit ` vi +` oder Ihrem bevorzugten Texteditor zum Bearbeiten.
sudo vi /var/lib/pgsql/9.4/data/postgresql.conf
Und ändern Sie die folgenden Zeilen:
-
Ändern Sie "+ listen_addresses =" + "in" + listen_addresses = "*" + "
-
Ändern Sie "+ port = 5432 " in " port = 5432 +"
Der erste Parameter gibt an, welche IP-Adresse der Datenbankserver überwacht. Postgres-Installationen erlauben aus Sicherheitsgründen nur lokale Host-Verbindungen. Wenn Sie dies in "*" ändern, wird Postgres auf Datenverkehr von jeder Quelle warten. Der zweite Parameter wurde durch Entfernen des Kommentarzeichens (#) aktiviert. es gibt den Standardport für Postgres an.
Speichern und schließen Sie die Datei.
Als nächstes bearbeiten wir + pg_hba.conf +
, die Host Based Access (HBA) -Konfigurationsdatei von PostgreSQL. Es gibt an, welche Hosts und IP-Bereiche eine Verbindung zum Datenbankserver herstellen können. Jeder Eintrag gibt an, ob die Verbindung lokal oder remote (Host) hergestellt werden kann, mit welcher Datenbank eine Verbindung hergestellt werden kann, über welchen Benutzer eine Verbindung hergestellt werden kann, von welchem IP-Block die Anforderung stammen kann und welcher Authentifizierungsmodus verwendet werden soll. Alle Verbindungsanfragen, die mit keinem dieser Einträge übereinstimmen, werden abgelehnt.
Öffne + pg_hba.conf
zum Bearbeiten.
sudo vi /var/lib/pgsql/9.4/data/pg_hba.conf
Scrollen Sie zum Ende der Datei und fügen Sie diese Zeile hinzu:
host all all /32 md5
Diese Zeile weist PostgreSQL an, Datenbankverbindungen zu akzeptieren, die nur von der IP-Adresse "++" stammen, wobei eine Standard-MD5-Prüfsumme für die Kennwortauthentifizierung verwendet wird. Die Verbindung kann für jede Datenbank als jeder Benutzer hergestellt werden.
Speichern und schließen Sie die Datei.
Starten Sie als nächstes den Postgres-Dienst:
sudo systemctl start postgresql-9.4.service
Und dann aktivieren Sie es:
sudo systemctl enable postgresql-9.4.service
Um zu überprüfen, ob der Datenbankserver Verbindungen akzeptiert, können Sie die letzten Zeilen der neuesten Postgres-Protokolldatei lesen. Die Datenbankfehlerprotokolle werden im Verzeichnis + / var / lib / pgsql / 9.4 / data / pg_log +
gespeichert. Führen Sie den folgenden Befehl aus, um die Dateien in diesem Verzeichnis anzuzeigen.
sudo ls -l /var/lib/pgsql/9.4/data/pg_log
Die Namen der Protokolldateien haben das Muster "+ postgresql-.log " (z. B. " postgresql-Wed.log +"). Suchen Sie die Protokolldatei, die dem aktuellen Tag entspricht, und sehen Sie sich die letzten Zeilen der neuesten Protokolldatei an.
sudo tail -f -n 20 /var/lib/pgsql/9.4/data/pg_log/postgresql-.log
Die Ausgabe sollte ungefähr so aussehen:
...
< 2015-02-26 21:32:24.159 EST >LOG: database system is ready to accept connections
< 2015-02-26 21:32:24.159 EST >LOG: autovacuum launcher started
Drücken Sie * STRG + C *, um die Ausgabe des Befehls + tail +
anzuhalten.
Dritter Schritt - Aktualisieren der Datenbankserver-Firewall
Wir müssen auch zulassen, dass der Postgres-Datenbankverkehr die Firewall passiert. CentOS 7 implementiert eine dynamische Firewall über den Daemon + firewalld +
. Der Dienst muss nicht neu gestartet werden, damit die Änderungen wirksam werden. Der "+ firewalld +" - Dienst sollte beim Systemstart automatisch gestartet werden, es ist jedoch immer gut, dies zu überprüfen.
sudo firewall-cmd --state
Der Standardstatus sollte "+ running " sein, aber wenn es " not running +" ist, starten Sie es mit:
sudo systemctl start firewalld
Fügen Sie als Nächstes die Regeln für Port 5432 hinzu. Dies ist der Port für den PostgreSQL-Datenbankverkehr.
sudo firewall-cmd --permanent --zone=public --add-port=5432/tcp
Laden Sie dann die Firewall neu.
sudo firewall-cmd --reload
Vierter Schritt - Erstellen und Auffüllen der Datenbank
In diesem Schritt erstellen wir eine Datenbank und fügen ihr einige Daten hinzu. Dies sind die Daten, die unsere Webanwendung dynamisch abruft und anzeigt.
Der erste Schritt ist das Ändern des Passworts des Postgres-Super-Benutzers * postgres *, das bei der Erstinstallation von PostgreSQL erstellt wird. Es ist am besten, wenn das Kennwort des Benutzers in Postgres geändert wird und nicht in der Eingabeaufforderung des Betriebssystems. Wechseln Sie dazu zum Benutzer * postgres *:
sudo su - postgres
Dies ändert die Eingabeaufforderung in "+ -bash-4.2 $ +". Starten Sie als Nächstes das integrierte Client-Tool.
psql
Standardmäßig wird der Postgres-Benutzer in der Postgres-Datenbank protokolliert. Ihre Eingabeaufforderung ändert sich in "+ postgres = # ", die psql-Eingabeaufforderung, keine OS-Eingabeaufforderung. Wenn Sie jetzt den Befehl " \ password +" eingeben, werden Sie aufgefordert, das Kennwort zu ändern.
\password
Geben Sie ein sicheres Passwort für den Postgres-Benutzer an.
Als nächstes erstellen Sie eine Datenbank mit dem Namen * product *:
CREATE DATABASE product;
Stellen Sie dann eine Verbindung zur * product * -Datenbank her:
\connect product;
Als nächstes erstellen Sie eine Tabelle in der Datenbank mit dem Namen * product_list *:
CREATE TABLE product_list (id int, product_name varchar(50));
Führen Sie jeden der folgenden Befehle einzeln aus. Jeder Befehl fügt einen einzelnen Datensatz zur Tabelle "+ product_list +" hinzu.
INSERT INTO product_list VALUES (1, 'Book');
INSERT INTO product_list VALUES (2, 'Computer');
INSERT INTO product_list VALUES (3, 'Desk');
Überprüfen Sie abschließend, ob die Daten korrekt hinzugefügt wurden.
SELECT * FROM product_list;
Die Ausgabe sollte folgendermaßen aussehen:
id | product_name
----+--------------
1 | Book
2 | Computer
3 | Desk
(3 rows)
Dies ist alles, was wir auf dem Datenbankserver tun müssen. Sie können jetzt die Verbindung trennen.
Fünfter Schritt - Installation von Nginx
Als Nächstes installieren und konfigurieren wir einen Nginx-Webserver im anderen Droplet. Stellen Sie eine Verbindung mit der anderen leeren, frisch installierten CentOS 7-Box her.
Wie PosgreSQL wird das Nginx-Repository nicht standardmäßig mit CentOS 7 geliefert. Wir müssen zuerst den RPM für das YUM-Repository herunterladen.
sudo wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
Nachdem das RPM gespeichert wurde, installieren Sie das Repository.
sudo yum install nginx-release-centos-7-0.el7.ngx.noarch.rpm -y
Installieren Sie abschließend den Nginx-Webserver.
sudo yum install nginx -y
Schritt 6 - Aktualisieren der Webserver-Firewall
In diesem Schritt konfigurieren wir die Firewall so, dass Nginx-Datenverkehr zugelassen wird, und passen einige Nginx-Konfigurationen an.
Wir müssen zulassen, dass HTTP / HTTPS-Datenverkehr die Firewall passiert. Überprüfen Sie nach wie vor, ob der Dienst "+ firewalld +" ausgeführt wird.
sudo firewall-cmd --state
Der Standardstatus sollte "+ running " sein, aber wenn es " running +" ist, starte es:
sudo systemctl start firewalld
Fügen Sie nun die Firewall-Regel für Port 80 (HTTP) hinzu:
sudo firewall-cmd --permanent --zone=public --add-port=80/tcp
Fügen Sie einen weiteren für Port 443 (HTTPS) hinzu:
sudo firewall-cmd --permanent --zone=public --add-port=443/tcp
Laden Sie dann die Firewall neu.
sudo firewall-cmd --reload
Starten Sie als Nächstes Nginx.
sudo systemctl start nginx.service
Und aktivieren Sie es.
sudo systemctl enable nginx.service
Wenn Sie unseren Browser auf die IP-Adresse des Servers richten, wird die Standardwebseite angezeigt:
image: https://assets.digitalocean.com/articles/LEPP_CentOS7/1.jpg [Standardwebseite von Nginx]
Schritt Sieben - Konfigurieren von Nginx
In diesem Schritt sind zwei Nginx-Konfigurationsdateien relevant. Die erste ist die Hauptkonfigurationsdatei und die zweite ist eine standortspezifische.
Die allgemeine Konfigurationsdatei steuert die allgemeinen Servereigenschaften. Nginx kann viele Websites bedienen und jede Site wird als Serverblock bezeichnet (Apache nennt sie virtuelle Hosts oder vhosts). Die Konfiguration jeder Site wird durch eine Serverblock-Konfigurationsdatei gesteuert.
Lassen Sie uns die Konfigurationsdatei des Hauptservers bearbeiten.
sudo vi /etc/nginx/nginx.conf
Ändern Sie in der zweiten Zeile der Datei den Parameter + worker_processes +
von 1 in 2. Dadurch werden die Nginx-Worker-Threads angewiesen, alle verfügbaren CPU-Kerne zu verwenden. Speichern und schließen Sie die Datei.
Wir werden hier keine Serve-Blöcke erstellen. Stattdessen erstellen wir unsere Webanwendung im Standard-Serverblock. Bearbeiten Sie daher die Standard-Serverblock-Konfigurationsdatei.
sudo vi /etc/nginx/conf.d/default.conf
Der Inhalt sieht so aus. Die zu bearbeitenden Teile werden hervorgehoben.
server {
listen 80;
server_name ;
...
root /usr/share/nginx/html;
;
#error_page 404 /404.html;
...
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
fastcgi_pass
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
include fastcgi_params;
}
...
}
Nehmen Sie die folgenden Änderungen vor:
-
Setzen Sie "+ Servername " von " localhost " auf "+".
-
Fügen Sie der Direktive "+ index " " index.php" hinzu, damit "+ index.php index.html index.htm" angezeigt wird.
-
Löschen Sie die Zeilen
+ location / {+
und+} +
, die die Direktiven+ root
und` + index` enthalten. Ohne diese Änderung wird Ihre Webseite möglicherweise nicht im Browser angezeigt und im Nginx-Fehlerprotokoll werden Meldungen wie "" Das primäre Skript kann nicht geöffnet werden: /etc/nginx/html/index.php (Keine solche Datei oder kein solches Verzeichnis) " ` -
Kommentieren Sie den Block
+ location ~ \ .php $ +
(einschließlich der letzten geschweiften Klammer) unter dem Kommentar * pass the PHP scripts to FastCGI server * aus. -
Löschen Sie die root-Direktive unter demselben
+ location ~ \ .php $ +
Block. -
Ändern Sie den Wert der Direktive fastcgi_pass von
+127.0.0.1: 9000 +
in+ unix: / var / run / php-fpm / php5-fpm.sock +
. Damit wird sichergestellt, dass der PHP FastCGI Process Manager (den wir im nächsten Schritt installieren) den Unix-Socket abhört. -
Ändern Sie den Direktivenwert
+ fastcgi_param +
in+ SCRIPT_FILENAME $ document_root $ fastcgi_script_name +
. Dadurch wird dem Webserver mitgeteilt, dass PHP-Skriptdateien im Stammverzeichnis des Dokuments gespeichert werden.
Nach Abschluss der Bearbeitung sollte die Datei folgendermaßen aussehen:
server {
listen 80;
server_name ;
...
root /usr/share/nginx/html;
index index.html index.htm;
...
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
fastcgi_pass
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
include fastcgi_params;
}
...
Speichern und beenden Sie die Datei und starten Sie den Webserver.
sudo systemctl restart nginx.service
Schritt acht - PHP installieren
Wir werden nun drei PHP-Komponenten auf dem Webserver installieren: die PHP-Engine selbst, den FastCGI Process Manager (FPM) und das PHP-Modul für PostgreSQL.
Installieren Sie zuerst PHP.
sudo yum install php -y
Als nächstes installieren wir den FastCGI Process Manager (FPM), eine PHP-eigene Implementierung von FastCGI. FastCGI ist wie ein Add-On auf Ihrem Webserver. Es wird unabhängig ausgeführt und beschleunigt Benutzeranforderungen, indem es sie in einem einzigen Prozess konsolidiert und so die Antwortzeit verkürzt.
sudo yum install php-fpm -y
Installieren Sie zum Schluss das PHP Postgres-Modul:
sudo yum install php-pgsql -y
Neunter Schritt - PHP konfigurieren
In diesem Schritt konfigurieren wir PHP.
Öffnen Sie die PHP-Konfigurationsdatei.
sudo vi /etc/php.ini
Nehmen Sie folgende Änderungen vor:
-
Ändern Sie
+ expose_php = On +
in+ expose_php = Off +
. Wenn Sie diesen Parameter auf "+ Aus +" setzen, fügt PHP seine Signatur nicht zum Header des Webservers hinzu und zeigt nicht an, dass auf dem Server PHP ausgeführt wird. -
Ändern Sie "; cgi.fix_pathinfo = 0 +" in "; cgi.fix_pathinfo = 1 +".
Speichern und schließen Sie die Datei. Bearbeiten Sie als Nächstes die FPM-Konfigurationsdatei.
sudo vi /etc/php-fpm.d/www.conf
Nehmen Sie folgende Änderungen vor:
-
Ändern Sie "+ user = apache" in "+ user = nginx".
-
Ändern Sie in ähnlicher Weise "+ group = apache" in "+ group = nginx".
-
Ändern Sie "+ listen = 127.0.0.1: 9000 " in " listen = / var / run / php-fpm / php5-fpm.sock +". Diesen Wert legen wir in der Konfigurationsdatei des Nginx-Standard-Serverblocks fest.
Speichern und beenden Sie vi. Als nächstes starten Sie PHP-FPM.
sudo systemctl start php-fpm.service
Dann aktivieren Sie es.
sudo systemctl enable php-fpm.service
Schritt 10 - Erstellen der Webanwendung
Wir haben alle unsere Serverkomponenten in beiden Knoten bereit. Jetzt ist es an der Zeit, unsere PHP-Anwendung zu erstellen. Erstellen Sie eine Datei mit dem Namen "+ index.php" in "+ / usr / share / nginx / html".
sudo vi /usr/share/nginx/html/index.php
Fügen Sie den folgenden Inhalt ein. Stellen Sie sicher, dass Sie die markierten Variablen durch Ihre Datenbankserver-IP-Adresse bzw. Ihr Postgres-Passwort ersetzen.
<html>
<head>
<title>LEPP Stack Example</title>
</head>
<body>
<h4>LEPP (Linux, Nginx, PHP, PostgreSQL) Sample Page</h4>
<hr/>
<p>Hello and welcome. This web page is dynamically showing a product list from a PostgreSQL database</p>
<?php
$host = "";
$user = "postgres";
$password = "";
$dbname = "product";
$con = pg_connect("host=$host dbname=$dbname user=$user password=$password")
or die ("Could not connect to server\n");
$query = "SELECT * FROM product_list";
$resultset = pg_query($con, $query) or die("Cannot execute query: $query\n");
$rowcount = pg_numrows($resultset);
for($index = 0; $index < $rowcount; $index++) {
$row = pg_fetch_array($resultset, $index);
echo $row["id"], "-", $row["product_name"];
echo "<br>";
}
?>
</body>
</html>
Dies ist eine einfache Webseite mit eingebettetem PHP-Code. Zunächst werden eine Reihe von Parametern für die Datenbankverbindungszeichenfolge definiert. Als nächstes wird eine Verbindung (angegeben durch "+ $ con +") zum Datenbankserver hergestellt. Eine Abfrage wird angegeben und dann für die Tabelle * product_list * ausgeführt. Es durchläuft die zurückgegebenen Ergebnisse und druckt den Inhalt jeder Zeile in einer neuen Zeile.
Öffnen Sie nach dem Schreiben und Speichern der Datei ein Browserfenster und zeigen Sie auf "++". Der Inhalt sollte folgendermaßen aussehen:
image: http: //i.imgur.com/HDwygcq.jpg [Dynamische PHP-Webseite mit PostgreSQL-Daten]
Fazit
Wir haben zwei Boxen von Grund auf neu erstellt, die gesamte erforderliche Software installiert und konfiguriert und dann unsere Webanwendung darin bereitgestellt. Ein Produktionsstack würde eine zusätzliche Komplexität aufweisen, wie das Hinzufügen externer Firewalls und Lastausgleichsmodule. Dies ist jedoch eine solide Grundkonfiguration, die Sie für den Einstieg verwenden können. Genießen!