<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>可视化 on Liangweidong's blog</title><link>https://liangweidonggood.github.io/tags/%E5%8F%AF%E8%A7%86%E5%8C%96/</link><description>Recent content in 可视化 on Liangweidong's blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Mon, 25 Sep 2023 00:00:00 +0800</lastBuildDate><atom:link href="https://liangweidonggood.github.io/tags/%E5%8F%AF%E8%A7%86%E5%8C%96/index.xml" rel="self" type="application/rss+xml"/><item><title>Grafana 可视化面板实战：从部署到匿名访问、中文环境与 InfluxDB 数据源</title><link>https://liangweidonggood.github.io/p/grafana-ke-shi-hua-mian-ban-shi-zhan/</link><pubDate>Mon, 25 Sep 2023 00:00:00 +0800</pubDate><guid>https://liangweidonggood.github.io/p/grafana-ke-shi-hua-mian-ban-shi-zhan/</guid><description>&lt;img src="https://liangweidonggood.github.io/p/grafana-ke-shi-hua-mian-ban-shi-zhan/image/cover.jpg" alt="Featured image of post Grafana 可视化面板实战：从部署到匿名访问、中文环境与 InfluxDB 数据源" /&gt;&lt;p&gt;监控数据再多，没人看就是&amp;quot;装个寂寞&amp;quot;。Grafana 把时序数据（Prometheus、InfluxDB、Elasticsearch、Loki&amp;hellip;）变成&amp;quot;能拖时间范围、能叠多源、能做告警&amp;quot;的可视化面板，几乎是云原生时代仪表盘的事实标准。这篇文章把 Grafana 容器化部署、初始密码、中文环境、匿名访问、配置持久化这些&amp;quot;装上就完事但装的时候总忘&amp;quot;的事整理成一篇。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;阅读对象&lt;/strong&gt;：刚把 Prometheus 装上、想接 Grafana 看图的开发者；或 Grafana 已经跑起来但中文乱码/匿名访问开不了的运维同学&lt;br&gt;
&lt;strong&gt;覆盖范围&lt;/strong&gt;：Grafana 10 容器化部署、初始密码、InluxDB 数据源、匿名访问（grafana.ini 持久化）、时区与中文环境、注意事项&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一为什么是-grafana"&gt;一、为什么是 Grafana
&lt;/h2&gt;&lt;p&gt;Grafana 不是&amp;quot;唯一&amp;quot;的仪表盘，但它的优势是&lt;strong&gt;面板能复用到极致&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;多数据源&lt;/strong&gt;：Prometheus、InfluxDB、Elasticsearch、MySQL、PostgreSQL、Loki、Tempo&amp;hellip; 同一个 Dashboard 拉多个源&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;导入社区仪表盘&lt;/strong&gt;：到 &lt;a class="link" href="https://grafana.com/grafana/dashboards" target="_blank" rel="noopener"
 &gt;https://grafana.com/grafana/dashboards&lt;/a&gt; 搜 ID，30 秒装好一套完整图&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;告警与通知&lt;/strong&gt;：面板里就能定义 alert rule，发邮件/Webhook/钉钉&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多租户&lt;/strong&gt;：Organization / Team / Folder 权限隔离&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;插件丰富&lt;/strong&gt;：官方/社区插件扩展数据源、图表类型、面板组件&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;When to use&lt;/strong&gt;：监控要&amp;quot;展示给人看&amp;quot;时，Grafana 几乎必装。如果你的数据是商业 BI 类（要做月度报表、维度下钻），Grafana 就不是首选了——Superset / Metabase 更合适。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="二容器化部署"&gt;二、容器化部署
