<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>反向代理 on 远栈</title><link>https://stackonward.com/zh/tags/%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86/</link><description>Recent content in 反向代理 on 远栈</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Fri, 18 Sep 2026 22:40:18 +0800</lastBuildDate><atom:link href="https://stackonward.com/zh/tags/%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86/index.xml" rel="self" type="application/rss+xml"/><item><title>502 和 504 怎么排查：反向代理、Docker 网络与上游超时</title><link>https://stackonward.com/zh/posts/502-504-troubleshooting/</link><pubDate>Wed, 02 Sep 2026 23:40:00 +0800</pubDate><guid>https://stackonward.com/zh/posts/502-504-troubleshooting/</guid><description>&lt;p&gt;502 和 504 都由网关或反向代理返回，但含义不同：502 表示代理没有从上游得到可用响应，504 表示代理等待上游响应超过时限。排查时先找到产生状态码的那一层，再从该层所在的网络访问上游。&lt;/p&gt;
&lt;figure&gt;
 &lt;img src="https://stackonward.com/images/posts/502-504-troubleshooting/zh/gateway-failure-map.svg" alt="客户端经过 CDN 和反向代理访问应用时，连接失败产生 502、等待超时产生 504 的故障图" loading="lazy" decoding="async"&gt;
 &lt;figcaption&gt;连接拒绝、解析失败和无效响应通常指向 502；上游等待超过代理期限通常指向 504。&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id="确认哪一层返回-502-或-504"&gt;确认哪一层返回 502 或 504&lt;/h2&gt;
