So konfigurieren Sie Nginx als Webserver und Reverse Proxy für Apache auf einem Ubuntu 16.04-Server

Einführung

Apache und Nginx sind zwei beliebte Open-Source-Webserver, die häufig mit PHP verwendet werden. Es kann nützlich sein, beide auf derselben virtuellen Maschine auszuführen, wenn mehrere Websites mit unterschiedlichen Anforderungen gehostet werden. Die allgemeine Lösung für den Betrieb von zwei Webservern auf einem einzigen System besteht darin, entweder mehrere IP-Adressen oder verschiedene Portnummern zu verwenden.

Droplets mit IPv4- und IPv6-Adressen können so konfiguriert werden, dass sie Apache-Sites auf einem Protokoll und Nginx-Sites auf dem anderen bedienen. Dies ist jedoch derzeit nicht praktikabel, da die IPv6-Übernahme durch ISPs noch nicht weit verbreitet ist. Eine andere Portnummer wie "+ 81 " oder " 8080 " für den zweiten Webserver ist eine andere Lösung, aber das Teilen von URLs mit Portnummern (wie " http: //example.com: 81 +") ist nicht möglich nicht immer vernünftig oder ideal.

Dieses Tutorial zeigt Ihnen, wie Sie Nginx sowohl als Webserver als auch als Reverse-Proxy für Apache konfigurieren - alles auf einem Droplet. Abhängig von der Webanwendung sind möglicherweise Codeänderungen erforderlich, um den Reverse-Proxy-Schutz von Apache aufrechtzuerhalten, insbesondere wenn SSL-Sites konfiguriert sind. Um dies zu vermeiden, installieren wir ein Apache-Modul mit dem Namen * mod_rpaf *, das bestimmte Umgebungsvariablen umschreibt, sodass der Apache offenbar Anfragen von Web-Clients direkt verarbeitet.

Wir werden vier Domainnamen auf einem Droplet hosten. Zwei werden von Nginx bereitgestellt: "+ example.com " (der standardmäßige virtuelle Host) und " sample.org ". Die restlichen beiden, " foobar.net " und " test.io +", werden von Apache bereitgestellt.

Voraussetzungen

  • Ein neues Ubuntu 16.04 Droplet.

  • Ein Standard-Benutzerkonto mit "+ sudo +" - Berechtigungen. Sie können ein Standardkonto einrichten, indem Sie die Schritte 2 und 3 unter Initial Server Setup with Ubuntu 16.04 ausführen. .

  • Die gewünschten Domainnamen sollten auf die IP-Adresse Ihres Droplets in der DigitalOcean-Systemsteuerung verweisen. In Schritt 3 von Einrichten eines Hostnamens mit DigitalOcean finden Sie ein Beispiel für Wie macht man das. Wenn Sie den DNS Ihrer Domains an anderer Stelle hosten, sollten Sie stattdessen dort entsprechende A-Einträge erstellen.

  • Optionale Referenzen *

Dieses Lernprogramm setzt Grundkenntnisse über virtuelle Hosts in Apache und Nginx sowie die Erstellung und Konfiguration von SSL-Zertifikaten voraus. Weitere Informationen zu diesen Themen finden Sie in den folgenden Artikeln.

Schritt 1 - Installation von Apache und PHP-FPM

Zusätzlich zu Apache und PHP-FPM müssen wir auch das PHP-FastCGI-Apache-Modul mit dem Namen libapache2-mod-fastcgi installieren.

Aktualisieren Sie zunächst das apt-Repository, um sicherzustellen, dass Sie über die neuesten Pakete verfügen.

sudo apt-get update

Installieren Sie als Nächstes die erforderlichen Pakete:

sudo apt-get install apache2 libapache2-mod-fastcgi php-fpm

Als nächstes ändern wir die Standardkonfiguration von Apache.

Schritt 2 - Konfigurieren von Apache und PHP-FPM

