So installieren Sie nginx als Reverse Proxy für Apache unter Ubuntu 16.04 LTS

Dieses Tutorial zeigt, wie Sie nginx als Reverse-Proxy vor einem Apache2-Webserver auf Ubuntu 16.04 einrichten können. nginx (ausgesprochen „engine x“) ist ein kostenloser, quelloffener, leistungsstarker HTTP-Server. nginx ist bekannt für seine Stabilität, seinen umfangreichen Funktionsumfang, seine einfache Konfiguration und seinen geringen Ressourcenverbrauch.

1 Vorbemerkung

In diesem Tutorial verwende ich den Hostnamen server1.example.com mit der IP-Adresse 192.168.1.100. Diese Einstellungen können für Sie unterschiedlich sein, so dass Sie sie gegebenenfalls ersetzen müssen.

Ich gehe davon aus, dass Sie einen vorhandenen Apache-Vhost haben (ich werde den Apache-Standard-Vhost in diesem Tutorial verwenden), der auf Port 80 auf der IP-Adresse 192.168.1.100 lauscht, den Sie über nginx proxyen möchten. Ich werde das Ubuntu LAMP-Tutorial als Grundlage verwenden. Bitte beachten Sie, dass dieses Tutorial nur http und nicht https (SSL) behandelt.

2 Apache konfigurieren

Das erste, was wir tun müssen, ist, unseren Apache vhost so zu konfigurieren, dass er auf localhost (127.0.0.0.1) auf einem anderen unbenutzten Port als 80 (z.B. 8000) lauscht. Öffnen Sie /etc/apache2/ports.conf……

nano /etc/apache2/ports.conf

…. und ändern Sie die Zeilen NameVirtualHost und Listen für Port 80, um Port 8000 zu verwenden:

# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf
Listen 8000

<IfModule ssl_module>
Listen 443
</IfModule>

<IfModule mod_gnutls.c>
Listen 443
</IfModule>

Öffnen Sie nun die vhost-Konfigurationsdatei (z.B. /etc/apache2/sites-available/000-default.conf)…..

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

…. und ändern Sie die Zeile <VirtualHost>, um die IP-Adresse 127.0.0.0.0.1 und den Port 8000 zu verwenden:

<VirtualHost 127.0.0.1:8000>
[...]

Wir werden nginx als transparenten Proxy konfigurieren, d.h. es wird die IP-Adresse des ursprünglichen Benutzers in einem Feld namens X-Forwarded-For an den Backend-Apache übergeben. Natürlich sollte der Backend-Apache die IP-Adresse des ursprünglichen Benutzers in seinen Zugriffsprotokollen anstelle der IP-Adresse von nginx (127.0.0.0.1) protokollieren. Es gibt zwei Möglichkeiten, dies zu erreichen:

1) Wir können die LogFormat-Zeile in /etc/apache2/apache2.conf ändern und %h durch %{X-Forwarded-For}i ersetzen:

nano /etc/apache2/apache2.conf
[...]
#LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
[...]

2) Unter Debian/Ubuntu können wir das Apache-Modul libapache2-mod-rpaf installieren, das sich um die Protokollierung der richtigen IP-Adresse kümmert:

apt-get -y install libapache2-mod-rpaf

Nach all diesen Änderungen starten Sie den Apache neu:

service apache2 restart

3 Konfigurieren von nginx

Wenn nginx noch nicht installiert ist, installieren Sie es wie folgt:

apt-get -y install nginx

Erstellen Sie seine Systemstartup-Links und stellen Sie sicher, dass sie gestartet sind:

systemctl enable nginx.service
service nginx restart

Es sollte nun auf Port 80 lauschen.

Einige Standard-Proxy-Parameter befinden sich in der Datei /etc/nginx/proxy_params:

nano /etc/nginx/proxy_params
proxy_set_header Host $http_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;