&lt;/h2&gt;&lt;h3 id="21-最简单一行"&gt;2.1 最简单一行
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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;docker pull grafana/grafana:10.0.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d --restart&lt;span class="o"&gt;=&lt;/span&gt;always --name&lt;span class="o"&gt;=&lt;/span&gt;grafana -p 3000:3000 grafana/grafana
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;访问 &lt;code&gt;http://{{HOST}}:3000&lt;/code&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;初始账号：&lt;code&gt;admin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;初始密码：&lt;code&gt;admin&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;第一次登录会强制要求改密码（生产环境必须改）。&lt;/p&gt;
&lt;h3 id="22-时区与中文环境"&gt;2.2 时区与中文环境
&lt;/h3&gt;&lt;p&gt;Grafana 默认时区是 UTC，中文界面也有可能因为字体不全出现&amp;quot;豆腐块&amp;quot;。通过环境变量解决：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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;docker run -d --restart&lt;span class="o"&gt;=&lt;/span&gt;always --name&lt;span class="o"&gt;=&lt;/span&gt;grafana &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Asia/Shanghai &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;LANG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;zh_CN.UTF-8 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 3000:3000 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; grafana/grafana
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;TZ 优先级&lt;/strong&gt;：Grafana 启动时会把 &lt;code&gt;TZ&lt;/code&gt; 写到容器内 &lt;code&gt;/etc/localtime&lt;/code&gt;，但&lt;strong&gt;部分版本&lt;/strong&gt;仍要靠挂载宿主机时区文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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;-v /etc/localtime:/etc/localtime:ro
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;保险起见两个都加。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="23-host-网络模式"&gt;2.3 host 网络模式
&lt;/h3&gt;&lt;p&gt;如果 Grafana 和后端服务在同一台机器，用 &lt;code&gt;--net=host&lt;/code&gt; 可以避免端口映射带来的 trace 调用异常：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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;docker run -d --restart&lt;span class="o"&gt;=&lt;/span&gt;always --name&lt;span class="o"&gt;=&lt;/span&gt;grafana --net&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Asia/Shanghai -e &lt;span class="nv"&gt;LANG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;zh_CN.UTF-8 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; grafana/grafana
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="三添加数据源"&gt;三、添加数据源
&lt;/h2&gt;&lt;p&gt;Grafana 的核心是&amp;quot;数据源 + 仪表盘&amp;quot;。进入 &lt;code&gt;Configuration → Data Sources → Add data source&lt;/code&gt;，能看到几十种数据源选项。&lt;/p&gt;
&lt;h3 id="31-prometheus"&gt;3.1 Prometheus
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Type: &lt;code&gt;Prometheus&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;URL: &lt;code&gt;http://{{PROM_HOST}}:9090&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;其它默认即可&lt;/li&gt;
&lt;li&gt;点击 &lt;code&gt;Save &amp;amp; test&lt;/code&gt;，绿色 &lt;code&gt;Data source is working&lt;/code&gt; 出现即成功&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="32-influxdb时序数据库"&gt;3.2 InfluxDB（时序数据库）
&lt;/h3&gt;&lt;p&gt;InfluxDB v1/v2 的接入参数略有不同：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Type: &lt;code&gt;InfluxDB&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;URL: &lt;code&gt;http://{{INFLUXDB_HOST}}:8086&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Database: 填库名&lt;/li&gt;
&lt;li&gt;User / Password: 填凭据&lt;/li&gt;
&lt;li&gt;HTTP Header: 如 &lt;code&gt;Authorization: Token {{TOKEN}}&lt;/code&gt;（v2 必需）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;测试连接成功后，在 Explore 面板里写 Flux 或 InfluxQL 即可查数据。&lt;/p&gt;
&lt;h3 id="33-loki日志"&gt;3.3 Loki（日志）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Type: &lt;code&gt;Loki&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;URL: &lt;code&gt;http://{{LOKI_HOST}}:3100&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;详细看 &lt;a class="link" href="https://liangweidonggood.github.io/p/loki-promtail-ri-zhi-jia-gou/" &gt;Loki + Promtail 日志架构&lt;/a&gt; 一文。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="34-人员定位面板业务-demo"&gt;3.4 人员定位面板（业务 Demo）
&lt;/h3&gt;&lt;p&gt;早期有人拿 Grafana 做过 UWB/蓝牙定位的&amp;quot;实时位置面板&amp;quot;——把人员坐标入库到 InfluxDB，Grafana 用 &lt;code&gt;geomap&lt;/code&gt; / &lt;code&gt;table&lt;/code&gt; / &lt;code&gt;stat&lt;/code&gt; 面板做实时展示。这种&amp;quot;业务可视化&amp;quot;用法比传统 BI 轻量很多，配置简单、刷新及时。&lt;/p&gt;
&lt;h2 id="四匿名访问"&gt;四、匿名访问
&lt;/h2&gt;&lt;p&gt;生产环境往往需要&amp;quot;未登录用户也能看图&amp;quot;——大屏监控、嵌入式展示、给非技术人员查指标。Grafana 通过 &lt;code&gt;grafana.ini&lt;/code&gt; 里的 &lt;code&gt;[auth.anonymous]&lt;/code&gt; 段开启。&lt;/p&gt;
&lt;h3 id="41-直接改容器内配置"&gt;4.1 直接改容器内配置
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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;docker &lt;span class="nb"&gt;exec&lt;/span&gt; -it grafana /bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vi /etc/grafana/grafana.ini
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;找到 &lt;code&gt;[auth.anonymous]&lt;/code&gt; 段，修改：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[auth.anonymous]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# enable anonymous access&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;enabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&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;&lt;span class="c1"&gt;# specify organization name that should be used for unauthenticated users&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;org_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Main Org.&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;&lt;span class="c1"&gt;# specify role for unauthenticated users&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;org_role&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Viewer&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;&lt;span class="c1"&gt;# mask the Grafana version number for unauthenticated users&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;hide_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;坑&lt;/strong&gt;：发现改不了——容器内 &lt;code&gt;/etc/grafana/grafana.ini&lt;/code&gt; 在某些镜像版本是只读，必须停掉容器后挂载出来改（见 4.2）。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="42-配置持久化推荐"&gt;4.2 配置持久化（推荐）
&lt;/h3&gt;&lt;p&gt;把 &lt;code&gt;grafana.ini&lt;/code&gt; 复制出来，挂载进容器：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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;mkdir -p /home/docker/grafana/conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker cp grafana:/etc/grafana/grafana.ini /home/docker/grafana/conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vim /home/docker/grafana/conf/grafana.ini
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;启动时挂载：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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;docker run -d --restart&lt;span class="o"&gt;=&lt;/span&gt;always --name&lt;span class="o"&gt;=&lt;/span&gt;grafana &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Asia/Shanghai -e &lt;span class="nv"&gt;LANG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;zh_CN.UTF-8 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 3000:3000 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /home/docker/grafana/conf/grafana.ini:/etc/grafana/grafana.ini &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; grafana/grafana
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;或 docker-compose：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;grafana&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;grafana&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;grafana/grafana:latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;TZ=Asia/Shanghai&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;LANG=zh_CN.UTF-8&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;3000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;/home/docker/grafana/conf/grafana.ini:/etc/grafana/grafana.ini&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;改完配置要重启&lt;/strong&gt;：&lt;code&gt;docker restart grafana&lt;/code&gt; 让新配置生效。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="五推荐仪表盘dashboard-id"&gt;五、推荐仪表盘（Dashboard ID）
&lt;/h2&gt;&lt;p&gt;到 &lt;a class="link" href="https://grafana.com/grafana/dashboards" target="_blank" rel="noopener"
 &gt;https://grafana.com/grafana/dashboards&lt;/a&gt; 搜 ID 即可导入：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;监控对象&lt;/th&gt;
					&lt;th&gt;推荐 Dashboard ID&lt;/th&gt;
					&lt;th&gt;用途&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Linux 主机&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;11074&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Node Exporter Full（CPU/内存/磁盘/网络/内核）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Windows 主机&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;10467&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Windows 主机全量指标&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;MySQL&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;7362&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;MySQL Overview（连接/QPS/慢查询/缓冲池）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Docker 容器&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;10619&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;cAdvisor（容器 CPU/内存/网络/IO）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Redis&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;11835&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Redis 监控&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Nginx&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;9614&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Nginx 日志/请求/状态码分析&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JVM&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;4701&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Java 应用堆/线程/GC&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;导入流程&lt;/strong&gt;：Grafana → &lt;code&gt;+&lt;/code&gt; → &lt;code&gt;Import&lt;/code&gt; → 输入 Dashboard ID → 选数据源 → 完成。约 30 秒就能看到十几张图。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="六踩坑清单"&gt;六、踩坑清单
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;改 &lt;code&gt;grafana.ini&lt;/code&gt; 不生效&lt;/strong&gt;——容器内文件只读，参考 4.2 挂载出来&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;忘记初始密码&lt;/strong&gt;——容器没挂载数据库时，数据存在容器内 &lt;code&gt;/var/lib/grafana&lt;/code&gt;。&lt;code&gt;docker volume rm&lt;/code&gt; 重置&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中文显示豆腐块&lt;/strong&gt;——字体不全，加 &lt;code&gt;-e LANG=zh_CN.UTF-8&lt;/code&gt; + 主机字体 &lt;code&gt;fonts-noto-cjk&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;时间不对&lt;/strong&gt;——时区没设对，Grafana 默认 UTC，业务日志要 &lt;code&gt;Asia/Shanghai&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;导入仪表盘数据为空&lt;/strong&gt;——Dashboard 自带数据源变量 &lt;code&gt;DS_PROMETHEUS&lt;/code&gt;，导入时要选实际的数据源&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;大屏刷新卡顿&lt;/strong&gt;——Dashboard 太多 Panel、Datasource 查询慢、Chrome 内存爆。优化方向：减少 Panel 数量、降低刷新频率、用 &lt;code&gt;time range from&lt;/code&gt; 限制数据范围&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="七2024-视角补充"&gt;七、2024+ 视角补充
&lt;/h2&gt;&lt;p&gt;本文写于 2023-09，2024-2026 期间 Grafana 关键演进：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Grafana 11.x&lt;/strong&gt;（2024）+ &lt;strong&gt;Grafana 12.x&lt;/strong&gt;（2025）：&lt;strong&gt;Drilldown / Explore 全面重构&lt;/strong&gt;、&lt;strong&gt;Scene 框架&lt;/strong&gt;（App SDK）让自定义面板开发更轻量&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grafana Loki 3.x&lt;/strong&gt;（2024-2026）配合：对象存储全面支持 S3 兼容、GCS、Azure Blob，&lt;strong&gt;日志查询性能 10x 提升&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grafana Mimir / Pyroscope / Beyla&lt;/strong&gt;：Metrics / Continuous Profiling / eBPF Auto-instrumentation 一站式可观测&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grafana 11+ IRM（Incident Response Management）&lt;/strong&gt;：内置 oncall 值班 / 事件管理 / Postmortem 模板，&lt;strong&gt;逐步替代 PagerDuty / Opsgenie 部分场景&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 助手 Grafana LLM&lt;/strong&gt;（2024-Q3 试验）：用自然语言生成 PromQL，2025 起仍是早期功能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grafana Faro&lt;/strong&gt;（RUM）：Web 端真实用户监控 SDK，前端可观测性补齐&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;实战建议（2025-2026 视角）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Grafana 11.x / 12.x + Loki 3.x + Prometheus 3.x + Mimir&lt;/strong&gt; 是云原生可观测的&amp;quot;标准四件套&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;K8s 场景&lt;/strong&gt;优先 Grafana Helm Chart 一键部署&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;国产可观测&lt;/strong&gt;（夜莺 / FlashDuty）2024+ 与 Grafana 体系深度集成，可作为 oncall 补充&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="八参考资料"&gt;八、参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Grafana 官方文档：https://grafana.com/docs/grafana/latest/&lt;/li&gt;
&lt;li&gt;社区仪表盘：https://grafana.com/grafana/dashboards&lt;/li&gt;
&lt;li&gt;配置文件参考：https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="下一步"&gt;下一步
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;监控那层用 Prometheus？→ 看 &lt;a class="link" href="https://liangweidonggood.github.io/p/prometheus-jian-kong-gao-jing-ti-xi/" &gt;Prometheus 监控告警体系&lt;/a&gt; 一文&lt;/li&gt;
&lt;li&gt;日志也想接 Grafana？→ &lt;a class="link" href="https://liangweidonggood.github.io/p/loki-promtail-ri-zhi-jia-gou/" &gt;Loki + Promtail 日志架构&lt;/a&gt; 一文&lt;/li&gt;
&lt;li&gt;不想自己拼装？→ &lt;a class="link" href="https://liangweidonggood.github.io/p/hertzbeat-qing-liang-jian-kong-gao-jing/" &gt;HertzBeat 轻量监控告警&lt;/a&gt; 把监控+告警+可视化打包到一容器&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Portainer 容器可视化管理：单 Docker 与集群一站搞定</title><link>https://liangweidonggood.github.io/p/portainer-rong-qi-ke-shi-hua-guan-li/</link><pubDate>Wed, 15 Mar 2023 00:00:00 +0800</pubDate><guid>https://liangweidonggood.github.io/p/portainer-rong-qi-ke-shi-hua-guan-li/</guid><description>&lt;img src="https://liangweidonggood.github.io/p/portainer-rong-qi-ke-shi-hua-guan-li/image/cover.jpg" alt="Featured image of post Portainer 容器可视化管理：单 Docker 与集群一站搞定" /&gt;&lt;p&gt;命令行的 &lt;code&gt;docker ps&lt;/code&gt;、&lt;code&gt;docker logs&lt;/code&gt; 用得再熟，新人 onboard 时一句&amp;quot;这容器跑哪了&amp;quot;还是能把人问住。Portainer 就是一个&amp;quot;看得见的 Docker 管理面板&amp;quot;——容器、镜像、网络、存储卷、用户、权限，一站式在 Web 界面操作，&lt;strong&gt;特别适合给非运维同学用&lt;/strong&gt;。这篇文章讲清楚容器化部署、Socket 挂载、初始账号、单 Docker / 集群模式选择。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;阅读对象&lt;/strong&gt;：想给团队/客户提供一个&amp;quot;点开就能用&amp;quot;的 Docker 管理界面的同学&lt;br&gt;
&lt;strong&gt;覆盖范围&lt;/strong&gt;：Portainer CE 容器化部署、Docker Socket 挂载、初始账号、单 Docker 模式 / Swarm 模式 / K8s 模式差异&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一为什么是-portainer"&gt;一、为什么是 Portainer
&lt;/h2&gt;&lt;p&gt;容器管理工具不少，但定位不同：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;工具&lt;/th&gt;
					&lt;th&gt;定位&lt;/th&gt;
					&lt;th&gt;适用场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Portainer CE&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;通用、轻量、社区版&lt;/td&gt;
					&lt;td&gt;单 Docker / 小团队 / 给非运维用&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Rancher&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;重量级、企业 K8s 管理&lt;/td&gt;
					&lt;td&gt;多 K8s 集群管理（已转型到 Rancher Prime）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Docker Desktop&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;本地开发&lt;/td&gt;
					&lt;td&gt;macOS / Windows 上单机使用&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Lazydocker&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;TUI&lt;/td&gt;
					&lt;td&gt;命令行党、SSH 远程&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Cockpit + podman&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;系统管理&lt;/td&gt;
					&lt;td&gt;RHEL 系&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Portainer 的&amp;quot;杀手锏&amp;quot;是&lt;strong&gt;零学习成本&lt;/strong&gt;——只要能开浏览器就能用 docker，比着文档点点鼠标就能拉镜像、起容器、看日志。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;When to use&lt;/strong&gt;：当你的团队里有人不熟 docker 命令行，或者要给客户演示/验收容器部署，Portainer 几乎是不二之选。如果只是个人开发用，且只需要起一两个容器，Portainer 会&amp;quot;杀鸡用牛刀&amp;quot;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="二容器化部署"&gt;二、容器化部署