In diesem Schritt ändern wir Apaches Portnummer auf 8080 und konfigurieren es so, dass es mit PHP-FPM unter Verwendung des Moduls mod_fastcgi funktioniert. Bearbeiten Sie die Apache-Konfigurationsdatei und ändern Sie die Portnummer von Apache.

sudo nano /etc/apache2/ports.conf

Suchen Sie die folgende Zeile:

Listen 80

Ändern Sie es in:

Listen

Speichern und beenden Sie + ports.conf +.

Als Nächstes bearbeiten wir die standardmäßige virtuelle Hostdatei von Apache. Die Direktive "+ <VirtualHost> " in dieser Datei ist so eingestellt, dass Sites nur an Port " 80 +" bedient werden. Daher müssen wir dies ebenfalls ändern. Öffnen Sie die standardmäßige virtuelle Hostdatei.

sudo nano /etc/apache2/sites-available/000-default.conf

Die erste Zeile sollte sein:

<VirtualHost *:80>

Ändern Sie es in:

<VirtualHost *:>

Speichern Sie die Datei und laden Sie Apache neu.

sudo systemctl reload apache2

Stellen Sie sicher, dass Apache jetzt "+ 8080 +" abhört.

sudo netstat -tlpn
Die Ausgabe sollte wie im folgenden Beispiel aussehen, wobei * apache2 * *

8080 * abhört.

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address     Foreign Address      State    PID/Program name
tcp        0      0 0.0.0.0:22        0.0.0.0:*            LISTEN   1086/sshd

tcp6       0      0 :::22             :::*                 LISTEN   1086/sshd

Sobald Sie sichergestellt haben, dass Apache den richtigen Port überwacht, können Sie die Unterstützung für PHP und FastCGI konfigurieren.

Schritt 3 - Apache für die Verwendung von mod_fastcgi konfigurieren

Apache bedient PHP-Seiten standardmäßig mit + mod_php +, erfordert jedoch eine zusätzliche Konfiguration, um mit PHP-FPM zu arbeiten.

sudo a2dismod php7.0

Wir werden einen Konfigurationsblock für "+ mod_fastcgi " hinzufügen, der von " mod_action " abhängt. ` mod_action +` ist standardmäßig deaktiviert, daher müssen wir es zuerst aktivieren.

sudo a2enmod actions

Diese Konfigurationsanweisungen übergeben Anforderungen für "+ .php +" - Dateien an den PHP-FPM UNIX-Socket.

sudo nano /etc/apache2/mods-enabled/fastcgi.conf

Fügen Sie die folgenden Zeilen in die Datei `+ <IfModule mod_fastcgi.c> ein. . . </ IfModule> + `unter den vorhandenen Elementen in diesem Block:

AddType application/x-httpd-fastphp .php
Action application/x-httpd-fastphp /php-fcgi
Alias /php-fcgi /usr/lib/cgi-bin/php-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php-fcgi -socket /run/php/php7.0-fpm.sock -pass-header Authorization
<Directory /usr/lib/cgi-bin>
   Require all granted
</Directory>

Speichern Sie die Änderungen, die Sie an "+ fastcgi.conf +" vorgenommen haben, und führen Sie einen Konfigurationstest durch.

sudo apachectl -t