Da wir diese Datei später in den Proxy-Teil unseres nginx vhost z.B..com aufnehmen werden, möchten Sie vielleicht weitere Proxy-Direktiven zu dieser Datei hinzufügen, wenn Sie möchten, z.B. wie folgt:

proxy_set_header Host $http_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;

client_max_body_size 100M;
client_body_buffer_size 1m;
proxy_intercept_errors on;
proxy_buffering on;
proxy_buffer_size 128k;
proxy_buffers 256 16k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_max_temp_file_size 0;
proxy_read_timeout 300;

Ändern Sie nun den Standard-Vhost für nginx – stellen Sie sicher, dass er den gleichen Dokumentenstamm wie der Apache vhost z.B..com verwendet (z.B. /var/www/html), so dass nginx statische Dateien direkt liefern kann, ohne die Anforderung an den Apache weiterzugeben:

nano /etc/nginx/sites-available/default
server {
     listen 80 default_server;
     listen [::]:80 default_server;
root /var/www/html;

# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;

server_name _;

location / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
}
}

Dies ist eine sehr einfache Konfiguration, die alle Anfragen an den Apache proxyen würde.

Laden Sie nginx neu, damit die Änderungen wirksam werden:

service nginx reload

Sie können nun den Hostnamen des Servers oder die IP 192.168.1.100 in Ihren Browser eingeben, und Sie sollten die Standardwebsite des Apache sehen, aber diesmal über nginx.

Die Apache-Standardseite - wird von nginx bereitgestellt.

Wie ich bereits sagte, ist dies eine sehr einfache Konfiguration, die alle Anfragen an den Apache proxiert. Da nginx aber viel schneller statische Dateien (wie JavaScript, CSS, Bilder, PDF-Dateien, statische HTML-Dateien usw.) liefert als Apache, ist es eine gute Idee, nginx diese Dateien direkt bedienen zu lassen. Dies kann durch Hinzufügen eines neuen Speicherorts für diese Dateien erfolgen, z.B. wie folgt:

server {
       listen 80 default_server;
       listen [::]:80 default_server;
root /var/www/html;

# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;

server_name _;

location / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
} location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ { } }

Laden Sie nginx neu:

service nginx reload

Sie können sogar einen Expires HTTP-Header für diese Dateien festlegen, so dass Browser diese Dateien zwischenspeichern (siehe Make Browsers Cache Static Files On nginx für weitere Details):

server {
       listen 80 default_server;
       listen [::]:80 default_server;
root /var/www/html;

# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;

server_name _;

location / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
} location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ { expires 30d; } }

Wir können dieses Setup nun einen Schritt weiter gehen, indem wir nginx so viele Requests wie möglich bedienen lassen und nur die restlichen Requests plus PHP-Dateien an den Apache übergeben:

server {
       listen 80 default_server;
       listen [::]:80 default_server;
root /var/www/html;

# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;

server_name _;

location / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
} location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ { expires 30d; } location @proxy { proxy_pass http://127.0.0.1:8000; include /etc/nginx/proxy_params; } location ~* \.php$ { proxy_pass http://127.0.0.1:8000; include /etc/nginx/proxy_params; } }

Laden Sie nginx neu:

service nginx reload

Natürlich können Sie dieses Setup noch weiter verfeinern, z.B. mit dem nginx proxy_cache (wenn Ihre Anwendung es zulässt – z.B. müssen Sie sicherstellen, dass Captchas oder Einkaufswagen nicht zwischengespeichert werden und angemeldete Benutzer immer eine neue Kopie der Seite erhalten) oder wenn Ihre Anwendung einen vollständigen Seiten-Cache hat – in einem solchen Fall könnte nginx direkt auf den gesamten Seiten-Cache zugreifen (ein Beispiel finden Sie in diesem Tutorial: Wie man Drupal 7.7 mit Boost und nginx (Debian Squeeze) beschleunigt.

4 Links

Das könnte Dich auch interessieren …