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

Der Autor hat die Electronic Frontier Foundation ausgewählt, um eine Spende im Rahmen der Write for zu erhalten DOnations program.

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.

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

In diesem Tutorial konfigurieren Sie Nginx sowohl als Webserver als auch als Reverse-Proxy für Apache - alles auf einem einzigen Server.

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 Sie ein Apache-Modul mit dem Namen "+ mod_rpaf +", das bestimmte Umgebungsvariablen umschreibt, sodass der Apache scheinbar Anfragen von Web-Clients direkt verarbeitet.

Wir werden vier Domainnamen auf einem Server 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. Wir werden Apache auch so konfigurieren, dass PHP-Anwendungen mit PHP-FPM bedient werden, was eine bessere Leistung als ` mod_php +` bietet.

Voraussetzungen

Um dieses Lernprogramm abzuschließen, benötigen Sie Folgendes:

  • Ein neuer Ubuntu 18.04-Server, der unter Initial Server Setup with Ubuntu 18.04 konfiguriert wurde. Root-Benutzer und eine Firewall.

  • Vier vollqualifizierte Domänennamen, die so konfiguriert sind, dass sie auf die IP-Adresse Ihres Servers 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.

Schritt 1 - Installation von Apache und PHP-FPM

Beginnen wir mit der Installation von Apache und PHP-FPM.

Zusätzlich zu Apache und PHP-FPM installieren wir das PHP-FastCGI-Apache-Modul + libapache2-mod-fastcgi +, um FastCGI-Webanwendungen zu unterstützen.

Aktualisieren Sie zunächst Ihre Paketliste, um sicherzustellen, dass Sie über die neuesten Pakete verfügen.

sudo apt update

Installieren Sie als Nächstes die Pakete Apache und PHP-FPM:

sudo apt install apache2 php-fpm

Das FastCGI-Apache-Modul ist im Ubuntu-Repository nicht verfügbar. Laden Sie es daher von https://kernel.org [kernel.org] herunter und installieren Sie es mit dem Befehl "+ dpkg +".

wget https://mirrors.edge.kernel.org/ubuntu/pool/multiverse/liba/libapache-mod-fastcgi/libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb
sudo dpkg -i libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb

Als nächstes ändern wir die Standardkonfiguration von Apache, um PHP-FPM zu verwenden.

Schritt 2 - Konfigurieren von Apache und PHP-FPM

In diesem Schritt ändern wir die Apache-Portnummer in "+ 8080 " und konfigurieren sie so, dass sie mit PHP-FPM unter Verwendung des Moduls " mod_fastcgi" funktioniert. Benennen Sie die Apache + ports.conf Konfigurationsdatei um:

sudo mv /etc/apache2/ports.conf /etc/apache2/ports.conf.default

Erstellen Sie eine neue Datei + ports.conf + mit dem Port + 8080 +:

echo "Listen " | sudo tee /etc/apache2/ports.conf

Als Nächstes erstellen wir eine virtuelle Hostdatei für Apache. Die Direktive "+ <VirtualHost> " in dieser Datei wird so eingestellt, dass Sites nur an Port " 8080 +" bedient werden.

Deaktivieren Sie den virtuellen Standardhost:

sudo a2dissite 000-default

Erstellen Sie dann eine neue virtuelle Hostdatei unter Verwendung der vorhandenen Standardsite:

sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/001-default.conf

Öffnen Sie nun die neue Konfigurationsdatei:

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

Ändern Sie den Abhörport auf "+ 8080 +":

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

<VirtualHost *:>
   ServerAdmin webmaster@localhost
   DocumentRoot /var/www/html
   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Speichern Sie die Datei und aktivieren Sie die neue Konfigurationsdatei:

sudo a2ensite 001-default

Dann lade 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 " auf " 8080 +" abhört:

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

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

Benennen Sie die vorhandene FastCGI-Konfigurationsdatei um:

sudo mv /etc/apache2/mods-enabled/fastcgi.conf /etc/apache2/mods-enabled/fastcgi.conf.default