Laden Sie Apache neu, wenn * Syntax OK * angezeigt wird. Wenn Sie die Warnung `+ sehen, konnte der vollständig qualifizierte Domänenname des Servers mit 127.0.1.1 nicht zuverlässig ermittelt werden. Setzen Sie die Anweisung "ServerName" global, um diese Meldung zu unterdrücken. Es betrifft uns jetzt nicht.

sudo systemctl reload apache2

Stellen wir jetzt sicher, dass wir PHP von Apache aus bedienen können.

Schritt 4 - Überprüfen der PHP-Funktionalität

Überprüfen Sie, ob PHP funktioniert, indem Sie eine + phpinfo () + - Datei erstellen und über Ihren Webbrowser darauf zugreifen.

echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php

Um die Datei in einem Browser anzuzeigen, gehen Sie zu + http: //: 8080 / info.php. Dadurch erhalten Sie eine Liste der Konfigurationseinstellungen, die PHP verwendet.

Überprüfen Sie oben auf der Seite, ob in der * Server-API * * FPM / FastCGI * angegeben ist. Ungefähr zwei Drittel der gesamten Seite erfahren Sie im Abschnitt * PHP-Variablen *, dass * SERVER_SOFTWARE * unter Ubuntu Apache ist. Diese bestätigen, dass + mod_fastcgi + aktiv ist und Apache PHP-FPM verwendet, um PHP-Dateien zu verarbeiten.

Schritt 5 - Erstellen virtueller Hosts für Apache

Erstellen wir virtuelle Apache-Hostdateien für die Domains "+ foobar.net " und " test.io +". Dazu erstellen wir zunächst Dokumentstammverzeichnisse für beide Sites und platzieren einige Standarddateien in diesen Verzeichnissen, damit wir unsere Konfiguration problemlos testen können.

Erstellen Sie zunächst die Stammverzeichnisse:

sudo mkdir -v /var/www/{,}

Dann erstellen Sie eine "+ Index" -Datei für jede Site.

echo "<h1 style='color: green;'>Foo Bar</h1>" | sudo tee /var/www//index.html
echo "<h1 style='color: red;'>Test IO</h1>" | sudo tee /var/www//index.html

Erstellen Sie dann für jede Site eine "+ phpinfo () +" - Datei, damit wir testen können, ob PHP richtig konfiguriert ist.

echo "<?php phpinfo(); ?>" | sudo tee /var/www//info.php
echo "<?php phpinfo(); ?>" | sudo tee /var/www//info.php

Erstellen Sie nun die virtuelle Host-Datei für die Domain "+ foobar.net +".

sudo nano /etc/apache2/sites-available/.conf

Fügen Sie die folgende Anweisung in diese neue Datei ein:

<VirtualHost *:8080>
   ServerName
   ServerAlias www.
   DocumentRoot /var/www/
   <Directory /var/www/>
       AllowOverride All
   </Directory>
</VirtualHost>

Dies sind nur die grundlegendsten Richtlinien. Eine vollständige Anleitung zum Einrichten von virtuellen Hosts in Apache finden Sie unter How So richten Sie virtuelle Apache-Hosts unter Ubuntu 16.04 ein.

Speichern und schließen Sie die Datei. Erstellen Sie dann eine ähnliche Konfiguration für "+ test.io +".

sudo nano /etc/apache2/sites-available/.conf
<VirtualHost *:8080>
   ServerName
   ServerAlias www.
   DocumentRoot /var/www/
   <Directory /var/www/>
       AllowOverride All
   </Directory>
</VirtualHost>

Nachdem Sie beide virtuellen Apache-Hosts eingerichtet haben, aktivieren Sie die Sites mit dem Befehl "+ a2ensite ". Dadurch wird eine symbolische Verknüpfung zur virtuellen Hostdatei im Verzeichnis " sites-enabled +" erstellt.

sudo a2ensite
sudo a2ensite

Überprüfen Sie Apache erneut auf Konfigurationsfehler.

sudo apachectl -t

Laden Sie Apache neu, wenn * Syntax OK * angezeigt wird.

sudo systemctl reload apache2

Öffnen Sie "+ http: //: 8080 " und " http: //: 8080 +" in Ihrem Browser und stellen Sie sicher, dass auf jeder Site die Datei "* index.html *" angezeigt wird.

Sie sollten die folgenden Ergebnisse sehen:

Überprüfen Sie auch, ob PHP funktioniert, indem Sie auf die * info.php * -Dateien für jede Site zugreifen. Besuchen Sie "+ http: //: 8080 / info.php " und " http: //: 8080 / info.php +" in Ihrem Browser.

Sie sollten auf jeder Site dieselbe PHP-Konfigurationsspezifikationsliste sehen, die Sie in Schritt 4 gesehen haben. Wir haben jetzt zwei auf Apache gehostete Websites in Port "+ 8080 +"

Schritt 6 - Installieren und Konfigurieren von Nginx

In diesem Schritt installieren wir Nginx und konfigurieren die Domänen "+ example.com " und " sample.org +" als virtuelle Nginx-Hosts. Eine vollständige Anleitung zum Einrichten virtueller Hosts in Nginx finden Sie unter https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-virtual-hosts-on-ubuntu-16 -04 [So richten Sie Nginx-Serverblöcke (virtuelle Hosts) unter Ubuntu 16.04 ein].

Installieren Sie Nginx mit dem Paketmanager.

sudo apt-get install nginx

Entfernen Sie dann den Symlink des virtuellen Standardhosts, da wir ihn nicht mehr verwenden. Wir erstellen unseren eigenen Standard-Site-Brief (+ example.com +).

sudo rm /etc/nginx/sites-enabled/default

Jetzt erstellen wir virtuelle Hosts für Nginx nach dem gleichen Verfahren wie für Apache. Erstellen Sie zunächst Dokumentenstammverzeichnisse für beide Websites:

sudo mkdir -v /usr/share/nginx/{,}

Wie bei den virtuellen Apache-Hosts erstellen wir nach Abschluss des Setups erneut Dateien mit den Bezeichnungen "+ index" und "+ phpinfo () +" zum Testen.

echo "<h1 style='color: green;'>Example.com</h1>" | sudo tee /usr/share/nginx//index.html
echo "<h1 style='color: red;'>Sample.org</h1>" | sudo tee /usr/share/nginx//index.html
echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx//info.php
echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx//info.php

Erstellen Sie nun eine virtuelle Host-Datei für die Domain "+ example.com +".

sudo nano /etc/nginx/sites-available/

Nginx ruft `+ server {auf. . .} + `Bereiche einer Konfigurationsdatei * Serverblöcke *. Erstellen Sie einen Serverblock für den primären virtuellen Host. Die Konfigurationsanweisung "+ default_server +" macht dies zum virtuellen Standardhost, der HTTP-Anforderungen verarbeitet, die keinem anderen virtuellen Host entsprechen.

Fügen Sie Folgendes in die Datei ein für:

server {
   listen 80 default_server;

   root /usr/share/nginx/;
   index index.php index.html index.htm;

   server_name ;
   location / {
       try_files $uri $uri/ /index.php;
   }

   location ~ \.php$ {
       fastcgi_pass unix:/run/php/php7.0-fpm.sock;
       include snippets/fastcgi-php.conf;
   }
}

Speichern und schließen Sie die Datei. Erstellen Sie nun eine virtuelle Hostdatei für die zweite Domain von Nginx, "+ sample.org +".

sudo nano /etc/nginx/sites-available/

Der Serverblock für sollte folgendermaßen aussehen:

server {
   root /usr/share/nginx/;
   index index.php index.html index.htm;

   server_name ;
   location / {
       try_files $uri $uri/ /index.php;
   }

   location ~ \.php$ {
       fastcgi_pass unix:/run/php/php7.0-fpm.sock;
       include snippets/fastcgi-php.conf;
   }
}

Speichern und schließen Sie die Datei. Aktivieren Sie dann beide Sites, indem Sie symbolische Links zum Verzeichnis "+ sites-enabled +" erstellen.

sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/

Führen Sie einen Nginx-Konfigurationstest durch:

sudo nginx -t

Laden Sie dann Nginx neu, wenn * OK * angezeigt wird.

sudo systemctl reload nginx

Greifen Sie jetzt auf die Datei "+ phpinfo () " Ihrer virtuellen Nginx-Hosts in einem Webbrowser zu, indem Sie " http: /// info.php" und "+ http: /// info.php +" besuchen. Sehen Sie sich noch einmal die Abschnitte mit den PHP-Variablen an.

  • ["SERVER_SOFTWARE"] * sollte "+ nginx +" sagen, was darauf hinweist, dass die Dateien direkt von Nginx bereitgestellt wurden. * ["DOCUMENT_ROOT"] * sollte auf das Verzeichnis verweisen, das Sie zuvor in diesem Schritt für jede Nginx-Site erstellt haben.

Zu diesem Zeitpunkt haben wir Nginx installiert und zwei virtuelle Hosts erstellt. Als nächstes konfigurieren wir Nginx für Proxy-Anfragen, die für auf Apache gehostete Domains bestimmt sind.

Schritt 7 - Konfigurieren von Nginx für die virtuellen Hosts von Apache

Erstellen Sie einen zusätzlichen virtuellen Nginx-Host mit mehreren Domänennamen in den Direktiven "+ Servername +". Anfragen für diese Domainnamen werden an Apache weitergeleitet.

Erstellen Sie eine neue virtuelle Nginx-Hostdatei:

sudo nano /etc/nginx/sites-available/apache

Fügen Sie den folgenden Codeblock hinzu. Hiermit werden die Namen der beiden virtuellen Apache-Hostdomänen angegeben und deren Anforderungen an Apache weitergeleitet. Denken Sie daran, die öffentliche IP-Adresse in + proxy_pass + zu verwenden.

server {
   listen 80;
   server_name ;

   location / {
       proxy_pass http://:8080;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
   }
}

Speichern Sie die Datei und aktivieren Sie diesen neuen virtuellen Host, indem Sie eine symbolische Verknüpfung erstellen.

sudo ln -s /etc/nginx/sites-available/apache /etc/nginx/sites-enabled/apache

Führen Sie einen Konfigurationstest durch:

sudo nginx -t

Laden Sie Nginx neu, wenn * OK * angezeigt wird.

sudo systemctl reload nginx

Öffnen Sie den Browser und rufen Sie die URL "+ http: /// info.php +" in Ihrem Browser auf. Scrollen Sie zum Abschnitt * PHP-Variablen * und überprüfen Sie die angezeigten Werte.

Die Variablen * SERVER_SOFTWARE * und * DOCUMENT_ROOT * bestätigen, dass diese Anfrage von Apache bearbeitet wurde. Die Variablen * HTTPXREAL_IP * und * HTTPXFORWARDED_FOR * wurden von Nginx hinzugefügt und sollten die öffentliche IP-Adresse des Computers anzeigen, mit dem Sie auf die URL zugreifen.

Wir haben Nginx erfolgreich für Proxy-Anfragen für bestimmte Domains an Apache eingerichtet. Als nächstes konfigurieren wir Apache so, dass die Variable "+ REMOTE_ADDR +" so eingestellt wird, als würde sie diese Anforderungen direkt verarbeiten.

Schritt 8 - Installation und Konfiguration von mod_rpaf

In diesem Schritt installieren wir ein Apache-Modul mit dem Namen * mod_rpaf *, das die Werte von * REMOTE_ADDR *, * HTTPS * und * HTTP_PORT * basierend auf den von einem Reverse-Proxy bereitgestellten Werten umschreibt. Ohne dieses Modul würden einige PHP-Anwendungen Codeänderungen erfordern, um nahtlos hinter einem Proxy zu funktionieren. Dieses Modul ist im Ubuntu-Repository als "+ libapache2-mod-rpaf" vorhanden, ist jedoch veraltet und unterstützt bestimmte Konfigurationsanweisungen nicht. Stattdessen installieren wir es von der Quelle.

Installieren Sie die zum Erstellen des Moduls erforderlichen Pakete:

sudo apt-get install unzip build-essential apache2-dev

Laden Sie die neueste stabile Version von GitHub herunter.

wget https://github.com/gnif/mod_rpaf/archive/stable.zip

Extrahiere es mit:

unzip stable.zip

Wechseln Sie in das Arbeitsverzeichnis.

cd mod_rpaf-stable

Dann kompilieren und installieren Sie das Modul.

make
sudo make install

Erstellen Sie eine Datei im Verzeichnis + mods-available +, die das rpaf-Modul lädt.

sudo nano /etc/apache2/mods-available/rpaf.load

Fügen Sie der Datei die folgende Zeile hinzu:

LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf.so

Erstellen Sie eine weitere Datei in diesem Verzeichnis. Dieser enthält die Konfigurationsanweisungen.

sudo nano /etc/apache2/mods-available/rpaf.conf

Fügen Sie den folgenden Codeblock hinzu, und achten Sie darauf, die IP-Adresse Ihres Droplets hinzuzufügen.

<IfModule mod_rpaf.c>
   RPAF_Enable             On
   RPAF_Header             X-Real-Ip
   RPAF_ProxyIPs
   RPAF_SetHostName        On
   RPAF_SetHTTPS           On
   RPAF_SetPort            On
</IfModule>

Hier finden Sie eine kurze Beschreibung der einzelnen Richtlinien. Weitere Informationen finden Sie in der Datei + mod_rpaf + README.

  • * RPAF_Header * - Der Header, der für die tatsächliche IP-Adresse des Clients verwendet werden soll.

  • * RPAF_ProxyIPs * - Die Proxy-IP, für die HTTP-Anforderungen angepasst werden sollen.

  • * RPAF_SetHostName * - Aktualisiert den vhost-Namen, damit ServerName und ServerAlias ​​funktionieren.

  • * RPAF_SetHTTPS * - Setzt die Umgebungsvariable "+ HTTPS " basierend auf dem in " X-Forwarded-Proto +" enthaltenen Wert.

  • * RPAF_SetPort * - Setzt die Umgebungsvariable + SERVER_PORT +. Nützlich, wenn sich Apache hinter einem SSL-Proxy befindet.

Speichern Sie + rpaf.conf + und aktivieren Sie das Modul.

sudo a2enmod rpaf

Dadurch werden symbolische Verknüpfungen der Dateien "+ rpaf.load " und " rpaf.conf " im Verzeichnis " mods-enabled +" erstellt. Führen Sie nun einen Konfigurationstest durch.

sudo apachectl -t

Laden Sie Apache neu, wenn * Syntax OK * zurückgegeben wird.

sudo systemctl reload apache2

Greifen Sie in Ihrem Browser auf eine der "+ phpinfo () +" - Seiten der Apache-Website zu und überprüfen Sie den Abschnitt "* PHP-Variablen *". Die Variable * REMOTE_ADDR * ist jetzt auch die öffentliche IP-Adresse Ihres lokalen Computers.

Schritt 9 - Einrichten von HTTPS-Websites (optional)

In diesem Schritt konfigurieren wir SSL-Zertifikate für beide auf Apache gehosteten Domänen. Nginx unterstützt die SSL-Beendigung, sodass wir SSL einrichten können, ohne die Konfigurationsdateien von Apache zu ändern. Das + mod_rpaf + - Modul stellt sicher, dass die erforderlichen Umgebungsvariablen in Apache gesetzt sind, damit Anwendungen nahtlos hinter einem SSL-Reverse-Proxy funktionieren.

Erstellen Sie ein Verzeichnis für die SSL-Zertifikate und ihre privaten Schlüssel.

sudo mkdir /etc/nginx/ssl

Für diesen Artikel verwenden wir selbstsignierte SSL-Zertifikate mit einer Gültigkeit von 10 Jahren. Generieren Sie selbstsignierte Zertifikate für "+ foobar.net " und " test.io +".

sudo openssl req -x509 -sha256 -newkey rsa:2048 -keyout /etc/nginx/ssl/-key.pem -out /etc/nginx/ssl/-cert.pem -days 3650 -nodes
sudo openssl req -x509 -sha256 -newkey rsa:2048 -keyout /etc/nginx/ssl/-key.pem -out /etc/nginx/ssl/-cert.pem -days 3650 -nodes

Jedes Mal werden Sie aufgefordert, Details zur Zertifikatsidentifikation einzugeben. Geben Sie jedes Mal die entsprechende Domain für den "+ Common Name +" ein.

Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

Öffnen Sie nun die virtuelle Apache-Hostdatei, die Anforderungen von Nginx an Apache weiterleitet.

sudo nano /etc/nginx/sites-available/apache

Da wir für jede Domain separate Zertifikate und Schlüssel haben, benötigen wir einen separaten `+ Server {. . . } + `Blöcke für jede Domain. Sie sollten den aktuellen Inhalt der Datei löschen und durch den folgenden Inhalt ersetzen:

server {
   listen 80;
   listen 443 ssl;
   server_name ;

   ssl on;
   ssl_certificate /etc/nginx/ssl/-cert.pem;
   ssl_certificate_key /etc/nginx/ssl/-key.pem;

   location / {
       proxy_pass http://:8080;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
   }
}

server {
   listen 80;
   listen 443 ssl;
   server_name ;

   ssl on;
   ssl_certificate /etc/nginx/ssl/-cert.pem;
   ssl_certificate_key /etc/nginx/ssl/-key.pem;

   location / {
       proxy_pass http://:8080;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
   }
}

Wir haben den ursprünglichen Serverblock in zwei separate Blöcke aufgeteilt und Nginx angewiesen, Port 443, den Standardport für sichere Sites, abzuhören.

Speichern Sie die Datei und führen Sie einen Konfigurationstest durch.

sudo nginx -t

Laden Sie Nginx neu, wenn der Test erfolgreich war.

sudo systemctl reload nginx

Greifen Sie jetzt mit dem Präfix "+ https: // " auf eine der Apache-Domänen in Ihrem Browser zu. Besuchen Sie zunächst " https: /// info.php +" und sehen Sie Folgendes:

Schauen Sie in den Abschnitt * PHP-Variablen *. Die Variable * SERVER_PORT * wurde auf * 443 * und * HTTPS * auf * on * gesetzt, als ob auf Apache direkt über HTTPS zugegriffen wurde. Wenn diese Variablen gesetzt sind, müssen PHP-Anwendungen nicht speziell konfiguriert werden, um hinter einem Reverse-Proxy zu arbeiten.

Schritt 10 - Blockieren des direkten Zugriffs auf Apache (optional)

Da Apache auf der öffentlichen IP-Adresse den Port "+ 8080 +" abhört, können alle darauf zugreifen. Sie können dies blockieren, indem Sie den folgenden IPtables-Befehl in Ihren Firewall-Regelsatz einfügen.

sudo iptables -I INPUT -p tcp --dport 8080 ! -s  -j REJECT --reject-with tcp-reset

Stellen Sie sicher, dass Sie die IP-Adresse Ihres Droplets anstelle des roten Beispiels verwenden. Sobald Port + 8080 + in Ihrer Firewall blockiert ist, testen Sie, ob Apache darauf nicht erreichbar ist. Öffnen Sie Ihren Webbrowser und versuchen Sie, über den Port "+ 8080 +" auf einen der Apache-Domainnamen zuzugreifen. Zum Beispiel: http: //: 8080

Der Browser sollte die Fehlermeldung "Verbindung nicht möglich" oder "Webseite nicht verfügbar" anzeigen. Mit der IPtables-Option "+ tcp-reset " würde ein Außenstehender keinen Unterschied zwischen Port " 8080 +" und einem Port sehen, auf dem kein Dienst ausgeführt wird.

  • Hinweis: * IPtables-Regeln überstehen einen Systemneustart nicht standardmäßig. Es gibt mehrere Möglichkeiten, IPtables-Regeln beizubehalten. Am einfachsten ist es jedoch, "+ iptables-persistent +" im Ubuntu-Repository zu verwenden. Weitere Informationen zum Konfigurieren von IPTables finden Sie unter https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall- using-iptables-on-ubuntu-14-04[this article] .

Schritt 11 - Statische Dateien mit Nginx bereitstellen (optional)

Wenn Nginx-Proxys Anforderungen für Apache-Domänen stellen, sendet es jede Dateianforderung für diese Domäne an Apache. Nginx ist schneller als Apache, wenn es darum geht, statische Dateien wie Bilder, JavaScript und Stylesheets bereitzustellen. Konfigurieren wir also die virtuelle Nginx-Hostdatei "+ apache +" so, dass sie statische Dateien direkt bereitstellt, aber PHP-Anfragen an Apache weiterleitet.

Öffnen Sie zunächst die virtuelle Host-Datei "+ apache".

sudo nano /etc/nginx/sites-available/apache

Sie müssen * jedem * Serverblock zwei zusätzliche Standortblöcke hinzufügen und die vorhandenen Standortblöcke ändern. (Wenn Sie nur einen Serverblock aus dem vorherigen Schritt haben, können Sie den Inhalt Ihrer Datei vollständig ersetzen, sodass er mit dem unten gezeigten Inhalt übereinstimmt.) Außerdem müssen Sie Nginx mitteilen, wo sich die statischen Dateien für jede Site befinden . Diese Änderungen werden im folgenden Code rot angezeigt:

server {
   listen 80;
   server_name test.io www.test.io;








       proxy_pass http://your_ip_address:8080;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
   }




}

server {
   listen 80;
   server_name foobar.net www.foobar.net;








       proxy_pass http://your_ip_address:8080;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
   }




}

Die Direktive + try_files + veranlasst Nginx, nach Dateien im Dokumentenstamm zu suchen und diese direkt bereitzustellen. Wenn die Datei die Erweiterung "+ .php +" hat, wird die Anfrage an Apache weitergeleitet. Auch wenn die Datei nicht im Dokumentenstamm gefunden wird, wird die Anfrage an Apache weitergeleitet, sodass Anwendungsfunktionen wie Permalinks problemlos funktionieren.

Speichern Sie die Datei und führen Sie einen Konfigurationstest durch.

sudo nginx -t

Laden Sie Nginx neu, wenn der Test erfolgreich war.

sudo service nginx reload

Um zu überprüfen, ob dies funktioniert, können Sie die Apache-Protokolldateien in "+ / var / log / apache2 " überprüfen und die GET-Anforderungen für die " info.php " -Dateien von " test.io " und " foobar.net " anzeigen . Verwenden Sie den Befehl ` tail `, um die letzten Zeilen der Datei anzuzeigen, und verwenden Sie die Option ` -f +`, um die Datei auf Änderungen zu überprüfen.

sudo tail -f /var/log/apache2/other_vhosts_access.log

Besuchen Sie "+ http: // test.io / info.php +" in Ihrem Browser und sehen Sie sich dann die Ausgabe aus dem Protokoll an. Sie werden sehen, dass Apache tatsächlich antwortet:

- - [01/Jul/2016:18:18:34 -0400] "GET /info.php HTTP/1.0" 200 20414 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36"

Besuchen Sie dann die Seite "+ index.html" für jede Site, und Sie sehen keine Protokolleinträge von Apache. Nginx bedient sie.

Wenn Sie mit dem Betrachten der Protokolldatei fertig sind, drücken Sie "+ STRG + C +", um die Aufzeichnung zu beenden.

Die einzige Einschränkung für dieses Setup ist, dass Apache den Zugriff auf statische Dateien nicht einschränken kann. Die Zugriffssteuerung für statische Dateien muss in der virtuellen Nginx-Hostdatei "+ apache +" konfiguriert werden.

Fazit

Sie haben jetzt ein Ubuntu-Droplet mit Nginx, das "+ example.com " und " sample.org " bedient, sowie Apache, das " foobar.net " und " test.o +" bedient. Obwohl Nginx als Reverse-Proxy für Apache fungiert, ist der Proxy-Service von Nginx transparent, und Verbindungen zu Apaches Domänen werden offenbar direkt von Apache aus bereitgestellt. Mit dieser Methode können Sie sichere und statische Websites bereitstellen.