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

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 wie81 oder8080 für den zweiten Webserver ist eine andere Lösung, aber das Teilen von URLs mit Portnummern (wiehttp://example.com:81) ist nicht immer sinnvoll 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 sicherzustellen, installieren wir ein Apache-Modul mit dem Namenmod_rpaf, das bestimmte Umgebungsvariablen neu schreibt, sodass Apache anscheinend Anforderungen von Webclients direkt verarbeitet.

Wir werden vier Domainnamen auf einem Droplet hosten. Zwei werden von Nginx bereitgestellt:example.com (der virtuelle Standardhost) undsample.org. Die verbleibenden zwei,foobar.net undtest.io, werden von Apache bedient.

Voraussetzungen

  • Ein neues Ubuntu 14.04 Droplet.

  • Ein Standardbenutzerkonto mit den Berechtigungen vonsudo. Sie können ein Standardkonto einrichten, indem Sie die Schritte 2 und 3 derInitial Server Setup with Ubuntu 14.04ausführen.

  • Die gewünschten Domainnamen sollten auf die IP-Adresse Ihres Droplets in der DigitalOcean-Systemsteuerung verweisen. In Schritt 3 vonHow To Set Up a Host Name with DigitalOcean finden Sie ein Beispiel dafür. Wenn Sie das DNS Ihrer Domains an anderer Stelle hosten, sollten Sie stattdessen dort geeigneteA recordserstellen.

Optionale Referenzen

Für dieses Lernprogramm sind Grundkenntnisse über virtuelle Hosts in Apache und Nginx sowie die Erstellung und Konfiguration von SSL-Zertifikaten erforderlich. Weitere Informationen zu diesen Themen finden Sie in den folgenden Artikeln.

[[Schritt 1 - Installation von Apache und PHP5-Fpm]] == Schritt 1 - Installation von Apache und PHP5-FPM

Zusätzlich zu Apache und PHP-FPM müssen wir auch das PHP FastCGI Apache-Modul installieren. Dies istlibapache2-mod-fastcgi, verfügbar immultiverse-Repository von Ubuntu, das zuerst in dersources.list-Datei aktiviert werden muss.

sudo nano /etc/apt/sources.list

Suchen Sie die folgenden Zeilen und kommentieren Sie sie aus, indem Sie das Hash-Symbol (#) am Anfang entfernen.

# deb http://mirrors.digitalocean.com/ubuntu trusty multiverse

 . . .

# deb http://mirrors.digitalocean.com/ubuntu trusty-updates multiverse

Damit sollten Sie die folgenden Informationen erhalten.

 deb http://mirrors.digitalocean.com/ubuntu trusty multiverse

 . . .

 deb http://mirrors.digitalocean.com/ubuntu trusty-updates multiverse

Speichern Sie die Datei und aktualisieren Sie das Apt-Repository.

sudo apt-get update

Installieren Sie dann die erforderlichen Pakete.

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

[[Schritt-2 - Konfigurieren von Apache und PHP5-Fpm]] == Schritt 2 - Konfigurieren von Apache und PHP5-FPM

In diesem Schritt ändern wir die Portnummer von Apache in8080 und konfigurieren sie für die Verwendung mit PHP5-FPM mithilfe des Modulsmod_fastcgi. 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 8080

Speichern und beenden Sieports.conf.

Note: Webserver sind im Allgemeinen so eingestellt, dass sie127.0.0.1:8080 abhören, wenn sie einen Reverse-Proxy konfigurieren. Dies würde jedoch den Wert der PHP-UmgebungsvariablenSERVER_ADDR auf die Loopback-IP-Adresse anstelle der öffentlichen IP des Servers setzen . Unser Ziel ist es, Apache so einzurichten, dass seine Websites keinen Reverse-Proxy vor sich sehen. Wir werden es also so konfigurieren, dass alle IP-Adressen auf8080 abgehört werden.

Als Nächstes bearbeiten wir die standardmäßige virtuelle Hostdatei von Apache. Die Direktive<VirtualHost> in dieser Datei ist so eingestellt, dass Sites nur auf Port80 bedient werden.

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

Die erste Zeile sollte sein:

Ändern Sie es in:

Speichern Sie die Datei und laden Sie Apache neu.

sudo service apache2 reload

Stellen Sie sicher, dass Apache jetzt8080 abhört.

sudo netstat -tlpn

Die Ausgabe sollte wie folgt aussehen, wobeiapache2:::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 :::8080           :::*                 LISTEN   4678/apache2
tcp6       0      0 :::22             :::*                 LISTEN   1086/sshd

[[Schritt-3 - Konfigurieren von Apache zur Verwendung von mod_fastcgi]] == Schritt 3 - Konfigurieren von Apache zur Verwendung von mod_fastcgi

Apache arbeitet standardmäßig mitmod_php, erfordert jedoch zusätzliche Konfiguration, um mit PHP5-FPM zu arbeiten.

Note: Wenn Sie dieses Tutorial für eine vorhandene Installation von LAMP mitmod_php versuchen, deaktivieren Sie es zuerst mit:

sudo a2dismod php5

Wir werden einen Konfigurationsblock fürmod_fastcgi hinzufügen, der vonmod_action abhängt. mod-action ist standardmäßig deaktiviert, daher müssen wir es zuerst aktivieren.

sudo a2enmod actions

Finden Sie heraus, welche Version von Apache auf Ihrem Droplet installiert ist:

sudo apache2 -v

Bearbeiten Sie die Konfigurationsdatei vonfastcgientsprechend. Diese Konfigurationsanweisungen übergeben Anforderungen für.php-Dateien an den PHP5-FPM-UNIX-Socket.

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

Fügen Sie die folgenden Zeilen am unteren Rand des<IfModule mod_fastcgi.c> . . . </IfModule>-Blocks fürApache 2.4 hinzu:

 AddType application/x-httpd-fastphp5 .php
 Action application/x-httpd-fastphp5 /php5-fcgi
 Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
 FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization
 
  Require all granted
 

Apache 2.2 benötigt den Abschnitt<Directory> nicht. Fügen Sie daher Folgendes hinzu:

 AddType application/x-httpd-fastphp5 .php
 Action application/x-httpd-fastphp5 /php5-fcgi
 Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
 FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization

Wenn Sie infastcgi.conf fertig sind, führen Sie einen Konfigurationstest durch.

sudo apachectl -t

Laden Sie Apache neu, wennSyntax OK angezeigt wird. Wenn Sie die WarnungCould not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message. sehen, ist das in Ordnung. Es betrifft uns jetzt nicht.

sudo service apache2 reload

[[Schritt 4 - Überprüfung der PHP-Funktionalität]] == Schritt 4 - Überprüfung der PHP-Funktionalität

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

echo "" | sudo tee /var/www/html/info.php

Um die Datei in einem Browser anzuzeigen, gehen Sie zuhttp://111.111.111.111:8080/info.php, verwenden Sie jedoch die IP-Adresse Ihres Droplets. Dadurch erhalten Sie eine Liste der von PHP verwendeten Konfigurationsspezifikationen.

phpinfo Server API

phpinfo PHP Variables

Überprüfen Sie oben auf der Seite, obServer APIFPM/FastCGI sagt. Ungefähr zwei Drittel des Seitenabschnitts zeigt Ihnen der AbschnittPHP Variables, dassSERVER_SOFTWARE unter Ubuntu Apache ist. Diese bestätigen, dassmod_fastcgi aktiv ist und Apache PHP5-FPM zur Verarbeitung von PHP-Dateien verwendet.

[[Schritt 5 - Erstellen virtueller Hosts für Apache] == Schritt 5 - Erstellen virtueller Hosts für Apache

Wir werden zwei virtuelle Apache-Hostdateien für die Domänenfoobar.net undtest.io erstellen. Dies beginnt mit dem Erstellen vondocument root-Verzeichnissen für beide Sites.

sudo mkdir -v /var/www/{foobar.net,test.io}

Jetzt fügen wir jedem Verzeichnis zwei Dateien zum Testen hinzu, nachdem das Setup abgeschlossen ist.

Zuerst erstellen wir für jede Site eineindex-Datei.

echo "

Foo Bar

" | sudo tee /var/www/foobar.net/index.html
echo "

Test IO

" | sudo tee /var/www/test.io/index.html

Dann einephpinfo()-Datei.

echo "" | sudo tee /var/www/foobar.net/info.php
echo "" | sudo tee /var/www/test.io/info.php

Erstellen Sie die virtuelle Hostdatei für die Domänefoobar.net.

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

Fügen Sie die folgende Anweisung ein:


    ServerName foobar.net
    ServerAlias www.foobar.net
    DocumentRoot /var/www/foobar.net
    
        AllowOverride All
    

Speichern und schließen Sie die Datei. Machen Sie dasselbe fürtest.io.

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

    ServerName test.io
    ServerAlias www.test.io
    DocumentRoot /var/www/test.io
    
        AllowOverride All
    

Note 1:AllowOverride All aktiviert die Unterstützung von.htaccess.

Note 2: Dies sind nur die grundlegendsten Anweisungen. Eine vollständige Anleitung zum Einrichten virtueller Hosts in Apache finden Sie unterHow To Set Up Apache Virtual Hosts on Ubuntu 14.04 LTS.

Nachdem beide virtuellen Apache-Hosts eingerichtet sind, aktivieren Sie die Sites mit dem Befehla2ensite. Dadurch wird eine symbolische Verknüpfung zur virtuellen Hostdatei im Verzeichnissites-enablederstellt.

sudo a2ensite foobar.net
sudo a2ensite test.io

Überprüfen Sie Apache erneut auf Konfigurationsfehler.

sudo apachectl -t

Laden Sie es neu, wennSyntax OK angezeigt wird.

sudo service apache2 reload

Um zu bestätigen, dass die Websites funktionieren, öffnen Siehttp://foobar.net:8080 undhttp://test.io:8080 in Ihrem Browser und überprüfen Sie, ob dieindex.html-Dateien angezeigt werden.

Das solltest du sehen:

foobar.net index page

test.io index page

Überprüfen Sie außerdem, ob PHP funktioniert, indem Sie auf die Dateieninfo.php zugreifen:http://foobar.net:8080/info.php undhttp://test.io:8080/info.php.

Sie sollten auf jeder Site dieselbe PHP-Konfigurationsspezifikationsliste sehen, die Sie in Schritt 1 gesehen haben. Wir haben jetzt zwei Websites, die auf Apache unter Port8080 gehostet werden.

[[Schritt 6 - Installieren und Konfigurieren von Nginx]] == Schritt 6 - Installieren und Konfigurieren von Nginx

In diesem Schritt installieren wir Nginx und konfigurieren die Domänenexample.com undsample.org als virtuelle Hosts von Nginx. Eine vollständige Anleitung zum Einrichten virtueller Hosts in Nginx finden Sie unterHow To Set Up Nginx Server Blocks (Virtual Hosts) on Ubuntu 14.04 LTS.

Installieren Sie Nginx.

sudo apt-get install nginx

Entfernen Sie dann den Symlink des virtuellen Standardhosts.

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

Jetzt erstellen wir virtuelle Hosts für Nginx. Erstellen Sie zuerstdocument root Verzeichnisse für beide Websites:

sudo mkdir -v /usr/share/nginx/{example.com,sample.org}

Wie bei den virtuellen Hosts von Apache erstellen wir nach Abschluss des Setups erneutindex undphpinfo() Dateien zum Testen.

echo "

Example.com

" | sudo tee /usr/share/nginx/example.com/index.html
echo "

Sample.org

" | sudo tee /usr/share/nginx/sample.org/index.html
echo "" | sudo tee /usr/share/nginx/example.com/info.php
echo "" | sudo tee /usr/share/nginx/sample.org/info.php

Erstellen Sie nun eine virtuelle Hostdatei für die Domäneexample.com.

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

Nginx ruftserver {. . .} Bereiche einer Konfigurationsdateiserver blocks auf. Erstellen Sie einen Serverblock für den primären virtuellen Hostexample.com. Die Konfigurationsanweisungdefault_servermacht dies zum virtuellen Standardhost, der HTTP-Anforderungen verarbeitet, die keinem anderen virtuellen Host entsprechen.

Fügen Sie fürexample.com Folgendes in die Datei ein:

server {
    listen 80 default_server;

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

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

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

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/sample.org

Der Serverblock fürsample.org sollte folgendermaßen aussehen:

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

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

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

Speichern und schließen Sie die Datei. Aktivieren Sie dann beide Sites, indem Sie symbolische Links zum Verzeichnissites-enablederstellen.

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
sudo ln -s /etc/nginx/sites-available/sample.org /etc/nginx/sites-enabled/sample.org

Führen Sie einen Nginx-Konfigurationstest durch:

sudo service nginx configtest

Laden Sie dann Nginx neu, wennOK angezeigt wird.

sudo service nginx reload

Greifen Sie jetzt auf diephpinfo()-Datei Ihrer virtuellen Nginx-Hosts in einem Webbrowser umhttp://example.com/info.php undhttp://sample.org/info.php zu. Schauen Sie noch einmal unter den AbschnittPHP Variables.

Nginx PHP Variables

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

Zu diesem Zeitpunkt haben wir Nginx installiert und zwei virtuelle Hosts erstellt. Als Nächstes richten wir einen zusätzlichen virtuellen Host für Proxy-Anforderungen für auf Apache gehostete Domänen ein.

[[Schritt-7 - Konfigurieren von Nginx für Apache-39-s-virtuelle Hosts]] == Schritt 7 - Konfigurieren von Nginx für die virtuellen Hosts von Apache

In diesem Abschnitt erstellen wir einen zusätzlichen virtuellen Nginx-Host mit mehreren Domänennamen in den Direktiven vonserver_name. 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 inproxy_pass zu verwenden.

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

    location / {
        proxy_pass http://111.111.111.111: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 service nginx configtest

Laden Sie Nginx neu, wennOK angezeigt wird.

sudo service nginx reload

Öffnen Sie den Browser und greifen Sie aufhttp://foobar.net/info.php unter einem der Apache-Domainnamen zu. Scrollen Sie zum AbschnittPHP Variables und überprüfen Sie die angezeigten Werte.

phpinfo of Apache via Nginx

Die VariablenSERVER_SOFTWARE undDOCUMENT_ROOT sollten bestätigen, dass diese Anforderung von Apache verarbeitet wurde. Die VariablenHTTP_X_REAL_IP undHTTP_X_FORWARDED_FOR wurden von Nginx hinzugefügt und sollten die öffentliche IP-Adresse des Computers anzeigen, von dem aus Sie in Ihrem Browser auf die URL zugreifen.

Wir haben Nginx erfolgreich für Proxy-Anfragen für bestimmte Domains an Apache eingerichtet. Der nächste Schritt besteht darin, Apache so zu konfigurieren, dass die VariablenREMOTE_ADDR so festgelegt werden, als würden diese Anforderungen direkt verarbeitet.

[[Schritt-8 -—- Installieren und Konfigurieren von mod_rpaf]] == Schritt 8 - Installieren und Konfigurieren von mod_rpaf

In diesem Schritt installieren wir ein Apache-Modul mit dem Namenmod_rpaf, das die Werte vonREMOTE_ADDR,HTTPS undHTTP_PORT basierend auf den von einem Reverse-Proxy bereitgestellten Werten neu schreibt. Ohne dieses Modul würden einige PHP-Anwendungen Codeänderungen erfordern, um nahtlos hinter einem Proxy zu funktionieren. Dieses Modul ist im Ubuntu-Repository alslibapache2-mod-rpaf vorhanden, jedoch veraltet und unterstützt bestimmte Konfigurationsanweisungen nicht. Stattdessen installieren wir es von der Quelle.

Installieren Sie die zum Kompilieren und Erstellen des Moduls erforderlichen Pakete:

sudo apt-get install unzip build-essential apache2-threaded-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.

sudo make
sudo make install

Erstellen Sie eine Datei im Verzeichnismods-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.


        RPAF_Enable             On
        RPAF_Header             X-Real-Ip
        RPAF_ProxyIPs           111.111.111.111
        RPAF_SetHostName        On
        RPAF_SetHTTPS           On
        RPAF_SetPort            On

Hier finden Sie eine kurze Beschreibung der einzelnen Richtlinien. Weitere Informationen finden Sie in der Dateimod_rpafREADME.

  • 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 - Legt die UmgebungsvariableHTTPS basierend auf dem inX-Forwarded-Proto enthaltenen Wert fest.

  • RPAF_SetPort - Legt die UmgebungsvariableSERVER_PORT fest. Nützlich, wenn sich Apache hinter einem SSL-Proxy befindet.

Speichern Sierpaf.conf und aktivieren Sie das Modul.

sudo a2enmod rpaf

Dadurch werden symbolische Verknüpfungen der Dateienrpaf.load undrpaf.conf im Verzeichnismods-enabled erstellt. Führen Sie nun einen Konfigurationstest durch.

sudo apachectl -t

Laden Sie Apache neu, wennSyntax OK zurückgegeben wird.

sudo service apache2 reload

Greifen Sie in Ihrem Browser auf einephpinfo()-Seite der Apache-Websites zu und überprüfen Sie den AbschnittPHP Variables. Die VariableREMOTE_ADDRist jetzt auch die der öffentlichen IP-Adresse Ihres lokalen Computers.

[[Schritt-9 -—- Einrichten von https-Websites-optional]] == 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 Modulmod_rpaf stellt sicher, dass die erforderlichen Umgebungsvariablen in Apache festgelegt 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ürfoobar.net undtest.io.

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

Jedes Mal werden Sie aufgefordert, Details zur Zertifikatsidentifikation einzugeben.

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

Öffnen Sie nun die virtuelle Hostdatei vonapache, 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, müssen wir für jede Domain separateserver { . . . }-Blöcke haben. Sie sollten den aktuellen Inhalt löschen. Wenn Sie fertig sind, sollte die vhost-Datei vonapachewie folgt aussehen.

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

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

    location / {
        proxy_pass http://111.111.111.111: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 foobar.net www.foobar.net;

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

    location / {
        proxy_pass http://111.111.111.111: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 führen Sie einen Konfigurationstest durch.

sudo service nginx configtest

Laden Sie Nginx neu, wenn der Test erfolgreich war.

sudo service nginx reload

Greifen Sie über den Browser mit dem Präfixhttps://auf eine der Domänen von Apache zu:https://foobar.net/info.php

phpinfo ssl

Schauen Sie in den AbschnittPHP Variables. Die VariableSERVER_PORT wurde auf443 undHTTPS aufon 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]] == Schritt 10 - Blockieren des direkten Zugriffs auf Apache (optional)

Da Apache Port8080 auf der öffentlichen IP-Adresse abhört, ist jeder für ihn zugänglich. 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 111.111.111.111 -j REJECT --reject-with tcp-reset

Stellen Sie sicher, dass Sie die IP-Adresse Ihres Droplets anstelle des roten Beispiels verwenden. Sobald Port8080 in Ihrer Firewall blockiert ist, testen Sie, ob Apache darauf nicht erreichbar ist. Öffnen Sie Ihren Webbrowser und versuchen Sie, über Port8080auf einen der Domain-Namen von Apache zuzugreifen. Zum Beispiel:http://example.com:8080

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

Die IPtables-Regeln vonNote:überleben einen Systemneustart standardmäßig nicht. Es gibt mehrere Möglichkeiten, IPtables-Regeln beizubehalten. Am einfachsten ist es jedoch,iptables-persistent im Ubuntu-Repository zu verwenden.

[[Schritt 11 - Bereitstellen statischer Dateien mit nginx-optional]] == Schritt 11 - Bereitstellen statischer Dateien mit Nginx (optional)

Wenn Nginx-Proxys Anfragen nach Apache-Domains stellen, werden alle Dateianfragen an die Domain an Apache gesendet. Nginx ist schneller als Apache, wenn es darum geht, statische Dateien wie Bilder, JavaScript und Stylesheets bereitzustellen. In diesem Abschnitt konfigurieren wir die virtuelle Hostdatei von Nginxapacheo, dass sie statische Dateien direkt bereitstellt und nur PHP-Anforderungen an Apache sendet.

Öffnen Sie die virtuelle Hostdatei vonapache.

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

Fügen Sie jedem Serverblock zwei zusätzlichelocation-Blöcke hinzu, wie im folgenden Codeblock rot dargestellt.

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

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

    location ~ \.php$ {
        proxy_pass http://111.111.111.111: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 ~ /\. {
     deny all;
    }
}

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

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

    location ~ \.php$ {
        proxy_pass http://111.111.111.111: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 ~ /\. {
     deny all;
    }
}

Die Direktivetry_files veranlasst Nginx, nach Dateien indocument root zu suchen und diese direkt bereitzustellen. Wenn die Datei die Erweiterung.phphat, wird die Anforderung an Apache übergeben. Auch wenn die Datei nicht indocument root gefunden wird, wird die Anforderung an Apache weitergeleitet, sodass Anwendungsfunktionen wie Permalinks problemlos funktionieren.

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

sudo service nginx configtest

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 untersuchen und die GET-Anforderungen für dieindex.php-Dateien vontest.io undfoobar.net anzeigen. Die einzige Einschränkung dieses Setups ist, dass Apache den Zugriff auf statische Dateien nicht einschränken kann. Die Zugriffssteuerung für statische Dateien müsste in der virtuellen Hostdatei von Nginxapachekonfiguriert werden.

Warning: Die Richtlinielocation ~ /\. ist sehr wichtig. Dies verhindert, dass Nginx den Inhalt von Dateien wie.htaccess und.htpasswd druckt.

Fazit

Nachdem Sie dieses Tutorial abgeschlossen haben, sollten Sie nun ein Ubuntu-Droplet mit Nginx haben, dasexample.com undsample.org liefert, zusammen mit Apache, dasfoobar.net undtest.io 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.