nginx

nginx ist zwar ein Web-Server, wird jedoch gerne auch als ein Reverse Proxy eingesetzt. Dabei werden Anfragen eines Clients an einen (von ggf. mehreren) Backend-Servern weitergeleitet.

Allgemein

nginx wird mittels der Konfigurationsdatei /etc/nginx/nginx.conf konfiguriert. Nach jeder Änderung der Konfiguration muss nginx dabei neu gestartet werden. Vorher kann die Konfiguration jedoch mit nginx -t getestet werden.

In der Konfiguration kann dabei via include andere Konfigurationsdateien an diese Stelle importiert werden. So ist es möglich, für jedes virtuelle Host eine separate Konfigurationsdatei zu erstellen.

Die Konfiguration eines virtuellen Hosts kann dann bspw. so aussehen:


upstream fisi-servers {
     server 1.1.1.1;
     server 1.2.3.4;
}

server {
    listen      127.0.0.1:443 ssl;
    listen      [::]:443 ssl;
    http2 on;
    server_name fisi.donmez.eu ;
    proxy_ssl_server_name on;

    ssl_certificate      /etc/nginx/ssl/fisi.donmez.eu.pem;
    ssl_certificate_key  /etc/nginx/ssl/fisi.donmez.eu.key;
    error_log  /var/log/nginx/domains/fisi.donmez.eu.error.log error;

    # Forward anything not below /grav-admin/ to that direcotry
    location / {
        return 301 https://$host/grav-admin$request_uri;
    }

    location /grav-admin/ {
        # proxy all requests to the specified upstream server(s)
        proxy_pass      https://fisi-servers; # or <proxy_pass https://IP:port> instead

        # handle the following file-types directly instead of proxying them
        location ~* ^.+\.(jpeg|jpg|png|gif|bmp|ico|svg|tif|tiff|css|js|ttf|otf|webp|txt|csv|rtf|doc|docx|xls|xlsx|ppt|pptx|odf|odp|ods|odt|pdf|psd|ai|eot|eps|ps|zip|tar|tgz|gz|rar|bz2|7z|aac|m4a|mp3|mp4|ogg|wav|wma|3gp|avi|flv|m4v|mkv|mov|mpeg|mpg|wmv|exe|iso|dmg|swf|woff|woff2)$ {

            root           /var/www/fisi.donmez.eu/public_html;
            access_log     /var/log/nginx/domains/fisi.donmez.eu.log combined;
            access_log     /var/log/nginx/domains/fisi.donmez.eu.bytes bytes;
            expires        max;
            try_files      $uri @fallback; # if file not found, try the upstream server through the fallback location
        }

    }

    location /error/ {
        alias   /var/www/fisi.donmez.eu/document_errors/;
    }

    location @fallback {
        proxy_pass      https://fisi-servers;
    }

    location ~ /\.ht    {return 404;}
    location ~ /\.env   {return 404;}
    location ~ /\.svn/  {return 404;}
    location ~ /\.git/  {return 404;}
    location ~ /\.hg/   {return 404;}
    location ~ /\.bzr/  {return 404;}

}

Reverse Proxy

Abgesehen vom hier beschriebenen Reverse HTTP Proxy ist auch ein Reverse-Proxy mittels FastCGI, uwsgi und SCGI möglich. Somit können z.B. Web-Applikationen als Upstream bzw. Backend genutzt werden.

Oben sieht man bereits die Direktive proxy_pass. Damit werden Client-Requests an ein Upstream-Server weitergeleitet. Folgende weitere Direktiven können im Kontext eines Reverse Proxys genutzt werden:

  • proxy_set_header setzt ein HTTP-Header, das an das Upstream weitergegeben wird
  • proxy_hide_header verschleiert angegebenes Header vor dem Upstream
  • proxy_pass_header sendet ein ansonsten verschleiertes Header an den Upstream-Server
  • proxy_bind baut die Verbindung zum Upstream über die angegebene Gateway-Adresse auf
  • proxy_ssl_server_name leitet SNI Informationen an den Up-Stream-Server weiter

Weiteres unter: https://nginx.org/en/docs/http/ngx_http_proxy_module.html