&lt;/h2&gt;&lt;h3 id="21-单-docker-模式最常见"&gt;2.1 单 Docker 模式（最常见）
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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;docker run -d &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --restart&lt;span class="o"&gt;=&lt;/span&gt;unless-stopped &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name portainer &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 9900:9000 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /var/run/docker.sock:/var/run/docker.sock &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /home/docker/portainer/data:/data &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; portainer/portainer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;挂载说明：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;挂载点&lt;/th&gt;
					&lt;th&gt;作用&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;接管宿主机 Docker Daemon，让 Portainer 能 list/start/stop 容器&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;/home/docker/portainer/data:/data&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Portainer 自己的数据（账号、配置、堆栈）持久化&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;访问 &lt;code&gt;http://{{HOST}}:9900&lt;/code&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首次进入会要求设置 &lt;code&gt;admin&lt;/code&gt; 账号（不是默认账号！）&lt;/li&gt;
&lt;li&gt;然后选择 &amp;ldquo;Get started&amp;rdquo; / &amp;ldquo;Local&amp;rdquo; 进入单 Docker 模式&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-初始账号"&gt;2.2 初始账号
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;重要&lt;/strong&gt;：新版本 Portainer &lt;strong&gt;不再有默认账号&lt;/strong&gt;，首次启动强制让你创建 admin 账号（最少 12 位密码）。网上很多老教程说&amp;quot;admin/admin123456789&amp;quot;那是过期文档。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="23-community-edition-vs-business-edition"&gt;2.3 Community Edition vs Business Edition
&lt;/h3&gt;&lt;p&gt;Portainer 有两个版本：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CE（Community Edition）&lt;/strong&gt;：免费，单一环境（单 Docker / 单 Swarm / 单 K8s），基础 RBAC&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BE（Business Edition）&lt;/strong&gt;：商业授权，多环境管理、LDAP/AD 集成、细粒度 RBAC、合规审计&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;绝大多数中小团队用 CE 足够&lt;/strong&gt;。如果企业有合规、审计、SSO 需求，再考虑 BE。&lt;/p&gt;
&lt;h2 id="三核心功能"&gt;三、核心功能
&lt;/h2&gt;&lt;p&gt;进入 Portainer 后，左侧导航是核心功能区：&lt;/p&gt;
&lt;h3 id="31-stackscompose-一键部署"&gt;3.1 Stacks（Compose 一键部署）
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Stacks → Add stack&lt;/code&gt;，把 &lt;code&gt;docker-compose.yml&lt;/code&gt; 内容贴进去（支持 Git 仓库、Web editor、Upload），点 &lt;code&gt;Deploy&lt;/code&gt; 就能拉起一整套服务。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;3&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;redis:7-alpine&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;6379&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;6379&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postgres&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;postgres:15-alpine&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;{{REDACTED}}&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;pgdata:/var/lib/postgresql/data&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;pgdata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;变量插值&lt;/strong&gt;：Portainer 支持 &lt;code&gt;{{VAR}}&lt;/code&gt; 占位符，在 Stack 部署时填入。&lt;strong&gt;不要&lt;/strong&gt;把明文密码写进 yaml 文件，用环境变量注入。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="32-containers--images--volumes--networks"&gt;3.2 Containers / Images / Volumes / Networks
&lt;/h3&gt;&lt;p&gt;点进去就能 list、inspect、start、stop、kill、remove、exec。&lt;code&gt;Container logs&lt;/code&gt; 还支持 &lt;code&gt;tail -f&lt;/code&gt; 实时跟随——比 SSH 进去 &lt;code&gt;docker logs -f&lt;/code&gt; 还方便。&lt;/p&gt;
&lt;h3 id="33-swarm-模式多节点"&gt;3.3 Swarm 模式（多节点）
&lt;/h3&gt;&lt;p&gt;如果宿主机是 Docker Swarm 集群，Portainer 能识别并显示所有 worker 节点，统一管理。前提是 Swarm 集群已经初始化：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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;docker swarm init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;集群里其它节点执行 &lt;code&gt;docker swarm join --token ...&lt;/code&gt; 加入后，Portainer 自动发现。&lt;/p&gt;
&lt;h3 id="34-k8s-模式"&gt;3.4 K8s 模式
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Add Environment → Kubernetes&lt;/code&gt;，填 kubeconfig 或者 service account，就能把 Portainer 接到 K8s 集群。但 K8s 模式功能比 CE 版还基础（命名空间、Deployment、Service、Pod 管理），&lt;strong&gt;复杂场景推荐用 Rancher / Lens / Octant&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="四生产环境建议"&gt;四、生产环境建议
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;不要把 Portainer 暴露到公网&lt;/strong&gt;——9000 端口直接对外是&amp;quot;裸奔&amp;quot;，&lt;code&gt;docker.sock&lt;/code&gt; 挂载意味着谁拿到 Portainer 就能控制宿主机所有容器&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用 Nginx / Caddy 反向代理&lt;/strong&gt;——加 HTTPS、加 basic auth、加 IP 白名单&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;管理员账号&lt;/strong&gt;——设置复杂的 12+ 位密码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据备份&lt;/strong&gt;——&lt;code&gt;/home/docker/portainer/data&lt;/code&gt; 整个目录定期 &lt;code&gt;tar&lt;/code&gt; 备份&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;升级&lt;/strong&gt;——&lt;code&gt;docker pull portainer/portainer &amp;amp;&amp;amp; docker restart portainer&lt;/code&gt;，但要看 release notes 注意破坏性变更&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="五踩坑清单"&gt;五、踩坑清单
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;看不到容器&lt;/strong&gt;——&lt;code&gt;/var/run/docker.sock&lt;/code&gt; 没挂载，Portainer 只是空壳。检查挂载路径&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stacks 部署失败不报错&lt;/strong&gt;——看 &lt;code&gt;Events&lt;/code&gt; 标签页，docker daemon 的报错会写在那里&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Container 控制台中文乱码&lt;/strong&gt;——容器本身的 locale 问题，进 &lt;code&gt;Exec&lt;/code&gt; 之前先 &lt;code&gt;export LANG=C.UTF-8&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Image 拉取超时&lt;/strong&gt;——Portainer 不会自动用 daemon.json 里的 mirror，但 docker daemon 会（继承宿主配置），所以本质上不影响&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多用户场景&lt;/strong&gt;——CE 版的 RBAC 很基础（只支持 owner / administrator / operator / viewer 四种角色），复杂权限需要 BE&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="六2024-视角补充"&gt;六、2024+ 视角补充
&lt;/h2&gt;&lt;p&gt;本文写于 2023-03，2024-2026 期间 Portainer 有几个显著演进：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Portainer CE 2.20+（2024 主流版本）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Edge Agent 模式强化&lt;/strong&gt;：分布式 IoT / 多机房场景下，Edge Agent 可以主动连中心 Portainer（出站 NAT 友好）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitOps 集成&lt;/strong&gt;：Stack 支持从 Git 仓库自动同步（Git pull = 自动 deploy），&lt;strong&gt;2024 起成为 CE 版的内置能力&lt;/strong&gt;（之前是 BE 专属）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RBAC 增强&lt;/strong&gt;：CE 版 RBAC 从 4 个角色（owner / administrator / operator / viewer）扩展到可自定义团队 + 资源访问控制（Namespace 级 / Stack 级 / Container 级）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;K8s 体验大幅提升&lt;/strong&gt;：之前 CE 版 K8s 模式功能很基础，2.20+ 加入 Helm chart 部署、ConfigMap / Secret 管理、Ingress 编辑&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Container Management 之外的扩展&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Homepage / Dashboard 定制&lt;/strong&gt;：每个用户可设自己的首页（&amp;ldquo;我关心的容器&amp;rdquo;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通知集成扩展&lt;/strong&gt;：Slack / Microsoft Teams / Email / webhook / &lt;strong&gt;PagerDuty&lt;/strong&gt; / &lt;strong&gt;Opsgenie&lt;/strong&gt;——alert rule 可直接推 oncall&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;审计日志&lt;/strong&gt;：CE 2.21+ 内置审计日志（之前是 BE 专属），合规场景可用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;备份 / 恢复&lt;/strong&gt;：Stack 级别的&amp;quot;Export / Import&amp;quot;——开发→测试→生产用同一份 stack 配置&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Portainer 替代品（2024 视野）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rancher Prime&lt;/strong&gt;（2024 改名，原 Rancher）：SUSE 把 Rancher 商业化转型，企业 K8s 多集群管理首选&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lens&lt;/strong&gt;：IDE 风格的 K8s 管理工具，免费，桌面应用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenLens&lt;/strong&gt;：Lens 6 后部分闭源，OpenLens 是 fork 继续开源&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Headlamp&lt;/strong&gt;：Kubernetes 官方推荐的 Web UI（取代老旧的 Dashboard）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LazyDocker&lt;/strong&gt;：终端党 2024 仍活跃&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CasaOS / Cosmos&lt;/strong&gt;：家用 NAS / 小团队 2024+ 更推荐（Portainer 偏运维，CasaOS 偏普通人）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;安全更新&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Portainer 2024 年修复过几个&lt;strong&gt;严重 RCE&lt;/strong&gt;（CVE-2024-21xxx），&lt;strong&gt;必须升 2.20.3+&lt;/strong&gt; 才是安全版本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker socket 挂载是核心风险&lt;/strong&gt;：2024 起官方推荐用 &lt;strong&gt;Docker Socket Proxy&lt;/strong&gt;（tecnativa/docker-socket-proxy）做&amp;quot;最小权限代理&amp;quot;，避免 Portainer 一旦被攻破就拿整个宿主机&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2FA 强制开启&lt;/strong&gt;：CE 2.18+ 强制所有 admin 必须配 2FA（之前是可选）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;实战用法变化（2024 视角）&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;+ Diun&lt;/strong&gt; 自动检测镜像更新 → Portainer 推送通知&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;+ Watchtower&lt;/strong&gt; 自动升级非关键容器&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;+ Traefik / Caddy&lt;/strong&gt; 自动 HTTPS 终结（Portainer 仍主攻容器编排，HTTPS 让专门的反向代理做）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;+ Headlamp&lt;/strong&gt; 管理 K8s 集群（Portainer 主攻 Docker，K8s 用专门工具）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;经验法则更新&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Docker 单机 / 小团队&lt;/strong&gt; → &lt;strong&gt;Portainer CE 2.20+&lt;/strong&gt; 仍是 2024+ 首选&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;K8s 集群&lt;/strong&gt; → 优先 &lt;strong&gt;Rancher Prime&lt;/strong&gt; / &lt;strong&gt;Lens&lt;/strong&gt; / &lt;strong&gt;Headlamp&lt;/strong&gt;，Portainer K8s 模式为辅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;家用 / 个人&lt;/strong&gt; → CasaOS 更轻量更易用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;大企业 / 合规&lt;/strong&gt; → Portainer BE 仍是合规审计好选择&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="七参考资料"&gt;七、参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Portainer 官方文档：https://docs.portainer.io/&lt;/li&gt;
&lt;li&gt;社区版 vs 商业版：https://www.portainer.io/products&lt;/li&gt;
&lt;li&gt;Docker Compose 规范：https://docs.docker.com/compose/compose-file/&lt;/li&gt;
&lt;li&gt;Portainer 安全公告：https://github.com/portainer/portainer/security/advisories&lt;/li&gt;
&lt;li&gt;Docker Socket Proxy：&lt;a class="link" href="https://github.com/tecnativa/docker-socket-proxy" target="_blank" rel="noopener"
 &gt;github.com/tecnativa/docker-socket-proxy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Headlamp K8s UI：&lt;a class="link" href="https://headlamp.io/" target="_blank" rel="noopener"
 &gt;headlamp.io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="下一步"&gt;下一步
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;想管 K8s 集群？→ 看 &lt;a class="link" href="https://liangweidonggood.github.io/p/prometheus-jian-kong-gao-jing-ti-xi/" &gt;Prometheus 监控告警体系&lt;/a&gt; 一文&lt;/li&gt;
&lt;li&gt;一站式监控+告警？→ &lt;a class="link" href="https://liangweidonggood.github.io/p/hertzbeat-qing-liang-jian-kong-gao-jing/" &gt;HertzBeat 轻量监控告警&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;想用 PaaS？→ &lt;a class="link" href="https://liangweidonggood.github.io/p/erda-yun-yuan-sheng-paas/" &gt;Erda 云原生 PaaS&lt;/a&gt; 一文&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>nginxWebUI 可视化配置：图形化管理 Nginx 反向代理与证书</title><link>https://liangweidonggood.github.io/p/nginxwebui-ke-shi-hua-pei-zhi/</link><pubDate>Thu, 15 Mar 2018 00:00:00 +0800</pubDate><guid>https://liangweidonggood.github.io/p/nginxwebui-ke-shi-hua-pei-zhi/</guid><description>&lt;img src="https://liangweidonggood.github.io/p/nginxwebui-ke-shi-hua-pei-zhi/image/cover.jpg" alt="Featured image of post nginxWebUI 可视化配置：图形化管理 Nginx 反向代理与证书" /&gt;&lt;h2 id="背景"&gt;背景
&lt;/h2&gt;&lt;p&gt;直接编辑 &lt;code&gt;nginx.conf&lt;/code&gt; 对老手不是问题，但对&lt;strong&gt;多机器、多域名、多证书&lt;/strong&gt;的场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;10 台机器的 Nginx 配置&lt;strong&gt;逐个 scp + reload&lt;/strong&gt;，效率低&lt;/li&gt;
&lt;li&gt;Let&amp;rsquo;s Encrypt 证书 90 天过期，&lt;strong&gt;每次手动续期&lt;/strong&gt;累&lt;/li&gt;
&lt;li&gt;反代配置改一行，要 grep + vim + nginx -t + reload 反复验证&lt;/li&gt;
&lt;li&gt;团队里新人不会写 nginx.conf&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;nginxWebUI&lt;/strong&gt;（&lt;a class="link" href="https://github.com/cym1102/nginxWebUI" target="_blank" rel="noopener"
 &gt;cym1102/nginxWebUI&lt;/a&gt;）是国产开源的&lt;strong&gt;Nginx 图形化管理工具&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Web 界面&lt;/strong&gt;配置 server、location、upstream、SSL&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可视化&lt;/strong&gt;反向代理、负载均衡、HTTPS、HTTP/2&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;证书申请&lt;/strong&gt;支持 Let&amp;rsquo;s Encrypt（DNS 验证）+ 自有证书&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;集群同步&lt;/strong&gt;多台 Nginx 配置一致&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;参数模板&lt;/strong&gt;常用片段（WebSocket、HTTPS、限流）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;中小企业&lt;strong&gt;多机器&lt;/strong&gt;统一配置&lt;/li&gt;