&lt;p&gt;浏览器前面可能同时有 CDN、云负载均衡、Caddy 或 Nginx。先保留状态码、响应头、时间和请求 ID：&lt;/p&gt;</description></item><item><title>Caddy、Nginx、Nginx Proxy Manager 怎么选：反向代理与 HTTPS 对比</title><link>https://stackonward.com/zh/posts/caddy-nginx-npm-comparison/</link><pubDate>Wed, 02 Sep 2026 10:30:00 +0800</pubDate><guid>https://stackonward.com/zh/posts/caddy-nginx-npm-comparison/</guid><description>&lt;p&gt;少量站点、希望配置进入 Git 并自动处理 HTTPS，可以先选 Caddy；已有大量 Nginx 配置或需要细粒度模块能力，继续用 Nginx；更习惯图形界面、管理的站点也不多，再考虑 Nginx Proxy Manager。&lt;/p&gt;
&lt;figure&gt;
 &lt;img src="https://stackonward.com/images/posts/caddy-nginx-npm-comparison/zh/proxy-decision-tree.svg" alt="根据文件或图形界面维护方式选择 Caddy、Nginx 和 Nginx Proxy Manager 的决策树" loading="lazy" decoding="async"&gt;
 &lt;figcaption&gt;先选维护方式，再看现有资产。大多数小型新站点不需要从性能跑分开始选。&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id="配置方式和维护对象"&gt;配置方式和维护对象&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&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;日常配置&lt;/td&gt;
					&lt;td&gt;Caddyfile 或 JSON&lt;/td&gt;
					&lt;td&gt;Nginx 配置文件&lt;/td&gt;
					&lt;td&gt;Web 管理界面&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HTTPS&lt;/td&gt;
					&lt;td&gt;自动签发和续期是默认能力&lt;/td&gt;
					&lt;td&gt;通常搭配 Certbot、acme.sh 或云证书&lt;/td&gt;
					&lt;td&gt;界面集成常见证书操作&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Git 管理&lt;/td&gt;
					&lt;td&gt;很适合&lt;/td&gt;
					&lt;td&gt;很适合&lt;/td&gt;
					&lt;td&gt;主要状态在数据库中&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;WebSocket&lt;/td&gt;
					&lt;td&gt;常见场景自动处理&lt;/td&gt;
					&lt;td&gt;需要正确设置升级相关头&lt;/td&gt;
					&lt;td&gt;由生成的 Nginx 配置处理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;缓存和限流&lt;/td&gt;
					&lt;td&gt;可以配置&lt;/td&gt;
					&lt;td&gt;能力成熟、控制细&lt;/td&gt;
					&lt;td&gt;受界面与高级配置范围影响&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;额外状态&lt;/td&gt;
					&lt;td&gt;配置和证书目录&lt;/td&gt;
					&lt;td&gt;配置、证书和相关脚本&lt;/td&gt;
					&lt;td&gt;应用、数据库、证书和生成配置&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;三者都能完成常见的 HTTPS 入口和反向代理。文件配置便于审查和回滚；数据库配置便于界面操作，但备份必须同时覆盖数据库和证书。&lt;/p&gt;</description></item><item><title>域名访问流程详解：从 DNS、TLS、CDN、反向代理到应用</title><link>https://stackonward.com/zh/posts/domain-request-flow/</link><pubDate>Wed, 02 Sep 2026 09:00:00 +0800</pubDate><guid>https://stackonward.com/zh/posts/domain-request-flow/</guid><description>&lt;p&gt;在浏览器输入一个网址后，请求通常要经过 DNS、网络连接、TLS、CDN 或反向代理，最后才到应用。返回的 HTML 也不是终点，浏览器还要继续下载样式、脚本、字体和图片。&lt;a href="https://developer.mozilla.org/zh-CN/docs/Learn_web_development/Getting_started/Web_standards/How_the_web_works" target="_blank" rel="noopener"&gt;MDN 对网页工作方式的说明&lt;span class="sr-only"&gt;（在新标签页打开）&lt;/span&gt;&lt;/a&gt;也把 DNS、HTTP 请求、服务器响应和浏览器组装页面列为连续环节。&lt;/p&gt;</description></item><item><title>Nginx Proxy Manager部署指南 | 可视化管理Nginx反向代理和SSL证书</title><link>https://stackonward.com/zh/posts/nginx-proxy-management/</link><pubDate>Fri, 11 Oct 2024 00:00:32 +0800</pubDate><guid>https://stackonward.com/zh/posts/nginx-proxy-management/</guid><description>&lt;h1 id="自建nginx-proxy-manager"&gt;自建&lt;a href="https://nginxproxymanager.com/guide/#quick-setup" target="_blank" rel="noopener"&gt;Nginx Proxy Manager&lt;span class="sr-only"&gt;（在新标签页打开）&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;前置条件：在服务器安装完成&lt;code&gt;Docker&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="部署npm"&gt;部署NPM&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;创建安装NPM的目录，例如：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo -i
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p /root/data/docker_data/npm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;编辑&lt;code&gt;docker-compose.yml&lt;/code&gt;文件&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /root/data/docker_data/npm
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vim docker-compose.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 输入安装脚本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;version: &lt;span class="s1"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;services:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; app:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: &lt;span class="s1"&gt;&amp;#39;jc21/nginx-proxy-manager:latest&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; restart: unless-stopped
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ports:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="s1"&gt;&amp;#39;80:80&amp;#39;&lt;/span&gt; &lt;span class="c1"&gt;# 保持默认即可，不建议修改左侧的80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="s1"&gt;&amp;#39;81:81&amp;#39;&lt;/span&gt; &lt;span class="c1"&gt;# 冒号左边可以改成自己服务器未被占用的端口&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="s1"&gt;&amp;#39;443:443&amp;#39;&lt;/span&gt; &lt;span class="c1"&gt;# 保持默认即可，不建议修改左侧的443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; volumes:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - ./data:/data &lt;span class="c1"&gt;# 冒号左边可以改路径，现在是表示把数据存放在在当前文件夹下的 data 文件夹中&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - ./letsencrypt:/etc/letsencrypt &lt;span class="c1"&gt;# 冒号左边可以改路径，现在是表示把数据存放在在当前文件夹下的 letsencrypt 文件夹中&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;安装NPM&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /root/data/docker_data/npm
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="4"&gt;
&lt;li&gt;输入 &lt;a href="http://ip:81/" target="_blank" rel="noopener"&gt;http://ip:81&lt;span class="sr-only"&gt;（在新标签页打开）&lt;/span&gt;&lt;/a&gt; 访问&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;默认登陆名和密码：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Email: admin@example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Password: changeme
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="更新-nginx-proxy-manager"&gt;更新 Nginx Proxy Manager&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /root/data/docker_data/npm
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose down
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp -r /root/data/docker_data/npm /root/data/docker_data/npm.archive &lt;span class="c1"&gt;#备份一份数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose pull
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker image prune &lt;span class="c1"&gt;# prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="卸载-nginx-proxy-manager"&gt;卸载 Nginx Proxy Manager&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /root/data/docker_data/npm
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose down
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -rf /root/data/docker_data/npm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="nginx-proxy-manager添加反向代理"&gt;Nginx Proxy Manager添加反向代理&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://images.stackonward.com/md/2024/202410110015772.png" alt="添加反向代理步骤1"&gt;&lt;/p&gt;</description></item></channel></rss>