{"id":31,"date":"2022-01-07T13:41:30","date_gmt":"2022-01-07T12:41:30","guid":{"rendered":"http:\/\/192.168.41.160:8081\/?p=31"},"modified":"2024-10-21T15:17:21","modified_gmt":"2024-10-21T13:17:21","slug":"nginx-reverse-proxy-ssl-termination-ip-forwarding-proxy-caching","status":"publish","type":"post","link":"https:\/\/timo-brunn.de\/index.php\/2022\/01\/07\/nginx-reverse-proxy-ssl-termination-ip-forwarding-proxy-caching\/","title":{"rendered":"NGINX Reverse Proxy (+SSL Termination, IP Forwarding &#038; Proxy Caching)"},"content":{"rendered":"\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><div class=\"has-text-align-right wp-block-post-date\"><time datetime=\"2022-01-07T13:41:30+01:00\">Januar 7, 2022<\/time><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"Vorwort\">Vorwort<\/h2>\n\n\n\n<p>Wie die meisten gr\u00f6\u00dferen Firmen nutze auch ich f\u00fcr diese Webseite und weitere Webdienste die ich anbiete einen Reverse Proxy.<\/p>\n\n\n\n<p>Hierbei nutze ich einen nginx. Auf Vor- und Nachteile von nginx gegen\u00fcber seinen Konkurrenten gehen wir hier erstmal nicht ein. Ob es das passende Tool f\u00fcr Ihren Anwendungsfall ist, sollte vorher gepr\u00fcft werden.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-dots\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Vorbereitung\">Vorbereitung<\/h2>\n\n\n\n<p>Als Betriebssysteme verwende ich in diesem Fall ein <strong>AlmaLinux 8.5<\/strong>. Die Anleitung kann aber mit kleinen Anpassungen auch auf anderen Linux Systemen angewendet werden.<\/p>\n\n\n\n<p><strong>NGINX installieren:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">sudo yum makecache\nsudo yum install nginx<\/code><\/pre>\n\n\n\n<p>Mit folgendem Befehlt l\u00e4sst sich die Installierte nginx version ausgeben:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">nginx -v<\/code><\/pre>\n\n\n\n<p>In meinem Fall ist die Ausgabe:<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"font-size:11px\"><code lang=\"bash\" class=\"language-bash\">nginx version: nginx\/1.14.1<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-black-color has-css-opacity has-black-background-color has-background is-style-dots\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Reverse-Proxy\">Reverse Proxy<\/h2>\n\n\n\n<p>Hierf\u00fcr legen wir eine neue Konfigurationsdatei &#8222;root.conf&#8220; im Standard &#8222;include&#8220; Verzeichnis an:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">sudo nano \/etc\/nginx\/conf.d\/root.conf<\/code><\/pre>\n\n\n\n<p>Hier m\u00fcssen wir jetzt folgende Konfiguration vornehmen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"nginx\" class=\"language-nginx\">server {\n     listen 80;\n     server_name sleepeehead.club;\n\n     location \/{\n          proxy_pass        http:\/\/192.168.43.26\/;\n     }\n}<\/code><\/pre>\n\n\n\n<p>Hierbei z\u00e4hlt Folgendes:<br><strong>listen<\/strong> = Hier kann man den Port oder IP:Port eingeben auf den nginx lauscht<br><br><strong>server_name<\/strong> = Hier kommt die URL auf die dieser &#8222;Server&#8220; antwortet. Man kann mehrere mit einem Leerzeichen trennen.<br><br><strong>location<\/strong> = Gibt den Pfad an den der Client anfordert. In dem Beispiel oben gibt &#8222;\/&#8220; an das es sich um http:\/\/sleepehead.club\/ handelt.<br><br><strong>proxy_pass<\/strong> = gibt das Ziel an, an das die Daten weitergeleitet werden sollen.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity aligncenter is-style-dots\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"SSL-Termination\">SSL Termination<\/h2>\n\n\n\n<p>SSL Termination erfordert in nginx die gleiche Konfiguration wie ein einfacher nginx Webserver:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"nginx\" class=\"language-nginx\">server {\n     listen 443 ssl;\n     server_name sleepeehead.club;\n     ssl_certificate \/etc\/ssl\/certs\/pub.pem;\n     ssl_certificate_key \/etc\/ssl\/certs\/priv.pem;\n\n     location \/{\n          proxy_pass        http:\/\/192.168.43.26\/;\n     }\n}<\/code><\/pre>\n\n\n\n<p>Hier haben wir jetzt unseren Lauschport auf 443 ge\u00e4ndert und nginx mitgeteilt das dieser Server ssl\/tls nutzen soll.<br><br><strong>ssl_certificate<\/strong> = Gibt den Pfad zum SSL Zertifikat an <br><strong>ssl_certificate_key<\/strong> = Gibt den Pfad zum SSL <strong><em>privaten Schl\u00fcssel<\/em><\/strong> an.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-dots\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"IP-Forwarding\">IP Forwarding<\/h2>\n\n\n\n<p>Damit unser Backend Server wei\u00df von welcher IP-Adresse unser Client zugreift, m\u00fcssen wir den X-Forwarded-For Header setzen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"nginx\" class=\"language-nginx\">server {\n     listen 443 ssl;\n     server_name sleepeehead.club;\n     ssl_certificate \/etc\/ssl\/certs\/pub.pem;\n     ssl_certificate_key \/etc\/ssl\/certs\/priv.pem;\n\n     location \/{\n          proxy_set_header  Host $host;\n          proxy_set_header  X-Real-IP $remote_addr;\n          proxy_set_header  X-Forwarded-For $remote_addr;\n          proxy_set_header  X-Forwarded-Host $remote_addr;\n          proxy_pass        http:\/\/192.168.43.26\/;\n     }\n}\n\n\n \n\n<\/code><\/pre>\n\n\n\n<p><strong>proxy_set_header<\/strong> = setzt den angegebenen Header f\u00fcr das Backend.<br><br>Im Normalfall gen\u00fcgt es X-Forwarded-For zu setzen.<br>Weitere Infos hierzu: <a href=\"https:\/\/distinctplace.com\/2014\/04\/23\/story-behind-x-forwarded-for-and-x-real-ip-headers\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/distinctplace.com\/2014\/04\/23\/story-behind-x-forwarded-for-and-x-real-ip-headers\/<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-dots\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Proxy-Caching\">Proxy Caching<\/h2>\n\n\n\n<p>Der Cache in nginx wird in einem Verzeichnis abgelegt, also m\u00fcssen wir dieses zuerst anlegen<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">sudo mkdir \/srv\/nginx_cache\nsudo mkdir \/srv\/nginx_cache\/root\/\nsudo chown nginx: \/srv\/nginx_cache\/ -R\nsudo chmod 700 \/srv\/nginx_cache -R<\/code><\/pre>\n\n\n\n<p>Danach muss der cache im nginx server hinterlegt werden<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"nginx\" class=\"language-nginx\">\nserver {\n     listen 443 ssl;\n     server_name sleepeehead.club;\n     ssl_certificate \/etc\/ssl\/certs\/pub.pem;\n     ssl_certificate_key \/etc\/ssl\/certs\/priv.pem;\n\n     proxy_cache_path \/srv\/nginx_cache\/root\/ levels=1:2 keys_zone=root_cache:10m max_size=512m inactive=60m use_temp_path=off;\n\n\n     location \/{\n          proxy_cache root_cache;\n          proxy_set_header  Host $host;\n          proxy_set_header  X-Real-IP $remote_addr;\n          proxy_set_header  X-Forwarded-For $remote_addr;\n          proxy_set_header  X-Forwarded-Host $remote_addr;\n          proxy_pass        http:\/\/192.168.43.26\/;\n     }\n}<\/code><\/pre>\n\n\n\n<p><strong>proxy_cache_path<\/strong> = Gibt den Pfad und Gr\u00f6\u00dfe des Caches an<br><br><strong>levels <\/strong>= Das ist die Menge an Unterordnern, die erstellt werden.<br>Das sollte man basierend auf Dateisystem erh\u00f6hen oder eben nicht.<br><br><strong>keys_zone <\/strong>= Name der Key Zone und Gr\u00f6\u00dfe. Ein MB kann ca. 8 Tausend Keys Speichern.<br><br><strong>max_size<\/strong> = Maximale Gr\u00f6\u00dfe des Caches.<br><br><strong>inactive<\/strong> = Gibt an wie lange Dateien im Cache behalten werden. <br><br><strong>use_temp_path <\/strong>= Gibt an welcher Pfad als tempor\u00e4rer Pfad verwendet werden soll.<br>Wenn der Wert auf &#8222;off&#8220; steht werden diese im gleichen Verzeichnis gespeichert.<br><br><strong>proxy_cache<\/strong> = Gibt an welche Key Zone verwendet werden soll.<br><br>Siehe: <a rel=\"noreferrer noopener\" href=\"https:\/\/nginx.org\/en\/docs\/http\/ngx_http_proxy_module.html#proxy_cache_path\" target=\"_blank\">https:\/\/nginx.org\/en\/docs\/http\/ngx_http_proxy_module.html#proxy_cache_path<\/a><\/p>\n\n\n\n<p>Zus\u00e4tzlich k\u00f6nnte man noch angeben, dass der Cache Control Header ignoriert werden soll:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"nginx\" class=\"language-nginx\"> proxy_ignore_headers Cache-Control;\n proxy_cache_valid any 60m;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-dots\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Abschluss\">Abschluss<\/h2>\n\n\n\n<p>Zum Schluss am besten die Konfiguration einmal validieren<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">sudo nginx -t<\/code><\/pre>\n\n\n\n<p>Und dann den nginx einmal neu laden<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">sudo systemctl reload nginx.service<\/code><\/pre>\n<\/div>\n<\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vorwort Wie die meisten gr\u00f6\u00dferen Firmen nutze auch ich f\u00fcr diese Webseite und weitere Webdienste die ich anbiete einen Reverse Proxy. Hierbei nutze ich einen nginx. Auf Vor- und Nachteile von nginx gegen\u00fcber seinen Konkurrenten gehen wir hier erstmal nicht ein. Ob es das passende Tool f\u00fcr Ihren Anwendungsfall ist, sollte vorher gepr\u00fcft werden. Vorbereitung [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,9,12,11,31,5,6,10,4],"tags":[23,17,15,14,19,25,16,20,26,22,21,18,24],"class_list":["post-31","post","type-post","status-publish","format-standard","hentry","category-almalinux","category-cache","category-german","category-language","category-linux","category-nginx","category-reverse-proxy","category-ssl-tls","category-webserver","tag-cache","tag-centos","tag-deutsch","tag-german","tag-ip-forwarding","tag-ip-weiterleitung","tag-nginx","tag-proxy","tag-proxy-cache","tag-proxy-caching","tag-reverse-proxy","tag-ssl-termination","tag-webserver"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/timo-brunn.de\/index.php\/wp-json\/wp\/v2\/posts\/31","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/timo-brunn.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/timo-brunn.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/timo-brunn.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/timo-brunn.de\/index.php\/wp-json\/wp\/v2\/comments?post=31"}],"version-history":[{"count":17,"href":"https:\/\/timo-brunn.de\/index.php\/wp-json\/wp\/v2\/posts\/31\/revisions"}],"predecessor-version":[{"id":280,"href":"https:\/\/timo-brunn.de\/index.php\/wp-json\/wp\/v2\/posts\/31\/revisions\/280"}],"wp:attachment":[{"href":"https:\/\/timo-brunn.de\/index.php\/wp-json\/wp\/v2\/media?parent=31"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/timo-brunn.de\/index.php\/wp-json\/wp\/v2\/categories?post=31"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/timo-brunn.de\/index.php\/wp-json\/wp\/v2\/tags?post=31"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}