Nginx als Reverse Proxy

Kennen Sie dieses Problem? Sie möchten an einer Webseite Änderungen vornehmen und müssen dazu eine Wartungsmeldung an Besucher der Webseite ausgeben und ggf. die Last vom Backend nehmen.

Hier die einfache Lösung:

Mit dem Nginx Webserver können mehrere Backend - Punkte definiert und bei Bedarf zu - oder abgeschaltet werden. Dies kann auch beim Ausfall eines Webservers automatisch passieren. In diesem Fall könnte der letzte oder der Standard-Webserver eine Wartungsseite ausgeben.
Besser ist es jedoch, ein Gateway vorzuschalten und das Gateway und Backend zu trennen. Denn, wenn der zum Beispiel der Backend-Server nicht funktionieren würde, kann auch keine Wartungsseite erzeugt werden. Der Gateway-Server (in unserem Fall Nginx) würde unabhängig vom Backend laufen und ist bei einem Ausfall schnell neu aufgesetzt. Unsere Systeme funktionieren mit dieser Lösung recht ausfallsicher und zuverlässig. Unsere Gateways haben wir zum Beispiel in der Amazon Cloud laufen und sind somit sehr leicht und schnell erweiterbar und oder neu aufgesetzt.

Der Nginx - Webserver funktioniert zudem wunderbar als Proxy-Server. Lassen Sie statische Dateien (Bilder, Styles oder Javascript - Dateien direkt vom Gateway ausliefern. Das Backend würde in diesem Falle gar nicht belastet werden.

Nginx Installationsbeispiel als Gateway und Proxy für statische Dateien:

Melden Sie sich beim Amazon Webservice (AWS) an und legen Sie sich eine Micro Instance (EC2) an. Diese kostet im ersten Jahr, falls man ein neues Mitglied ist, keinen Cent (ausser Traffic und Speicher). Man kann also erstmal alles testen und dann eine kleine Instance erstellen. Auf dieser muss im Prinzip nichts weiter als der Nginx - Webseiter installiert werden: auf einem Debian System: apt-get install nginx

Damit läuft der Webserver auf Port 80 und man kann die Konfiguration vornehmen. Diese findet man in /etc/nginx/

Beispiel der nginx.conf
user www-data;
worker_processes  4;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
        worker_connections  4096;
        multi_accept on;
        use epoll;
}

http {
        include       /etc/nginx/mime.types;
        access_log      /var/log/nginx/access.log;

        sendfile        on;
        keepalive_timeout  65;
        tcp_nodelay        on;

        server_tokens off;

        gzip on;
        gzip_vary on;
        gzip_static on;
        gzip_buffers 16 8k;
        gzip_comp_level 9;
        gzip_http_version 1.1;
        gzip_min_length 5;
        gzip_types text/plain text/css image/png image/gif image/jpg image/jpeg application/x-javascript text/xml application/x
        gzip_proxied any;
        gzip_disable "MSIE [1-6]\.";

        proxy_cache_key $host$request_uri;
        proxy_cache_path /var/www/cache/images  levels=1:2 keys_zone=images:200m;

        upstream backup {
                server localhost:PORT;
        }

        upstream wsb80 {
                ip_hash;
                server IP-Adresse:PORT;
                server IP-Adresse:PORT;
        }

        upstream lp80 {
                ip_hash;
                server IP-Adresse:PORT;
                server IP-Adresse:PORT;
        }


        upstream wsb443 {
                ip_hash;
                server IP-Adresse:443;
        }


        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

Im Verzeichnis: /etc/nginx/sites-enabled/ findet man dann die bereitzustellenden Webseiten. Falls dort keine Datei liegt, muss eine leer Datei (nennen wir diese default.ws) erzeugt werden.

# 80

server {
        listen 80;
        server_name www.meinedomain.de meinedomain.de;
        keepalive_timeout    65;


    location ~* \.(?:ico|css|js|gif|jpe?g|png|swf)$ {
        access_log off;
        log_not_found off;

        proxy_cache images;
        proxy_cache_valid 30d;

        expires 30d;
        add_header Pragma public;
        add_header Cache-Control "public";

        error_page 500 502 503 504 = @error;

        client_max_body_size 20M;
        client_body_buffer_size 512k;

        proxy_pass http://wsb80;

        proxy_redirect    off;
        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-Client-Verify  SUCCESS;
        #proxy_set_header    X-Forwarded-Proto http;
        proxy_read_timeout  65;
        proxy_connect_timeout 15;
        proxy_next_upstream error timeout;
    }
    
    location / {
                #expires 1d;
                #add_header Pragma private;
                #add_header Cache-Control "private";

                error_page 500 502 503 504 = @error;

                client_max_body_size 20M;
                client_body_buffer_size 512k;

                proxy_pass http://wsb80;

                proxy_redirect    off;
                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-Client-Verify  SUCCESS;
                #proxy_set_header        X-Forwarded-Proto http;
                proxy_read_timeout  65;
                proxy_connect_timeout 15;
                proxy_next_upstream error timeout;

        }

        location @error {
                internal;
                proxy_pass           http://backup;
        }
}

Falls diese Konfiguration übernommen wird, bitte alle Werte in Großbuchstaben, mit den eigenen Werten ersetzen. Hilfe zur Konfiguration von NGINX findet man auf Nginx Webserver.