Deutsch| English

Nginx unter Ubuntu 12.04 als Reverse Proxy für Apache2 aufsetzen

Version 1.0
Author: Falko Timme <ft [at] falkotimme [dot] com>
Follow me on Twitter
Last edited 10/20/2012

nginx (“engine x” ausgesprochen) ist ein kostenloser, quelloffener, Hochleistungs-HTTP-Server. nginx ist für seine Stabilität, seine vielen Features, die einfache Konfiguration und niedrigen Ressourcenverbrauch bekannt. Dieses Tutorial zeigt, wie Sie nginx unter Ubuntu 12.04 als Reverse Proxy vor einem Apache2 Webserver aufsetzen.

Für die Richtigkeit der Inhalte dieses Tutorials gebe ich keinerlei Garantie.

1 Vorbemerkung

In diesem Tutorial benutze ich den Hostnamen server1.example.com und die IP-Adresse 192.168.0.100. Diese Einstellungen werden sich von Ihren unterscheiden, ersetzen Sie sie also an den entsprechenden Stellen.

Ich nehme im Folgenden an, dass Sie bereits einen Apache vHost haben (ich werde in diesem Tutorial example.com benutzen), welcher Port 80 auf der IP-Adresse 192.168.0.100 benutzt, die Sie durch nginx proxen möchten.

Beachten Sie bitte, dass dieses Tutorial nur http behandelt, nicht https (SSL).

2 Konfiguration von Apache

Das erste was Sie tun müssen ist, den Apache vHost dazu zu konfigurieren auf localhost (127.0.0.1) auf einen anderen Port als 80 zu hören (z.B. 8000). Öffnen Sie /etc/apache2/ports.conf

vi /etc/apache2/ports.conf

… und editieren Sie die NameVirtualHost und Listen Zeilen für Port 80, sodass sie Port 8000 benutzen:

# 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
# This is also true if you have upgraded from before 2.2.9-3 (i.e. from
# Debian etch). See /usr/share/doc/apache2.2-common/NEWS.Debian.gz and
# README.Debian.gz

NameVirtualHost *:8000
Listen 8000

<IfModule mod_ssl.c>
 # If you add NameVirtualHost *:443 here, you will also have to change
 # the VirtualHost statement in /etc/apache2/sites-available/default-ssl
 # to <VirtualHost *:443>
 # Server Name Indication for SSL named virtual hosts is currently not
 # supported by MSIE on Windows XP.
Listen 443
</IfModule>

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

Öffnen Sie als nächstes die vHost Konfigurationsdatei (z.B. /etc/apache2/sites-available/example.com.vhost)…

vi /etc/apache2/sites-available/example.com.vhost

… und ändern Sie die <VirtualHost> Zeile, sodass sie die IP-Adresse 127.0.0.1 und den Port 8000 benutzt:

<VirtualHost 127.0.0.1:8000>
[...]

Wir konfigurieren nginx als transparenten Proxy, das heißt, es übergibt die ursprüngliche Benutzer-IP in einem Feld namens X-Forwarded-For zum Backend Apache. Natürlich sollte das Backend Apache die ursprüngliche Benutzer-IP in seinen Zugriffsprotokollen speichern und nicht nginx’ IP-Adresse (127.0.0.1). Dies können Sie auf zwei Wegen erreichen:

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

vi /etc/apache2/apache2.conf

[...]
#LogFormat "%h %l %u %t "%r" %>s %b "%{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 Sie das Apachemodul libapache2-mod-rpaf installieren, welches sich um die korrekte Protokollierung der IP-Adresse kümmert:

apt-get install libapache2-mod-rpaf

Starten Sie nach diesen Änderungen Apache neu:

/etc/init.d/apache2 restart

3 Konfiguration von nginx

Ist nginx nicht bereits installiert, installieren Sie es folgendermaßen:

apt-get install nginx

Erstellen Sie seine Systemstartlinks und stellen Sie sicher, dass es gestartet ist:

update-rc.d nginx defaults
/etc/init.d/nginx restart

