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 von
sudo
. 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 mit
mod_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 vonfastcgi
entsprechend. 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.
Ü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-enabled
erstellt.
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:
Ü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_server
macht 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-enabled
erstellen.
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.
[“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.
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_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 - Legt die Umgebungsvariable
HTTPS
basierend auf dem inX-Forwarded-Proto
enthaltenen Wert fest. -
RPAF_SetPort - Legt die Umgebungsvariable
SERVER_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 vonapache
wie 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
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 Port8080
auf 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-reset
wü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 Nginxapache
o, 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.php
hat, 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 Nginxapache
konfiguriert 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.