Erstellen Sie eine neue Konfigurationsdatei:

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

Fügen Sie der Datei die folgenden Anweisungen hinzu, um Anforderungen für "+ .php +" - Dateien an den PHP-FPM-UNIX-Socket zu übergeben:

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

<IfModule mod_fastcgi.c>
 AddHandler fastcgi-script .fcgi
 FastCgiIpcDir /var/lib/apache2/fastcgi
 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.2-fpm.sock -pass-header Authorization
 <Directory /usr/lib/cgi-bin>
   Require all granted
 </Directory>
</IfModule>

Speichern Sie die Änderungen und führen Sie einen Konfigurationstest durch:

sudo apachectl -t

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

sudo systemctl reload apache2

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 'ServerName'-Direktive global, um diese Meldung zu unterdrücken. + `Sie können sie vorerst ignorieren. Wir werden die Servernamen später konfigurieren.

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

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

Stellen wir sicher, dass PHP funktioniert, indem Sie eine "+ phpinfo () +" - Datei erstellen und über einen Webbrowser darauf zugreifen.

Erstellen Sie die Datei "+ / var / www / html / info.php", die einen Aufruf der Funktion "+ phpinfo" enthält:

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. Es wird eine Ausgabe ähnlich der folgenden angezeigt:

Ü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 Dokumentstammverzeichnisse:

sudo mkdir -v /var/www/ /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

Dann erstellen Sie eine "+ phpinfo () +" - Datei für jede Site, 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/foobar.net.conf

Fügen Sie der Datei den folgenden Code hinzu, um den Host zu definieren:

/etc/apache2/sites-available/foobar.net.conf

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

Die Zeile + AllowOverride All + aktiviert die Unterstützung von + .htaccess +.

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 +". Erstellen Sie zuerst die Datei:

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

Fügen Sie dann die Konfiguration zur Datei hinzu:

/etc/apache2/sites-available/test.io.conf

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

Speichern Sie die Datei und beenden Sie den Editor.

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

sudo a2ensite
sudo a2ensite

Überprüfen Sie Apache erneut auf Konfigurationsfehler:

sudo apachectl -t

Wenn keine Fehler vorliegen, wird * Syntax OK * angezeigt. Wenn Sie etwas anderes sehen, überprüfen Sie die Konfiguration und versuchen Sie es erneut.

Laden Sie Apache neu, um die Änderungen zu übernehmen, sobald Ihre Konfiguration fehlerfrei ist:

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 sehen die folgenden Ergebnisse:

Stellen Sie außerdem sicher, dass 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.

Auf jeder Site sehen Sie dieselbe Liste der PHP-Konfigurationsspezifikationen wie in Schritt 4.

Wir haben jetzt zwei auf Apache gehostete Websites in Port "+ 8080 +". Lassen Sie uns als nächstes Nginx konfigurieren.

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-install-nginx-on-ubuntu-18-04#step-5-%E2% 80% 93-setup-server-blocks- (empfohlen) [So richten Sie Nginx-Serverblöcke (virtuelle Hosts) unter Ubuntu 18.04 ein].

Installieren Sie Nginx mit dem Paketmanager:

sudo apt install nginx

Entfernen Sie dann den Symlink des virtuellen Standardhosts, da wir ihn nicht mehr verwenden:

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

Wir erstellen unseren eigenen Standard-Site-Brief (+ example.com +).

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/ /usr/share/nginx/

Wir behalten die Nginx-Websites in "+ / usr / share / nginx ", wo Nginx sie standardmäßig haben möchte. Sie könnten sie unter " / var / www / html" mit den Apache-Sites einfügen, aber diese Trennung kann Ihnen helfen, Sites mit Nginx zu verknüpfen.

Erstellen Sie wie bei den virtuellen Apache-Hosts die Dateien "+ index" und "+ phpinfo () +", um sie nach Abschluss des Setups zu 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.

/etc/nginx/sites-available/example.com

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.2-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/

Fügen Sie der Datei Folgendes hinzu:

/etc/nginx/sites-available/sample.org

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.2-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/

Testen Sie anschließend die Nginx-Konfiguration, um sicherzustellen, dass keine Konfigurationsprobleme vorliegen:

sudo nginx -t

Laden Sie dann Nginx neu, wenn keine Fehler vorliegen:

sudo systemctl reload nginx

Greifen Sie jetzt auf die Datei "+ phpinfo () +" Ihrer virtuellen Nginx-Hosts in einem Webbrowser zu, indem Sie http://example.com/info.php und http://sample.org/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, um Anforderungen an Apache weiterzuleiten:

sudo nano /etc/nginx/sites-available/

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

/ etc / nginx / sites-available / apache

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

Testen Sie die Konfiguration, um sicherzustellen, dass keine Fehler vorliegen:

sudo nginx -t

Wenn es keine Fehler gibt, lade Nginx neu:

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 * HTTP_X_REAL_IP * und * HTTP_X_FORWARDED_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 Sie 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 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

Extrahieren Sie die heruntergeladene Datei:

unzip stable.zip

Wechseln Sie in das neue Verzeichnis mit den Dateien:

cd mod_rpaf-stable

Kompilieren und installieren Sie das Modul:

make
sudo make install

Als nächstes 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 den folgenden Code hinzu, um das Modul zu laden:

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

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

Speichern Sie die Datei und beenden Sie den Editor.

Erstellen Sie in diesem Verzeichnis eine weitere Datei mit dem Namen "+ rpaf.conf ", die die Konfigurationsanweisungen für " mod_rpaf +" enthält:

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

Fügen Sie den folgenden Codeblock hinzu, um "+ mod_rpaf +" zu konfigurieren, und geben Sie dabei die IP-Adresse Ihres Servers an:

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

   <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, sodass "+ 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 keine Fehler vorliegen:

sudo systemctl reload apache2

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

Richten wir nun die TLS / SSL-Verschlüsselung für jede Site ein.

Schritt 9 - Einrichten von HTTPS-Websites mit Let’s Encrypt (optional)

In diesem Schritt konfigurieren wir TLS / SSL-Zertifikate für beide auf Apache gehosteten Domänen. Wir erhalten die Zertifikate über [Let’s Encrypt] (https://letsencrypt.org). 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.

Zuerst werden wir die "+ server {…​} " - Blöcke beider Domänen trennen, so dass jede von ihnen ihre eigenen SSL-Zertifikate haben kann. Öffnen Sie die Datei " / etc / nginx / sites-available / apache +" in Ihrem Editor:

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

Ändern Sie die Datei so, dass sie wie folgt aussieht: "+ foobar.net " und " test.io " in ihren eigenen " server +" -Blöcken:

/ etc / nginx / sites-available / apache

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

Wir verwenden https://certbot.eff.org [Certbot], um unsere TLS / SSL-Zertifikate zu generieren. Das Nginx-Plugin sorgt dafür, dass Nginx neu konfiguriert und die Konfiguration bei Bedarf neu geladen wird.

Fügen Sie zunächst das offizielle Certbot-Repository hinzu:

sudo add-apt-repository ppa:certbot/certbot

Drücken Sie "+ ENTER", wenn Sie aufgefordert werden, das Hinzufügen des neuen Repositorys zu bestätigen. Aktualisieren Sie anschließend die Paketliste, um die Paketinformationen des neuen Repositorys abzurufen:

sudo apt update

Installieren Sie dann das Nginx-Paket von Certbot mit "+ apt +":

sudo apt install python-certbot-nginx

Verwenden Sie nach der Installation den Befehl "+ certbot ", um die Zertifikate für " foobar.net " und " www.foobar.net +" zu generieren:

sudo certbot --nginx -d  -d

Dieser Befehl weist Certbot an, das Plugin "+ nginx " zu verwenden und mit " -d +" die Namen anzugeben, für die das Zertifikat gültig sein soll.

Wenn Sie + certbot + zum ersten Mal ausführen, werden Sie aufgefordert, eine E-Mail-Adresse einzugeben und den Nutzungsbedingungen zuzustimmen. Anschließend kommuniziert + certbot + mit dem Let’s Encrypt-Server und führt eine Abfrage durch, um zu überprüfen, ob Sie die Domäne steuern, für die Sie ein Zertifikat anfordern.

Als Nächstes fragt Certbot, wie Sie Ihre HTTPS-Einstellungen konfigurieren möchten:

OutputPlease choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

Wählen Sie Ihre Wahl und drücken Sie dann + ENTER. Die Konfiguration wird aktualisiert und Nginx wird neu geladen, um die neuen Einstellungen zu übernehmen.

Führen Sie nun den Befehl für die zweite Domain aus:

sudo certbot --nginx -d  -d

Greifen Sie mit dem Präfix "+ https: // " auf eine der Apache-Domänen in Ihrem Browser zu. Besuchen Sie " 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.

Deaktivieren wir nun den direkten Zugriff auf Apache.

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

Jetzt konfigurieren wir Nginx so, dass statische Dateien für die Apache-Sites bereitgestellt werden.

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 die Datei "+ / etc / nginx / sites-available / apache +" in Ihrem Editor:

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

Sie müssen jedem Serverblock zwei zusätzliche "+ location " - Blöcke hinzufügen und die vorhandenen " location +" - Abschnitte ändern. Außerdem müssen Sie Nginx mitteilen, wo sich die statischen Dateien für jede Site befinden.

Wenn Sie sich gegen die Verwendung von SSL- und TLS-Zertifikaten entschieden haben, ändern Sie Ihre Datei folgendermaßen:

/ etc / nginx / sites-available / apache

server {
   listen 80;
   server_name ;
   root /var/www/;
   index index.php index.htm index.html;

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

   location ~ \.php$ {
       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;
   }

   location ~ /\.ht {
       deny all;
   }
}

server {
   listen 80;
   server_name ;
   root /var/www/;
   index index.php index.htm index.html;

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

   location ~ \.php$ {
       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;
   }

   location ~ /\.ht {
       deny all;
   }
}

Wenn HTTPS auch verfügbar sein soll, verwenden Sie stattdessen die folgende Konfiguration:

/ etc / nginx / sites-available / apache

server {
   listen 80;
   server_name ;
   root /var/www/;
   index index.php index.htm index.html;

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

   location ~ \.php$ {
       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;
   }

   location ~ /\.ht {
       deny all;
   }

   listen 443 ssl;
   ssl_certificate /etc/letsencrypt/live//fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live//privkey.pem;
   include /etc/letsencrypt/options-ssl-nginx.conf;
   ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
   listen 80;
   server_name ;
   root /var/www/;
   index index.php index.htm index.html;

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

   location ~ \.php$ {
       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;
   }

   location ~ /\.ht {
       deny all;
   }

   listen 443 ssl;
   ssl_certificate /etc/letsencrypt/live//fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live//privkey.pem;
   include /etc/letsencrypt/options-ssl-nginx.conf;
   ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

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 die Dinge funktionieren, können Sie die Apache-Protokolldateien in "+ / var / log / apache2 " untersuchen und die " GET " -Anforderungen für die " info.php " -Dateien von " test.io " und " foobar" anzeigen .net + . 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 nun in Ihrem Browser "+ http: // test.io / info.php +" und sehen Sie sich die Ausgabe aus dem Protokoll an. Sie werden sehen, dass Apache tatsächlich antwortet:

Output     - - [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.

Mit diesem Setup kann Apache den Zugriff auf statische Dateien nicht einschränken. Die Zugriffssteuerung für statische Dateien müsste in der virtuellen Nginx-Hostdatei "+ apache +" konfiguriert werden. Dies würde jedoch den Rahmen dieses Lernprogramms sprengen.

Fazit

Sie haben jetzt einen Ubuntu-Server mit Nginx, der "+ example.com " und " sample.org " bedient, sowie Apache, der " 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.