Es sollte nun auf Port 80 hören.

Einige standard Proxyparameter befinden sich in der Datei /etc/nginx/proxy_params:

vi /etc/nginx/proxy_params

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Da Sie diese Datei später im Proxyteil Ihres nginx vHosts für example.com hinzufügen müssen können Sie weitere Proxydirektiven zu ihr hinzufügen wenn Sie möchten, z.B. folgendermaßen:

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

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;

Nun erstellen Sie den example.com vHost für nginx - stellen Sie sicher, dass er das selbe Stammverzeichnis benutzt wie der Apache vHost für example.com (z.B. /var/www/example.com/web), sodass nginx statische Dateien direkt ausliefern kann, ohne die Anfrage über Apache zu bearbeiten:

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

server {
 listen 80;
 server_name www.example.com example.com;
 root /var/www/example.com/web;
 if ($http_host != "www.example.com") {
 rewrite ^ http://www.example.com$request_uri permanent;
 }
 index index.php index.html;

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

Dies ist eine sehr simple Konfiguration, die alle Anfragen über Apache proxen würde.

Um diesen vHost zu aktivieren, erstellen Sie einen Symlinkauf ihn aus dem /etc/nginx/sites-enabled/ Verzeichnis:

cd /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/example.com.vhost example.com.vhost

Laden Sie nginx neu um die Änderungen geltend zu machen:

/etc/init.d/nginx reload

Sie können nun www.example.com in Ihren
Browser eingeben und sollten Ihre Webseite sehen, diesmal jedoch ausgeliefert von nginx.

Wie zuvor erwähnt ist dies eine sehr simple Konfiguration, welche alle Anfragen zu Apache proxt. Da nginx jedoch viel schneller im Ausliefern von statischen Dateien ist (wie JavaScript, CSS, Bilder, PDF Dateien, statische HTML Dateien, etc.) als Apache, ist es vorteilhaft diese Dateien direkt von nginx ausliefern zu lassen. Dies kann durch Hinzufügen einer neuen location für diese Dateien geschehen, z.B. wie folgt:

server {
 listen 80;
 server_name www.example.com example.com;
 root /var/www/example.com/web;
 if ($http_host != "www.example.com") {
 rewrite ^ http://www.example.com$request_uri permanent;
 }
 index index.php index.html;

 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:

/etc/init.d/nginx reload

Sie können auch einen Expires HTTP Header für diese Dateien einsetzen, sodass sie vom Browser gecached werden (siehe Make Browsers Cache Static Files On nginx für mehr Informationen):

server {
 listen 80;
 server_name www.example.com example.com;
 root /var/www/example.com/web;
 if ($http_host != "www.example.com") {
 rewrite ^ http://www.example.com$request_uri permanent;
 }
 index index.php index.html;

 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 nun noch einen Schritt weitergehen und nginx so viele Anfragen übernehmen lassen wie es schafft und nur den Rest sowie alle PHP Dateien an Apache weiterzugeben:

server {
 listen 80;
 server_name www.example.com example.com;
 root /var/www/example.com/web;
 if ($http_host != "www.example.com") {
 rewrite ^ http://www.example.com$request_uri permanent;
 }
 index index.php index.html;

 location / {
 try_files $uri @proxy;
 }
 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 danach nginx neu:

/etc/init.d/nginx reload

Natürlich können Sie dieses Setup noch weiter feintunen, zum Beispiel in dem Sie den nginx proxy_cache benutzen (solange Ihre Anwendung dies zulässt - zum Beispiel müssen Sie sicherstellen, dass Captchas und Warenkörbe nicht gecached werden und eingeloggte Benutzer immer eine neue Kopie der Seite bekommen) oder, falls Ihre Anwendung einen Cache für ganze Seiten hat, kann nginx direkt auf diesen zugreifen (Sie finden ein Beispiel in diesem Tutorial: How To Speed Up Drupal 7.7 With Boost And nginx (Debian Squeeze)).

4 Links

vgwort />

 

 

Kommentar

Du musst eingeloggt um einen Kommentar zu hinterlassen.