<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Reverse Proxy on StackOnward</title><link>https://stackonward.com/tags/reverse-proxy/</link><description>Recent content in Reverse Proxy on StackOnward</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Fri, 11 Sep 2026 05:18:00 +0800</lastBuildDate><atom:link href="https://stackonward.com/tags/reverse-proxy/index.xml" rel="self" type="application/rss+xml"/><item><title>What Happens When You Type a URL in the Browser</title><link>https://stackonward.com/posts/domain-request-flow/</link><pubDate>Fri, 11 Sep 2026 05:18:00 +0800</pubDate><guid>https://stackonward.com/posts/domain-request-flow/</guid><description>&lt;p&gt;What happens when you type a URL in the browser is a sequence of hops, not a round trip to one origin. The request usually travels through DNS, a TCP or QUIC connection, TLS, a CDN or reverse proxy, and only then the application. The HTML that comes back is not the end; the browser still fetches styles, scripts, fonts, and images. &lt;a href="https://developer.mozilla.org/en-US/docs/Learn_web_development/Getting_started/Web_standards/How_the_web_works" target="_blank" rel="noopener"&gt;MDN’s account of how the web works&lt;span class="sr-only"&gt;(opens in a new tab)&lt;/span&gt;&lt;/a&gt; lists DNS, the HTTP request, the server response, and the browser assembling the page as consecutive stages.&lt;/p&gt;</description></item><item><title>Caddy vs Nginx vs Nginx Proxy Manager</title><link>https://stackonward.com/posts/caddy-nginx-npm-comparison/</link><pubDate>Fri, 11 Sep 2026 05:15:00 +0800</pubDate><guid>https://stackonward.com/posts/caddy-nginx-npm-comparison/</guid><description>&lt;p&gt;Caddy vs Nginx is decided by where the reverse-proxy config lives and how certificates are renewed, not by a public request-per-second ranking. A small site with files in Git and default automatic HTTPS usually belongs on Caddy. Working Nginx configs, modules, or operator muscle stay on Nginx. A web UI for a handful of hosts is Nginx Proxy Manager, and that choice also means backing up an application, a database, and generated Nginx files.&lt;/p&gt;
&lt;figure&gt;
 &lt;img src="https://stackonward.com/images/posts/caddy-nginx-npm-comparison/en/proxy-decision-tree.svg" alt="Decision tree that chooses Caddy, Nginx, or Nginx Proxy Manager from file versus web UI maintenance, then from existing Nginx assets" loading="lazy" decoding="async"&gt;
 &lt;figcaption&gt;Existing Nginx assets stay on the file path. A GUI path still needs a backup of the admin data.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id="caddy-vs-nginx-is-decided-by-the-config-source-of-truth"&gt;Caddy vs Nginx is decided by the config source of truth&lt;/h2&gt;
&lt;div class="table-responsive" role="region" aria-label="Scrollable table" tabindex="0"&gt;
 &lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Axis&lt;/th&gt;
					&lt;th&gt;Caddy&lt;/th&gt;
					&lt;th&gt;Nginx&lt;/th&gt;
					&lt;th&gt;Nginx Proxy Manager&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Daily config&lt;/td&gt;
					&lt;td&gt;Caddyfile or JSON&lt;/td&gt;
					&lt;td&gt;Nginx config files&lt;/td&gt;
					&lt;td&gt;Web admin UI&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HTTPS&lt;/td&gt;
					&lt;td&gt;Certificate issue and renewal are default&lt;/td&gt;
					&lt;td&gt;Usually Certbot, acme.sh, or a cloud certificate&lt;/td&gt;
					&lt;td&gt;Common certificate actions in the UI&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Git&lt;/td&gt;
					&lt;td&gt;Reviewed as files&lt;/td&gt;
					&lt;td&gt;Reviewed as files&lt;/td&gt;
					&lt;td&gt;Main state lives in a database&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;WebSocket&lt;/td&gt;
					&lt;td&gt;HTTP reverse proxy handles the usual upgrade&lt;/td&gt;
					&lt;td&gt;Upgrade-related headers must be set correctly&lt;/td&gt;
					&lt;td&gt;Follows the generated Nginx config&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Cache and limits&lt;/td&gt;
					&lt;td&gt;Configurable&lt;/td&gt;
					&lt;td&gt;Mature and fine-grained&lt;/td&gt;
					&lt;td&gt;Bounded by the UI and Advanced config&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Extra state&lt;/td&gt;
					&lt;td&gt;Config plus certificate storage&lt;/td&gt;
					&lt;td&gt;Config, certificates, and related scripts&lt;/td&gt;
					&lt;td&gt;App, database, certificates, and generated config&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

&lt;/div&gt;

&lt;p&gt;Files are easy to review and roll back. A database is easy to click through, and a restore has to cover that database together with the certificates.&lt;/p&gt;</description></item><item><title>How to Troubleshoot 502 and 504 Behind a Reverse Proxy</title><link>https://stackonward.com/posts/502-504-troubleshooting/</link><pubDate>Fri, 11 Sep 2026 05:08:00 +0800</pubDate><guid>https://stackonward.com/posts/502-504-troubleshooting/</guid><description>&lt;p&gt;How to troubleshoot 502 and 504 starts at the hop that produced the status. Both codes come from a gateway or reverse proxy: 502 Bad Gateway means that hop did not get a usable response from upstream; 504 Gateway Timeout means it waited past its limit. Keep the headers, then reach the upstream from that hop&amp;rsquo;s network.&lt;/p&gt;
&lt;figure&gt;
 &lt;img src="https://stackonward.com/images/posts/502-504-troubleshooting/en/gateway-failure-map.svg" alt="A client reaches an app through a CDN and reverse proxy; a failed connection becomes 502, a wait past the limit becomes 504" loading="lazy" decoding="async"&gt;
 &lt;figcaption&gt;Connection refused, DNS failure, and an invalid response usually point to 502. An upstream wait past the proxy deadline usually points to 504.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id="how-to-troubleshoot-502-and-504-at-the-hop-that-returned-the-status"&gt;How to troubleshoot 502 and 504 at the hop that returned the status&lt;/h2&gt;
&lt;p&gt;A browser may sit behind Cloudflare or another CDN, a cloud load balancer, and Caddy or Nginx. Save the status, headers, time, and request ID:&lt;/p&gt;</description></item></channel></rss>