Einrichten eines LEPP-Stacks mit zwei Knoten unter CentOS 7

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:

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!