&lt;li&gt;不熟悉 nginx.conf 的&lt;strong&gt;运维新人&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;大量&lt;strong&gt;多域名&lt;/strong&gt;业务（虚拟主机）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;证书自动续期&lt;/strong&gt; + 同步&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;前置知识&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nginx 基础&lt;/li&gt;
&lt;li&gt;一台已装 Nginx 1.16+ 的 Linux 机器&lt;/li&gt;
&lt;li&gt;JDK 1.8（运行 Spring Boot）&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;重要原则&lt;/strong&gt;：nginxWebUI 直接&lt;strong&gt;修改&lt;/strong&gt;&lt;code&gt;nginx.conf&lt;/code&gt; 并 reload，&lt;strong&gt;所有手工编辑的注释必须用 &lt;code&gt;# nginxWebUI&lt;/code&gt; 标记&lt;/strong&gt;（避免被覆盖）。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一架构"&gt;一、架构
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;┌──────────────────┐&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;nginxWebUI&lt;/span&gt; &lt;span class="n"&gt;Web&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="err"&gt;用户浏览器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Spring&lt;/span&gt; &lt;span class="n"&gt;Boot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8082&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;└────────┬─────────┘&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;┌──────┴──────┐&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;┌────▼─────┐&lt;/span&gt; &lt;span class="err"&gt;┌────▼─────┐&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;Nginx&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;配置文件&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nginxWebUI&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;模板、&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;reload&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;证书、&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;└──────────┘&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;集群配置&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;└──────────┘&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键路径&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web UI：&lt;code&gt;http://&amp;lt;ip&amp;gt;:8080&lt;/code&gt;（默认）&lt;/li&gt;
&lt;li&gt;项目目录：&lt;code&gt;/home/nginxWebUI/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;配置文件：&lt;code&gt;/home/nginxWebUI/conf/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;证书目录：&lt;code&gt;/home/nginxWebUI/.acme.sh/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二前置工作"&gt;二、前置工作
&lt;/h2&gt;&lt;h3 id="21-安装-jdk-18"&gt;2.1 安装 JDK 1.8
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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="c1"&gt;# 下载并解压&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -O https://example.com/jdk-8u381-linux-x64.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar -xzvf jdk-8u381-linux-x64.tar.gz -C /usr/local
&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;cat &amp;lt;&amp;lt; &lt;span class="s2"&gt;&amp;#34;EOF&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/profile
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;JAVA_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/jdk1.8.0_381
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;CLASSPATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$JAVA_HOME&lt;/span&gt;/bin:&lt;span class="nv"&gt;$JAVA_HOME&lt;/span&gt;/lib:&lt;span class="nv"&gt;$JAVA_HOME&lt;/span&gt;/jre/lib
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;.:&lt;span class="nv"&gt;$JAVA_HOME&lt;/span&gt;/bin:&lt;span class="nv"&gt;$JAVA_HOME&lt;/span&gt;/jre/bin:&lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EOF
&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;&lt;span class="nb"&gt;source&lt;/span&gt; /etc/profile
&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;java -version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# java version &amp;#34;1.8.0_381&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="22-准备-nginx"&gt;2.2 准备 Nginx
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;编译选项必须包含&lt;/strong&gt;（缺哪个就重编）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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;nginx -V
&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;&lt;span class="c1"&gt;# --with-http_ssl_module HTTPS 必备&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --with-http_stub_status_module 状态监控&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --with-pcre 正则&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --with-http_gzip_static_module 静态压缩&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --with-stream TCP/UDP 四层代理&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --with-stream_ssl_module TCP SSL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果没有 &lt;code&gt;--with-stream&lt;/code&gt;，重编译：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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;./configure --prefix&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/nginx &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --with-http_ssl_module &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --with-http_stub_status_module &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --with-pcre &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --with-http_gzip_static_module &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --with-stream &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --with-stream_ssl_module
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;把 nginx 加入 PATH&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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;cat &amp;lt;&amp;lt; &lt;span class="s2"&gt;&amp;#34;EOF&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/profile
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;:/usr/local/nginx/sbin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; PATH
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; /etc/profile
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nginx -V
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="三安装-nginxwebui"&gt;三、安装 nginxWebUI
&lt;/h2&gt;&lt;h3 id="31-下载-jar"&gt;3.1 下载 jar
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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;mkdir -p /home/nginxWebUI/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget -O /home/nginxWebUI/nginxWebUI.jar &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; https://gitee.com/cym1102/nginxWebUI/releases/download/4.3.0/nginxWebUI-4.3.0.jar
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;版本选择&lt;/strong&gt;：4.x 需要 JDK 11+，4.2.x 兼容 JDK 1.8。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="32-启动测试"&gt;3.2 启动（测试）
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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;nohup java -jar -Dfile.encoding&lt;span class="o"&gt;=&lt;/span&gt;UTF-8 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /home/nginxWebUI/nginxWebUI.jar &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --server.port&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --project.home&lt;span class="o"&gt;=&lt;/span&gt;/home/nginxWebUI/ &amp;gt; /dev/null &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="33-systemd-守护生产推荐"&gt;3.3 systemd 守护（生产推荐）
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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;cat &amp;lt;&amp;lt; &lt;span class="s2"&gt;&amp;#34;EOF&amp;#34;&lt;/span&gt; &amp;gt; /etc/systemd/system/nginxwebui.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;Unit&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;NginxWebUI
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;After&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;syslog.target
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;After&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;network.target
&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="o"&gt;[&lt;/span&gt;Service&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;simple
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;User&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;root
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Group&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;root
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WorkingDirectory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/nginxWebUI
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/jdk1.8.0_381/bin/java -jar -Dfile.encoding&lt;span class="o"&gt;=&lt;/span&gt;UTF-8 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /home/nginxWebUI/nginxWebUI.jar --server.port&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;8082&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;always
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ReStartSec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;600&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;&lt;span class="o"&gt;[&lt;/span&gt;Install&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EOF
&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;systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now nginxwebui.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl status nginxwebui.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="四首次登录"&gt;四、首次登录
&lt;/h2&gt;&lt;h3 id="41-访问"&gt;4.1 访问
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;http://&amp;lt;server-ip&amp;gt;:8082
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="42-修改默认密码"&gt;4.2 修改默认密码
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;第一次登录&lt;/strong&gt;会要求修改默认账号（默认 &lt;code&gt;admin&lt;/code&gt; / &lt;code&gt;nginxWebUI&lt;/code&gt; 或类似，取决于版本）。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;必须改强密码&lt;/strong&gt;——这个 Web 界面一旦被破，攻击者直接控制你的 Nginx。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="43-主界面"&gt;4.3 主界面
&lt;/h3&gt;&lt;p&gt;登录后看到 5 大模块：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;反向代理&lt;/strong&gt;：可视化配置 server/location/upstream&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;证书管理&lt;/strong&gt;：Let&amp;rsquo;s Encrypt 申请 + 续期&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;参数模板&lt;/strong&gt;：常用片段（WebSocket、HTTPS、限流）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;集群管理&lt;/strong&gt;：多机器同步&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;系统设置&lt;/strong&gt;：日志、备份、安全&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="五反向代理实战"&gt;五、反向代理实战
&lt;/h2&gt;&lt;h3 id="51-创建一个-http-反代"&gt;5.1 创建一个 HTTP 反代
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;反向代理 → 创建&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;名称：blog-app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;监听端口：80
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;域名：blog.example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;上游地址：127.0.0.1:3000
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;nginxWebUI 自动生成：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;blog.example.com&lt;/span&gt;&lt;span class="p"&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; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://127.0.0.1:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="52-https--websocket-模板"&gt;5.2 HTTPS + WebSocket 模板
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;反向代理 → 编辑 → 启用 SSL&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;证书：选择 let&amp;#39;s encrypt 自动申请
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;强制 HTTPS：是
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;模板：WebSocket
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;自动生成：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;blog.example.com&lt;/span&gt;&lt;span class="p"&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; &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt; &lt;span class="s"&gt;/home/nginxWebUI/.acme.sh/blog.example.com/fullchain.cer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="s"&gt;/home/nginxWebUI/.acme.sh/blog.example.com/blog.example.com.key&lt;/span&gt;&lt;span class="p"&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; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://127.0.0.1:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_http_version&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="s"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Upgrade&lt;/span&gt; &lt;span class="nv"&gt;$http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Connection&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;upgrade&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# WebSocket 超时
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_read_timeout&lt;/span&gt; &lt;span class="s"&gt;600s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="53-负载均衡"&gt;5.3 负载均衡
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;上游 → 创建&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;名称：api-pool
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;负载策略：ip_hash（会话保持）
&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; - 10.0.1.10:8080
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 10.0.1.11:8080
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - 10.0.1.12:8080
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;在反代 location 选 &lt;code&gt;api-pool&lt;/code&gt;，自动生成：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;upstream&lt;/span&gt; &lt;span class="s"&gt;api-pool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ip_hash&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="n"&gt;10.0.1.10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="n"&gt;10.0.1.11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="n"&gt;10.0.1.12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="54-重载配置"&gt;5.4 重载配置
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;右上角 → 替换文件 → 验证配置 → 重新加载 nginx&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;nginx&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;nginx&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;reload&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;nginxWebUI 自动执行这两步。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="六证书自动申请"&gt;六、证书自动申请
&lt;/h2&gt;&lt;h3 id="61-阿里云-dns-验证"&gt;6.1 阿里云 DNS 验证
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;证书管理 → 申请证书 → DNS 验证 → 阿里云&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;需要阿里云 AccessKey（&lt;strong&gt;最小权限&lt;/strong&gt;：AliyunDNSFullAccess）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AccessKey ID: LTAI5txxxxxxxxxxx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AccessKey Secret: h8Q4xxxxxxxxxxxx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;强烈建议&lt;/strong&gt;用 RAM 子账号 AccessKey，不要用主账号。&lt;/p&gt;
&lt;h3 id="62-申请流程"&gt;6.2 申请流程
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;选择 DNS 厂商（阿里云 / 腾讯云 / Cloudflare / 华为云）&lt;/li&gt;
&lt;li&gt;填 AccessKey&lt;/li&gt;
&lt;li&gt;输入要申请证书的域名&lt;/li&gt;
&lt;li&gt;nginxWebUI 自动：
&lt;ul&gt;
&lt;li&gt;在 DNS 添加 &lt;code&gt;_acme-challenge&lt;/code&gt; TXT 记录&lt;/li&gt;
&lt;li&gt;等 Let&amp;rsquo;s Encrypt 验证&lt;/li&gt;
&lt;li&gt;保存证书到 &lt;code&gt;/home/nginxWebUI/.acme.sh/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在反代配置中选这个证书&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="63-自动续期"&gt;6.3 自动续期
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Let&amp;rsquo;s Encrypt 证书 90 天过期&lt;/strong&gt;。nginxWebUI 内置 cron 任务：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每天检查 30 天内过期的证书&lt;/li&gt;
&lt;li&gt;自动调用 &lt;code&gt;acme.sh&lt;/code&gt; 续期&lt;/li&gt;
&lt;li&gt;自动 reload nginx&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;无需人工干预。&lt;/p&gt;
&lt;h3 id="64-多域名san-证书"&gt;6.4 多域名（SAN 证书）
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;www.example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;api.example.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;一次申请，3 个域名共用 1 张证书。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="七集群同步"&gt;七、集群同步
&lt;/h2&gt;&lt;h3 id="71-场景"&gt;7.1 场景
&lt;/h3&gt;&lt;p&gt;N 台 Nginx 机器（机房 A 3 台 + 机房 B 2 台），配置要&lt;strong&gt;完全一致&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="72-配置主从"&gt;7.2 配置主从
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;集群管理 → 添加节点&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;节点名：nginx-slave-01
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;IP：10.0.1.21
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SSH 端口：22
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SSH 用户：root
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;认证方式：SSH 私钥
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;主节点（你这台）配置变更后，点&amp;quot;同步&amp;quot;会&lt;strong&gt;自动 scp 配置 + reload&lt;/strong&gt; 到所有从节点。&lt;/p&gt;
&lt;h3 id="73-同步内容"&gt;7.3 同步内容
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;反代配置&lt;/li&gt;
&lt;li&gt;证书&lt;/li&gt;
&lt;li&gt;模板&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不&lt;/strong&gt;同步：日志、本地统计&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="74-同步失败的常见原因"&gt;7.4 同步失败的常见原因
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SSH 免密没配&lt;/strong&gt;：&lt;code&gt;ssh-keygen + ssh-copy-id&lt;/code&gt; 先打通&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;nginx 路径不同&lt;/strong&gt;：从节点 &lt;code&gt;/usr/local/nginx/sbin/nginx&lt;/code&gt; 不存在&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JDK 没装&lt;/strong&gt;：从节点没 java，nginxWebUI 跑不起来&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;防火墙&lt;/strong&gt;：从节点没开放 22 给主节点&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="八参数模板"&gt;八、参数模板
&lt;/h2&gt;&lt;p&gt;把常用配置片段做成模板，&lt;strong&gt;一处维护，到处使用&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="81-内置模板"&gt;8.1 内置模板
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WebSocket 反代&lt;/strong&gt;：&lt;code&gt;Upgrade&lt;/code&gt; + &lt;code&gt;Connection &amp;quot;upgrade&amp;quot;&lt;/code&gt; + 长超时&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTPS 优化&lt;/strong&gt;：ssl_protocols / ssl_ciphers / session cache&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;静态资源&lt;/strong&gt;：gzip / expires / cache-control&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;限流&lt;/strong&gt;：&lt;code&gt;limit_req_zone&lt;/code&gt; 限 IP / URI&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;防盗链&lt;/strong&gt;：referer 白名单&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="82-自定义模板"&gt;8.2 自定义模板
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&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;&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;limit_req&lt;/span&gt; &lt;span class="s"&gt;zone=one&lt;/span&gt; &lt;span class="s"&gt;burst=10&lt;/span&gt; &lt;span class="s"&gt;nodelay&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://backend&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;保存后，在反代编辑界面可以&lt;strong&gt;一键插入&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="九备份与恢复"&gt;九、备份与恢复
&lt;/h2&gt;&lt;h3 id="91-自动备份"&gt;9.1 自动备份
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;系统设置 → 自动备份&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;备份目录：&lt;code&gt;/home/nginxWebUI/backup/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;备份内容：所有反代配置 + 证书&lt;/li&gt;
&lt;li&gt;备份频率：每天 / 每周&lt;/li&gt;
&lt;li&gt;保留份数：30 份&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="92-手动备份"&gt;9.2 手动备份
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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="c1"&gt;# 备份项目目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar -czf nginxWebUI_&lt;span class="k"&gt;$(&lt;/span&gt;date +%F&lt;span class="k"&gt;)&lt;/span&gt;.tar.gz /home/nginxWebUI/
&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;# 排除 .acme.sh（可重新申请）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar -czf nginxWebUI_config_&lt;span class="k"&gt;$(&lt;/span&gt;date +%F&lt;span class="k"&gt;)&lt;/span&gt;.tar.gz &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --exclude&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;*.acme.sh&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /home/nginxWebUI/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="93-跨机迁移"&gt;9.3 跨机迁移
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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="c1"&gt;# 旧机器打包&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar -czf nginxWebUI.tar.gz /home/nginxWebUI/
&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;tar -xzf nginxWebUI.tar.gz -C /
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 然后启动 systemd 即可&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;记得修改&lt;/strong&gt; &lt;code&gt;--project.home&lt;/code&gt; 指向新路径。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="十安全加固"&gt;十、安全加固
&lt;/h2&gt;&lt;h3 id="101-web-ui-端口保护"&gt;10.1 Web UI 端口保护
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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="c1"&gt;# 用 Nginx 反代 nginxWebUI，加 basic auth&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;location / &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; auth_basic &lt;span class="s2"&gt;&amp;#34;NginxWebUI Admin&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; auth_basic_user_file /etc/nginx/.htpasswd&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_pass http://127.0.0.1:8082&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="102-https-for-web-ui"&gt;10.2 HTTPS for Web UI
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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="c1"&gt;# 生成自签证书（内网用）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl req -x509 -nodes -days &lt;span class="m"&gt;3650&lt;/span&gt; -newkey rsa:2048 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -keyout /home/nginxWebUI/ssl.key &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -out /home/nginxWebUI/ssl.crt &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -subj &lt;span class="s2"&gt;&amp;#34;/CN=nginxwebui.internal&amp;#34;&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;&lt;span class="c1"&gt;# 启动加 --server.ssl.key-store&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nohup java -jar nginxWebUI.jar &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --server.port&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;8443&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --server.ssl.key-store&lt;span class="o"&gt;=&lt;/span&gt;/home/nginxWebUI/ssl.jks &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --server.ssl.key-store-password&lt;span class="o"&gt;=&lt;/span&gt;changeit &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="103-操作审计"&gt;10.3 操作审计
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;审计台 → 操作日志&lt;/strong&gt;：所有 Web UI 操作都记录（谁在什么时间改了什么）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="十一常见问题"&gt;十一、常见问题
&lt;/h2&gt;&lt;h3 id="111-配置替换后-nginx--t-报错"&gt;11.1 配置替换后 nginx -t 报错
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：上游地址不可达 + nginx -t 不检查 upstream 通断。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;对策&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在 nginxWebUI 启用&amp;quot;测试&amp;quot;模式（不直接 reload）&lt;/li&gt;
&lt;li&gt;手工 &lt;code&gt;nginx -t&lt;/code&gt; 验证语法&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="112-证书申请失败"&gt;11.2 证书申请失败
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DNS 验证失败&lt;/strong&gt;：阿里云 AccessKey 没 AliyunDNSFullAccess&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;速率限制&lt;/strong&gt;：Let&amp;rsquo;s Encrypt 一周 5 张同域名证书，用 staging 环境测&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;端口 80 被占&lt;/strong&gt;：HTTP 验证需要 80 端口，改用 DNS 验证&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="113-web-ui-502-bad-gateway"&gt;11.3 Web UI 502 Bad Gateway
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;8080 端口被占：lsof -i :8080&lt;/li&gt;
&lt;li&gt;Java 进程没起来：systemctl status nginxwebui&lt;/li&gt;
&lt;li&gt;磁盘满：证书申请要写临时文件&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="114-集群同步后从节点-nginx-起不来"&gt;11.4 集群同步后从节点 nginx 起不来
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;检查从节点 nginx 编译参数一致&lt;/li&gt;
&lt;li&gt;检查从节点 /etc/nginx 是否被覆盖（nginxWebUI 默认只动 conf.d）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="十二卸载"&gt;十二、卸载
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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;systemctl stop nginxwebui.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl disable nginxwebui.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -rf /etc/systemd/system/nginxwebui.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -rf /home/nginxWebUI
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="小结"&gt;小结
&lt;/h2&gt;&lt;p&gt;nginxWebUI 是国产&lt;strong&gt;最易用&lt;/strong&gt;的 Nginx 可视化工具：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;图形化反代&lt;/strong&gt;——不用手写 nginx.conf&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;证书自动续期&lt;/strong&gt;——Let&amp;rsquo;s Encrypt 90 天焦虑解除&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;集群同步&lt;/strong&gt;——多机器配置一致性&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模板复用&lt;/strong&gt;——常用片段一处维护&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;生产使用三原则&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Web UI 加 basic auth + HTTPS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;手写配置必须带 &lt;code&gt;# nginxWebUI&lt;/code&gt; 标记&lt;/strong&gt;避免被覆盖&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定期备份 /home/nginxWebUI/&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;替代方案对比&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;nginxWebUI&lt;/strong&gt;（本篇）：Spring Boot + Web，集群同步&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nginx Proxy Manager&lt;/strong&gt;：Docker 化，UI 更现代&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Caddy&lt;/strong&gt;：自带 HTTPS，但生态小&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;APISIX&lt;/strong&gt;：企业级网关，APISIX Ingress&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;下一步&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用 Nginx Proxy Manager 做&lt;strong&gt;内网穿透&lt;/strong&gt;入口&lt;/li&gt;
&lt;li&gt;用 APISIX 做 API 网关（限流、鉴权、灰度）&lt;/li&gt;
&lt;li&gt;自建证书监控（certspotter / cert-expiry-monitor）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="2024-视角web-ui-类工具已百花齐放"&gt;2024 视角：Web UI 类工具已&amp;quot;百花齐放&amp;quot;
&lt;/h2&gt;&lt;p&gt;2018 那篇只有 nginxWebUI 一个国产工具。&lt;strong&gt;2024 视角下，Web UI 类 Nginx 工具已经&amp;quot;百花齐放&amp;quot;&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="一nginxwebui-4x2024-现状"&gt;一、nginxWebUI 4.x（2024 现状）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;当前版本&lt;/strong&gt; 4.3.x（2024 持续更新）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新特性&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JDK 17+ 兼容&lt;/strong&gt;（不再强依赖 JDK 8）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;国密 SM2/SM3/SM4&lt;/strong&gt;（国内信创环境）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;集群同步&lt;/strong&gt; 增强：支持灰度发布&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenAPI&lt;/strong&gt;：用 REST API 自动化配置&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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="c1"&gt;# 2024 装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget -O /home/nginxWebUI/nginxWebUI.jar &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; https://gitee.com/cym1102/nginxWebUI/releases/download/4.3.0/nginxWebUI-4.3.0.jar
&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;# 启动（要求 JDK 17+）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;java -jar nginxWebUI.jar --server.port&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt; --project.home&lt;span class="o"&gt;=&lt;/span&gt;/home/nginxWebUI/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="二nginx-proxy-managernpm-2024-主流最易用工具"&gt;二、Nginx Proxy Manager（NPM）—— 2024 主流&amp;quot;最易用&amp;quot;工具
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nginx Proxy Manager&lt;/strong&gt;（&lt;a class="link" href="https://github.com/NginxProxyManager/nginx-proxy-manager" target="_blank" rel="noopener"
 &gt;NginxProxyManager/nginx-proxy-manager&lt;/a&gt;）：&lt;strong&gt;Docker 一行命令&lt;/strong&gt; 起 UI。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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="c1"&gt;# 装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name nginx-proxy-manager &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 80:80 -p 443:443 -p 81:81 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /data/npm/data:/data &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /data/npm/letsencrypt:/etc/letsencrypt &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; jc21/nginx-proxy-manager:latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优势&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;UI 极其现代&lt;/strong&gt;（Vue 3 + Element Plus）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Let&amp;rsquo;s Encrypt 自动续期&lt;/strong&gt;（内置）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Access List&lt;/strong&gt;（HTTP Basic Auth 访问控制）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audit Log&lt;/strong&gt;（所有操作记录）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2024 主流&lt;/strong&gt;：NPM 在&lt;strong&gt;个人 / 小团队 / 自托管&lt;/strong&gt;场景已经&lt;strong&gt;超过 nginxWebUI&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="三caddy--自动-https的魅力"&gt;三、Caddy —— &amp;ldquo;自动 HTTPS&amp;quot;的魅力
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Caddy&lt;/strong&gt;（Go 写）&lt;strong&gt;自动申请 Let&amp;rsquo;s Encrypt 证书 + 自动续期&lt;/strong&gt;——&lt;strong&gt;配置极简&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-caddyfile" data-lang="caddyfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# /etc/caddy/Caddyfile
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gh"&gt;myapp.example.com&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;reverse_proxy&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&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;&lt;span class="gh"&gt;blog.example.com&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;reverse_proxy&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;encode&lt;/span&gt; &lt;span class="s"&gt;gzip&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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="c1"&gt;# 装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt install caddy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;caddy run
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 自动 HTTPS + 自动续期&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2024 趋势&lt;/strong&gt;：Caddy 在&lt;strong&gt;静态博客 / 个人网站 / 内部工具&lt;/strong&gt;场景&lt;strong&gt;全面替代 Nginx&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;劣势&lt;/strong&gt;：插件生态远不如 Nginx（没有 stream 四层、不能编译第三方模块）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="四apisix--kong--api-网关路线"&gt;四、APISIX / Kong —— &amp;ldquo;API 网关&amp;quot;路线
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;APISIX&lt;/strong&gt;（Apache 顶级项目，国产）：&lt;strong&gt;云原生 API 网关&lt;/strong&gt;——支持动态路由、限流、鉴权、灰度、gRPC：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# APISIX Route&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;upstreams&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;nodes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;10.0.1.10&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;10.0.1.11&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;roundrobin&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kong&lt;/strong&gt;（基于 Nginx + Lua）：商业 API 网关老牌，2024 仍是外企主流。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="五traefik--k8s-时代的动态反代"&gt;五、Traefik —— K8s 时代的&amp;quot;动态反代&amp;rdquo;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Traefik&lt;/strong&gt;（Go 写）&lt;strong&gt;自动发现 K8s 资源&lt;/strong&gt;（Ingress / Service）——&lt;strong&gt;几乎零配置&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Helm 装&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;helm repo add traefik https://traefik.github.io/charts&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;helm install traefik traefik/traefik&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 自动发现所有 Ingress&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;kubectl apply -f myapp-ingress.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自动 HTTPS&lt;/strong&gt;（Let&amp;rsquo;s Encrypt + cert-manager 集成）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2024 K8s 项目默认 Ingress Controller 之一&lt;/strong&gt;（与 Nginx Ingress Controller 并列）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="六acmesh--命令行证书申请的事实标准"&gt;六、&lt;code&gt;acme.sh&lt;/code&gt; —— 命令行证书申请的事实标准
&lt;/h3&gt;&lt;p&gt;2018 那篇的 nginxWebUI 内置 acme.sh。&lt;strong&gt;2024 视角&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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="c1"&gt;# 装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl https://get.acme.sh &lt;span class="p"&gt;|&lt;/span&gt; sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&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;# 申请证书（DNS 验证）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;Ali_Key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;xxx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;Ali_Secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;yyy&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;acme.sh --issue -d example.com --dns dns_ali
&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;# 复制到 Nginx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;acme.sh --install-cert -d example.com &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --key-file /etc/nginx/ssl/example.com.key &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --fullchain-file /etc/nginx/ssl/example.com.crt &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --reloadcmd &lt;span class="s2"&gt;&amp;#34;systemctl reload nginx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;acme.sh 2024 仍是 80+ DNS 厂商&lt;/strong&gt;支持的&amp;quot;证书神器&amp;rdquo;——比 certbot 简单、比 nginxWebUI 灵活。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="七web-ui-工具选型-2024-决策表"&gt;七、Web UI 工具选型 2024 决策表
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;场景&lt;/th&gt;
					&lt;th&gt;2018 选择&lt;/th&gt;
					&lt;th&gt;2024 推荐&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;个人博客 / 静态站&lt;/td&gt;
					&lt;td&gt;Caddy / Nginx&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Caddy&lt;/strong&gt;（自动 HTTPS）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;小团队 1-3 台 Nginx&lt;/td&gt;
					&lt;td&gt;nginxWebUI&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;NPM&lt;/strong&gt;（UI 现代）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;中小企业多 Nginx&lt;/td&gt;
					&lt;td&gt;nginxWebUI + rsync&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;NPM&lt;/strong&gt; 或 &lt;strong&gt;APISIX&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;K8s 集群 Ingress&lt;/td&gt;
					&lt;td&gt;（K8s 还没普及）&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Traefik / Nginx Ingress / APISIX Ingress&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;API 网关 / 限流&lt;/td&gt;
					&lt;td&gt;（没普及）&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;APISIX / Kong&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;信创 / 国密&lt;/td&gt;
					&lt;td&gt;nginxWebUI&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;nginxWebUI 4.x&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;跨境 / 外企&lt;/td&gt;
					&lt;td&gt;nginxWebUI&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Nginx Plus&lt;/strong&gt; 或 &lt;strong&gt;Kong Enterprise&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="八web-ui-工具的未来趋势"&gt;八、Web UI 工具的&amp;quot;未来趋势&amp;quot;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AI 辅助配置&lt;/strong&gt;（2024 萌芽）：自然语言生成 Nginx 配置&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitOps 化&lt;/strong&gt;：Web UI 改动自动 commit 到 Git&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多集群联邦&lt;/strong&gt;：一个 UI 管多 K8s 集群的 Ingress&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全扫描&lt;/strong&gt;：Web UI 内置配置审计（防止错误配置）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;源文档&lt;/strong&gt;：&lt;code&gt;os/linux/第三方tools/net/nginx/nginxwebUI.md&lt;/code&gt;（JDK 安装、Nginx 编译、jar 启动、systemd 守护、证书申请）&lt;/p&gt;</description></item></channel></rss>