<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

    <title>reveal.js</title>

    <link rel="stylesheet" href="dist/reset.css">
    <link rel="stylesheet" href="dist/reveal.css">
    <link rel="stylesheet" href="dist/theme/black.css" id="theme">

    <!-- Theme used for syntax highlighted code -->
    <link rel="stylesheet" href="plugin/highlight/monokai.css" id="highlight-theme">
</head>
<body>
<div class="reveal">
    <div class="slides">
        <section>
            <section>
                <h1 class="r-fit-text">Reverse proxies</h1>

                <p>
                <img src="revproxy.svg" width="466" height="338" alt="Revers Proxy schematisch"/>
                </p>
                <p class="justify-end">
                    <small>© 2021 Jan Dittberner</small>
                </p>
            </section>
            <section data-markdown>
				<textarea data-template>
				> Ein Reverse-Proxy ist ein Proxy in einem Rechnernetz, der Ressourcen für einen externen Client von einem oder mehreren internen Servern holt. Die Umsetzung der Adresse ist
				> atypisch und der Richtung des Aufrufes entgegengesetzt (deutsch „umgekehrter Proxy“). ...

				Quelle: [Wikipedia](https://de.wikipedia.org/wiki/Reverse_Proxy)
				</textarea>
            </section>
            <section data-markdown>
				<textarea data-template>
				> ... Die wahre Adresse des internen Zielsystems bleibt dem externen Client verborgen. Das
				> unterscheidet ihn vom typischen (Forward-)Proxy, der mehreren Clients eines internen (in sich abgeschlossenen) Netzes den Zugriff auf ein externes Netz gewährt.

				Quelle: [Wikipedia](https://de.wikipedia.org/wiki/Reverse_Proxy)
				</textarea>
            </section>
            <section>
                <h2 class="r-fit-text">Wichtige Funktionen</h2>

                <ul>
                    <li class="fragment fade-in">Weiterleitung auf dahinterliegende Systeme</li>
                    <li class="fragment fade-in">Performanceoptimierungen</li>
                    <li class="fragment fade-in">TLS-Terminierung</li>
                    <li class="fragment fade-in">Loadbalancing</li>
                </ul>
            </section>
            <section>
                <h2>Warum?</h2>

                <ul>
                    <li class="fragment fade-in">schnelle Rekonfiguration ohne Restart langsamer Backend-Anwendungen
                    </li>
                    <li class="fragment fade-in">einheitliche Konfiguration von TLS-Terminierung</li>

                    <li class="fragment fade-in">bessere Security z.B. durch URL-Filterung, Beschränkung von Zugriffen,
                        Rate-Limiting
                    </li>
                    <li class="fragment fade-in">Caching und direkte Auslieferung von statischen Resourcen (Bilder, CSS,
                        ...)
                    </li>
                    <li class="fragment fade-in">(Pre-)Authentifizierung, z.B. Kerberos, Client-Zertifikate, ...</li>
                    <li class="fragment fade-in">Zusammenstellung von Content aus mehreren Teilanwendungen</li>
                </ul>
            </section>
        </section>
        <section>
            <section>
                <h2 class="r-fit-text">Bekannte Vertreter</h2>
            </section>
            <section data-markdown>
				<textarea data-template>
				## Bekannte Vertreter

				### klassisch

				- [Apache httpd](https://httpd.apache.org/)
				- [nginx](https://nginx.org/)
				- [Microsoft IIS](https://www.iis.net/)
				</textarea>
            </section>
            <section data-markdown>
				<textarea data-template>
				## Bekannte Vertreter

				### Cloud native

				- [Traefik](https://traefik.io/)
				- [Envoy](https://www.envoyproxy.io/)
				</textarea>
            </section>
        </section>
        <section>
            <section>
                <h2>Apache httpd</h2>
                <img src="apache_logo.svg" width="97" height="195">
                <ul>
                    <li class="fragment fade-in">bewährte, ausgereifte Software, gibt es seit 1995</li>
                    <li class="fragment fade-in">Apache Software Foundation</li>
                </ul>
            </section>
            <section>
                <h2>Apache httpd</h2>
                <h3>Charakteristika</h3>

                <ul>
                    <li class="fragment fade-in">mehrere Processing Module (MPM) zur Auswahl <small>(Standard: prefork)</small></li>
                    <li class="fragment fade-in">Integration von PHP, Perl, usw. über Module</li>
                    <li class="fragment fade-in">in (fast) allen OS-Distributionen enthalten</li>
                </ul>
            </section>
            <section>
                <h2>Apache httpd</h2>
                <h3>Vorteile 👍</h3>

                <ul>
                    <li class="fragment fade-in">viele Tutorials
                    <li class="fragment fade-in">starke Rewrite-Engine
                    <li class="fragment fade-in">Unterstützung für .htaccess zum Überschreiben von Einstellungen
				</ul>
            </section>
            <section>
                <h2>Apache httpd</h2>
                <h3>Nachteile 👎</h3>

                <ul>
                    <li class="fragment fade-in">viele schlechte Tutorials</li>
                    <li class="fragment fade-in">Unterstützung für .htaccess zum Überschreiben von Einstellungen</li>
                    <li class="fragment fade-in">relativ langsam</li>
                    <li class="fragment fade-in">relative speicherhungrig</li>
                </ul>
            </section>
        </section>
        <section>
            <section>
                <h2>nginx</h2>
                <img src="nginx_logo.svg" width="480" height="100"/>

                <ul>
                    <li class="fragment fade-in">inzwischen auch sehr ausgereift, gibt es seit 2004</li>
                    <li class="fragment fade-in">ursprünglich von Igor Sysoev entwickelt, um Apache Performance-Probleme zu lösen</li>
                    <li class="fragment fade-in">laut Netcraft seit April 2019 Marktführer</li>
                    <li class="fragment fade-in">kommerziell supported durch Nginx, Inc., jetzt Teil von F5</li>
                    <li class="fragment fade-in">kommerzielle Variante mit Zusatzfunktionen</li>
				</ul>
            </section>
            <section>
                <h2>nginx</h2>
                <h3>Characteristika</h3>

                <ul>
                    <li class="fragment fade-in">asynchrone, Event-basierte Request-Verarbeitung</li>
                    <li class="fragment fade-in">Skriptsprachenanbindung per FastCGI, uwsgi, scgi oder direkt per http(s)</li>
                    <li class="fragment fade-in">in vielen OS-Distributionen enthalten</li>
                </ul>
            </section>
            <section>
                <h2>nginx</h2>
                <h3>Vorteile 👍</h3>

                <ul>
                    <li class="fragment fade-in">sehr schnell</li>
                    <li class="fragment fade-in">geringer Speicherbedarf</li>
                    <li class="fragment fade-in">Support für E-Mail (IMAP, SMTP) sowie TCP und UDP Proxying</li>
                    <li class="fragment fade-in">Support für Streaming</li>
                </ul>
            </section>
            <section>
                <h2>nginx</h2>
                <h3>Nachteile 👎</h3>

                <ul>
                    <li class="fragment fade-in">weniger Dokumentation als für Apache httpd</li>
                    <li class="fragment fade-in">weniger mächtiges Rewriting als Apache httpd</li>
                    <li class="fragment fade-in">keine .htaccess-Dateien</li>
                </ul>
            </section>
        </section>
        <section>
            <h2>Microsoft IIS</h2>
            <p class="fragment fade-in-then-out">Microsoft® Windows® only</p>
            <p class="fragment fade-in r-fit-text">🤷</p>
        </section>
        <section>
            <h2>Cloud native reverse proxies</h2>

            <h3>Vertreter: Traefik, Envoy</h3>

            <ul>
                <li class="fragment fade-in">dynamische Konfiguration (z.B. aus Kubernetes Configmaps, etcd, Docker
                    Labels, Consul, ...)
                </li>
                <li class="fragment fade-in">Support für Prometheus, Tracing, etc.</li>
                <li class="fragment fade-in">noch wenig Erfahrung vorhanden (bei uns)</li>
                <li class="fragment fade-in">auf stark dynamische Anwendungen ausgelegt</li>
                <li class="fragment fade-in">eingebautes Traffic-Routing, Failover, etc.</li>
                <li class="fragment fade-in">brauchen hohen Grad an Automatisierung für Konfiguration</li>
            </ul>
        </section>
        <section>
            <h2 class="r-fit-text">Fragen? Feedback?</h2>
        </section>
    </div>
</div>

<script src="dist/reveal.js"></script>
<script src="plugin/notes/notes.js"></script>
<script src="plugin/markdown/markdown.js"></script>
<script src="plugin/highlight/highlight.js"></script>
<script>
    // More info about initialization & config:
    // - https://revealjs.com/initialization/
    // - https://revealjs.com/config/
    Reveal.initialize({
        hash: true,

        // Learn about plugins: https://revealjs.com/plugins/
        plugins: [RevealMarkdown, RevealHighlight, RevealNotes]
    });
</script>
</body>
</html>