<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://2233941.xyz/</id>
  <title type="text">Lumifly</title>
  <subtitle type="text">平淡浮生，亦绽一寸清光</subtitle>
  <updated>2026-10-23T00:00:00.000Z</updated>
  <author><name>lumifly</name></author>
  <link rel="alternate" href="https://2233941.xyz/"/>
  <link rel="self" href="https://2233941.xyz/atom.xml"/>
  <generator uri="https://github.com/CuteLeaf/Firefly">Firefly v6.16.8</generator>
    <entry>
      <id>https://2233941.xyz/posts/podman%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/</id>
      <title type="text">podman安装使用</title>
      <published>2026-10-23T00:00:00.000Z</published>
      <updated>2026-10-23T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/podman%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/"/>
      <summary type="text">podman安装使用</summary>
      <content type="html"><![CDATA[<section><h1>一、podman简介<a href="#一podman简介"><span>#</span></a></h1><p>Podman 是一个开源的容器引擎，由 Red Hat 主导开发，遵循 OCI（开放容器倡议）标准，用于管理容器、镜像和 Pod。 简单说，它就是一个可以替代 Docker 的容器管理工具，命令行几乎一模一样，但架构设计上有本质区别。</p><section><h2>1.1 核心特点<a href="#11-核心特点"><span>#</span></a></h2><ul>
<li><strong>无守护进程（Daemonless）</strong>
Podman 不依赖常驻后台的守护进程（如 Docker 的 dockerd），而是直接通过 fork/exec 调用 OCI 运行时（runc/crun）启动容器。每个容器都是独立的子进程，由 systemd 或用户会话直接管理，消除了单点故障风险，空闲时几乎不占用系统资源。</li>
</ul><ul>
<li>
<p><strong>原生 Rootless 模式</strong>
默认以普通用户权限运行容器，容器内的 root 用户通过 Linux 用户命名空间映射为宿主机上的非特权用户。即使容器逃逸，攻击面也被限制在当前用户范围内，符合最小权限原则。</p>
</li>
<li>
<p><strong>原生 Pod 支持</strong>
内置 Kubernetes Pod 概念，可以将多个容器组合为一个逻辑单元，共享网络和 IPC 命名空间。支持通过 <code>podman generate kube</code> 导出 K8s YAML，或通过 <code>podman play kube</code> 直接运行 K8s 配置，方便本地开发与生产环境衔接。</p>
</li>
<li>
<p><strong>高度兼容 Docker</strong>
命令行与 Docker 90% 以上兼容，支持 <code>alias docker=podman</code> 直接替换。兼容 Docker 镜像格式、Dockerfile 语法以及 Docker Hub 等镜像仓库。</p>
</li>
<li>
<p><strong>深度集成 systemd</strong>
可通过 <code>podman generate systemd</code> 生成 systemd 服务单元文件，将容器作为系统服务管理，实现开机自启、故障自动重启和日志接入 journald。</p>
</li>
</ul></section><section><h2>1.2 与Docker的主要区别<a href="#12-与docker的主要区别"><span>#</span></a></h2>

<table><thead><tr><th>维度</th><th>Docker</th><th>Podman</th></tr></thead><tbody><tr><td>架构</td><td>C/S 架构，依赖 dockerd 守护进程</td><td>无守护进程，直接 fork/exec</td></tr><tr><td>权限</td><td>默认需 root，Rootless 需额外配置</td><td>原生 Rootless，默认普通用户运行</td></tr><tr><td>Pod 支持</td><td>需借助 Compose 或 Swarm</td><td>原生支持</td></tr><tr><td>K8s 集成</td><td>需额外工具</td><td>原生支持生成/运行 K8s YAML</td></tr><tr><td>镜像构建</td><td>内置 docker build</td><td>内置 + Buildah 独立构建</td></tr><tr><td>跨平台</td><td>成熟（Linux/Win/Mac）</td><td>Linux 为主，Win/Mac 需虚拟机</td></tr><tr><td>许可</td><td>桌面版对企业收费</td><td>完全开源免费</td></tr></tbody></table></section><section><h2>1.3 适用场景<a href="#13-适用场景"><span>#</span></a></h2><ul>
<li><strong>生产环境 / 安全敏感场景</strong>：Rootless 和无守护进程架构降低了攻击面，适合金融、政务等对安全要求高的环境。</li>
<li><strong>Kubernetes 迁移准备</strong>：原生 Pod 支持和 K8s YAML 互转能力，让本地开发到 K8s 部署的过渡更顺畅。</li>
<li><strong>低配服务器 / 边缘计算</strong>：无守护进程意味着更低的内存占用和更少的资源消耗。</li>
<li><strong>Red Hat 生态</strong>：RHEL/CentOS/Fedora 已将 Podman 作为默认容器引擎。</li>
</ul></section></section>
<section><h1>二、podman安装<a href="#二podman安装"><span>#</span></a></h1><blockquote><p>官方网址：<a href="https://podman.io/" target="_blank">Podman</a></p><p>中文网址：<a href="https://podman.org.cn/" target="_blank">Podman 容器工具</a></p><p>中文文档：<a href="https://podman.org.cn/docs" target="_blank">Podman 入门指南 | Podman 容器工具</a></p></blockquote><section><h2>2.1 下载二进制包<a href="#21-下载二进制包"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/usr/local/src</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 这里下载6.1.4版本</span></div></div><div><div><div>4</div></div><div><span>curl</span><span> </span><span>-fL</span><span> </span><span>-o</span><span> </span><span>podman-static-v6.1.4-linux-amd64.tar.gz</span><span> </span><span>\</span></div></div><div><div><div>5</div></div><div><span>https://github.com/mgoltzsche/podman-static/releases/download/v6.1.4/podman-linux-amd64.tar.gz</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>2.2 配置文件目录<a href="#22-配置文件目录"><span>#</span></a></h2><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 创建安装目录</span></div></div><div><div><div>2</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/usr/local/podman/bin</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>         </span><span>/usr/local/podman/etc/containers</span><span> </span><span>\</span></div></div><div><div><div>4</div></div><div><span>         </span><span>/usr/local/podman/storage</span><span> </span><span>\</span></div></div><div><div><div>5</div></div><div><span>         </span><span>/usr/local/podman/run/containers/storage</span><span> </span><span>\</span></div></div><div><div><div>6</div></div><div><span>         </span><span>/usr/local/podman/run/tmp</span><span> </span><span>\</span></div></div><div><div><div>7</div></div><div><span>         </span><span>/usr/local/podman/docs</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 解压二进制包</span></div></div><div><div><div>10</div></div><div><span>cd</span><span> </span><span>/usr/local/src/</span><span> &amp;&amp; </span><span>tar</span><span> </span><span>-xzf</span><span> </span><span>podman-static-v6.1.4-linux-amd64.tar.gz</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># 移动文件</span></div></div><div><div><div>13</div></div><div><span>mv</span><span> </span><span>/usr/lcoal/src/podman-linux-amd64/usr/local/bin/</span><span>*</span><span>      </span><span>/usr/local/podman/bin/</span></div></div><div><div><div>14</div></div><div><span>mv</span><span> </span><span>/usr/lcoal/src/podman-linux-amd64/usr/local/lib</span><span>        </span><span>/usr/local/podman/lib</span></div></div><div><div><div>15</div></div><div><span>mv</span><span> </span><span>/usr/lcoal/src/podman-linux-amd64/usr/local/share</span><span>      </span><span>/usr/local/podman/share</span></div></div><div><div><div>16</div></div><div><span>mv</span><span> </span><span>/usr/lcoal/src/podman-linux-amd64/etc/containers/</span><span>*</span><span>     </span><span>/usr/local/podman/etc/containers/</span></div></div><div><div><div>17</div></div><div><span>cp</span><span> </span><span>/usr/lcoal/src/podman-linux-amd64/README.md</span><span>            </span><span>/usr/local/podman/docs/README.md</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span># 移动quadlet，与netavark/aardvark-dns 同一搜索路径</span></div></div><div><div><div>20</div></div><div><span>mv</span><span> </span><span>/usr/lcoal/src/podman-linux-amd64/usr/local/libexec/podman/quadlet</span><span> </span><span>/usr/local/podman/lib/podman/quadlet</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span># 上游自带的 storage.conf.d 把 mount_program 指向 /usr/local/bin/fuse-overlayfs（我们的目录外），</span></div></div><div><div><div>23</div></div><div><span># 必须删掉，否则会引用包外路径</span></div></div><div><div><div>24</div></div><div><span>rm</span><span> </span><span>-rf</span><span> </span><span>/usr/local/podman/etc/containers/storage.conf.d</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h2>2.3 修改文件属性<a href="#23-修改文件属性"><span>#</span></a></h2><p>包里文件的 UID/GID 是构建机的 <code>1001:1001</code>，必须改回 root：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>chown</span><span> </span><span>-R</span><span> </span><span>root:root</span><span> </span><span>/usr/local/podman</span></div></div><div><div><div>2</div></div><div><span>chmod</span><span> </span><span>0755</span><span> </span><span>/usr/local/podman/bin/</span><span>*</span><span> </span><span>/usr/local/podman/lib/podman/</span><span>*</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>2.4 修改二进制名并新建一个替代<a href="#24-修改二进制名并新建一个替代"><span>#</span></a></h2><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 修改podman二进制文件名</span></div></div><div><div><div>2</div></div><div><span>mv</span><span> </span><span>/usr/local/podman/bin/podman</span><span> </span><span>/usr/local/podman/bin/podman.real</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 新建一个名为podman的脚本</span></div></div><div><div><div>5</div></div><div><span>cat</span><span> &gt; </span><span>/usr/local/podman/bin/podman</span><span> </span><span>&lt;</span><span>&lt; </span><span>'EOF'</span></div></div><div><div><div>6</div></div><div><span>#!/bin/bash</span></div></div><div><div><div>7</div></div><div><span>PD_HOME</span><span>=</span><span>/usr/local/podman</span></div></div><div><div><div>8</div></div><div><span>C</span><span>=</span><span>$PD_HOME</span><span>/etc/containers</span></div></div><div><div><div>9</div></div><div><span>export</span><span> </span><span>CONTAINERS_CONF</span><span>=</span><span>$C</span><span>/</span><span>containers</span><span>.</span><span>conf</span></div></div><div><div><div>10</div></div><div><span>export</span><span> </span><span>CONTAINERS_STORAGE_CONF</span><span>=</span><span>$C</span><span>/</span><span>storage</span><span>.</span><span>conf</span></div></div><div><div><div>11</div></div><div><span>export</span><span> </span><span>CONTAINERS_REGISTRIES_CONF</span><span>=</span><span>$C</span><span>/</span><span>registries</span><span>.</span><span>conf</span></div></div><div><div><div>12</div></div><div><span>export</span><span> </span><span>CONTAINERS_POLICY_JSON</span><span>=</span><span>$C</span><span>/</span><span>policy</span><span>.</span><span>json</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>export</span><span> </span><span>XDG_CONFIG_HOME</span><span>=</span><span>$PD_HOME</span><span>/</span><span>xdg</span><span>/</span><span>config</span></div></div><div><div><div>15</div></div><div><span>export</span><span> </span><span>XDG_DATA_HOME</span><span>=</span><span>$PD_HOME</span><span>/</span><span>xdg</span><span>/</span><span>data</span></div></div><div><div><div>16</div></div><div><span>export</span><span> </span><span>XDG_CACHE_HOME</span><span>=</span><span>$PD_HOME</span><span>/</span><span>xdg</span><span>/</span><span>cache</span></div></div><div><div><div>17</div></div><div><span>export</span><span> </span><span>XDG_RUNTIME_DIR</span><span>=</span><span>$PD_HOME</span><span>/</span><span>run</span></div></div><div><div><div>18</div></div><div><span>export</span><span> </span><span>TMPDIR</span><span>=</span><span>$PD_HOME</span><span>/</span><span>run</span><span>/</span><span>tmp</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>"</span><span>$TMPDIR</span><span>"</span><span> </span><span>"</span><span>$XDG_CONFIG_HOME</span><span>"</span><span> </span><span>"</span><span>$XDG_DATA_HOME</span><span>"</span><span> </span><span>2&gt;/dev/null</span><span> || </span><span>true</span></div></div><div><div><div>21</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>"</span><span>$XDG_CACHE_HOME</span><span>"</span><span> 2&gt;</span><span>/dev/null</span><span> || </span><span>true</span></div></div><div><div><div>22</div></div><div><span>chmod</span><span> </span><span>0700</span><span> </span><span>"</span><span>$XDG_RUNTIME_DIR</span><span>"</span><span> </span><span>"</span><span>$XDG_CONFIG_HOME</span><span>"</span><span> 2&gt;</span><span>/dev/null</span><span> || </span><span>true</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>exec</span><span> </span><span>-a</span><span> </span><span>podman</span><span> </span><span>"</span><span>$PD_HOME</span><span>/bin/podman.real"</span><span> </span><span>"</span><span>$@</span><span>"</span></div></div><div><div><div>25</div></div><div><span>EOF</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span># 修改文件权限</span></div></div><div><div><div>28</div></div><div><span>chmod</span><span> </span><span>0755</span><span> </span><span>/usr/local/podman/bin/podman</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p><strong>为什么要多这一层</strong>：podman 的配置、helper、临时目录都要靠 <code>CONTAINERS_*</code> 环境变量指向包内。如果用户从<strong>非登录 shell</strong>（cron、systemd、<code>ssh host cmd</code>、容器内 exec）调用，<code>/etc/profile.d</code> 不会被加载，podman 就会去 <code>/etc/containers</code> 和系统默认路径找依赖，直接失败。启动器把环境变量固化下来，保证<strong>任何调用方式结果一致</strong>。</p><p><strong>文件参数说明：</strong></p><ul>
<li><code>exec -a podman</code>：把 <code>argv[0]</code> 改成 <code>podman</code>，否则 <code>podman --version</code> 会显示成 <code>podman.real version 6.1.4</code>。</li>
<li><code>XDG_*</code> 三个变量：防止在 <code>~/.config/containers</code>、<code>~/.cache/containers</code>、<code>/run/user/0/crun</code> 生成文件。</li>
<li><code>TMPDIR</code>：防止临时文件落到 <code>/tmp</code>。</li>
</ul><blockquote>

<table><thead><tr><th>环境变量</th><th>作用</th><th>不设会怎样</th></tr></thead><tbody><tr><td><code>CONTAINERS_CONF</code></td><td>指定主配置</td><td>读 <code>/etc/containers/containers.conf</code>，配置全部失效</td></tr><tr><td><code>CONTAINERS_STORAGE_CONF</code></td><td>指定存储配置</td><td>镜像存到 <code>/var/lib/containers/storage</code></td></tr><tr><td><code>CONTAINERS_REGISTRIES_CONF</code></td><td>指定镜像源配置</td><td>直连 docker.io，拉取超时</td></tr><tr><td><code>CONTAINERS_POLICY_JSON</code></td><td>指定签名策略文件</td><td><code>podman pull</code> 直接报 <code>no policy.json file found</code></td></tr><tr><td><code>XDG_CONFIG_HOME</code></td><td>配置目录</td><td>生成 <code>~/.config/containers</code></td></tr><tr><td><code>XDG_DATA_HOME</code></td><td>数据目录</td><td>生成 <code>~/.local/share/containers</code></td></tr><tr><td><code>XDG_CACHE_HOME</code></td><td>缓存目录</td><td>生成 <code>~/.cache/containers</code></td></tr><tr><td><code>XDG_RUNTIME_DIR</code></td><td>运行时目录</td><td>crun 状态落到 <code>/run/user/0/crun</code></td></tr><tr><td><code>TMPDIR</code></td><td>临时目录</td><td>写 <code>/var/tmp</code></td></tr></tbody></table><p>最后一行 <code>exec -a podman ...</code> 中的 <code>-a podman</code> 是用来修正进程名的：二进制改名成 <code>podman.real</code> 后，<code>podman --version</code> 会显示成 <code>podman.real version 6.1.4</code>，加上这个参数后显示正常。</p></blockquote></section><section><h2>2.5 编写配置文件<a href="#25-编写配置文件"><span>#</span></a></h2><p>配置文件全部放在 <code>/usr/local/podman/etc/containers/</code></p><section><h3>2.5.1 containers.conf<a href="#251-containersconf"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>/usr/local/podman/etc/containers/containers.conf</span><span> &lt;&lt; </span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>[engine]</span></div></div><div><div><div>3</div></div><div><span># OCI 运行时：使用包内自带的 crun</span></div></div><div><div><div>4</div></div><div><span>runtime = "crun"</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># # 容器监控进程 conmon（必须在包内）</span></div></div><div><div><div>7</div></div><div><span>conmon_path = ["/usr/local/podman/lib/podman/conmon"]</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 辅助二进制目录：netavark / aardvark-dns / catatonit</span></div></div><div><div><div>10</div></div><div><span>helper_binaries_dir = ["/usr/local/podman/lib/podman"]</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># # 锁文件写入存储目录，避免占用 /dev/shm</span></div></div><div><div><div>13</div></div><div><span>lock_type = "file"</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span># 无 systemd 环境使用 cgroupfs 直接管理 cgroup</span></div></div><div><div><div>16</div></div><div><span>cgroup_manager = "cgroupfs"</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span># 事件日志写文件，不依赖 journald</span></div></div><div><div><div>19</div></div><div><span>events_logger = "file"</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span># 临时目录收进包内，避免写 /var/tmp 与 /tmp</span></div></div><div><div><div>22</div></div><div><span>tmp_dir = "/usr/local/podman/run/tmp"</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>[engine.runtimes]</span></div></div><div><div><div>25</div></div><div><span>crun = ["/usr/local/podman/bin/crun"]</span></div></div><div><div><div>26</div></div><div><span>runc = ["/usr/local/podman/bin/runc"]</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>[network]</span></div></div><div><div><div>29</div></div><div><span># podman 5 起默认使用 netavark 网络栈</span></div></div><div><div><div>30</div></div><div><span>network_backend = "netavark"</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span># netavark 2.x 只支持 nftables 防火墙后端</span></div></div><div><div><div>33</div></div><div><span>firewall_driver = "nftables"</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span># 容器网段（避开 docker 默认的 172.17.0.0/16）</span></div></div><div><div><div>36</div></div><div><span>default_subnet = "10.88.0.0/16"</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>[containers]</span></div></div><div><div><div>39</div></div><div><span># seccomp 规则文件收进包内</span></div></div><div><div><div>40</div></div><div><span>seccomp_profile = "/usr/local/podman/etc/containers/seccomp.json"</span></div></div><div><div><div>41</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>关键项解释：</p>

<table><thead><tr><th>配置项</th><th>作用</th></tr></thead><tbody><tr><td><code>conmon_path</code></td><td><strong>必须显式指定</strong>。<code>helper_binaries_dir</code> 对 conmon 无效，conmon 有独立的搜索列表，不设就会去 <code>/usr/libexec/podman/conmon</code> 等系统路径找，报 <code>conmon not found</code></td></tr><tr><td><code>helper_binaries_dir</code></td><td>netavark / aardvark-dns / catatonit / quadlet 的搜索目录</td></tr><tr><td><code>cgroup_manager = "cgroupfs"</code></td><td>不依赖 systemd 的 cgroup 驱动</td></tr><tr><td><code>events_logger = "file"</code></td><td>事件写入文件，不依赖 journald</td></tr><tr><td><code>default_subnet = 10.88.0.0/16</code></td><td>避开Docker 默认的 <code>172.17.0.0/16</code>，防止docker容器网段冲突</td></tr><tr><td><code>firewall_driver = "nftables"</code></td><td>netavark 2.x 只支持 nftables 后端</td></tr></tbody></table></section><section><h3>2.5.2 storage.conf<a href="#252-storageconf"><span>#</span></a></h3><p>podman 存储配置，镜像层、容器层、命名卷全部落在 /usr/local/podman 内</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>/usr/local/podman/etc/containers/storage.conf</span><span> &lt;&lt; </span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>[storage]</span></div></div><div><div><div>3</div></div><div><span>driver = "overlay"</span></div></div><div><div><div>4</div></div><div><span># 镜像与容器层存储根目录</span></div></div><div><div><div>5</div></div><div><span>graphroot = "/usr/local/podman/storage"</span></div></div><div><div><div>6</div></div><div><span># 运行时元数据目录（容器运行期状态）</span></div></div><div><div><div>7</div></div><div><span>runroot = "/usr/local/podman/run/containers/storage"</span></div></div><div><div><div>8</div></div><div><span>transient_store = false</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>[storage.options]</span></div></div><div><div><div>11</div></div><div><span>[storage.options.overlay]</span></div></div><div><div><div>12</div></div><div><span>mountopt = "nodev"</span></div></div><div><div><div>13</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这里的 <code>driver</code> <strong>必须显式写 <code>overlay</code></strong>。如果沿用系统里已有旧存储库（其记录为空 driver <code>""</code>），显式写 overlay 会报
<code>database graph driver "" does not match our graph driver "overlay"</code>。
本次是全新 <code>graphroot</code>，没有历史数据库，因此可以显式设置。</p></section><section><h3>2.5.3 registries.conf<a href="#253-registriesconf"><span>#</span></a></h3><p>配置镜像源</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>/usr/local/podman/etc/containers/registries.conf</span><span> &lt;&lt; </span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>unqualified-search-registries = ["docker.io", "quay.io", "ghcr.io"]</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>[[registry]]</span></div></div><div><div><div>5</div></div><div><span>prefix = "docker.io"</span></div></div><div><div><div>6</div></div><div><span>location = "docker.io"</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>[[registry.mirror]]</span></div></div><div><div><div>9</div></div><div><span>location = "docker.m.daocloud.io"</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>[[registry.mirror]]</span></div></div><div><div><div>12</div></div><div><span>location = "docker.1ms.run"</span></div></div><div><div><div>13</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.5.4 policy.json<a href="#254-policyjson"><span>#</span></a></h3><p>保留上游原值（内网镜像站不提供签名校验，需要放开）：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>/usr/local/podman/etc/containers/policy.json</span><span> &lt;&lt; </span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>{</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>"default": [{ "type": "insecureAcceptAnything" }],</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>"transports": {</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>"docker-daemon": { "": [{ "type": "insecureAcceptAnything" }] }</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>7</div></div><div><span>}</span></div></div><div><div><div>8</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>2.6 配置环境变量<a href="#26-配置环境变量"><span>#</span></a></h2><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>/etc/profile.d/podman.sh</span><span> &lt;&lt;</span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>if [ -d /usr/local/podman/bin ]; then</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>case ":${PATH}:" in</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>*:/usr/local/podman/bin:*) ;;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>*) PATH="/usr/local/podman/bin:${PATH}" ;;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>esac</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>export PATH</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>C=/usr/local/podman/etc/containers</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>export CONTAINERS_CONF=$C/containers.conf</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>export CONTAINERS_STORAGE_CONF=$C/storage.conf</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>export CONTAINERS_REGISTRIES_CONF=$C/registries.conf</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>export CONTAINERS_POLICY_JSON=$C/policy.json</span></div></div><div><div><div>14</div></div><div><span>fi</span></div></div><div><div><div>15</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>source</span><span> </span><span>/etc/profile</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>用 <code>if [ -d ... ]</code> 包住：目录被删后脚本即使残留也不会污染 PATH。</p></section><section><h2>2.7 测试podman<a href="#27-测试podman"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>podman</span><span> </span><span>--version</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 首次执行 info 会创建 overlay 存储库</span></div></div><div><div><div>4</div></div><div><span>podman</span><span> </span><span>info</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 查看依赖路径</span></div></div><div><div><div>7</div></div><div><span>podman</span><span> </span><span>info</span><span> 2&gt;&amp;1 | </span><span>grep</span><span> </span><span>-iE</span><span> </span><span>'graphRoot|graphDriverName|runRoot|networkBackend|ociRuntime|conmon'</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 拉取镜像测试</span></div></div><div><div><div>10</div></div><div><span>podman</span><span> </span><span>pull</span><span> </span><span>hello-world</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>podman</span><span> </span><span>run</span><span> </span><span>--rm</span><span> </span><span>hello-world</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>2.8 卸载podman<a href="#28-卸载podman"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 删除目录</span></div></div><div><div><div>2</div></div><div><span>rm</span><span> </span><span>-rf</span><span> </span><span>/usr/local/podman</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 删除环境变量</span></div></div><div><div><div>5</div></div><div><span>rm</span><span> </span><span>-f</span><span>  </span><span>/etc/profile.d/podman.sh</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 镜像 blob 校验缓存</span></div></div><div><div><div>8</div></div><div><span>/var/lib/containers/cache</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h1>三、podman使用<a href="#三podman使用"><span>#</span></a></h1><p>Podman 的命令行和 Docker 几乎一样，大多数时候把 <code>docker</code> 直接换成 <code>podman</code> 就能用。 它最大的区别是<strong>无守护进程、默认支持 rootless</strong>，所以更适合在 Linux 上以普通用户管理容器。</p><section><h2>3.1 常用命令速查<a href="#31-常用命令速查"><span>#</span></a></h2>

<table><thead><tr><th>功能</th><th>命令</th><th>说明</th></tr></thead><tbody><tr><td>查看版本</td><td><code>podman version</code></td><td>确认安装是否成功</td></tr><tr><td>搜索镜像</td><td><code>podman search nginx</code></td><td>从仓库搜索镜像</td></tr><tr><td>拉取镜像</td><td><code>podman pull nginx:1.27</code></td><td>建议使用固定版本标签</td></tr><tr><td>查看镜像</td><td><code>podman images</code></td><td>列出本地镜像</td></tr><tr><td>运行容器</td><td><code>podman run -d --name web -p 8080:80 nginx:1.27</code></td><td>后台启动容器</td></tr><tr><td>查看容器</td><td><code>podman ps -a</code></td><td>列出所有容器</td></tr><tr><td>查看日志</td><td><code>podman logs -f web</code></td><td>实时查看日志</td></tr><tr><td>进入容器</td><td><code>podman exec -it web bash</code></td><td>在容器内执行命令</td></tr><tr><td>停止/启动</td><td><code>podman stop web</code> / <code>podman start web</code></td><td>生命周期管理</td></tr><tr><td>删除容器</td><td><code>podman rm web</code></td><td>删除已停止容器</td></tr><tr><td>删除镜像</td><td><code>podman rmi nginx:1.27</code></td><td>删除本地镜像</td></tr><tr><td>复制文件</td><td><code>podman cp ./index.html web:/usr/share/nginx/html/</code></td><td>主机和容器互传文件</td></tr><tr><td>监控资源</td><td><code>podman stats web</code></td><td>查看 CPU、内存等</td></tr><tr><td>清理资源</td><td><code>podman system prune</code></td><td>清理无用镜像、容器、网络</td></tr></tbody></table><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>podman</span><span> </span><span>info</span><span>                                         </span><span># 环境详情</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>podman</span><span> </span><span>volume</span><span> </span><span>create</span><span> </span><span>data</span><span>                           </span><span># 命名卷</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>podman</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>-v</span><span> </span><span>data:/usr/share/nginx/html</span><span> </span><span>nginx</span><span>   </span><span># 挂载卷</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>podman</span><span> </span><span>volume</span><span> </span><span>ls</span><span>                                    </span><span># 卷列表</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>podman</span><span> </span><span>system</span><span> </span><span>df</span><span>                                    </span><span># 空间占用</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>podman</span><span> </span><span>system</span><span> </span><span>prune</span><span> </span><span>-a</span><span>                              </span><span># 清理未使用资源</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>podman</span><span> </span><span>system</span><span> </span><span>reset</span><span> </span><span>-f</span><span>                              </span><span># 清空全部镜像/容器/卷（危险）</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>podman</span><span> </span><span>generate</span><span> </span><span>kube</span><span> </span><span>web</span><span> &gt; </span><span>web.yaml</span><span>                 </span><span># 导出为 K8s YAML</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>podman</span><span> </span><span>play</span><span> </span><span>kube</span><span> </span><span>web.yaml</span><span>                           </span><span># 从 YAML 启动</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>podman</span><span> </span><span>pod</span><span> </span><span>create</span><span> </span><span>--name</span><span> </span><span>mypod</span><span> </span><span>-p</span><span> </span><span>8080:80</span><span>           </span><span># Pod</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h2>3.2 使用示例<a href="#32-使用示例"><span>#</span></a></h2><section><h3>3.2.1 基础用法<a href="#321-基础用法"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 运行容器</span></div></div><div><div><div>2</div></div><div><span>podman</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>--name</span><span> </span><span>web</span><span> </span><span>-p</span><span> </span><span>8080:80</span><span> </span><span>--restart=always</span><span> </span><span>nginx:1.27</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 查看容器运行状态</span></div></div><div><div><div>5</div></div><div><span>podman</span><span> </span><span>ps</span><span> </span><span>-a</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 查看镜像</span></div></div><div><div><div>8</div></div><div><span>podman</span><span> </span><span>images</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 查看日志</span></div></div><div><div><div>11</div></div><div><span>podman</span><span> </span><span>logs</span><span> </span><span>-f</span><span> </span><span>web</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>#进入容器</span></div></div><div><div><div>14</div></div><div><span>podman</span><span> </span><span>exec</span><span> </span><span>-it</span><span> </span><span>web</span><span> </span><span>bash</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span># 停止容器并删除</span></div></div><div><div><div>17</div></div><div><span>podman</span><span> </span><span>stop</span><span> </span><span>web</span></div></div><div><div><div>18</div></div><div><span>podman</span><span> </span><span>rm</span><span> </span><span>web</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span># 删除镜像</span></div></div><div><div><div>21</div></div><div><span>podman</span><span> </span><span>rmi</span><span> </span><span>nginx:1.27</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>3.2.2 挂载目录<a href="#322-挂载目录"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>data/www</span></div></div><div><div><div>2</div></div><div><span>echo</span><span> </span><span>"&lt;h1&gt;Hello Podman&lt;/h1&gt;"</span><span> &gt; </span><span>data/www/index.html</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># :Z 独占标签。将该目录的标签设为仅此容器可访问，并递归修改宿主机上该目录及其内容的 SELinux 上下文</span></div></div><div><div><div>5</div></div><div><span># :z 共享标签。标签允许多个容器访问，同样递归修改</span></div></div><div><div><div>6</div></div><div><span># 系统没有启用 SELinux时，该标签可以省略</span></div></div><div><div><div>7</div></div><div><span>podman</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>--name</span><span> </span><span>web</span><span> </span><span>-p</span><span> </span><span>8080:80</span><span> </span><span>-v</span><span> </span><span>data/www:/usr/share/nginx/html:Z</span><span> </span><span>nginx:1.27</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>3.2.3 容器携带变量<a href="#323-容器携带变量"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 启动容器使用变量、同时使用命名卷pgdata，</span></div></div><div><div><div>2</div></div><div><span>podman</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>--name</span><span> </span><span>db</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>-e </span><span>POSTGRES_PASSWORD=example</span><span> </span><span>\</span></div></div><div><div><div>4</div></div><div><span>-p </span><span>5432:5432</span><span> </span><span>\</span></div></div><div><div><div>5</div></div><div><span>-v </span><span>pgdata:/var/lib/postgresql/data</span><span> </span><span>\</span></div></div><div><div><div>6</div></div><div><span>postgres:16</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 查看容器状态</span></div></div><div><div><div>9</div></div><div><span>podman</span><span> </span><span>ps</span></div></div><div><div><div>10</div></div><div><span>podman</span><span> </span><span>logs</span><span> </span><span>-f</span><span> </span><span>db</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># 进入数据库</span></div></div><div><div><div>13</div></div><div><span>podman</span><span> </span><span>exec</span><span> </span><span>-it</span><span> </span><span>db</span><span> </span><span>psql</span><span> </span><span>-U</span><span> </span><span>postgres</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>3.2.4 使用pod模拟容器<a href="#324-使用pod模拟容器"><span>#</span></a></h3><p>Podman 的 Pod 类似 Kubernetes 的 Pod，多个容器可以共享网络。</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 创建一个pod</span></div></div><div><div><div>2</div></div><div><span>podman</span><span> </span><span>pod</span><span> </span><span>create</span><span> </span><span>--name</span><span> </span><span>app</span><span> </span><span>-p</span><span> </span><span>8080:80</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 在pod中启动容器</span></div></div><div><div><div>5</div></div><div><span>podman</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>--pod</span><span> </span><span>app</span><span> </span><span>--name</span><span> </span><span>web</span><span> </span><span>nginx:1.27</span></div></div><div><div><div>6</div></div><div><span>podman</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>--pod</span><span> </span><span>app</span><span> </span><span>--name</span><span> </span><span>redis</span><span> </span><span>redis:alpine</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 查看pod</span></div></div><div><div><div>9</div></div><div><span>podman</span><span> </span><span>pod</span><span> </span><span>ps</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span># 停止pod</span></div></div><div><div><div>12</div></div><div><span>podman</span><span> </span><span>pod</span><span> </span><span>stop</span><span> </span><span>app</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span># 删除pod</span></div></div><div><div><div>15</div></div><div><span>podman</span><span> </span><span>pod</span><span> </span><span>rm</span><span> </span><span>app</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><section><h4>3.2.4.1 Nginx 反向代理 + 后端 API<a href="#3241-nginx-反向代理--后端-api"><span>#</span></a></h4><p>后端不需要暴露给宿主机，只让 Nginx 对外服务。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>podman</span><span> </span><span>pod</span><span> </span><span>create</span><span> </span><span>--name</span><span> </span><span>api-pod</span><span> </span><span>-p</span><span> </span><span>8080:80</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>podman</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>--pod</span><span> </span><span>api-pod</span><span> </span><span>--name</span><span> </span><span>backend</span><span> </span><span>php:latest</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>podman</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>--pod</span><span> </span><span>api-pod</span><span> </span><span>--name</span><span> </span><span>nginx</span><span> </span><span>\</span></div></div><div><div><div>6</div></div><div><span>-v </span><span>./nginx.conf:/etc/nginx/nginx.conf:Z</span><span> </span><span>\</span></div></div><div><div><div>7</div></div><div><span>nginx:alpine</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>3.2.4.2 ELK / 日志栈本地调试<a href="#3242-elk--日志栈本地调试"><span>#</span></a></h4><p>把 Elasticsearch、Logstash、Kibana 放进一个 Pod，内部访问非常简单。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>podman</span><span> </span><span>pod</span><span> </span><span>create</span><span> </span><span>--name</span><span> </span><span>elk</span><span> </span><span>-p</span><span> </span><span>5601:5601</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>podman</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>--pod</span><span> </span><span>elk</span><span> </span><span>--name</span><span> </span><span>elasticsearch</span><span> </span><span>\</span></div></div><div><div><div>4</div></div><div><span>-e </span><span>"discovery.type=single-node"</span><span> </span><span>\</span></div></div><div><div><div>5</div></div><div><span>-v </span><span>es-data:/usr/share/elasticsearch/data</span><span> </span><span>\</span></div></div><div><div><div>6</div></div><div><span>elasticsearch:8.17.0</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>podman</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>--pod</span><span> </span><span>elk</span><span> </span><span>--name</span><span> </span><span>logstash</span><span> </span><span>\</span></div></div><div><div><div>9</div></div><div><span>logstash:8.17.0</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>podman</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>--pod</span><span> </span><span>elk</span><span> </span><span>--name</span><span> </span><span>kibana</span><span> </span><span>\</span></div></div><div><div><div>12</div></div><div><span>-e </span><span>"ELASTICSEARCH_HOSTS=http://localhost:9200"</span><span> </span><span>\</span></div></div><div><div><div>13</div></div><div><span>kibana:8.17.0</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>Kibana 和 Logstash 访问 Elasticsearch 时都可以直接用 <code>localhost:9200</code>。</p></section><section><h4>3.2.4.3 共享数据卷：构建产物 + 静态服务<a href="#3243-共享数据卷构建产物--静态服务"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>podman</span><span> </span><span>volume</span><span> </span><span>create</span><span> </span><span>build-data</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>podman</span><span> </span><span>pod</span><span> </span><span>create</span><span> </span><span>--name</span><span> </span><span>build-pod</span><span> </span><span>-p</span><span> </span><span>8080:80</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>podman</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>--pod</span><span> </span><span>build-pod</span><span> </span><span>--name</span><span> </span><span>builder</span><span> </span><span>\</span></div></div><div><div><div>6</div></div><div><span>-v </span><span>build-data:/app/dist</span><span> </span><span>\</span></div></div><div><div><div>7</div></div><div><span>node:20 </span><span>\</span></div></div><div><div><div>8</div></div><div><span>sh </span><span>-c</span><span> </span><span>"cd /app &amp;&amp; npm run build"</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>podman</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>--pod</span><span> </span><span>build-pod</span><span> </span><span>--name</span><span> </span><span>web</span><span> </span><span>\</span></div></div><div><div><div>11</div></div><div><span>-v </span><span>build-data:/usr/share/nginx/html:Z</span><span> </span><span>\</span></div></div><div><div><div>12</div></div><div><span>nginx:alpine</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这样可以把构建输出和静态服务拆成两个容器，但通过同一个卷共享文件。</p></section><section><h4>3.2.4.4 限制整个pod资源<a href="#3244-限制整个pod资源"><span>#</span></a></h4><p>资源限制可以加在 Pod 上，Pod 内所有容器共享这些限制。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>podman</span><span> </span><span>pod</span><span> </span><span>create</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>--name </span><span>limited-pod</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>-p </span><span>8080:80</span><span> </span><span>\</span></div></div><div><div><div>4</div></div><div><span>--memory=2g </span><span>\</span></div></div><div><div><div>5</div></div><div><span>--cpus=2</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>podman</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>--pod</span><span> </span><span>limited-pod</span><span> </span><span>--name</span><span> </span><span>app</span><span> </span><span>myapp:latest</span></div></div><div><div><div>8</div></div><div><span>podman</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>--pod</span><span> </span><span>limited-pod</span><span> </span><span>--name</span><span> </span><span>worker</span><span> </span><span>worker:latest</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>3.2.4.5 用YAML管理 Pod<a href="#3245-用yaml管理-pod"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 本地 Pod 导出成 YAML</span></div></div><div><div><div>2</div></div><div><span>podman</span><span> </span><span>generate</span><span> </span><span>kube</span><span> </span><span>mypod</span><span> &gt; </span><span>mypod.yaml</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 使用yaml启动</span></div></div><div><div><div>5</div></div><div><span>podman</span><span> </span><span>play</span><span> </span><span>kube</span><span> </span><span>mypod.yaml</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>3.2.4.6 用systemd管理 Pod<a href="#3246-用systemd管理-pod"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>podman</span><span> </span><span>pod</span><span> </span><span>create</span><span> </span><span>--name</span><span> </span><span>webapp</span><span> </span><span>-p</span><span> </span><span>8080:80</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>podman</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>--pod</span><span> </span><span>webapp</span><span> </span><span>--name</span><span> </span><span>web</span><span> </span><span>nginx:alpine</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>podman</span><span> </span><span>generate</span><span> </span><span>systemd</span><span> </span><span>--name</span><span> </span><span>webapp</span><span> </span><span>--files</span><span> </span><span>--new</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>生成后把 service 文件放到：</p><ul>
<li>用户级：<code>~/.config/systemd/user/</code></li>
<li>系统级：<code>/etc/systemd/system/</code></li>
</ul><p>然后：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>systemctl</span><span> </span><span>--user</span><span> </span><span>daemon-reload</span></div></div><div><div><div>2</div></div><div><span>systemctl</span><span> </span><span>--user</span><span> </span><span>enable</span><span> </span><span>--now</span><span> </span><span>pod-webapp.service</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果想让普通用户的服务开机也能运行，还需要执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>loginctl</span><span> </span><span>enable-linger</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8minio/</id>
      <title type="text">对象存储MinIO</title>
      <published>2026-09-20T00:00:00.000Z</published>
      <updated>2026-09-20T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8minio/"/>
      <summary type="text">对象存储MinIO</summary>
      <content type="html"><![CDATA[<section><h1>一、MinIO<a href="#一minio"><span>#</span></a></h1><p>MinIO 是一款基于 <strong>Go 语言</strong>开发的开源、高性能、分布式<strong>对象存储</strong>系统，于 2016 年首次发布。它 100% 兼容 <strong>Amazon S3 API</strong>，可以在消费级或企业级硬件上运行，专为云原生环境、AI/ML 工作负载及大数据湖而设计。</p><blockquote><p><strong>重要提示</strong>：MinIO 社区版已于 <strong>2025 年 12 月</strong>进入维护模式，2026 年 2 月 GitHub 仓库归档。官方战略重心已转向商业版 <strong>AIStor</strong>（集成 Apache Iceberg V3）等产品。但社区版仍可正常使用和学习，只是不再有新功能更新。</p></blockquote><section><h2>1.1 对象存储与传统存储区别<a href="#11-对象存储与传统存储区别"><span>#</span></a></h2>

<table><thead><tr><th>特性</th><th>文件存储（NFS等）</th><th>块存储（磁盘）</th><th>对象存储（MinIO）</th></tr></thead><tbody><tr><td>数据结构</td><td>目录树/文件</td><td>裸磁盘块</td><td>扁平命名空间（Bucket + Object）</td></tr><tr><td>扩展性</td><td>有限</td><td>单节点</td><td>水平无限扩展</td></tr><tr><td>适用场景</td><td>共享文件</td><td>数据库</td><td>图片/视频/日志/备份等非结构化数据</td></tr><tr><td>访问方式</td><td>文件系统路径</td><td>块设备</td><td>HTTP API（S3 协议）</td></tr></tbody></table></section><section><h2>1.2 核心概念<a href="#12-核心概念"><span>#</span></a></h2><ul>
<li><strong>Object（对象）</strong>：存储的基本单元，由数据本体、元数据和唯一 ID 组成。上传的每一个文件就是对象；<code>Object Key</code> 是文件路径名（如 <code>avatar/2026/user001.jpg</code>），对象 = 文件内容 + 元数据（大小、类型、上传时间）。</li>
<li><strong>Bucket（存储桶）</strong>：对象的逻辑容器，全局唯一命名，仅支持小写字母、数字、短横线和点，长度 3-63 字符。顶层容器，相当于 “根文件夹”，一个 MinIO 里可以建多个桶；桶名全局唯一，不能有大写字母</li>
<li><strong>Drive（驱动器）</strong>：存储数据的物理磁盘</li>
<li><strong>Erasure Set（纠删码集）</strong>：一组驱动器的集合，是数据冗余的基本单位</li>
<li><strong>API 端口 9000</strong>：S3 API 端口，程序 / SDK/mc 客户端上传下载走这个端口。</li>
<li><strong>Console 端口 9001</strong>：Web 管理控制台，浏览器访问，可视化管理。</li>
</ul></section><section><h2>1.3 核心特性<a href="#13-核心特性"><span>#</span></a></h2><section><h3>1.3.1 S3 协议兼容<a href="#131-s3-协议兼容"><span>#</span></a></h3><p>完整实现 AWS S3 核心 API（V2/V4），支持 AWS CLI、SDK 及 rclone 等工具无缝对接。应用仅需更改 Endpoint 配置即可从 AWS S3 迁移到 MinIO。</p></section><section><h3>1.3.2 高性能<a href="#132-高性能"><span>#</span></a></h3><ul>
<li>采用 Go 语言编写，支持异步 I/O 与 NVMe SSD 优化</li>
<li>单节点吞吐量可超 <strong>1 GB/s</strong></li>
<li>32 节点集群读写速度可达 <strong>325 GiB/s</strong>，QPS 可达 <strong>20 万次/秒</strong>，延迟稳定在 <strong>2ms</strong> 以内</li>
</ul></section><section><h3>1.3.3 数据保护<a href="#133-数据保护"><span>#</span></a></h3><p>MinIO 使用 <strong>Reed-Solomon 纠删码</strong>替代传统 RAID，将对象拆分为数据块和校验块分散存储。默认配置下可容忍高达<strong>一半</strong>的节点或磁盘故障而不丢失数据。</p><p>例如：12 块磁盘的部署中，6 块存数据、6 块存校验，即使只剩 7 块磁盘仍可正常读写。</p></section><section><h3>1.3.4 安全特性<a href="#134-安全特性"><span>#</span></a></h3><ul>
<li><strong>加密</strong>：支持 AES-256-GCM、ChaCha20-Poly1305，支持服务端加密（SSE-S3/SSE-KMS/SSE-C）和客户端加密</li>
<li><strong>WORM（对象锁定）</strong>：数据一旦写入即防篡改，满足合规要求</li>
<li><strong>Bitrot 保护</strong>：使用 HighwayHash 算法防止静默数据损坏</li>
<li><strong>TLS/SSL</strong>：传输加密</li>
</ul></section><section><h3>1.3.5 云原生支持<a href="#135-云原生支持"><span>#</span></a></h3><p>提供 Docker 镜像、Helm Chart 及 MinIO Operator，支持 Kubernetes 自动扩缩容、故障自愈及滚动升级。</p></section></section><section><h2>1.4 适用场景<a href="#14-适用场景"><span>#</span></a></h2><p><strong>MinIO 不是数据库，是对象存储（Object Storage）</strong>，兼容 AWS S3 API，专门用来存图片、视频、PDF、备份、模型文件这类<strong>非结构化文件</strong>，不是用来存业务表、行数据的关系型 / NoSQL 数据库</p><p>适合<code>图片 / 音视频存储、文件备份、AI 模型存储、数据湖、日志存储</code></p></section></section>
<section><h1>二、MinIO部署<a href="#二minio部署"><span>#</span></a></h1><p>MinIO 支持三种部署拓扑：</p>

<table><thead><tr><th>模式</th><th>说明</th><th>适用场景</th></tr></thead><tbody><tr><td><strong>单节点单硬盘（SNSD）</strong></td><td>一个服务器 + 一个存储目录</td><td>本地开发、评估测试</td></tr><tr><td><strong>单节点多硬盘（SNMD）</strong></td><td>一个服务器 + 4块以上磁盘</td><td>小规模工作负载</td></tr><tr><td><strong>多节点多硬盘（MNMD）</strong></td><td>多个服务器 + 多块磁盘</td><td>生产环境、PB级扩展</td></tr></tbody></table><blockquote><p>官网地址：<a href="https://minio.org.cn/" target="_blank">MinIO | 用于AI的S3 &amp; Kubernetes原生对象存储</a></p><p>官方文档：<a href="https://minio.org.cn/docs/minio/kubernetes/upstream/" target="_blank">MinIO对象存储 Kubernetes — MinIO中文文档 | MinIO Kubernetes中文文档</a></p><p>下载地址：<a href="https://minio.org.cn/download.shtml#/linux" target="_blank">MinIO下载和安装 | 用于创建高性能对象存储的代码和下载内容</a></p><p>github地址：<a href="https://github.com/minio/minio" target="_blank">minio/minio: MinIO is a high-performance, S3 compatible object store, open sourced under GNU AGPLv3 license.</a></p><p>最后一个保留完整 Web 控制台功能的 MinIO 版本是：<strong><code>RELEASE.2025-04-22T22-12-26Z</code></strong></p><p>从下一个版本 <code>RELEASE.2025-05-24T17-08-30Z</code> 开始，官方正式移除了嵌入式 Web 控制台的大部分管理功能，将其降级为”对象浏览器（Object Browser）”。</p></blockquote><section><h2>2.1 单机部署<a href="#21-单机部署"><span>#</span></a></h2><section><h3>2.1.1 二进制部署<a href="#211-二进制部署"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 1. 下载 MinIO</span></div></div><div><div><div>2</div></div><div><span>cd</span><span> </span><span>/usr/local/src</span></div></div><div><div><div>3</div></div><div><span>wget</span><span> </span><span>https://github.com/minio/minio/releases/download/RELEASE.2025-04-22T22-12-26Z/minio.linux-amd64.RELEASE.2025-04-22T22-12-26Z</span></div></div><div><div><div>4</div></div><div><span>chmod</span><span> </span><span>+x</span><span> </span><span>minio</span></div></div><div><div><div>5</div></div><div><span>mv</span><span> </span><span>minio</span><span> </span><span>/usr/local/bin/</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 2. 创建数据目录</span></div></div><div><div><div>8</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/data/minio</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 3. 设置环境变量</span></div></div><div><div><div>11</div></div><div><span>export</span><span> </span><span>MINIO_ROOT_USER</span><span>=</span><span>admin</span></div></div><div><div><div>12</div></div><div><span>export</span><span> </span><span>MINIO_ROOT_PASSWORD</span><span>=</span><span>Admin</span><span>@</span><span>123</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span># 4. 前台启动</span></div></div><div><div><div>15</div></div><div><span>minio</span><span> </span><span>server</span><span> </span><span>/data/minio</span><span> </span><span>--console-address</span><span> </span><span>":9001"</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><section><h4>2.1.1.1 配置systemd服务<a href="#2111-配置systemd服务"><span>#</span></a></h4><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>/etc/systemd/system/minio.service</span><span> &lt;&lt;</span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>[Unit]</span></div></div><div><div><div>3</div></div><div><span>Description=MinIO Object Storage Server</span></div></div><div><div><div>4</div></div><div><span>Documentation=https://docs.min.io</span></div></div><div><div><div>5</div></div><div><span>Wants=network-online.target</span></div></div><div><div><div>6</div></div><div><span>After=network-online.target</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>[Service]</span></div></div><div><div><div>9</div></div><div><span>User=root</span></div></div><div><div><div>10</div></div><div><span>Environment="MINIO_ROOT_USER=admin"</span></div></div><div><div><div>11</div></div><div><span>Environment="MINIO_ROOT_PASSWORD=Admin@123"</span></div></div><div><div><div>12</div></div><div><span># 执行命令：minio server 数据目录，指定console端口</span></div></div><div><div><div>13</div></div><div><span>ExecStart=/usr/local/bin/minio server /data/minio --console-address ":9001"</span></div></div><div><div><div>14</div></div><div><span>LimitNOFILE=65536</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span># 进程重启策略</span></div></div><div><div><div>17</div></div><div><span>Restart=always</span></div></div><div><div><div>18</div></div><div><span>RestartSec=5</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span># 日志输出</span></div></div><div><div><div>21</div></div><div><span>StandardOutput=journal+console</span></div></div><div><div><div>22</div></div><div><span>StandardError=journal+console</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>[Install]</span></div></div><div><div><div>25</div></div><div><span>WantedBy=multi-user.target</span></div></div><div><div><div>26</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>systemctl</span><span> </span><span>daemon-reload</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>systemctl</span><span> </span><span>start</span><span> </span><span>minio.service</span></div></div><div><div><div>4</div></div><div><span>systemctl</span><span> </span><span>status</span><span> </span><span>minio.service</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 查看端口</span></div></div><div><div><div>7</div></div><div><span>netstat</span><span> </span><span>-tunlp</span><span> | </span><span>grep</span><span> </span><span>-E</span><span> </span><span>"9000|9001"</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>2.1.2 docker部署<a href="#212-docker部署"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 拉取镜像（推荐使用带控制台的最后一个AGPL v3版本）</span></div></div><div><div><div>2</div></div><div><span>docker</span><span> </span><span>pull</span><span> </span><span>minio/minio:RELEASE.2025-04-22T22-12-26Z</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 创建数据目录</span></div></div><div><div><div>5</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/data/minio</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 启动 MinIO</span></div></div><div><div><div>8</div></div><div><span>docker</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>\</span></div></div><div><div><div>9</div></div><div><span>  </span><span>--name</span><span> </span><span>minio-server</span><span> </span><span>\</span></div></div><div><div><div>10</div></div><div><span>  </span><span>-p</span><span> </span><span>9000:9000</span><span> </span><span>\</span></div></div><div><div><div>11</div></div><div><span>  </span><span>-p</span><span> </span><span>9001:9001</span><span> </span><span>\</span></div></div><div><div><div>12</div></div><div><span>  </span><span>-v</span><span> </span><span>/data/minio:/data</span><span> </span><span>\</span></div></div><div><div><div>13</div></div><div><span>  </span><span>-e</span><span> </span><span>"MINIO_ROOT_USER=admin"</span><span> </span><span>\</span></div></div><div><div><div>14</div></div><div><span>  </span><span>-e</span><span> </span><span>"MINIO_ROOT_PASSWORD=Admin@123"</span><span> </span><span>\</span></div></div><div><div><div>15</div></div><div><span>  </span><span>minio/minio:RELEASE.2025-04-22T22-12-26Z</span><span> </span><span>\</span></div></div><div><div><div>16</div></div><div><span>  </span><span>server</span><span> </span><span>/data</span><span> </span><span>--console-address</span><span> </span><span>":9001"</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>使用<code>docker-compose</code></p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 创建docker-compose.yml</span></div></div><div><div><div>2</div></div><div><span>version:</span><span> </span><span>'3'</span></div></div><div><div><div>3</div></div><div><span>services:</span></div></div><div><div><div>4</div></div><div><span>  </span><span>minio:</span></div></div><div><div><div>5</div></div><div><span>    </span><span>image:</span><span> </span><span>minio/minio:RELEASE.2025-04-22T22-12-26Z</span></div></div><div><div><div>6</div></div><div><span>    </span><span>container_name:</span><span> </span><span>minio-server</span></div></div><div><div><div>7</div></div><div><span>    </span><span>ports:</span></div></div><div><div><div>8</div></div><div><span>      </span><span>-</span><span> </span><span>"9000:9000"</span></div></div><div><div><div>9</div></div><div><span>      </span><span>-</span><span> </span><span>"9001:9001"</span></div></div><div><div><div>10</div></div><div><span>    </span><span>environment:</span></div></div><div><div><div>11</div></div><div><span>      </span><span>MINIO_ROOT_USER:</span><span> </span><span>admin</span></div></div><div><div><div>12</div></div><div><span>      </span><span>MINIO_ROOT_PASSWORD:</span><span> </span><span>Admin@123</span></div></div><div><div><div>13</div></div><div><span>    </span><span>volumes:</span></div></div><div><div><div>14</div></div><div><span>      </span><span>-</span><span> </span><span>/data/minio:/data</span></div></div><div><div><div>15</div></div><div><span>    </span><span>command</span><span>:</span><span> </span><span>server</span><span> </span><span>/data</span><span> </span><span>--console-address</span><span> </span><span>":9001"</span></div></div><div><div><div>16</div></div><div><span>    </span><span>restart:</span><span> </span><span>unless-stopped</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>启动</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>compose</span><span> </span><span>up</span><span> </span><span>-d</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section></section>
<section><h1>三、MinIO web控制台使用<a href="#三minio-web控制台使用"><span>#</span></a></h1><section><h2>3.1 Object Browser（对象浏览器）<a href="#31-object-browser对象浏览器"><span>#</span></a></h2><p><strong>作用</strong>：最基础的文件浏览与管理界面，也是登录后默认进入的页面。</p><p><strong>核心功能</strong>：</p><ul>
<li>
<p><strong>浏览所有桶</strong>：左侧或顶部展示你有权限访问的所有桶列表</p>
<p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/18/%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8MinIO/image-20260917134313644.png" alt="image-20260917134313644" /><figcaption>image-20260917134313644</figcaption></figure><p></p>
</li>
<li>
<p><strong>文件上传</strong>：支持单文件 / 多文件上传到指定桶</p>
</li>
<li>
<p><strong>文件下载</strong>：点击文件可下载到本地</p>
</li>
<li>
<p><strong>文件预览</strong>：图片、文本等常见格式可直接在线预览</p>
</li>
<li>
<p><strong>创建文件夹</strong>：在桶内创建虚拟目录（前缀）</p>
</li>
<li>
<p><strong>删除文件 / 文件夹</strong>：支持单个或批量删除</p>
</li>
<li>
<p><strong>分享链接</strong>：生成临时预签名 URL，可对外分享文件访问权限</p>
<p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/18/%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8MinIO/image-20260917134435807.png" alt="image-20260917134435807" /><figcaption>image-20260917134435807</figcaption></figure><p></p>
</li>
<li>
<p><strong>版本回滚（Rewind）</strong>：如果桶开启了版本控制，可恢复到历史版本</p>
</li>
<li>
<p><strong>筛选搜索</strong>：按文件名快速过滤对象</p>
</li>
</ul><p><strong>使用场景</strong>：日常文件上传、下载、查看，是最常用的功能。</p></section><section><h2>3.2  Access Keys（访问密钥）<a href="#32--access-keys访问密钥"><span>#</span></a></h2><p><strong>作用</strong>：管理 S3 API 对接用的 Access Key 和 Secret Key。</p><p><strong>核心功能</strong>：</p><ul>
<li><strong>创建密钥</strong>：为当前用户生成新的 AccessKey/SecretKey 对</li>
<li><strong>查看密钥</strong>：查看已创建的密钥列表</li>
<li><strong>禁用 / 启用密钥</strong>：临时停用某个密钥而不删除</li>
<li><strong>删除密钥</strong>：永久删除不再使用的密钥</li>
<li><strong>设置过期时间</strong>：密钥可设置自动过期时间，提升安全性</li>
<li><strong>关联策略</strong>：为每个密钥单独绑定权限策略</li>
</ul><p><strong>使用场景</strong>：</p><ul>
<li>给应用程序、开发团队对接 S3 API 时，创建专属密钥</li>
<li>不同项目 / 人员使用不同密钥，方便权限隔离和审计</li>
</ul><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/18/%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8MinIO/image-20260917134959546.png" alt="image-20260917134959546" /><figcaption>image-20260917134959546</figcaption></figure><p></p></section><section><h2>3.3 Buckets（桶管理）<a href="#33-buckets桶管理"><span>#</span></a></h2><p><strong>作用</strong>：集中管理所有存储桶的配置和状态。</p><p><strong>核心功能</strong>：</p><ul>
<li>
<p><strong>创建桶</strong>：新建存储桶，可设置区域、版本控制等参数</p>
</li>
<li>
<p><strong>查看桶详情</strong>：每个桶显示名称、对象数量、总大小、访问权限（R/W 读写）</p>
<p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/18/%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8MinIO/image-20260917135253492.png" alt="image-20260917135253492" /><figcaption>image-20260917135253492</figcaption></figure><p></p>
</li>
<li>
<p><strong>桶权限设置</strong>：设置桶为私有（Private）、公共读（Public Read）或公共读写</p>
</li>
<li>
<p><strong>版本控制</strong>：开启 / 关闭桶的对象版本控制，防止误删除</p>
</li>
<li>
<p><strong>生命周期规则</strong>：设置文件自动过期、自动转储到更低存储级别</p>
</li>
<li>
<p><strong>桶复制</strong>：配置跨桶 / 跨集群的数据自动同步</p>
</li>
<li>
<p><strong>对象锁定</strong>：开启 WORM（一次写入多次读取）合规保留</p>
</li>
<li>
<p><strong>删除桶</strong>：删除不再使用的桶</p>
<p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/18/%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8MinIO/image-20260917140352484.png" alt="image-20260917140352484" /><figcaption>image-20260917140352484</figcaption></figure><p></p>
</li>
<li>
<p><strong>搜索桶</strong>：按名称快速筛选桶</p>
</li>
</ul><p><strong>使用场景</strong>：</p><ul>
<li>
<p>初始化存储桶并配置权限策略</p>
</li>
<li>
<p>监控每个桶的存储用量和对象数量</p>
</li>
<li>
<p>配置自动清理规则，节省存储空间</p>
</li>
</ul></section><section><h2>3.4 Policies（IAM 权限策略）<a href="#34-policiesiam-权限策略"><span>#</span></a></h2><p><strong>作用</strong>：基于策略的访问控制（PBAC），定义用户 / 用户组能对哪些资源做什么操作。</p><p><strong>核心功能</strong>：</p><ul>
<li>
<p><strong>内置默认策略</strong>：MinIO 自带 5 个常用策略</p>
<ul>
<li>
<p><code>consoleAdmin</code>：控制台完全管理员权限</p>
</li>
<li>
<p><code>diagnostics</code>：诊断和监控只读权限</p>
</li>
<li>
<p><code>readonly</code>：只读权限，可查看所有桶和文件</p>
</li>
<li>
<p><code>readwrite</code>：读写权限，可上传下载文件</p>
</li>
<li>
<p><code>writeonly</code>：只写权限，只能上传不能下载</p>
</li>
</ul>
</li>
</ul><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/18/%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8MinIO/image-20260917140544516.png" alt="image-20260917140544516" /><figcaption>image-20260917140544516</figcaption></figure><p></p><ul>
<li>
<p><strong>创建自定义策略</strong>：用 JSON 语法编写细粒度权限策略</p>
<ul>
<li>
<p>精确到某个桶、某个前缀（文件夹）</p>
</li>
<li>
<p>精确到允许的 API 操作（GetObject、PutObject、DeleteObject 等）</p>
</li>
</ul>
</li>
<li>
<p><strong>搜索策略</strong>：按名称查找已有策略</p>
</li>
<li>
<p><strong>删除策略</strong>：删除自定义策略</p>
</li>
</ul><p><strong>策略示例</strong>：<code>all-bucket-readwrite</code>，允许访问<strong>所有桶</strong></p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>{</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>"Version": "2012-10-17",</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>"Statement": [</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>{</span></div></div><div><div><div>5</div></div><div><span><span>            </span></span><span>"Effect": "Allow",</span></div></div><div><div><div>6</div></div><div><span><span>            </span></span><span>"Action": [</span></div></div><div><div><div>7</div></div><div><span><span>                </span></span><span>"s3:*"</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>],</span></div></div><div><div><div>9</div></div><div><span><span>            </span></span><span>"Resource": [</span></div></div><div><div><div>10</div></div><div><span><span>                </span></span><span>"arn:aws:s3:::*",</span></div></div><div><div><div>11</div></div><div><span><span>                </span></span><span>"arn:aws:s3:::*/*"</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>]</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>]</span></div></div><div><div><div>15</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p><strong>使用场景</strong>：</p><ul>
<li>
<p>给不同团队 / 项目分配不同的存储权限</p>
</li>
<li>
<p>限制某个用户只能访问指定桶或指定文件夹</p>
</li>
<li>
<p>实现最小权限原则，提升安全性</p>
</li>
</ul></section><section><h2>3.5 Identity（身份管理）<a href="#35-identity身份管理"><span>#</span></a></h2><section><h3>3.5.1 Users（用户管理）<a href="#351-users用户管理"><span>#</span></a></h3><p><strong>作用</strong>：管理 MinIO 本地用户账号。</p><p><strong>核心功能</strong>：</p><ul>
<li>
<p><strong>创建用户</strong>：新建用户，设置用户名和密码</p>
</li>
<li>
<p><strong>分配策略</strong>：为用户绑定一个或多个权限策略</p>
</li>
<li>
<p><strong>加入用户组</strong>：将用户添加到某个用户组，继承组权限</p>
</li>
<li>
<p><strong>禁用 / 启用用户</strong>：临时停用某个用户登录</p>
</li>
<li>
<p><strong>删除用户</strong>：永久删除用户账号</p>
</li>
<li>
<p><strong>搜索用户</strong>：按用户名筛选</p>
</li>
</ul><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/18/%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8MinIO/image-20260917141050388.png" alt="image-20260917141050388" /><figcaption>image-20260917141050388</figcaption></figure><p></p><p><strong>说明</strong>：</p><ul>
<li>
<p>每个用户由唯一的 Access Key（用户名）和 Secret Key（密码）组成</p>
</li>
<li>
<p>用户通过所属用户组继承权限，也可以直接绑定策略</p>
</li>
<li>
<p>支持策略的叠加：用户自己的策略 + 所在组的策略，权限取并集</p>
</li>
</ul></section><section><h3>3.5.2 Groups（用户组管理）<a href="#352-groups用户组管理"><span>#</span></a></h3><p><strong>作用</strong>：按团队 / 部门分组管理用户，简化权限分配。</p><p><strong>核心功能</strong>：</p><ul>
<li>
<p><strong>创建用户组</strong>：新建用户组</p>
</li>
<li>
<p><strong>添加 / 移除用户</strong>：在组内管理成员</p>
</li>
<li>
<p><strong>分配策略</strong>：为整个组绑定权限策略，组内所有成员自动继承</p>
</li>
<li>
<p><strong>禁用 / 启用组</strong>：一次性停用整个组的权限</p>
</li>
<li>
<p><strong>删除用户组</strong>：删除组本身（不删除组内用户）</p>
</li>
</ul><p><strong>使用场景</strong>：</p><ul>
<li>
<p>按部门分组建用户组，如 “研发组”、“运营组”、“备份组”</p>
</li>
<li>
<p>给整个组分配相同的桶访问权限，不用逐个用户配置</p>
</li>
</ul><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/18/%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8MinIO/image-20260917141142124.png" alt="image-20260917141142124" /><figcaption>image-20260917141142124</figcaption></figure><p></p></section><section><h3>3.5.3 OpenID（OpenID 集成）<a href="#353-openidopenid-集成"><span>#</span></a></h3><p><strong>作用</strong>：对接外部 OpenID Connect 身份提供商（如 Keycloak、Auth0、Google 等）。</p><p><strong>核心功能</strong>：</p><ul>
<li>
<p>配置外部 OIDC 身份源</p>
</li>
<li>
<p>允许用户用第三方单点登录（SSO）访问 MinIO</p>
</li>
<li>
<p>支持将 OIDC 中的用户组映射到 MinIO 权限策略</p>
</li>
</ul><p><strong>使用场景</strong>：企业已有统一身份认证系统，希望员工用统一账号登录 MinIO，不用单独创建账号。</p></section><section><h3>3.5.4 LDAP（LDAP 集成）<a href="#354-ldapldap-集成"><span>#</span></a></h3><p><strong>作用</strong>：对接企业内部 LDAP/Active Directory 目录服务。</p><p><strong>核心功能</strong>：</p><ul>
<li>
<p>配置 LDAP 服务器连接参数（地址、端口、绑定账号）</p>
</li>
<li>
<p>配置用户搜索和组搜索的基准 DN</p>
</li>
<li>
<p>自动将 LDAP 用户同步到 MinIO</p>
</li>
<li>
<p>支持将 LDAP 组映射到 MinIO 权限策略</p>
</li>
</ul><p><strong>使用场景</strong>：大型企业用 AD/LDAP 管理员工账号，MinIO 直接复用现有组织架构和账号体系。</p></section></section><section><h2>3.6 Monitoring（监控中心）<a href="#36-monitoring监控中心"><span>#</span></a></h2><section><h3>3.6.1 Metrics（系统指标仪表盘）<a href="#361-metrics系统指标仪表盘"><span>#</span></a></h3><p><strong>作用</strong>：实时查看 MinIO 集群运行状态和资源使用情况。</p><p><strong>核心功能</strong>（顶部有 4 个标签页）：</p><ul>
<li>
<p><strong>Info（概览）</strong>：</p>
<ul>
<li>
<p>桶数量、对象总数</p>
</li>
<li>
<p>服务器节点数量（在线 / 离线）</p>
</li>
<li>
<p>磁盘数量（在线 / 离线）</p>
</li>
<li>
<p>后端存储类型、存储纠删码配置</p>
</li>
</ul>
</li>
<li>
<p><strong>Usage（用量）</strong>：</p>
<ul>
<li>
<p>总存储容量和已使用空间</p>
</li>
<li>
<p>各桶存储用量分布</p>
</li>
<li>
<p>对象数量增长趋势</p>
</li>
</ul>
</li>
<li>
<p><strong>Traffic（流量）</strong>：</p>
<ul>
<li>
<p>读写请求 QPS</p>
</li>
<li>
<p>网络入站 / 出站带宽</p>
</li>
<li>
<p>API 调用延迟统计</p>
</li>
</ul>
</li>
<li>
<p><strong>Resources（资源）</strong>：</p>
<ul>
<li>
<p>CPU 使用率</p>
</li>
<li>
<p>内存使用率</p>
</li>
<li>
<p>磁盘 I/O 性能</p>
</li>
</ul>
</li>
</ul><p><strong>使用场景</strong>：日常运维监控，快速判断集群是否健康，存储是否快满了。</p></section><section><h3>3.6.2 Logs（系统日志）<a href="#362-logs系统日志"><span>#</span></a></h3><p><strong>作用</strong>：查看 MinIO 服务器运行日志。</p><p><strong>核心功能</strong>：</p><ul>
<li>
<p>实时滚动查看服务端日志输出</p>
</li>
<li>
<p>按日志级别过滤（Info、Warning、Error）</p>
</li>
<li>
<p>查看启动信息、配置加载、API 请求错误等</p>
</li>
</ul><p><strong>使用场景</strong>：排查服务启动失败、API 调用异常等问题。</p></section><section><h3>3.6.3 Audit（审计日志）<a href="#363-audit审计日志"><span>#</span></a></h3><p><strong>作用</strong>：记录所有用户的 API 访问行为，用于安全审计。</p><p><strong>核心功能</strong>：</p><ul>
<li>
<p>记录每个 API 请求的时间、调用者、操作类型</p>
</li>
<li>
<p>记录请求的桶、对象路径</p>
</li>
<li>
<p>记录请求的来源 IP、响应状态码</p>
</li>
<li>
<p>支持按用户、按操作类型筛选</p>
</li>
</ul><p><strong>使用场景</strong>：</p><ul>
<li>
<p>安全合规审计，追溯谁在什么时间访问 / 修改了什么文件</p>
</li>
<li>
<p>排查误删除操作，找到操作人</p>
</li>
<li>
<p>统计用户访问行为</p>
</li>
</ul></section></section><section><h2>3.7 Events（事件通知）<a href="#37-events事件通知"><span>#</span></a></h2><p><strong>作用</strong>：当桶内发生文件上传、删除等事件时，自动推送到外部系统。</p><p><strong>核心功能</strong>：</p><ul>
<li>
<p><strong>添加事件目的地</strong>：配置接收通知的外部服务</p>
<ul>
<li>
<p>Webhook（HTTP 回调）</p>
</li>
<li>
<p>Kafka 消息队列</p>
</li>
<li>
<p>Redis</p>
</li>
<li>
<p>MySQL/PostgreSQL 数据库</p>
</li>
<li>
<p>MQTT</p>
</li>
<li>
<p>Elasticsearch</p>
</li>
</ul>
</li>
<li>
<p><strong>触发事件类型</strong>：</p>
<ul>
<li>
<p>文件上传（s3:ObjectCreated）</p>
</li>
<li>
<p>文件删除（s3:ObjectRemoved）</p>
</li>
<li>
<p>恢复文件、复制完成等</p>
</li>
</ul>
</li>
<li>
<p><strong>按桶配置</strong>：每个桶单独配置要推送的事件类型</p>
</li>
<li>
<p><strong>筛选条件</strong>：可按文件名前缀 / 后缀过滤要通知的事件</p>
</li>
</ul><p><strong>使用场景</strong>：</p><ul>
<li>
<p>用户上传图片后，自动通知后端服务做缩略图处理</p>
</li>
<li>
<p>文件删除后，自动触发数据备份</p>
</li>
<li>
<p>业务系统需要实时感知存储桶变化</p>
</li>
</ul></section><section><h2>3.8 Configuration（系统配置）<a href="#38-configuration系统配置"><span>#</span></a></h2><p><strong>作用</strong>：MinIO 服务器级别的全局参数配置。</p><p><strong>核心配置项</strong>（左侧标签页）：</p><ul>
<li>
<p><strong>Region（区域）</strong>：设置服务器物理区域标识，影响 S3 API 的区域头信息</p>
</li>
<li>
<p><strong>Compression（压缩）</strong>：配置服务端传输压缩，减小网络带宽占用</p>
</li>
<li>
<p><strong>API</strong>：API 请求相关配置，如请求大小限制、超时时间</p>
</li>
<li>
<p><strong>Scanner（扫描器）</strong>：后台磁盘扫描任务的配置，用于数据完整性校验</p>
</li>
<li>
<p><strong>Etcd</strong>：对接外部 Etcd 服务发现配置（分布式模式用）</p>
</li>
<li>
<p><strong>Logger Webhook</strong>：将系统日志推送到外部 HTTP 接口</p>
</li>
<li>
<p><strong>Audit Webhook</strong>：将审计日志推送到外部 HTTP 接口</p>
</li>
<li>
<p><strong>Audit Kafka</strong>：将审计日志推送到 Kafka 集群</p>
</li>
</ul><p><strong>操作</strong>：</p><ul>
<li>
<p>导出配置：下载当前配置到本地</p>
</li>
<li>
<p>导入配置：从本地文件导入配置</p>
</li>
<li>
<p>恢复默认：一键恢复出厂设置</p>
</li>
</ul><p><strong>使用场景</strong>：</p><ul>
<li>
<p>高级运维调优，比如调整 API 超时、压缩级别</p>
</li>
<li>
<p>配置日志统一收集到 ELK、Prometheus 等监控系统</p>
</li>
</ul></section></section>
<section><h1>四、MinIO命令使用<a href="#四minio命令使用"><span>#</span></a></h1><p>使用 mc 命令行客户端<strong>MinIO Client</strong>，mc 是官方命令行工具，兼容 S3</p><blockquote><p>github项目地址：<a href="https://github.com/minio/mc" target="_blank">minio/mc: Unix like utilities for object store</a></p><p>官方中文文档：<a href="https://minio.org.cn/docs/minio/linux/reference/minio-mc.html" target="_blank">MinIO客户端 — MinIO中文文档 | MinIO Linux中文文档</a></p></blockquote><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/usr/local/src</span></div></div><div><div><div>2</div></div><div><span>wget</span><span> </span><span>https://github.com/minio/mc/releases/download/RELEASE.2025-04-16T18-13-26Z/mc.linux-amd64.RELEASE.2025-04-16T18-13-26Z</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>mv</span><span> </span><span>mc.linux-amd64.RELEASE.2025-04-16T18-13-26Z</span><span> </span><span>mc</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>chmod</span><span> </span><span>+x</span><span> </span><span>mc</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>mv</span><span> </span><span>mc</span><span> </span><span>/usr/local/bin/</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h2>4.1 mc常用命令<a href="#41-mc常用命令"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 添加minio服务别名（起名字，后面直接用别名操作）</span></div></div><div><div><div>2</div></div><div><span>mc</span><span> </span><span>alias</span><span> </span><span>set</span><span> </span><span>myminio</span><span> </span><span>http://127.0.0.1:9000</span><span> </span><span>admin</span><span> </span><span>Admin@123</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 删除别名minio</span></div></div><div><div><div>5</div></div><div><span>mc</span><span> </span><span>alias</span><span> </span><span>rm</span><span> </span><span>myminio</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 查看已配置的所有别名</span></div></div><div><div><div>8</div></div><div><span>mc</span><span> </span><span>alias</span><span> </span><span>list</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 配置命令补全</span></div></div><div><div><div>11</div></div><div><span>mc</span><span> </span><span>--autocompletion</span></div></div><div><div><div>12</div></div><div><span># 卸载自动补全</span></div></div><div><div><div>13</div></div><div><span>mc</span><span> </span><span>--autocompletion</span><span> </span><span>remove</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>4.1.1 桶操作<a href="#411-桶操作"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 1.查看所有桶</span></div></div><div><div><div>2</div></div><div><span>[root@localhost /usr/local/src]# mc ls myminio</span></div></div><div><div><div>3</div></div><div><span>[2026-09-17 10:52:14 CST]     0B bucket-2/</span></div></div><div><div><div>4</div></div><div><span>[2026-09-17 10:48:56 CST]     0B upload-file/</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 2.创建桶</span></div></div><div><div><div>7</div></div><div><span>[root@localhost /root]# mc mb myminio/test-bucket</span></div></div><div><div><div>8</div></div><div><span>Bucket</span><span> </span><span>created</span><span> </span><span>successfully</span><span> </span><span>`</span><span>myminio/test-bucket</span><span>`</span><span>.</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 3.删除桶：桶必须是空的才能直接删；带--force会先删除桶内所有对象再删桶</span></div></div><div><div><div>11</div></div><div><span>mc</span><span> </span><span>rb</span><span> </span><span>myminio/test-bucket</span></div></div><div><div><div>12</div></div><div><span>mc</span><span> </span><span>rb</span><span> </span><span>myminio/test-bucket</span><span> </span><span>--force</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span># 4.查看桶信息（容量、对象数量）</span></div></div><div><div><div>15</div></div><div><span>[root@localhost /root]# mc du myminio/test-bucket</span></div></div><div><div><div>16</div></div><div><span>13B</span><span>  </span><span>1</span><span> </span><span>object</span><span>  </span><span>test-bucket</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span># 4.开启桶版本控制</span></div></div><div><div><div>19</div></div><div><span>mc</span><span> </span><span>version</span><span> </span><span>enable</span><span> </span><span>myminio/test-bucket</span></div></div><div><div><div>20</div></div><div><span># 查看版本状态</span></div></div><div><div><div>21</div></div><div><span>mc</span><span> </span><span>version</span><span> </span><span>info</span><span> </span><span>myminio/test-bucket</span></div></div><div><div><div>22</div></div><div><span># 暂停版本控制</span></div></div><div><div><div>23</div></div><div><span>mc</span><span> </span><span>version</span><span> </span><span>suspend</span><span> </span><span>myminio/test-bucket</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span># 5.设置桶访问策略</span></div></div><div><div><div>26</div></div><div><span># 私有（默认，推荐业务使用）</span></div></div><div><div><div>27</div></div><div><span>mc</span><span> </span><span>policy</span><span> </span><span>set</span><span> </span><span>private</span><span> </span><span>myminio/test-bucket</span></div></div><div><div><div>28</div></div><div><span># 公开只读：任何人可以直接访问文件链接（图片静态资源用）</span></div></div><div><div><div>29</div></div><div><span>mc</span><span> </span><span>policy</span><span> </span><span>set</span><span> </span><span>public</span><span> </span><span>myminio/test-bucket</span></div></div><div><div><div>30</div></div><div><span># 查看当前桶策略</span></div></div><div><div><div>31</div></div><div><span>mc</span><span> </span><span>policy</span><span> </span><span>get</span><span> </span><span>myminio/test-bucket</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>4.1.2 对象（文件）操作<a href="#412-对象文件操作"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 1.上传本地文件到桶</span></div></div><div><div><div>2</div></div><div><span>mc</span><span> </span><span>cp</span><span> </span><span>./111.json</span><span> </span><span>myminio/test-bucket/</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 2.下载文件到本地</span></div></div><div><div><div>5</div></div><div><span>mc</span><span> </span><span>cp</span><span> </span><span>myminio/test-bucket/111.json</span><span> </span><span>./</span></div></div><div><div><div>6</div></div><div><span># 递归下载整个目录</span></div></div><div><div><div>7</div></div><div><span>mc</span><span> </span><span>cp</span><span> </span><span>-r</span><span> </span><span>myminio/test-bucket/files</span><span> </span><span>./</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 3.删除对象</span></div></div><div><div><div>10</div></div><div><span>mc</span><span> </span><span>rm</span><span> </span><span>myminio/test-bucket/111.json</span></div></div><div><div><div>11</div></div><div><span># 递归删除桶内全部文件（桶保留，只删内容）</span></div></div><div><div><div>12</div></div><div><span>mc</span><span> </span><span>rm</span><span> </span><span>-r</span><span> </span><span>myminio/test-bucket/</span><span> </span><span>--force</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span># 4.本地 ./files 目录全部上传到minio的demo-bucket/files</span></div></div><div><div><div>15</div></div><div><span>mc</span><span> </span><span>cp</span><span> </span><span>-r</span><span> </span><span>./files</span><span> </span><span>myminio/demo-bucket/files</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span># 5.上传到模拟子目录（自动创建avatar/路径）</span></div></div><div><div><div>18</div></div><div><span>mc</span><span> </span><span>cp</span><span> </span><span>/tmp/avatar.jpg</span><span> </span><span>myminio/demo-bucket/avatar/user1.jpg</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span># 6.列出桶内文件</span></div></div><div><div><div>21</div></div><div><span># 列出根目录</span></div></div><div><div><div>22</div></div><div><span>mc</span><span> </span><span>ls</span><span> </span><span>myminio/demo-bucket</span></div></div><div><div><div>23</div></div><div><span># 递归列出所有子目录全部文件</span></div></div><div><div><div>24</div></div><div><span>mc</span><span> </span><span>ls</span><span> </span><span>-r</span><span> </span><span>myminio/demo-bucket</span></div></div><div><div><div>25</div></div><div><span># 列出带文件大小、修改时间</span></div></div><div><div><div>26</div></div><div><span>mc</span><span> </span><span>ls</span><span> </span><span>--human-readable</span><span> </span><span>myminio/demo-bucket</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span># 7.对象移动/重命名  minio 里重命名本质是复制 + 删除原对象</span></div></div><div><div><div>30</div></div><div><span># 桶内移动（改名）</span></div></div><div><div><div>31</div></div><div><span>mc</span><span> </span><span>mv</span><span> </span><span>myminio/demo-bucket/old.jpg</span><span> </span><span>myminio/demo-bucket/new.jpg</span></div></div><div><div><div>32</div></div><div><span># 跨桶移动文件</span></div></div><div><div><div>33</div></div><div><span>mc</span><span> </span><span>mv</span><span> </span><span>myminio/demo-bucket/file.txt</span><span> </span><span>myminio/other-bucket/</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span># 8.对象复制</span></div></div><div><div><div>36</div></div><div><span>mc</span><span> </span><span>cp</span><span> </span><span>myminio/demo-bucket/file.txt</span><span> </span><span>myminio/demo-bucket/file_bak.txt</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>4.1.3 预签名URL<a href="#413-预签名url"><span>#</span></a></h3><p>生成临时下载链接，带过期时间，不需要账号密码即可访问</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 生成1小时有效期下载链接</span></div></div><div><div><div>2</div></div><div><span>mc</span><span> </span><span>presign</span><span> </span><span>myminio/demo-bucket/test.txt</span><span> </span><span>1h</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 20分钟有效期</span></div></div><div><div><div>5</div></div><div><span>mc</span><span> </span><span>presign</span><span> </span><span>myminio/demo-bucket/test.txt</span><span> </span><span>20m</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 7天有效期</span></div></div><div><div><div>8</div></div><div><span>mc</span><span> </span><span>presign</span><span> </span><span>myminio/demo-bucket/test.txt</span><span> </span><span>7d</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 生成预签名上传 URL</span></div></div><div><div><div>11</div></div><div><span>mc</span><span> </span><span>presign</span><span> </span><span>--put</span><span> </span><span>myminio/demo-bucket/uploadfile.txt</span><span> </span><span>30m</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>4.1.4 元数据 &amp; 对象信息<a href="#414-元数据--对象信息"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 查看对象详细信息（大小、etag、内容类型等）</span></div></div><div><div><div>2</div></div><div><span>mc</span><span> </span><span>stat</span><span> </span><span>myminio/demo-bucket/test.txt</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>4.1.5 镜像同步<a href="#415-镜像同步"><span>#</span></a></h3><p><code>mc mirror</code> 用来本地目录 ↔ minio，或者 minioA ↔ minioB 双向 / 单向同步，做备份。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 本地目录同步到minio（增量，只上传新增/修改文件）</span></div></div><div><div><div>2</div></div><div><span>mc</span><span> </span><span>mirror</span><span> </span><span>/data/backup</span><span> </span><span>myminio/demo-bucket/backup</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># minio桶同步到本地</span></div></div><div><div><div>5</div></div><div><span>mc</span><span> </span><span>mirror</span><span> </span><span>myminio/demo-bucket/backup</span><span> </span><span>/data/backup</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 删除目标端多余文件（保持两边完全一致，谨慎使用）</span></div></div><div><div><div>8</div></div><div><span>mc</span><span> </span><span>mirror</span><span> </span><span>--remove</span><span> </span><span>/data/backup</span><span> </span><span>myminio/demo-bucket/backup</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section><section><h3>4.1.6 IAM 用户 &amp; 访问密钥<a href="#416-iam-用户--访问密钥"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 创建子用户，生成accesskey/secretkey</span></div></div><div><div><div>2</div></div><div><span>mc</span><span> </span><span>admin</span><span> </span><span>user</span><span> </span><span>add</span><span> </span><span>myminio</span><span> </span><span>appuser</span><span> </span><span>App@123456</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 列出所有用户</span></div></div><div><div><div>5</div></div><div><span>mc</span><span> </span><span>admin</span><span> </span><span>user</span><span> </span><span>list</span><span> </span><span>myminio</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 禁用用户</span></div></div><div><div><div>8</div></div><div><span>mc</span><span> </span><span>admin</span><span> </span><span>user</span><span> </span><span>disable</span><span> </span><span>myminio</span><span> </span><span>appuser</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 启用用户</span></div></div><div><div><div>11</div></div><div><span>mc</span><span> </span><span>admin</span><span> </span><span>user</span><span> </span><span>enable</span><span> </span><span>myminio</span><span> </span><span>appuser</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>用户策略：给子用户单独权限，比如只允许读写 demo-bucket，后面可以练自定义 policy。</p></blockquote></section><section><h3>4.1.7 集群信息、服务状态<a href="#417-集群信息服务状态"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 查看minio服务信息</span></div></div><div><div><div>2</div></div><div><span>mc</span><span> </span><span>admin</span><span> </span><span>info</span><span> </span><span>myminio</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 查看服务日志</span></div></div><div><div><div>5</div></div><div><span>mc</span><span> </span><span>admin</span><span> </span><span>logs</span><span> </span><span>myminio</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 查看磁盘状态</span></div></div><div><div><div>8</div></div><div><span>mc</span><span> </span><span>admin</span><span> </span><span>disk</span><span> </span><span>list</span><span> </span><span>myminio</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section></section>
<section><h1>五、MinIO单节点多硬盘部署<a href="#五minio单节点多硬盘部署"><span>#</span></a></h1><p><strong>单节点单硬盘SNSD</strong> 使用<strong>零奇偶校验的纠删码后端</strong>（零冗余），而<strong>单节点多硬盘（SNMD）</strong> 使用标准纠删码（有数据冗余）。两者的底层数据格式完全不同，MinIO 无法直接将 SNSD 数据目录转换为 SNMD 格式，以此需要先备份数据。</p><section><h2>5.1 前置准备<a href="#51-前置准备"><span>#</span></a></h2><p><strong>硬件准备：</strong></p><ul>
<li>
<p>准备至少 <strong>4 块独立磁盘</strong>（纠删码最少需要 4 块盘）（<strong>学习使用可以使用是个不同的目录来替代。只是纠删码数据冗余形同虚设</strong>）</p>
</li>
<li>
<p>每块磁盘使用 <strong>XFS 文件系统</strong>格式化（MinIO 官方强烈推荐）</p>
</li>
<li>
<p>确保每块磁盘有独立挂载点，如 <code>/mnt/disk1</code>、<code>/mnt/disk2</code>、<code>/mnt/disk3</code>、<code>/mnt/disk4</code>（没有那么独立磁盘，这里直接创建四个不同的目录：<code>disk1到disk4</code>）</p>
<div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 创建新的存储目录</span></div></div><div><div><div>2</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/data1</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># MinIO 支持用loop 设备（文件模拟磁盘），在单块硬盘上虚拟出 4 个独立文件系统</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 创建4个镜像文件，两个个2G，两个1G，可以改大小</span></div></div><div><div><div>7</div></div><div><span>dd</span><span> </span><span>if=/dev/zero</span><span> </span><span>of=/data1/disk1.img</span><span> </span><span>bs=1G</span><span> </span><span>count=</span><span>2</span></div></div><div><div><div>8</div></div><div><span>dd</span><span> </span><span>if=/dev/zero</span><span> </span><span>of=/data1/disk2.img</span><span> </span><span>bs=1G</span><span> </span><span>count=</span><span>2</span></div></div><div><div><div>9</div></div><div><span>dd</span><span> </span><span>if=/dev/zero</span><span> </span><span>of=/data1/disk3.img</span><span> </span><span>bs=1G</span><span> </span><span>count=</span><span>1</span></div></div><div><div><div>10</div></div><div><span>dd</span><span> </span><span>if=/dev/zero</span><span> </span><span>of=/data1/disk4.img</span><span> </span><span>bs=1G</span><span> </span><span>count=</span><span>1</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># 格式化xfs（如果提示命令错误，安装软件包即可：apt install -y xfsprogs）</span></div></div><div><div><div>13</div></div><div><span>mkfs.xfs</span><span> </span><span>/data1/disk1.img</span></div></div><div><div><div>14</div></div><div><span>mkfs.xfs</span><span> </span><span>/data1/disk2.img</span></div></div><div><div><div>15</div></div><div><span>mkfs.xfs</span><span> </span><span>/data1/disk3.img</span></div></div><div><div><div>16</div></div><div><span>mkfs.xfs</span><span> </span><span>/data1/disk4.img</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span># 创建挂载目录</span></div></div><div><div><div>19</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/data1/minio/disk{1..4}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span># 挂载loop设备</span></div></div><div><div><div>22</div></div><div><span>mount</span><span> </span><span>-o</span><span> </span><span>loop</span><span> </span><span>/data1/disk1.img</span><span> </span><span>/data1/minio/disk1</span></div></div><div><div><div>23</div></div><div><span>mount</span><span> </span><span>-o</span><span> </span><span>loop</span><span> </span><span>/data1/disk2.img</span><span> </span><span>/data1/minio/disk2</span></div></div><div><div><div>24</div></div><div><span>mount</span><span> </span><span>-o</span><span> </span><span>loop</span><span> </span><span>/data1/disk3.img</span><span> </span><span>/data1/minio/disk3</span></div></div><div><div><div>25</div></div><div><span>mount</span><span> </span><span>-o</span><span> </span><span>loop</span><span> </span><span>/data1/disk4.img</span><span> </span><span>/data1/minio/disk4</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span># fstab 持久化（可选，重启自动挂载）</span></div></div><div><div><div>28</div></div><div><span>cat</span><span> &gt;&gt; </span><span>/etc/fstab</span><span> &lt;&lt; </span><span>'EOF'</span></div></div><div><div><div>29</div></div><div><span>/data1/disk1.img /data1/minio/disk1 xfs loop 0 0</span></div></div><div><div><div>30</div></div><div><span>/data1/disk2.img /data1/minio/disk2 xfs loop 0 0</span></div></div><div><div><div>31</div></div><div><span>/data1/disk3.img /data1/minio/disk3 xfs loop 0 0</span></div></div><div><div><div>32</div></div><div><span>/data1/disk4.img /data1/minio/disk4 xfs loop 0 0</span></div></div><div><div><div>33</div></div><div><span>EOF</span></div></div><div><div><div>34</div></div><div><span># 执行生效</span></div></div><div><div><div>35</div></div><div><span>mount</span><span> </span><span>-a</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
</li>
</ul></section><section><h2>5.2 备份旧数据<a href="#52-备份旧数据"><span>#</span></a></h2><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 连接minio并设置别名,（直接使用之前的myminio也行）</span></div></div><div><div><div>2</div></div><div><span>mc</span><span> </span><span>alias</span><span> </span><span>set</span><span> </span><span>old_minio</span><span> </span><span>http://127.0.0.1:9000</span><span> </span><span>admin</span><span> </span><span>Admin@123</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 列出所有的桶</span></div></div><div><div><div>5</div></div><div><span>mc</span><span> </span><span>ls</span><span> </span><span>old_minio</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 全量备份到本地文件对象</span></div></div><div><div><div>8</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/backup/minio_data/</span></div></div><div><div><div>9</div></div><div><span>mc</span><span> </span><span>mirror</span><span> </span><span>--overwrite</span><span> </span><span>old_minio/</span><span> </span><span>/backup/minio_data/</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span># 导出所有桶的配置（桶元信息）并移动到指定位置</span></div></div><div><div><div>12</div></div><div><span>mc</span><span> </span><span>admin</span><span> </span><span>cluster</span><span> </span><span>bucket</span><span> </span><span>export</span><span> </span><span>old_minio</span><span> &amp;&amp; </span><span>mv</span><span>   </span><span>old_minio-bucket-metadata.zip</span><span> </span><span>/backup/</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span># 完整导出old_minio全部IAM（用户、策略、用户绑定的策略） 执行完成后，在 `/backup/` 下会得到 zip 包</span></div></div><div><div><div>15</div></div><div><span>mc</span><span> </span><span>admin</span><span> </span><span>cluster</span><span> </span><span>iam</span><span> </span><span>export</span><span> </span><span>old_minio</span><span> </span><span>-o</span><span> </span><span>/backup/old_minio-iam-metadata.zip</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span># 关闭minio</span></div></div><div><div><div>18</div></div><div><span>systemctl</span><span> </span><span>stop</span><span> </span><span>minio</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h2>5.3 搭建单节点多硬盘MinIO<a href="#53-搭建单节点多硬盘minio"><span>#</span></a></h2><section><h3>5.3.1 二进制部署<a href="#531-二进制部署"><span>#</span></a></h3><p>直接修改启动方式即可</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 配置环境变量</span></div></div><div><div><div>2</div></div><div><span>export</span><span> </span><span>MINIO_ROOT_USER</span><span>=</span><span>admin</span></div></div><div><div><div>3</div></div><div><span>export</span><span> </span><span>MINIO_ROOT_PASSWORD</span><span>=</span><span>Admin</span><span>@</span><span>123</span></div></div><div><div><div>4</div></div><div><span># 前台启动</span></div></div><div><div><div>5</div></div><div><span>minio</span><span> </span><span>server</span><span> </span><span>/data1/minio/disk{1...4}</span><span> </span><span>--console-address</span><span> </span><span>":9001"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>修改systemd配置文件：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'/^ExecStart=/c ExecStart=/usr/local/bin/minio server /data1/minio/disk{1...4} --console-address ":9001"'</span><span> </span><span>/etc/systemd/system/minio.service</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>systemctl</span><span> </span><span>daemon-reload</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>systemctl</span><span> </span><span>start</span><span> </span><span>minio.service</span></div></div><div><div><div>4</div></div><div><span>systemctl</span><span> </span><span>status</span><span> </span><span>minio.service</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>5.3.2 docker部署<a href="#532-docker部署"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 拉取镜像（推荐使用带控制台的最后一个AGPL v3版本）</span></div></div><div><div><div>2</div></div><div><span>docker</span><span> </span><span>pull</span><span> </span><span>minio/minio:RELEASE.2025-04-22T22-12-26Z</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 创建数据目录</span></div></div><div><div><div>5</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/data/minio</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 启动 MinIO</span></div></div><div><div><div>8</div></div><div><span>docker</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>\</span></div></div><div><div><div>9</div></div><div><span>  </span><span>--name</span><span> </span><span>minio-server</span><span> </span><span>\</span></div></div><div><div><div>10</div></div><div><span>  </span><span>-p</span><span> </span><span>9000:9000</span><span> </span><span>\</span></div></div><div><div><div>11</div></div><div><span>  </span><span>-p</span><span> </span><span>9001:9001</span><span> </span><span>\</span></div></div><div><div><div>12</div></div><div><span>  </span><span>-v</span><span> </span><span>/data1/minio/disk1:/data/disk1</span><span> </span><span>\</span></div></div><div><div><div>13</div></div><div><span>  </span><span>-v</span><span> </span><span>/data1/minio/disk2:/data/disk2</span><span> </span><span>\</span></div></div><div><div><div>14</div></div><div><span>  </span><span>-v</span><span> </span><span>/data1/minio/disk3:/data/disk3</span><span> </span><span>\</span></div></div><div><div><div>15</div></div><div><span>  </span><span>-v</span><span> </span><span>/data1/minio/disk4:/data/disk4</span><span> </span><span>\</span></div></div><div><div><div>16</div></div><div><span>  </span><span>-e</span><span> </span><span>"MINIO_ROOT_USER=admin"</span><span> </span><span>\</span></div></div><div><div><div>17</div></div><div><span>  </span><span>-e</span><span> </span><span>"MINIO_ROOT_PASSWORD=Admin@123"</span><span> </span><span>\</span></div></div><div><div><div>18</div></div><div><span>  </span><span>minio/minio:RELEASE.2025-04-22T22-12-26Z</span><span> </span><span>\</span></div></div><div><div><div>19</div></div><div><span>  </span><span>server</span><span> </span><span>/data/disk{1...4}</span><span> </span><span>--console-address</span><span> </span><span>":9001"</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>使用<code>docker-compose</code></p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>version:</span><span> </span><span>'3'</span></div></div><div><div><div>2</div></div><div><span>services:</span></div></div><div><div><div>3</div></div><div><span>  </span><span>minio:</span></div></div><div><div><div>4</div></div><div><span>    </span><span>image:</span><span> </span><span>minio/minio:RELEASE.2025-04-22T22-12-26Z</span></div></div><div><div><div>5</div></div><div><span>    </span><span>ports:</span></div></div><div><div><div>6</div></div><div><span>      </span><span>-</span><span> </span><span>"9000:9000"</span></div></div><div><div><div>7</div></div><div><span>      </span><span>-</span><span> </span><span>"9001:9001"</span></div></div><div><div><div>8</div></div><div><span>    </span><span>environment:</span></div></div><div><div><div>9</div></div><div><span>      </span><span>MINIO_ROOT_USER:</span><span> </span><span>admin</span></div></div><div><div><div>10</div></div><div><span>      </span><span>MINIO_ROOT_PASSWORD:</span><span> </span><span>minio123456</span></div></div><div><div><div>11</div></div><div><span>    </span><span>volumes:</span></div></div><div><div><div>12</div></div><div><span>      </span><span>-</span><span> </span><span>/data1/minio/disk1:/data/disk1</span></div></div><div><div><div>13</div></div><div><span>      </span><span>-</span><span> </span><span>/data1/minio/disk2:/data/disk2</span></div></div><div><div><div>14</div></div><div><span>      </span><span>-</span><span> </span><span>/data1/minio/disk3:/data/disk3</span></div></div><div><div><div>15</div></div><div><span>      </span><span>-</span><span> </span><span>/data1/minio/disk4:/data/disk4</span></div></div><div><div><div>16</div></div><div><span>    </span><span>command</span><span>:</span><span> </span><span>server</span><span> </span><span>/data/disk{1...4}</span><span> </span><span>--console-address</span><span> </span><span>":9001"</span></div></div><div><div><div>17</div></div><div><span>    </span><span>restart:</span><span> </span><span>unless-stopped</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>启动</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>compose</span><span> </span><span>up</span><span> </span><span>-d</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>5.4 迁移文件数据到新实例<a href="#54-迁移文件数据到新实例"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 配置新实例的别名</span></div></div><div><div><div>2</div></div><div><span>mc</span><span> </span><span>alias</span><span> </span><span>set</span><span> </span><span>new_minio</span><span> </span><span>http://127.0.0.1:9000</span><span> </span><span>admin</span><span> </span><span>Admin@123</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 导入桶配置，自动在new_minio创建所有桶，并且恢复桶的生命周期/版本等配置</span></div></div><div><div><div>5</div></div><div><span>mc</span><span> </span><span>admin</span><span> </span><span>cluster</span><span> </span><span>bucket</span><span> </span><span>import</span><span> </span><span>new_minio</span><span> </span><span>/backup/old_minio-buckets.zip</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 从备份恢复数据</span></div></div><div><div><div>8</div></div><div><span>mc</span><span> </span><span>mirror</span><span> </span><span>--overwrite</span><span> </span><span>/backup/minio_data/</span><span> </span><span>new_minio/</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 或者如果旧实例还能启动（用不同端口），直接从旧实例迁移</span></div></div><div><div><div>11</div></div><div><span># 先用旧端口启动旧实例</span></div></div><div><div><div>12</div></div><div><span>minio</span><span> </span><span>server</span><span> </span><span>/old_data</span><span> </span><span>--address</span><span> </span><span>":9002"</span><span> </span><span>--console-address</span><span> </span><span>":9003"</span></div></div><div><div><div>13</div></div><div><span>mc</span><span> </span><span>alias</span><span> </span><span>set</span><span> </span><span>old_minio</span><span> </span><span>http://127.0.0.1:9002</span><span> </span><span>旧AccessKey</span><span> </span><span>旧SecretKey</span></div></div><div><div><div>14</div></div><div><span>mc</span><span> </span><span>mirror</span><span> </span><span>--overwrite</span><span> </span><span>old_minio/</span><span> </span><span>new_minio/</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>查看数据底层存在的数据：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/data1/minio</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>[root@localhost /data1/minio]# tree</span></div></div><div><div><div>4</div></div><div><span>.</span></div></div><div><div><div>5</div></div><div><span>├──</span><span> </span><span>disk1</span></div></div><div><div><div>6</div></div><div><span>│  </span><span> </span><span>├──</span><span> </span><span>bucket-2</span></div></div><div><div><div>7</div></div><div><span>│  </span><span> </span><span>├──</span><span> </span><span>test-bucket</span></div></div><div><div><div>8</div></div><div><span>│  </span><span> </span><span>│  </span><span> </span><span>└──</span><span> </span><span>111.json</span></div></div><div><div><div>9</div></div><div><span>│  </span><span> </span><span>│  </span><span>     </span><span>└──</span><span> </span><span>xl.meta</span></div></div><div><div><div>10</div></div><div><span>│  </span><span> </span><span>└──</span><span> </span><span>upload-file</span></div></div><div><div><div>11</div></div><div><span>│  </span><span>     </span><span>└──</span><span> </span><span>新建文本文档.txt</span></div></div><div><div><div>12</div></div><div><span>│  </span><span>         </span><span>└──</span><span> </span><span>xl.meta</span></div></div><div><div><div>13</div></div><div><span>├──</span><span> </span><span>disk2</span></div></div><div><div><div>14</div></div><div><span>│  </span><span> </span><span>├──</span><span> </span><span>bucket-2</span></div></div><div><div><div>15</div></div><div><span>│  </span><span> </span><span>├──</span><span> </span><span>test-bucket</span></div></div><div><div><div>16</div></div><div><span>│  </span><span> </span><span>│  </span><span> </span><span>└──</span><span> </span><span>111.json</span></div></div><div><div><div>17</div></div><div><span>│  </span><span> </span><span>│  </span><span>     </span><span>└──</span><span> </span><span>xl.meta</span></div></div><div><div><div>18</div></div><div><span>│  </span><span> </span><span>└──</span><span> </span><span>upload-file</span></div></div><div><div><div>19</div></div><div><span>│  </span><span>     </span><span>└──</span><span> </span><span>新建文本文档.txt</span></div></div><div><div><div>20</div></div><div><span>│  </span><span>         </span><span>└──</span><span> </span><span>xl.meta</span></div></div><div><div><div>21</div></div><div><span>├──</span><span> </span><span>disk3</span></div></div><div><div><div>22</div></div><div><span>│  </span><span> </span><span>├──</span><span> </span><span>bucket-2</span></div></div><div><div><div>23</div></div><div><span>│  </span><span> </span><span>├──</span><span> </span><span>test-bucket</span></div></div><div><div><div>24</div></div><div><span>│  </span><span> </span><span>│  </span><span> </span><span>└──</span><span> </span><span>111.json</span></div></div><div><div><div>25</div></div><div><span>│  </span><span> </span><span>│  </span><span>     </span><span>└──</span><span> </span><span>xl.meta</span></div></div><div><div><div>26</div></div><div><span>│  </span><span> </span><span>└──</span><span> </span><span>upload-file</span></div></div><div><div><div>27</div></div><div><span>│  </span><span>     </span><span>└──</span><span> </span><span>新建文本文档.txt</span></div></div><div><div><div>28</div></div><div><span>│  </span><span>         </span><span>└──</span><span> </span><span>xl.meta</span></div></div><div><div><div>29</div></div><div><span>└──</span><span> </span><span>disk4</span></div></div><div><div><div>30</div></div><div><span>    </span><span>├──</span><span> </span><span>bucket-2</span></div></div><div><div><div>31</div></div><div><span>    </span><span>├──</span><span> </span><span>test-bucket</span></div></div><div><div><div>32</div></div><div><span>    </span><span>│  </span><span> </span><span>└──</span><span> </span><span>111.json</span></div></div><div><div><div>33</div></div><div><span>    </span><span>│  </span><span>     </span><span>└──</span><span> </span><span>xl.meta</span></div></div><div><div><div>34</div></div><div><span>    </span><span>└──</span><span> </span><span>upload-file</span></div></div><div><div><div>35</div></div><div><span>        </span><span>└──</span><span> </span><span>新建文本文档.txt</span></div></div><div><div><div>36</div></div><div><span>            </span><span>└──</span><span> </span><span>xl.meta</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h2>5.5 迁移用户、策略等配置<a href="#55-迁移用户策略等配置"><span>#</span></a></h2><p>数据迁移只迁移对象数据，<strong>用户、策略、桶配置需要单独重建</strong>：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 在新实例上导入备份的IAM数据</span></div></div><div><div><div>2</div></div><div><span>mc</span><span> </span><span>admin</span><span> </span><span>cluster</span><span> </span><span>iam</span><span> </span><span>import</span><span> </span><span>new_minio</span><span> </span><span>/backup/old_minio-iam-metadata.zip</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>5.6 验证<a href="#56-验证"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 检查新实例状态</span></div></div><div><div><div>2</div></div><div><span>mc</span><span> </span><span>admin</span><span> </span><span>info</span><span> </span><span>new_minio</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 对比数据</span></div></div><div><div><div>5</div></div><div><span>mc</span><span> </span><span>ls</span><span> </span><span>new_minio</span></div></div><div><div><div>6</div></div><div><span>mc</span><span> </span><span>diff</span><span> </span><span>old_minio/bucket</span><span> </span><span>new_minio/bucket</span><span>   </span><span># 无输出即一致</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 检查纠删码状态</span></div></div><div><div><div>9</div></div><div><span>mc</span><span> </span><span>admin</span><span> </span><span>info</span><span> </span><span>new_minio</span><span> | </span><span>grep</span><span> </span><span>-i</span><span> </span><span>erasure</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h1>六、MinIO多节点多硬盘部署<a href="#六minio多节点多硬盘部署"><span>#</span></a></h1><section><h2>6.1 环境规划<a href="#61-环境规划"><span>#</span></a></h2><p>搭建一个 <strong>3 节点 × 每节点 4 盘</strong> 的分布式集群</p>

<table><thead><tr><th>节点</th><th>IP 地址</th><th>磁盘挂载</th></tr></thead><tbody><tr><td>minio-node-1</td><td>10.22.51.91</td><td>/data2/minio/disk{1…4}</td></tr><tr><td>minio-node-2</td><td>10.22.51.72</td><td>/data2/minio/disk{1…4}</td></tr><tr><td>minio-node-3</td><td>10.22.51.74</td><td>/data2/minio/disk{1…4}</td></tr></tbody></table><p><strong>总磁盘数 = 12 块</strong>，满足纠删码要求（至少 4 块，推荐 4 的倍数）。</p><p><code>10.22.51.91</code>安装<code>nginx</code>同时作为负载均衡器</p></section><section><h2>6.2 前置准备<a href="#62-前置准备"><span>#</span></a></h2><p>这里使用<code>二进制</code>的方式进行安装，<code>docker</code>的安装方式类似，只是<strong>环境变量和启动参数发生变换</strong></p><section><h3>6.2.1 所有节点安装MinIO<a href="#621-所有节点安装minio"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 1. 下载 MinIO</span></div></div><div><div><div>2</div></div><div><span>cd</span><span> </span><span>/usr/local/src</span></div></div><div><div><div>3</div></div><div><span>wget</span><span> </span><span>https://github.com/minio/minio/releases/download/RELEASE.2025-04-22T22-12-26Z/minio.linux-amd64.RELEASE.2025-04-22T22-12-26Z</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>mv</span><span> </span><span>minio.linux-amd64.RELEASE.2025-04-22T22-12-26Z</span><span> </span><span>minio</span></div></div><div><div><div>6</div></div><div><span>chmod</span><span> </span><span>+x</span><span> </span><span>minio</span></div></div><div><div><div>7</div></div><div><span>mv</span><span> </span><span>minio</span><span> </span><span>/usr/local/bin/</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 2. 创建数据目录</span></div></div><div><div><div>10</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/data2/minio</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>6.2.2 各节点初始化磁盘<a href="#622-各节点初始化磁盘"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 创建新的存储目录</span></div></div><div><div><div>2</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/data2</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># MinIO 支持用loop 设备（文件模拟磁盘），在单块硬盘上虚拟出 4 个独立文件系统</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 创建4个镜像文件，两个个2G，两个1G，可以改大小</span></div></div><div><div><div>7</div></div><div><span>dd</span><span> </span><span>if=/dev/zero</span><span> </span><span>of=/data2/disk1.img</span><span> </span><span>bs=1G</span><span> </span><span>count=</span><span>2</span></div></div><div><div><div>8</div></div><div><span>dd</span><span> </span><span>if=/dev/zero</span><span> </span><span>of=/data2/disk2.img</span><span> </span><span>bs=1G</span><span> </span><span>count=</span><span>2</span></div></div><div><div><div>9</div></div><div><span>dd</span><span> </span><span>if=/dev/zero</span><span> </span><span>of=/data2/disk3.img</span><span> </span><span>bs=1G</span><span> </span><span>count=</span><span>1</span></div></div><div><div><div>10</div></div><div><span>dd</span><span> </span><span>if=/dev/zero</span><span> </span><span>of=/data2/disk4.img</span><span> </span><span>bs=1G</span><span> </span><span>count=</span><span>1</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># 格式化xfs（如果提示命令错误，安装软件包即可：apt install -y xfsprogs）</span></div></div><div><div><div>13</div></div><div><span>mkfs.xfs</span><span> </span><span>/data2/disk1.img</span></div></div><div><div><div>14</div></div><div><span>mkfs.xfs</span><span> </span><span>/data2/disk2.img</span></div></div><div><div><div>15</div></div><div><span>mkfs.xfs</span><span> </span><span>/data2/disk3.img</span></div></div><div><div><div>16</div></div><div><span>mkfs.xfs</span><span> </span><span>/data2/disk4.img</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span># 创建挂载目录</span></div></div><div><div><div>19</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/data2/minio/disk{1..4}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span># 挂载loop设备</span></div></div><div><div><div>22</div></div><div><span>mount</span><span> </span><span>-o</span><span> </span><span>loop</span><span> </span><span>/data2/disk1.img</span><span> </span><span>/data2/minio/disk1</span></div></div><div><div><div>23</div></div><div><span>mount</span><span> </span><span>-o</span><span> </span><span>loop</span><span> </span><span>/data2/disk2.img</span><span> </span><span>/data2/minio/disk2</span></div></div><div><div><div>24</div></div><div><span>mount</span><span> </span><span>-o</span><span> </span><span>loop</span><span> </span><span>/data2/disk3.img</span><span> </span><span>/data2/minio/disk3</span></div></div><div><div><div>25</div></div><div><span>mount</span><span> </span><span>-o</span><span> </span><span>loop</span><span> </span><span>/data2/disk4.img</span><span> </span><span>/data2/minio/disk4</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span># fstab 持久化（可选，重启自动挂载）</span></div></div><div><div><div>28</div></div><div><span>cat</span><span> &gt;&gt; </span><span>/etc/fstab</span><span> &lt;&lt; </span><span>'EOF'</span></div></div><div><div><div>29</div></div><div><span>/data2/disk1.img /data2/minio/disk1 xfs loop 0 0</span></div></div><div><div><div>30</div></div><div><span>/data2/disk2.img /data2/minio/disk2 xfs loop 0 0</span></div></div><div><div><div>31</div></div><div><span>/data2/disk3.img /data2/minio/disk3 xfs loop 0 0</span></div></div><div><div><div>32</div></div><div><span>/data2/disk4.img /data2/minio/disk4 xfs loop 0 0</span></div></div><div><div><div>33</div></div><div><span>EOF</span></div></div><div><div><div>34</div></div><div><span># 执行生效</span></div></div><div><div><div>35</div></div><div><span>mount</span><span> </span><span>-a</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section><section><h2>6.3各节点配置启动服务<a href="#63各节点配置启动服务"><span>#</span></a></h2><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>/etc/systemd/system/minio-cluster.service</span><span> &lt;&lt;</span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>[Unit]</span></div></div><div><div><div>3</div></div><div><span>Description=MinIO Object Storage Server</span></div></div><div><div><div>4</div></div><div><span>Documentation=https://docs.min.io</span></div></div><div><div><div>5</div></div><div><span>Wants=network-online.target</span></div></div><div><div><div>6</div></div><div><span>After=network-online.target</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>[Service]</span></div></div><div><div><div>9</div></div><div><span>User=root</span></div></div><div><div><div>10</div></div><div><span>Environment="MINIO_ROOT_USER=admin"</span></div></div><div><div><div>11</div></div><div><span>Environment="MINIO_ROOT_PASSWORD=Admin@123456"</span></div></div><div><div><div>12</div></div><div><span># 后续负载均衡使用</span></div></div><div><div><div>13</div></div><div><span>Environment="MINIO_SERVER_URL=http://10.22.51.91:19000"</span></div></div><div><div><div>14</div></div><div><span>Environment="MINIO_BROWSER_REDIRECT_URL=http://10.22.51.91:19001"</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span># 集群数据目录，使用环境变量</span></div></div><div><div><div>17</div></div><div><span>Environment="MINIO_VOLUMES=http://10.22.51.91/data2/minio/disk1 \</span></div></div><div><div><div>18</div></div><div><span>http://10.22.51.91/data2/minio/disk2 \</span></div></div><div><div><div>19</div></div><div><span>http://10.22.51.91/data2/minio/disk3 \</span></div></div><div><div><div>20</div></div><div><span>http://10.22.51.91/data2/minio/disk4 \</span></div></div><div><div><div>21</div></div><div><span>http://10.22.51.72/data2/minio/disk1 \</span></div></div><div><div><div>22</div></div><div><span>http://10.22.51.72/data2/minio/disk2 \</span></div></div><div><div><div>23</div></div><div><span>http://10.22.51.72/data2/minio/disk3 \</span></div></div><div><div><div>24</div></div><div><span>http://10.22.51.72/data2/minio/disk4 \</span></div></div><div><div><div>25</div></div><div><span>http://10.22.51.74/data2/minio/disk1 \</span></div></div><div><div><div>26</div></div><div><span>http://10.22.51.74/data2/minio/disk2 \</span></div></div><div><div><div>27</div></div><div><span>http://10.22.51.74/data2/minio/disk3 \</span></div></div><div><div><div>28</div></div><div><span>http://10.22.51.74/data2/minio/disk4"</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span># 执行命令：minio server 数据目录，指定console端口</span></div></div><div><div><div>31</div></div><div><span>ExecStart=/usr/local/bin/minio server $MINIO_VOLUMES --console-address ":9001"</span></div></div><div><div><div>32</div></div><div><span>LimitNOFILE=65536</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span># 进程重启策略</span></div></div><div><div><div>35</div></div><div><span>Restart=always</span></div></div><div><div><div>36</div></div><div><span>RestartSec=5</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span># 日志输出</span></div></div><div><div><div>39</div></div><div><span>StandardOutput=journal+console</span></div></div><div><div><div>40</div></div><div><span>StandardError=journal+console</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>[Install]</span></div></div><div><div><div>43</div></div><div><span>WantedBy=multi-user.target</span></div></div><div><div><div>44</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>systemctl</span><span> </span><span>daemon-reload</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>systemctl</span><span> </span><span>start</span><span> </span><span>minio-cluster.service</span></div></div><div><div><div>4</div></div><div><span>systemctl</span><span> </span><span>status</span><span> </span><span>minio-cluster.service</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 查看端口</span></div></div><div><div><div>7</div></div><div><span>netstat</span><span> </span><span>-tunlp</span><span> | </span><span>grep</span><span> </span><span>-E</span><span> </span><span>"9000|9001"</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>6.4 配置负载均衡器<a href="#64-配置负载均衡器"><span>#</span></a></h2><p>在<code>10.22.51.91</code>安装<code>nginx</code>作为负载均衡器</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>apt</span><span> </span><span>install</span><span> </span><span>-y</span><span> </span><span>nginx</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 备份原nginx.conf</span></div></div><div><div><div>4</div></div><div><span>cp</span><span> </span><span>/etc/nginx/nginx.conf</span><span> </span><span>/etc/nginx/nginx.conf.bak</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>修改<code>nginx.conf</code>：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>user</span><span> </span><span>root</span><span>;</span></div></div><div><div><div>2</div></div><div><span>worker_processes</span><span> </span><span>auto</span><span>;</span></div></div><div><div><div>3</div></div><div><span>error_log</span><span> </span><span>/var/log/nginx/error.log</span><span> </span><span>warn</span><span>;</span></div></div><div><div><div>4</div></div><div><span>pid</span><span> </span><span>/var/run/nginx.pid</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>events</span><span> </span><span>{</span></div></div><div><div><div>7</div></div><div><span>    </span><span>worker_connections</span><span> </span><span>1024</span><span>;</span></div></div><div><div><div>8</div></div><div><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>http</span><span> </span><span>{</span></div></div><div><div><div>11</div></div><div><span>    </span><span>include</span><span> </span><span>/etc/nginx/mime.types</span><span>;</span></div></div><div><div><div>12</div></div><div><span>    </span><span>default_type</span><span> </span><span>application/octet-stream</span><span>;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>    </span><span>log_format</span><span> </span><span>main</span><span> </span><span>'$remote_addr - $remote_user [$time_local] "$request" '</span></div></div><div><div><div>15</div></div><div><span>                    </span><span>'$status $body_bytes_sent "$http_referer" '</span></div></div><div><div><div>16</div></div><div><span>                    </span><span>'"$http_user_agent" "$http_x_forwarded_for"'</span><span>;</span></div></div><div><div><div>17</div></div><div><span>    </span><span>access_log</span><span> </span><span>/var/log/nginx/access.log</span><span> </span><span>main</span><span>;</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span>sendfile</span><span> </span><span>on</span><span>;</span></div></div><div><div><div>20</div></div><div><span>    </span><span>keepalive_timeout</span><span> </span><span>65</span><span>;</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>    </span><span>upstream</span><span> </span><span>minio_api</span><span> </span><span>{</span></div></div><div><div><div>23</div></div><div><span>        </span><span>ip_hash</span><span>;</span></div></div><div><div><div>24</div></div><div><span>        </span><span>server</span><span> </span><span>10.22.51.91:9000</span><span>;</span></div></div><div><div><div>25</div></div><div><span>        </span><span>server</span><span> </span><span>10.22.51.72:9000</span><span>;</span></div></div><div><div><div>26</div></div><div><span>        </span><span>server</span><span> </span><span>10.22.51.74:9000</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>    </span><span>upstream</span><span> </span><span>minio_console</span><span> </span><span>{</span></div></div><div><div><div>30</div></div><div><span>        </span><span>server</span><span> </span><span>10.22.51.91:9001</span><span>;</span></div></div><div><div><div>31</div></div><div><span>        </span><span>server</span><span> </span><span>10.22.51.72:9001</span><span>;</span></div></div><div><div><div>32</div></div><div><span>        </span><span>server</span><span> </span><span>10.22.51.74:9001</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>    </span><span>server</span><span> </span><span>{</span></div></div><div><div><div>36</div></div><div><span>        </span><span>listen</span><span> </span><span>19000</span><span>;</span></div></div><div><div><div>37</div></div><div><span>        </span><span>server_name</span><span> </span><span>_</span><span>;</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>location</span><span> </span><span>/</span><span> </span><span>{</span></div></div><div><div><div>40</div></div><div><span>            </span><span>proxy_http_version</span><span> </span><span>1.1</span><span>;</span></div></div><div><div><div>41</div></div><div><span>            </span><span>proxy_set_header</span><span> </span><span>Connection</span><span> </span><span>""</span><span>;</span></div></div><div><div><div>42</div></div><div><span>            </span><span>proxy_set_header</span><span> </span><span>Host</span><span> </span><span>$host</span><span>:</span><span>$server_port</span><span>;</span></div></div><div><div><div>43</div></div><div><span>            </span><span>proxy_set_header</span><span> </span><span>X-Real-IP</span><span> </span><span>$remote_addr</span><span>;</span></div></div><div><div><div>44</div></div><div><span>            </span><span>proxy_set_header</span><span> </span><span>X-Forwarded-For</span><span> </span><span>$proxy_add_x_forwarded_for</span><span>;</span></div></div><div><div><div>45</div></div><div><span>            </span><span>proxy_set_header</span><span> </span><span>X-Forwarded-Proto</span><span> </span><span>$scheme</span><span>;</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>            </span><span>proxy_connect_timeout</span><span> </span><span>300</span><span>;</span></div></div><div><div><div>48</div></div><div><span>            </span><span>proxy_send_timeout</span><span> </span><span>300</span><span>;</span></div></div><div><div><div>49</div></div><div><span>            </span><span>proxy_read_timeout</span><span> </span><span>300</span><span>;</span></div></div><div><div><div>50</div></div><div>
</div></div><div><div><div>51</div></div><div><span>            </span><span>proxy_cache</span><span> </span><span>off</span><span>;</span></div></div><div><div><div>52</div></div><div><span>            </span><span>proxy_buffering</span><span> </span><span>off</span><span>;</span></div></div><div><div><div>53</div></div><div>
</div></div><div><div><div>54</div></div><div><span>            </span><span>proxy_pass</span><span> </span><span>http://minio_api</span><span>;</span></div></div><div><div><div>55</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>56</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>57</div></div><div>
</div></div><div><div><div>58</div></div><div><span>    </span><span>server</span><span> </span><span>{</span></div></div><div><div><div>59</div></div><div><span>        </span><span>listen</span><span> </span><span>19001</span><span>;</span></div></div><div><div><div>60</div></div><div><span>        </span><span>server_name</span><span> </span><span>_</span><span>;</span></div></div><div><div><div>61</div></div><div>
</div></div><div><div><div>62</div></div><div><span>        </span><span>location</span><span> </span><span>/</span><span> </span><span>{</span></div></div><div><div><div>63</div></div><div><span>            </span><span>proxy_http_version</span><span> </span><span>1.1</span><span>;</span></div></div><div><div><div>64</div></div><div><span>            </span><span>proxy_set_header</span><span> </span><span>Connection</span><span> </span><span>""</span><span>;</span></div></div><div><div><div>65</div></div><div><span>            </span><span>proxy_set_header</span><span> </span><span>Host</span><span> </span><span>$host</span><span>:</span><span>$server_port</span><span>;</span></div></div><div><div><div>66</div></div><div><span>            </span><span>proxy_set_header</span><span> </span><span>X-Real-IP</span><span> </span><span>$remote_addr</span><span>;</span></div></div><div><div><div>67</div></div><div><span>            </span><span>proxy_set_header</span><span> </span><span>X-Forwarded-For</span><span> </span><span>$proxy_add_x_forwarded_for</span><span>;</span></div></div><div><div><div>68</div></div><div><span>            </span><span>proxy_set_header</span><span> </span><span>X-Forwarded-Proto</span><span> </span><span>$scheme</span><span>;</span></div></div><div><div><div>69</div></div><div>
</div></div><div><div><div>70</div></div><div><span>            </span><span>proxy_connect_timeout</span><span> </span><span>300</span><span>;</span></div></div><div><div><div>71</div></div><div><span>            </span><span>proxy_send_timeout</span><span> </span><span>300</span><span>;</span></div></div><div><div><div>72</div></div><div><span>            </span><span>proxy_read_timeout</span><span> </span><span>300</span><span>;</span></div></div><div><div><div>73</div></div><div>
</div></div><div><div><div>74</div></div><div><span>            </span><span>proxy_cache</span><span> </span><span>off</span><span>;</span></div></div><div><div><div>75</div></div><div><span>            </span><span>proxy_buffering</span><span> </span><span>off</span><span>;</span></div></div><div><div><div>76</div></div><div>
</div></div><div><div><div>77</div></div><div><span>            </span><span>proxy_pass</span><span> </span><span>http://minio_console</span><span>;</span></div></div><div><div><div>78</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>79</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>80</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 验证语法</span></div></div><div><div><div>2</div></div><div><span>nginx</span><span> </span><span>-t</span></div></div><div><div><div>3</div></div><div><span># 启动nginx</span></div></div><div><div><div>4</div></div><div><span>systemctl</span><span> </span><span>start</span><span> </span><span>nginx</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>6.5 各节点配置mc别名<a href="#65-各节点配置mc别名"><span>#</span></a></h2><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># # mc 测试，替换为负载服务器IP</span></div></div><div><div><div>2</div></div><div><span>mc</span><span> </span><span>alias</span><span> </span><span>set</span><span> </span><span>minio-cluster</span><span> </span><span>http://10.22.51.91:19000</span><span> </span><span>admin</span><span> </span><span>Admin@123456</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>[root@localhost /root]# mc admin info minio-cluster</span></div></div><div><div><div>5</div></div><div><span>●</span><span>  </span><span>10.22.51.72:9000</span></div></div><div><div><div>6</div></div><div><span>   </span><span>Uptime:</span><span> </span><span>4</span><span> </span><span>minutes</span></div></div><div><div><div>7</div></div><div><span>   </span><span>Version:</span><span> </span><span>2025-04-22T22:12:26Z</span></div></div><div><div><div>8</div></div><div><span>   </span><span>Network:</span><span> </span><span>3/3</span><span> </span><span>OK</span></div></div><div><div><div>9</div></div><div><span>   </span><span>Drives:</span><span> </span><span>4/4</span><span> </span><span>OK</span></div></div><div><div><div>10</div></div><div><span>   </span><span>Pool:</span><span> </span><span>1</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>●</span><span>  </span><span>10.22.51.74:9000</span></div></div><div><div><div>13</div></div><div><span>   </span><span>Uptime:</span><span> </span><span>4</span><span> </span><span>minutes</span></div></div><div><div><div>14</div></div><div><span>   </span><span>Version:</span><span> </span><span>2025-04-22T22:12:26Z</span></div></div><div><div><div>15</div></div><div><span>   </span><span>Network:</span><span> </span><span>3/3</span><span> </span><span>OK</span></div></div><div><div><div>16</div></div><div><span>   </span><span>Drives:</span><span> </span><span>4/4</span><span> </span><span>OK</span></div></div><div><div><div>17</div></div><div><span>   </span><span>Pool:</span><span> </span><span>1</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>●</span><span>  </span><span>10.22.51.91:9000</span></div></div><div><div><div>20</div></div><div><span>   </span><span>Uptime:</span><span> </span><span>4</span><span> </span><span>minutes</span></div></div><div><div><div>21</div></div><div><span>   </span><span>Version:</span><span> </span><span>2025-04-22T22:12:26Z</span></div></div><div><div><div>22</div></div><div><span>   </span><span>Network:</span><span> </span><span>3/3</span><span> </span><span>OK</span></div></div><div><div><div>23</div></div><div><span>   </span><span>Drives:</span><span> </span><span>4/4</span><span> </span><span>OK</span></div></div><div><div><div>24</div></div><div><span>   </span><span>Pool:</span><span> </span><span>1</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>┌──────┬──────────────────────┬─────────────────────┬──────────────┐</span></div></div><div><div><div>27</div></div><div><span>│</span><span> </span><span>Pool</span><span> </span><span>│</span><span> </span><span>Drives</span><span> </span><span>Usage</span><span>         </span><span>│</span><span> </span><span>Erasure</span><span> </span><span>stripe</span><span> </span><span>size</span><span> </span><span>│</span><span> </span><span>Erasure</span><span> </span><span>sets</span><span> </span><span>│</span></div></div><div><div><div>28</div></div><div><span>│</span><span> </span><span>1st</span><span>  </span><span>│</span><span> </span><span>2.9%</span><span> (total: </span><span>12</span><span> </span><span>GiB</span><span>) │ 12                  │ 1            │</span></div></div><div><div><div>29</div></div><div><span>└──────┴──────────────────────┴─────────────────────┴──────────────┘</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>12</span><span> </span><span>drives</span><span> </span><span>online,</span><span> </span><span>0</span><span> </span><span>drives</span><span> </span><span>offline,</span><span> </span><span>EC:4</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h2>6.6 网页访问<a href="#66-网页访问"><span>#</span></a></h2><p>访问minio控制台，使用<code>10.22.51.91:19001</code>,输入账号密码<code>admin/Admin@123456</code></p></section><section><h2>6.7导入数据<a href="#67导入数据"><span>#</span></a></h2><p>根据之前的实验，将备份出来的数据迁移回去。回到<code>10.22.51.91</code></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>[root@localhost /etc/nginx]# cd /backup/</span></div></div><div><div><div>2</div></div><div><span>[root@localhost /backup]# ls</span></div></div><div><div><div>3</div></div><div><span>minio_data</span><span>  </span><span>old_minio-iam-metadata.zip</span><span>  </span><span>policies.txt</span><span>  </span><span>users.txt</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 导入桶元数据，自动在new_minio创建所有桶，并且恢复桶的生命周期/版本等配置</span></div></div><div><div><div>7</div></div><div><span>mc</span><span> </span><span>admin</span><span> </span><span>cluster</span><span> </span><span>bucket</span><span> </span><span>import</span><span> </span><span>minio-cluster</span><span>  </span><span>/backup/old_minio-bucket-metadata.zip</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 导入文件数据</span></div></div><div><div><div>10</div></div><div><span>mc</span><span> </span><span>mirror</span><span> </span><span>--overwrite</span><span> </span><span>/backup/minio_data/</span><span> </span><span>minio-cluster/</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># 导入备份的IAM数据（用户、策略、桶配置）</span></div></div><div><div><div>13</div></div><div><span>mc</span><span> </span><span>admin</span><span> </span><span>cluster</span><span> </span><span>iam</span><span> </span><span>import</span><span> </span><span>minio-cluster</span><span> </span><span>/backup/old_minio-iam-metadata.zip</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/raid%E6%8A%80%E6%9C%AF/</id>
      <title type="text">RAID技术</title>
      <published>2026-09-15T00:00:00.000Z</published>
      <updated>2026-09-15T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/raid%E6%8A%80%E6%9C%AF/"/>
      <summary type="text">RAID技术</summary>
      <content type="html"><![CDATA[<section><h1>一、RAID概述<a href="#一raid概述"><span>#</span></a></h1><p><strong>RAID</strong>（Redundant Array of Independent Disks，独立磁盘冗余阵列）是一种将多块物理磁盘通过硬件或软件方式组合为一个逻辑磁盘的技术，核心目标是：</p><ul>
<li><strong>提升性能</strong>：通过条带化（Striping）实现多盘并行读写</li>
<li><strong>增强可靠性</strong>：通过镜像（Mirroring）或奇偶校验（Parity）实现数据冗余</li>
<li><strong>扩大容量</strong>：将多块小盘组合为大容量逻辑卷</li>
</ul><p>RAID 的核心机制包括三大技术：<strong>条带化</strong>（数据分块分散到多盘）、<strong>镜像</strong>（数据完整复制）、<strong>奇偶校验</strong>（通过 XOR 等算法生成校验信息用于故障恢复）。</p><ul>
<li>
<p>实现方式：<code>硬件RAID(整列卡)、软件RAID</code></p>
<p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/RAID%E6%8A%80%E6%9C%AF/image-20260914162446534.png" alt="image-20260914162446534" /><figcaption>image-20260914162446534</figcaption></figure><p></p>
</li>
<li>
<p><strong>硬件RAID</strong>：使用专用的RAID适配器、硬盘控制器或存储处理器。RAID控制器有自己的处理器，I/O处理芯片，和内存，用来提高资源利用率和数据传输速度。RAID控制器管理路由、缓冲区，控制主机与RAID间数据流。硬件RAID通常在服务器中使用。</p>
</li>
<li>
<p><strong>软件RAID</strong>：没有自己的处理器或I/O处理芯片，而是完全依赖于主机处理器。因此，低速CPU不能满足RAID实施的要求。软件RAID通常在企业级存储设备上使用。</p>
</li>
</ul></section>
<section><h1>二、传统RAID原理<a href="#二传统raid原理"><span>#</span></a></h1><section><h2>2.1 RAID 0<a href="#21-raid-0"><span>#</span></a></h2><p>RAID 0——条带化（Striping）</p><p>RAID 0 是最简单也最”激进”的阵列模式。它将连续数据切分为固定大小的数据块（称为”条带”，通常 4KB–256KB），然后<strong>轮询交替写入</strong>多块磁盘，实现多盘并行读写。</p><p>以 3 块盘为例，数据分布如下：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>数据块:   A0  A1  A2  B0  B1  B2  C0  C1  C2</span></div></div><div><div><div>2</div></div><div><span><span>          </span></span><span>↓   ↓   ↓   ↓   ↓   ↓   ↓   ↓   ↓</span></div></div><div><div><div>3</div></div><div><span>Disk 0:   A0          B0          C0</span></div></div><div><div><div>4</div></div><div><span>Disk 1:       A1          B1          C1</span></div></div><div><div><div>5</div></div><div><span>Disk 2:           A2          B2          C2</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>2.1.1关键参数<a href="#211关键参数"><span>#</span></a></h3>

<table><thead><tr><th>项目</th><th>说明</th></tr></thead><tbody><tr><td>最少磁盘数</td><td><strong>2 块</strong></td></tr><tr><td>容量利用率</td><td><strong>100%</strong>（总容量 = 所有磁盘容量之和）</td></tr><tr><td>读性能</td><td>极高，理论为单盘的 <strong>N 倍</strong>（N = 磁盘数）</td></tr><tr><td>写性能</td><td>极高，同样接近 N 倍</td></tr><tr><td>容错能力</td><td><strong>无</strong>，任意一块盘损坏，全部数据丢失</td></tr></tbody></table></section><section><h3>2.1.2 适用场景<a href="#212-适用场景"><span>#</span></a></h3><p>视频剪辑缓存、临时计算空间、日志盘（非核心）、游戏存储等<strong>数据可丢失、追求极致速度</strong>的场景。</p><hr /></section></section><section><h2>2.2 RAID 1<a href="#22-raid-1"><span>#</span></a></h2><p>RAID 1 — 镜像（Mirroring）</p><p>RAID 1 将数据<strong>完全复制</strong>到另一块磁盘上，两块盘始终保持一致。写入时同时写入两块盘，读取时可以从任意一块盘读取（支持负载均衡）。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>写入数据 D:</span></div></div><div><div><div>2</div></div><div><span>Disk 0:  D  （工作盘）</span></div></div><div><div><div>3</div></div><div><span>Disk 1:  D  （镜像盘）</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>2.2.1 关键参数<a href="#221-关键参数"><span>#</span></a></h3>

<table><thead><tr><th>项目</th><th>说明</th></tr></thead><tbody><tr><td>最少磁盘数</td><td><strong>2 块</strong>（通常为偶数）</td></tr><tr><td>容量利用率</td><td><strong>50%</strong>（总容量 = 单块磁盘容量）</td></tr><tr><td>读性能</td><td>较好，可从两块盘并行读取</td></tr><tr><td>写性能</td><td>一般或略低（需同步写入两块盘）</td></tr><tr><td>容错能力</td><td>可承受 <strong>1 块</strong>磁盘损坏</td></tr></tbody></table></section><section><h3>2.2.2 适用场景<a href="#222-适用场景"><span>#</span></a></h3><p>操作系统盘、小型数据库、财务系统等<strong>对数据安全性要求极高</strong>的关键应用。</p><hr /></section></section><section><h2>2.3 RAID 3<a href="#23-raid-3"><span>#</span></a></h2><p>RAID 3 — 字节级条带化 + 专用奇偶校验盘</p><p>RAID 3 采用<strong>字节级条带化</strong>，将数据按字节为单位分散到多块数据盘上，同时使用一块<strong>专用磁盘</strong>存储奇偶校验信息（Parity）。校验信息通过对所有数据盘上对应字节进行 <strong>XOR（异或）运算</strong>生成。</p><p>以 4 块盘（3 数据 + 1 校验）为例：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>数据块:    A0  A1  A2  B0  B1  B2</span></div></div><div><div><div>2</div></div><div><span><span>           </span></span><span>↓   ↓   ↓   ↓   ↓   ↓</span></div></div><div><div><div>3</div></div><div><span>Disk 0:    A0          B0        （数据盘）</span></div></div><div><div><div>4</div></div><div><span>Disk 1:        A1          B1    （数据盘）</span></div></div><div><div><div>5</div></div><div><span>Disk 2:            A2        B2  （数据盘）</span></div></div><div><div><div>6</div></div><div><span>Disk 3:       P(A)          P(B) （专用校验盘）</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>其中 P(A) = A0 ⊕ A1 ⊕ A2，当任意一块<code>数据盘</code>损坏时，可通过剩余数据盘和校验盘反算出丢失数据。</p></blockquote><section><h3>2.3.1 关键参数<a href="#231-关键参数"><span>#</span></a></h3>

<table><thead><tr><th>项目</th><th>说明</th></tr></thead><tbody><tr><td>最少磁盘数</td><td><strong>3 块</strong>（至少 2 数据盘 + 1 校验盘）</td></tr><tr><td>容量利用率</td><td><strong>(N-1)/N</strong>（损失 1 块盘用于校验）</td></tr><tr><td>读性能</td><td>顺序读性能优秀，随机读性能较差</td></tr><tr><td>写性能</td><td>较低（每次写入都需更新专用校验盘）</td></tr><tr><td>容错能力</td><td>可承受 <strong>1 块</strong>磁盘损坏</td></tr></tbody></table></section><section><h3>2.3.2 特点与局限<a href="#232-特点与局限"><span>#</span></a></h3><p>RAID 3 的专用校验盘在<strong>并发 I/O 或随机读写</strong>场景下容易成为性能瓶颈，因此它更适合<strong>顺序处理</strong>类应用（如早期的视频流处理）。由于这一局限性，RAID 3 在实际中已很少使用，逐渐被 RAID 5 取代。</p><hr /></section></section><section><h2>2.4 RAID 5<a href="#24-raid-5"><span>#</span></a></h2><p>RAID 5 — 分布式奇偶校验条带化</p><p>RAID 5 是 RAID 3 的重大改进。它同样使用 XOR 奇偶校验，但<strong>取消了专用校验盘</strong>，将校验信息<strong>均匀分布（轮转）到所有磁盘</strong>上。每个条带中，N-1 块盘存数据，1 块盘存校验，且校验块的位置随条带递进轮换。</p><p>以 4 块盘为例：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>条带1:  [A0] [A1] [A2] [P_A]   → 校验在 Disk 3</span></div></div><div><div><div>2</div></div><div><span>条带2:  [B0] [B1] [P_B] [B2]   → 校验在 Disk 2</span></div></div><div><div><div>3</div></div><div><span>条带3:  [C0] [P_C] [C1] [C2]   → 校验在 Disk 1</span></div></div><div><div><div>4</div></div><div><span>条带4:  [P_D] [D0] [D1] [D2]   → 校验在 Disk 0</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>数据恢复原理：若 Disk 1 损坏，可通过 Disk 0、Disk 2、Disk 3 上的数据和校验信息，利用 XOR 运算反算出 Disk 1 上的原始数据。</p></blockquote><section><h3>2.4.1 关键参数<a href="#241-关键参数"><span>#</span></a></h3>

<table><thead><tr><th>项目</th><th>说明</th></tr></thead><tbody><tr><td>最少磁盘数</td><td><strong>3 块</strong></td></tr><tr><td>容量利用率</td><td><strong>(N-1)/N</strong>（如 4 盘利用率 75%）</td></tr><tr><td>读性能</td><td>高，接近 RAID 0</td></tr><tr><td>写性能</td><td>中等，存在”<strong>写惩罚</strong>”（每次写入需读取旧数据、旧校验，计算新校验，再写入新数据和新校验）</td></tr><tr><td>容错能力</td><td>可承受 <strong>1 块</strong>磁盘损坏</td></tr></tbody></table></section><section><h3>2.4.2 写惩罚说明<a href="#242-写惩罚说明"><span>#</span></a></h3><p>RAID 5 的一次随机小数据块写入，实际需要 <strong>4 次 I/O 操作</strong>：</p><ol>
<li>读取旧数据块</li>
<li>读取旧校验块</li>
<li>计算新校验值（新校验 = 旧校验 ⊕ 旧数据 ⊕ 新数据）</li>
<li>写入新数据块和新校验块</li>
</ol><p>这就是所谓的”写惩罚”，是 RAID 5 写性能不如 RAID 0 的主要原因。</p><p>适用场景：<strong>文件服务器、NAS、中小型数据库、Web 服务器等</strong>读多写少、追求性价比的通用场景。</p><p><strong>风险提示</strong>：当使用大容量硬盘（如 10TB 以上）时，RAID 5 重建时间很长，重建期间若再坏一块盘则数据全失。因此大容量场景建议选用 RAID 6。</p><hr /></section></section><section><h2>2.5 RAID 6<a href="#25-raid-6"><span>#</span></a></h2><p>RAID 6 — 双重分布式奇偶校验条带化</p><p>RAID 6 是 RAID 5 的增强版，它在 RAID 5 的基础上增加了<strong>第二套独立的校验信息</strong>（通常称为 P 校验和 Q 校验），两份校验信息都分布式存储在所有磁盘上。这使得 RAID 6 能够同时容忍<strong>两块磁盘</strong>同时损坏。</p><p>以 5 块盘为例：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>条带1:  [A0] [A1] [A2] [P_A] [Q_A]</span></div></div><div><div><div>2</div></div><div><span>条带2:  [B0] [B1] [B2] [Q_B] [P_B]</span></div></div><div><div><div>3</div></div><div><span>条带3:  [C0] [C1] [P_C] [C2] [Q_C]</span></div></div><div><div><div>4</div></div><div><span>条带4:  [D0] [P_D] [D1] [Q_D] [D2]</span></div></div><div><div><div>5</div></div><div><span>条带5:  [P_E] [E0] [Q_E] [E1] [E2]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><ul>
<li><strong>P 校验</strong>：与 RAID 5 相同，使用 XOR 运算</li>
<li><strong>Q 校验</strong>：使用另一种独立的校验算法生成，提供第二层保护</li>
</ul></blockquote><p>双重校验的数学原理使得即使两块盘同时损坏，也能通过剩余盘上的数据和两套校验信息联立方程求解出丢失数据。</p><section><h3>2.5.1 关键参数<a href="#251-关键参数"><span>#</span></a></h3>

<table><thead><tr><th>项目</th><th>说明</th></tr></thead><tbody><tr><td>最少磁盘数</td><td><strong>4 块</strong></td></tr><tr><td>容量利用率</td><td><strong>(N-2)/N</strong>（如 5 盘利用率 60%）</td></tr><tr><td>读性能</td><td>高，与 RAID 5 相当</td></tr><tr><td>写性能</td><td>低于 RAID 5（需计算双重校验，写惩罚更重）</td></tr><tr><td>容错能力</td><td>可承受 <strong>2 块</strong>磁盘同时损坏</td></tr></tbody></table><p><strong>适用场景</strong>：大容量 SATA 硬盘阵列、关键数据归档、备份服务器、医疗影像存储、云存储节点等<strong>对可靠性要求极高</strong>的场景。</p><hr /></section></section><section><h2>2.6 RAID 10<a href="#26-raid-10"><span>#</span></a></h2><p>RAID 10 — 镜像 + 条带化（RAID 1+0）</p><p>RAID 10 是一种<strong>嵌套 RAID</strong>，先做 RAID 1（镜像），再做 RAID 0（条带化）。即将磁盘两两配对组成镜像组，然后将多个镜像组进行条带化。</p><p>以 4 块盘为例：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>镜像组 A:  Disk 0 ←→ Disk 1  （互为镜像）</span></div></div><div><div><div>2</div></div><div><span>镜像组 B:  Disk 2 ←→ Disk 3  （互为镜像）</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>数据条带化分布：</span></div></div><div><div><div>5</div></div><div><span>数据块    A0    A1    B0    B1</span></div></div><div><div><div>6</div></div><div><span><span>          </span></span><span>↓     ↓     ↓     ↓</span></div></div><div><div><div>7</div></div><div><span>Disk 0:   A0                （镜像组A）</span></div></div><div><div><div>8</div></div><div><span>Disk 1:   A0'（A0的镜像）</span></div></div><div><div><div>9</div></div><div><span>Disk 2:               B0    （镜像组B）</span></div></div><div><div><div>10</div></div><div><span>Disk 3:               B0'（B0的镜像）</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>2.6.1 关键参数<a href="#261-关键参数"><span>#</span></a></h3>

<table><thead><tr><th>项目</th><th>说明</th></tr></thead><tbody><tr><td>最少磁盘数</td><td><strong>4 块</strong>（必须为偶数）</td></tr><tr><td>容量利用率</td><td><strong>50%</strong></td></tr><tr><td>读性能</td><td>极高，兼具 RAID 0 的速度</td></tr><tr><td>写性能</td><td>极高，<strong>无校验计算开销</strong></td></tr><tr><td>容错能力</td><td>每个镜像组可承受 1 块盘故障，只要同一镜像对未同时损坏即可</td></tr></tbody></table><p><strong>RAID 10 vs RAID 01 的区别</strong>：</p><ul>
<li><strong>RAID 10</strong>（先镜像后条带）：一个镜像组内坏一块盘，仅该组降级，其余组正常工作，影响面小</li>
<li><strong>RAID 01</strong>（先条带后镜像）：一块盘损坏会导致整个条带组失效，影响面更大</li>
</ul><p>因此 <strong>RAID 10 的安全性优于 RAID 01</strong>，实际应用中 RAID 10 更为常见。</p><p><strong>适用场景</strong>：数据库服务器、虚拟化主机、高频交易系统、金融核心业务等<strong>对性能和安全性都有极高要求</strong>的场景。</p><hr /></section></section><section><h2>2.7 RAID 50<a href="#27-raid-50"><span>#</span></a></h2><p><strong>RAID 50 — RAID 5+0（多组 RAID 5 条带化）</strong></p><p>RAID 50 将<strong>多个 RAID 5 子阵列</strong>通过 RAID 0 条带化组合在一起。每个子阵列独立进行分布式奇偶校验，顶层再对所有子阵列做条带化，兼顾了 RAID 5 的容错能力和 RAID 0 的高性能。</p><p>以 6 块盘（2 组 RAID 5，每组 3 盘）为例：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>RAID 5 子阵列 A:  [Disk 0] [Disk 1] [Disk 2]  → 可容忍 1 块盘故障</span></div></div><div><div><div>2</div></div><div><span>RAID 5 子阵列 B:  [Disk 3] [Disk 4] [Disk 5]  → 可容忍 1 块盘故障</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>顶层 RAID 0 条带化：</span></div></div><div><div><div>5</div></div><div><span>数据块 → 交替分发到子阵列 A 和子阵列 B</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>2.7.1 关键参数<a href="#271-关键参数"><span>#</span></a></h3>

<table><thead><tr><th>项目</th><th>说明</th></tr></thead><tbody><tr><td>最少磁盘数</td><td><strong>6 块</strong></td></tr><tr><td>容量利用率</td><td><strong>(N-M)/N</strong>（N 为总盘数，M 为子组数；如 6 盘 2 组利用率为 4/6 ≈ 67%）</td></tr><tr><td>读性能</td><td>极高</td></tr><tr><td>写性能</td><td>优于单个 RAID 5（校验计算分散到多个子阵列）</td></tr><tr><td>容错能力</td><td>每个子阵列可承受 1 块盘故障</td></tr></tbody></table><p><strong>相比单个 RAID 5 的优势</strong></p><ul>
<li><strong>更高的读写性能</strong>：条带化跨多个子阵列，I/O 并行度更高</li>
<li><strong>更快的重建速度</strong>：仅需重建故障子阵列，而非整个阵列</li>
<li><strong>更好的容错性</strong>：不同子阵列各可容忍一块盘故障</li>
</ul><p><strong>适用场景</strong>：大型数据库、流媒体服务器、需要大容量和高读写性能的中大型存储系统。</p><hr /></section></section><section><h2>2.8 综合对比总结<a href="#28-综合对比总结"><span>#</span></a></h2>

<table><thead><tr><th>RAID 级别</th><th>最少盘数</th><th>容量利用率</th><th>读性能</th><th>写性能</th><th>容错能力</th><th>典型场景</th></tr></thead><tbody><tr><td><strong>RAID 0</strong></td><td>2</td><td>100%</td><td>⭐⭐⭐⭐⭐</td><td>⭐⭐⭐⭐⭐</td><td>无</td><td>临时缓存、视频渲染</td></tr><tr><td><strong>RAID 1</strong></td><td>2</td><td>50%</td><td>⭐⭐⭐⭐</td><td>⭐⭐⭐</td><td>1 块盘</td><td>系统盘、关键数据</td></tr><tr><td><strong>RAID 3</strong></td><td>3</td><td>(N-1)/N</td><td>⭐⭐⭐（顺序好）</td><td>⭐⭐</td><td>1 块盘</td><td>顺序处理（已少用）</td></tr><tr><td><strong>RAID 5</strong></td><td>3</td><td>(N-1)/N</td><td>⭐⭐⭐⭐</td><td>⭐⭐⭐</td><td>1 块盘</td><td>文件服务器、NAS</td></tr><tr><td><strong>RAID 6</strong></td><td>4</td><td>(N-2)/N</td><td>⭐⭐⭐⭐</td><td>⭐⭐</td><td>2 块盘</td><td>大容量归档、备份</td></tr><tr><td><strong>RAID 10</strong></td><td>4</td><td>50%</td><td>⭐⭐⭐⭐⭐</td><td>⭐⭐⭐⭐⭐</td><td>每组 1 块</td><td>数据库、虚拟化</td></tr><tr><td><strong>RAID 50</strong></td><td>6</td><td>(N-M)/N</td><td>⭐⭐⭐⭐⭐</td><td>⭐⭐⭐⭐</td><td>每组 1 块</td><td>大型数据库、流媒体</td></tr></tbody></table><section><h3>2.8.1 选型建议<a href="#281-选型建议"><span>#</span></a></h3><ul>
<li><strong>追求极致速度、数据可丢失</strong> → RAID 0</li>
<li><strong>追求安全、盘数少</strong> → RAID 1</li>
<li><strong>性价比均衡（通用之选）</strong> → RAID 5</li>
<li><strong>大容量硬盘（&gt;4TB）或极高安全性</strong> → RAID 6</li>
<li><strong>预算充足、兼顾速度与极致安全</strong> → RAID 10</li>
<li><strong>大容量 + 高性能 + 一定容错</strong> → RAID 50</li>
</ul><blockquote><p>选型口诀：<strong>要速度不要数据选 0；要安全小容量选 1；性价比均衡选 5；大容量高可靠选 6；核心业务既要快又要稳选 10。</strong></p></blockquote><hr /></section></section></section>
<section><h1>三、其他RAID技术<a href="#三其他raid技术"><span>#</span></a></h1><section><h2>3.1 RAID 2.0+技术<a href="#31-raid-20技术"><span>#</span></a></h2><section><h3>3.1.1 技术定位与研发背景<a href="#311-技术定位与研发背景"><span>#</span></a></h3><p>RAID 2.0+并非一种新的RAID冗余级别，而是<strong>对传统RAID底层实现逻辑的革新</strong>，最早由<code>华为</code>针对企业级存储场景研发，核心目的是解决传统RAID在大容量硬盘时代面临的三大痛点：</p><ol>
<li><strong>重构风险高</strong>：传统RAID重构仅依赖单块热备盘，2TB硬盘重构需18小时以上，期间若再出现坏盘将导致数据全丢。</li>
<li><strong>存在性能热点</strong>：数据固定分布在指定RAID组的几块盘上，高频访问的盘会提前磨损，成为系统性能瓶颈。</li>
<li><strong>管理僵化</strong>：需要手动划分RAID组、配置热备盘，扩容时必须重新规划阵列结构，无法适配虚拟化环境动态分配资源的需求。</li>
</ol><p>它的本质是在不改变传统RAID 5/6/10等核心算法的基础上，将数据管理粒度从“整块硬盘”细化到“MB级数据块”，通过全局池化的方式重构底层存储架构。</p></section><section><h3>3.1.2 核心实现原理<a href="#312-核心实现原理"><span>#</span></a></h3><p>RAID 2.0+采用双层虚拟化架构，数据组织流程分为四层，每一层对应不同粒度的存储单元：</p><ol>
<li><strong>物理硬盘→CK（Chunk，数据块）</strong>：将存储池内所有物理硬盘（支持SSD、SAS、NL-SAS等混合介质）切分为固定大小的块，称为CK，常见大小为4MB（SSD场景）或64MB（机械盘场景），CK是组成RAID的最小单位。</li>
<li><strong>CK→CKG（Chunk Group，分块组）</strong>：从不同硬盘上选取N+M个CK按照指定的RAID策略组成CKG，每个CKG相当于一个微型RAID组，其中N为动态数据列数目，M为固定的校验列数目（比如RAID 6对应M=2，RAID-TP对应M=3）。</li>
<li><strong>CKG→Grain（存储颗粒）</strong>：每个CKG会进一步切分为更细粒度的Grain，默认大小为8KB，Grain是分配给LUN的基本单元，支持实现精简配置、动态扩容等高级功能。</li>
<li><strong>Grain→LUN（逻辑单元）</strong>：用户创建LUN时，系统会从存储池中随机分配空闲Grain组成LUN，同一LUN的数据会分散在存储池的所有硬盘上，不会出现数据集中在少数盘上的情况。</li>
</ol></section><section><h3>3.1.3 关键机制说明<a href="#313-关键机制说明"><span>#</span></a></h3><ul>
<li><strong>分布式热备空间</strong>：不再需要单独配置整块热备盘，而是每块成员盘都会预留一小部分CK作为热备空间，当某块盘故障时，所有健康盘的预留空间会共同承接重构数据，避免单块热备盘过载。</li>
<li><strong>动态RAID重构</strong>：当故障盘无法被替换时，系统会自动将CKG的分条结构从N+M调整为(N-1)+M，保持校验列M不变，确保冗余能力不降级；插入新盘后会自动恢复为标准结构，无需手动干预。</li>
<li><strong>按需重构</strong>：仅重构故障盘上已写入业务数据的部分，未使用的预留空间不会参与重构，进一步缩短重构时间。</li>
</ul></section><section><h3>3.1.4 相比传统RAID的核心优势<a href="#314-相比传统raid的核心优势"><span>#</span></a></h3>

<table><thead><tr><th>对比维度</th><th>传统RAID</th><th>RAID 2.0+</th></tr></thead><tbody><tr><td><strong>重构速度</strong></td><td>单盘重构，2TB盘需18小时+</td><td>所有健康盘并行重构，速度提升20倍，分钟级完成</td></tr><tr><td><strong>负载均衡</strong></td><td>数据固定绑定少数盘，易出现热点</td><td>数据自动打散到存储池所有盘，无热点，硬盘寿命均衡</td></tr><tr><td><strong>热备资源利用</strong></td><td>需占用整块盘做热备，平时闲置浪费</td><td>热备空间分散在所有盘上，整体利用率提升10%以上</td></tr><tr><td><strong>扩容灵活性</strong></td><td>扩容需重新规划RAID组，业务可能中断</td><td>直接插入新盘，系统自动调整数据分布，业务无感知</td></tr><tr><td><strong>重构影响</strong></td><td>重构期间性能下降30%-70%</td><td>每块盘的重构负载极低，对上层业务几乎无影响</td></tr><tr><td><strong>容错能力</strong></td><td>最多支持双盘容错（RAID 6）</td><td>支持RAID-TP级别，可同时容忍3块盘故障，甚至支持单硬盘框整体故障</td></tr></tbody></table></section><section><h3>3.1.5  支持的RAID级别与适用场景<a href="#315--支持的raid级别与适用场景"><span>#</span></a></h3><p>RAID 2.0+兼容传统主流RAID级别，同时针对闪存场景做了优化，常见配置如下：</p><ul>
<li><strong>RAID 6（默认配置）</strong>：校验列M=2，可容忍2块盘同时故障，容量利用率高，适合通用业务存储、文件服务器、中型数据库。</li>
<li><strong>RAID-TP</strong>：华为针对全闪存阵列定制的级别，校验列M=3，可容忍3块盘同时故障，适合金融、医疗等对数据可靠性要求极高的核心业务。</li>
<li><strong>RAID 10</strong>：校验列M=2，无校验计算开销，读写性能最优，适合高频交易、虚拟化主机等高性能场景。</li>
<li><strong>RAID 5</strong>：校验列M=1，容量利用率最高，适合读多写少的归档类业务。</li>
</ul></section></section><section><h2>3.2 CRAID（Chinese-RAID）<a href="#32-craidchinese-raid"><span>#</span></a></h2><p>CRAID 又名 <strong>“Chinese-RAID”</strong>，是由**宏杉科技（MacroSAN）**自主研发的存储专利技术，以中国命名，专门针对海量数据环境中存储介质易损坏导致的数据丢失和业务中断问题而设计。</p><p>它并非一种新的 RAID 冗余级别，而是对传统 RAID 底层数据组织和管理方式的革新，核心理念是将磁盘细分为数千甚至数万个小单元（Cell）进行单独管理。</p>

<table><thead><tr><th>版本</th><th>核心改进</th></tr></thead><tbody><tr><td><strong>CRAID 1.0</strong></td><td>将 RAID 组分割为数千甚至上万个 Cell 小单元进行精细化管理，提升故障硬盘重建效率</td></tr><tr><td><strong>CRAID 2.0</strong></td><td>采用全新 RAID 算法和<strong>三重校验机制</strong>，允许同一 RAID 组中<strong>任意 3 块盘</strong>同时故障，数据不丢失</td></tr><tr><td><strong>CRAID 3.0</strong></td><td>将单层虚拟化升级为<strong>两层虚拟化</strong>管理模式，以数据块为单元管理数据，提升读写性能并缩短重建时间</td></tr></tbody></table><section><h3>3.2.1 CRAID 3.0 核心原理<a href="#321-craid-30-核心原理"><span>#</span></a></h3><p>CRAID 3.0 采用<strong>底层硬盘管理 + 上层资源管理</strong>的两层虚拟化模式，数据组织分为四层：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>物理硬盘 → Chunk(CK) → DCG(Chunk Group) → Cell → LUN</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li><strong>第一层：硬盘 → Chunk（CK）</strong>
每块物理硬盘被切分为固定大小的数据块（Chunk），每个 CK 大小通常为 64MB 等。CK 是构建 RAID 的最小单位。</li>
<li><strong>第二层：CK → DCG（Chunk Group）</strong>
从不同硬盘上选取多个 CK，按照指定的 RAID 策略（支持 RAID 0/1/3/5/6）组成 DCG，每个 DCG 相当于一个微型 RAID 组。一个存储池基于指定的硬盘域创建，可按 RAID 策略组成 DCG 向上层提供具有 RAID 保护的存储资源。</li>
<li><strong>第三层：DCG → Cell</strong>
每个 DCG 被进一步划分为固定大小的存储单元 Cell（如 1GB），Cell 是构成 LUN 的基本单位。</li>
<li><strong>第四层：Cell → LUN</strong>
用户创建 LUN 时，系统从存储池中动态分配 Cell 组成 LUN，数据均匀分布到存储池的所有硬盘上。</li>
</ul></section><section><h3>3.2.2 核心优势<a href="#322-核心优势"><span>#</span></a></h3><section><h4>3.2.2.1 三重容错：允许任意 3 块盘故障<a href="#3221-三重容错允许任意-3-块盘故障"><span>#</span></a></h4><p>CRAID 2.0/3.0 采用全新的 RAID 算法和三重数据校验机制（N+1/2/3 模式），用户可自由指定校验盘数量。在同一个硬盘组中，任意 3 块硬盘同时发生完全物理故障，数据不丢失、业务不中断。</p></section><section><h4>3.2.2.2 多种智能重建方式<a href="#3222-多种智能重建方式"><span>#</span></a></h4>

<table><thead><tr><th>重建方式</th><th>说明</th></tr></thead><tbody><tr><td><strong>快速重建</strong></td><td>仅重建损坏的数据块，未出错区域直接拷贝到热备空间，大幅降低对性能的影响</td></tr><tr><td><strong>局部重建</strong></td><td>不使用热备盘顶替，仅对原盘发生变化的部分进行重建（适用于闪断、误拔插等短暂失效场景，支持 5 分钟内的数据恢复）</td></tr><tr><td><strong>优化重建</strong></td><td>仅重建被 LUN 使用的 Cell，未使用的 Cell 不重建；优先重建存在介质错误的 Cell，再用拷贝方式重建其他 Cell</td></tr><tr><td><strong>全盘重建</strong></td><td>与传统 RAID 类似，适用于磁盘被拔走或严重故障的场景</td></tr></tbody></table></section><section><h4>3.2.2.3 性能负载分摊<a href="#3223-性能负载分摊"><span>#</span></a></h4><p>前端主机的逻辑卷来自硬盘组中所有硬盘，IO 读写压力在所有硬盘间均衡分摊，不存在硬盘热点，大幅提升 IO 读写性能。</p></section><section><h4>3.2.2.4 空间利用率高<a href="#3224-空间利用率高"><span>#</span></a></h4><p>传统 RAID 5/6 仅含 1~2 块校验盘，RAID 1/10 利用率仅 50%。CRAID 采用 N+1/2/3 模式，用户可自由指定校验盘数量，在提升数据安全的同时提高硬盘空间利用率。</p></section><section><h4>3.2.2.5 重建效率极高<a href="#3225-重建效率极高"><span>#</span></a></h4><p>磁盘重建时间仅为传统重建时间的 <strong>15%~20%</strong>，RAID 组失效率降低 <strong>80%</strong>。</p></section></section></section><section><h2>3.3 RAID X0<a href="#33-raid-x0"><span>#</span></a></h2><p>RAID x0 <strong>不是一个独立的 RAID 级别</strong>，而是一个<strong>类别统称</strong>，泛指将多个相同类型的 RAID 子阵列通过 RAID 0 条带化组合在一起的嵌套 RAID 技术。其中 “x” 代表底层的 RAID 级别数字。</p><p>常见的 RAID x0 包括：</p>

<table><thead><tr><th>名称</th><th>底层组合</th><th>最少盘数</th></tr></thead><tbody><tr><td><strong>RAID 30</strong></td><td>多个 RAID 3 + RAID 0</td><td>6 块</td></tr><tr><td><strong>RAID 50</strong></td><td>多个 RAID 5 + RAID 0</td><td>6 块</td></tr><tr><td><strong>RAID 60</strong></td><td>多个 RAID 6 + RAID 0</td><td>8 块</td></tr></tbody></table><p>此外，IBM 的 ServeRAID 体系中，RAID x0 还包括 RAID 00、RAID 10、RAID 1E0 等。</p><section><h3>3.3.1 核心原理<a href="#331-核心原理"><span>#</span></a></h3><p>RAID x0 的本质是**“阵列的阵列”（Array of Arrays）**，采用两层结构：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>第一层（底层）：将物理硬盘分组，每组构建一个独立的 RAID 子阵列（如 RAID 5）</span></div></div><div><div><div>2</div></div><div><span>第二层（顶层）：将多个 RAID 子阵列通过 RAID 0 条带化组合为一个大的逻辑卷</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>以 RAID 50（6 块盘，2 组 RAID 5）为例：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>RAID 5 子阵列 A:  [Disk 0] [Disk 1] [Disk 2]  → 可容忍 1 块盘故障</span></div></div><div><div><div>2</div></div><div><span>RAID 5 子阵列 B:  [Disk 3] [Disk 4] [Disk 5]  → 可容忍 1 块盘故障</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>顶层 RAID 0 条带化：</span></div></div><div><div><div>5</div></div><div><span>数据块 → 交替分发到子阵列 A 和子阵列 B</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>3.3.2 容错特性<a href="#332-容错特性"><span>#</span></a></h3><p>RAID x0 的容错能力取决于底层子阵列的类型：</p><ul>
<li><strong>RAID 30/50</strong>：每个子阵列（RAID 3 或 RAID 5）最多允许 <strong>1 块盘</strong>故障，不丢失数据</li>
<li><strong>RAID 60</strong>：每个子阵列（RAID 6）最多允许 <strong>2 块盘</strong>故障，不丢失数据</li>
</ul><blockquote><p>⚠️ 注意：如果同一个子阵列内的故障盘数超过其容错上限，该子阵列将整体失效，导致整个 RAID x0 阵列数据丢失。</p></blockquote></section><section><h3>3.3.3 核心优势<a href="#333-核心优势"><span>#</span></a></h3><ul>
<li><strong>更大容量</strong>：突破单个 RAID 子阵列的盘数限制（传统 RAID 5 最多 16 块盘，RAID 50 可支持 60 块盘）</li>
<li><strong>更高性能</strong>：顶层 RAID 0 条带化使 IO 跨多个子阵列并行，读写性能显著优于单个 RAID 阵列</li>
<li><strong>更好可靠性</strong>：故障隔离在子阵列内部，不同子阵列可各自独立容错</li>
<li><strong>更快重建</strong>：仅需重建故障子阵列，不影响其他子阵列的正常运行</li>
</ul></section><section><h3>3.3.4 适用场景<a href="#334-适用场景"><span>#</span></a></h3>

<table><thead><tr><th>RAID x0 类型</th><th>典型场景</th></tr></thead><tbody><tr><td><strong>RAID 50</strong></td><td>大型数据库、流媒体服务器、需要大容量和高吞吐的中大型存储</td></tr><tr><td><strong>RAID 60</strong></td><td>对安全性要求极高的大规模存储系统、大容量归档</td></tr><tr><td><strong>RAID 30</strong></td><td>大文件顺序读写场景（较少使用）</td></tr></tbody></table></section></section><section><h2>3.4 NetApp RAID-DP / RAID-TEC<a href="#34-netapp-raid-dp--raid-tec"><span>#</span></a></h2><p>NetApp 是其 ONTAP 操作系统中的核心数据保护技术，应用于 NetApp AFF/FAS/ASA 全系列存储产品。</p><section><h3>3.4.1  核心原理<a href="#341--核心原理"><span>#</span></a></h3><p><strong>RAID-DP（Double Parity）</strong> 是 NetApp 对 RAID 6 的专有实现，采用<strong>双奇偶校验</strong>机制，允许同一 RAID 组中任意两块盘同时故障而不丢失数据。</p><p>其独特之处在于<strong>消除了传统 RAID 的”写惩罚”</strong>：ONTAP 在写入时，先将数据暂存到 NVRAM（非易失性内存）中，在内存中完成奇偶校验计算，然后作为一个完整的 RAID 条带一次性写入磁盘。整个过程不需要额外的”读旧数据、读旧校验”操作，因此不存在传统 RAID 5/6 的写惩罚问题。</p><p><strong>RAID-TEC（Triple Erasure Coding）</strong> 是 RAID-DP 的增强版，引入<strong>第三重奇偶校验</strong>，可容忍任意三块盘同时故障。</p></section><section><h3>3.4.2 关键特性<a href="#342-关键特性"><span>#</span></a></h3>

<table><thead><tr><th>项目</th><th>RAID-DP</th><th>RAID-TEC</th></tr></thead><tbody><tr><td>校验盘数</td><td>2</td><td>3</td></tr><tr><td>容错能力</td><td>任意 2 块盘故障</td><td>任意 3 块盘故障</td></tr><tr><td>写惩罚</td><td><strong>无</strong>（NVRAM 缓存+全条带写）</td><td><strong>无</strong></td></tr><tr><td>默认适用场景</td><td>4TB 以下磁盘</td><td>4TB 及以上磁盘（ONTAP 默认策略）</td></tr><tr><td>强制使用</td><td>—</td><td>10TB 及以上磁盘必须使用 RAID-TEC</td></tr></tbody></table></section><section><h3>3.4.3 与 RAID 2.0+ 的核心区别<a href="#343-与-raid-20-的核心区别"><span>#</span></a></h3><p>NetApp 的 RAID-DP/TEC 仍然基于<strong>传统 RAID 组</strong>的概念（固定数量的盘组成一个 RAID 组），而华为 RAID 2.0+ 采用全局池化+细粒度数据块分布。NetApp 的优势在于通过 NVRAM 彻底消除写惩罚，性能表现极为出色。</p><hr /></section></section><section><h2>3.5 Dell ADAPT（Distributed Erasure Coding）<a href="#35-dell-adaptdistributed-erasure-coding"><span>#</span></a></h2><p>Dell ADAPT 是 Dell PowerVault ME5/ME52 系列存储中的专有数据保护技术，全称为 <strong>Adaptive Distributed Protection Technology</strong>。</p><section><h3>3.5.1 核心原理<a href="#351-核心原理"><span>#</span></a></h3><p>ADAPT 本质上是一种<strong>分布式擦除编码</strong>技术，支持 <strong>16+2</strong> 或 <strong>8+2</strong> 的条带宽度，即 16 块（或 8 块）数据盘 + 2 块校验盘，提供<strong>双磁盘故障保护</strong>。</p><p>与传统 RAID 的关键区别：</p><ul>
<li><strong>无需专用热备盘</strong>：备用容量内置于所有成员盘中，类似 RAID 2.0+ 的分布式热备理念</li>
<li><strong>极速重建</strong>：故障盘数据由所有健康盘并行重建，速度远超传统 RAID</li>
<li><strong>大型存储池</strong>：最少需要 <strong>12 块磁盘</strong>，支持构建超大存储池（ME5/ME52 单 ADAPT 组最大 1.5 PiB）</li>
<li><strong>简化运维</strong>：无需手动配置热备盘、无需规划 RAID 组，插入磁盘即可自动加入池</li>
</ul><p><strong>适用场景</strong>：Dell 官方推荐 ADAPT 适用于<strong>大多数工作负载</strong>，尤其适合需要灵活存储和快速重建的场景。但不推荐用于极少磁盘或大量随机写入的工作负载。</p><hr /></section></section><section><h2>3.6 IBM Dynamic Disk Pool（DDP）<a href="#36-ibm-dynamic-disk-poolddp"><span>#</span></a></h2><p>IBM Dynamic Disk Pool 是 IBM 存储系统（如 DS3500、DCS3700 等）中的专有数据保护技术，属于 IBM 早期推出的”全局热备+分布式重构”方案。</p><section><h3>3.6.1 核心原理<a href="#361-核心原理"><span>#</span></a></h3><p>DDP 将每块物理磁盘划分为固定大小的 <strong>D-piece</strong>（512MB），多个 D-piece 组成一个 <strong>D-chunk（D-stripe）</strong>，默认采用 <strong>8D+2P（RAID 6）</strong> 的条带结构。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>物理盘结构：</span></div></div><div><div><div>2</div></div><div><span>Disk 0: [D-piece][D-piece][D-piece][D-piece]...[系统保留]</span></div></div><div><div><div>3</div></div><div><span>Disk 1: [D-piece][D-piece][D-piece][D-piece]...[系统保留]</span></div></div><div><div><div>4</div></div><div><span>...</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>D-chunk 组成（8+2）：</span></div></div><div><div><div>7</div></div><div><span>[D0][D1][D2][D3][D4][D5][D6][D7][P1][P2]  → 来自 10 块不同的盘</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>关键机制</strong>：</p><ul>
<li><strong>分布式热备</strong>：每块盘预留一部分 D-piece 作为备用空间，当某块盘故障时，所有健康盘的预留空间共同承担重构数据，<strong>无需专用热备盘</strong></li>
<li><strong>并行重构</strong>：重构数据分散写入所有健康盘，避免单盘成为热点</li>
<li><strong>自动再平衡</strong>：加入新盘后，系统自动将数据重新分布到新容量上</li>
</ul></section><section><h3>3.6.2 关键参数<a href="#362-关键参数"><span>#</span></a></h3>

<table><thead><tr><th>项目</th><th>说明</th></tr></thead><tbody><tr><td>最少磁盘数</td><td><strong>11 块</strong>（8 数据 + 2 校验 + 1 备用等效）</td></tr><tr><td>RAID 级别</td><td>固定为 RAID 6（8D+2P），不可更改</td></tr><tr><td>容错能力</td><td>任意 2 块盘同时故障</td></tr><tr><td>扩容</td><td>支持在线加盘（每次 1-12 块），不支持减盘</td></tr></tbody></table></section><section><h3>3.6.3 与 RAID 2.0+ 的关系<a href="#363-与-raid-20-的关系"><span>#</span></a></h3><p>IBM DDP 与华为 RAID 2.0+ 在理念上非常相似（全局池化、分布式热备、并行重构），但 DDP 是 IBM 的早期实现，粒度和灵活性不如 RAID 2.0+ 的 CK/CKG/Grain 三层架构。</p><hr /></section></section><section><h2>3.7 ZFS RAID-Z / RAID-Z2 / RAID-Z3<a href="#37-zfs-raid-z--raid-z2--raid-z3"><span>#</span></a></h2><p>RAID-Z 是 Sun Microsystems（后被 Oracle 收购）在其 <strong>ZFS 文件系统</strong>中开发的软件 RAID 方案，不需要额外硬件 RAID 卡。广泛应用于 TrueNAS、OpenZFS 等开源存储平台。</p><section><h3>3.7.1 核心原理<a href="#371-核心原理"><span>#</span></a></h3><p>解决 RAID-5 写入漏洞</p><p>传统 RAID 5 存在著名的**“写入漏洞”（Write Hole）**问题：当仅写入条带的一部分数据时，如果中途断电，数据与校验将不一致，导致校验永久失效。</p><p>RAID-Z 通过两大机制彻底解决了这个问题：</p><ul>
<li><strong>动态条带宽度</strong>：ZFS 根据每次写入的实际数据块大小动态调整条带宽度，确保<strong>每次写操作都是全条带写入</strong>，从根本上消除写入漏洞</li>
<li><strong>写时复制（Copy-on-Write）</strong>：数据先写入新位置，元数据更新后才指向新位置，即使断电也不会出现数据与校验不一致</li>
</ul>

<table><thead><tr><th>级别</th><th>校验数</th><th>最少盘数</th><th>容错能力</th><th>对标传统 RAID</th></tr></thead><tbody><tr><td><strong>RAID-Z1</strong></td><td>1</td><td>3</td><td>1 块盘</td><td>RAID 5</td></tr><tr><td><strong>RAID-Z2</strong></td><td>2</td><td>4</td><td>2 块盘</td><td>RAID 6</td></tr><tr><td><strong>RAID-Z3</strong></td><td>3</td><td>5</td><td>3 块盘</td><td>无对应</td></tr></tbody></table></section><section><h3>3.7.2 自愈能力<a href="#372-自愈能力"><span>#</span></a></h3><p>ZFS 为每个数据块计算<strong>校验和（Checksum）</strong>，读取时自动比对。若检测到静默数据损坏（bit rot），ZFS 会从冗余副本或校验信息中自动修复，无需人工干预。</p></section><section><h3>3.7.3 性能特征<a href="#373-性能特征"><span>#</span></a></h3><ul>
<li>顺序读写性能优秀，可随盘数线性扩展</li>
<li>随机写入因校验计算性能较低</li>
<li>重建时间随校验盘增加而延长（RAID-Z1 约 5 小时，RAID-Z3 约 9 小时，以 4TB HDD 为例）</li>
<li>推荐每组 3-9 块盘以优化性能</li>
</ul><hr /></section></section><section><h2>3.8 Ceph CRUSH<a href="#38-ceph-crush"><span>#</span></a></h2><p>CRUSH（Controlled Replication Under Scalable Hashing）是 <strong>Ceph 开源分布式存储系统</strong>的核心数据分布算法，严格来说它不是传统意义上的 RAID，而是一种<strong>去中心化的数据分布与冗余机制</strong>。</p><section><h3>3.8.1 核心原理<a href="#381-核心原理"><span>#</span></a></h3><p>CRUSH 彻底抛弃了传统 RAID 的”固定磁盘组”概念，通过<strong>算法计算</strong>而非查表来确定数据存放位置：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>数据对象 → 哈希映射到 PG（归置组） → CRUSH 算法计算 OSD 列表</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>工作流程</strong>：</p><ol>
<li><strong>对象→PG 映射</strong>：<code>PG_ID = Hash(Object_ID) % pg_num</code></li>
<li><strong>PG→OSD 映射</strong>：<code>CRUSH(PG_ID, Cluster_Map, Rule) → [OSD1, OSD2, ...]</code></li>
</ol><p>CRUSH 算法根据<strong>集群拓扑图（CRUSH Map）<strong>和</strong>放置规则（Placement Rule）</strong>，计算出数据应存放在哪些 OSD 上。</p></section><section><h3>3.8.2 关键特性<a href="#382-关键特性"><span>#</span></a></h3><ul>
<li><strong>去中心化</strong>：客户端和 OSD 均可独立计算数据位置，无需中心元数据服务器</li>
<li><strong>故障域隔离</strong>：支持按机架、机房、主机等物理层级隔离副本，确保同一数据的多个副本不在同一故障域</li>
<li><strong>弹性扩展</strong>：新增/移除 OSD 时，仅迁移受影响的数据（约 1/N），最小化数据搬迁量</li>
<li><strong>权重感知</strong>：根据设备容量/性能权重分配数据，大容量盘承载更多数据</li>
<li><strong>冗余模式</strong>：支持<strong>副本模式</strong>（默认 3 副本）和<strong>纠删码模式</strong>（类似 RAID 5/6 的编码方式）</li>
</ul></section><section><h3>3.8.3 与传统 RAID 的本质区别<a href="#383-与传统-raid-的本质区别"><span>#</span></a></h3>

<table><thead><tr><th>维度</th><th>传统 RAID</th><th>Ceph CRUSH</th></tr></thead><tbody><tr><td>数据分布</td><td>固定 RAID 组内条带化</td><td>算法计算，全局分布</td></tr><tr><td>扩展方式</td><td>需重建 RAID 组</td><td>加入新 OSD 自动再平衡</td></tr><tr><td>故障域</td><td>单控制器/单机柜</td><td>可跨机架、跨机房</td></tr><tr><td>规模上限</td><td>数十块盘</td><td>数千块盘</td></tr><tr><td>元数据管理</td><td>控制器维护 RAID 映射表</td><td>无中心元数据，算法自计算</td></tr></tbody></table><hr /></section></section><section><h2>3.9 RAIDIX RAID 7.3<a href="#39-raidix-raid-73"><span>#</span></a></h2><p>RAIDIX 是一家专注于高性能存储软件的公司，其 RAID 7.3 是专有的 <strong>N+M 数据保护算法</strong>，应用于 RAIDIX 5.X 软件定义存储平台。</p><section><h3>3.9.1 核心原理<a href="#391-核心原理"><span>#</span></a></h3><p>RAID 7.3 采用 <strong>N+M 冗余编码</strong>，允许灵活配置数据盘（N）和校验盘（M）的数量，提供比传统 RAID 更灵活的冗余策略。支持最大 <strong>9PB</strong> 的存储容量，系统可随需求阶段性扩展。</p></section><section><h3>3.9.2 技术特色<a href="#392-技术特色"><span>#</span></a></h3><ul>
<li><strong>ERA 引擎</strong>：采用无锁数据路径（Lockless Data Path）的创新软件 RAID，将存储性能提升到闪存介质带宽水平</li>
<li><strong>双控制器高可用</strong>：避免单点故障</li>
<li><strong>线性性能扩展</strong>：读写性能随盘数线性增长</li>
<li><strong>跨平台兼容</strong>：支持各家厂商的硬盘和控制器，避免供应商锁定</li>
</ul><p><strong>适用场景</strong>：高性能计算（HPC）、AI 训练数据存储、大型视频监控、冷/暖数据归档、影视后期制作（4K/8K 素材处理）。</p><hr /></section></section><section><h2>3.10 IBM Storage Scale RAID（Reed-Solomon 编码）<a href="#310-ibm-storage-scale-raidreed-solomon-编码"><span>#</span></a></h2><p>IBM Storage Scale（原 GPFS）中的 <strong>Reed-Solomon 编码 vdisk</strong>，用于大规模并行文件系统的数据保护。</p><section><h3>3.10.1 核心原理<a href="#3101-核心原理"><span>#</span></a></h3><p>采用 <strong>Reed-Solomon 纠删码</strong>替代传统 XOR 校验，支持如 <strong>8+3p</strong>（8 数据 + 3 校验，空间利用率 73%）或 <strong>8+2p</strong>（8 数据 + 2 校验，空间利用率 80%）等灵活配置。</p><p>与复制模式（3 副本利用率仅 33%）相比，Reed-Solomon 编码在空间效率上有显著优势，特别适合存储大量用户数据的场景。</p></section><section><h3>3.10.2 最佳实践<a href="#3102-最佳实践"><span>#</span></a></h3><ul>
<li><strong>元数据</strong>使用复制模式（replicated vdisk），因为元数据量小（占 1%-3%），且小块写入性能更好</li>
<li><strong>用户数据</strong>使用 Reed-Solomon 编码（Reed-Solomon vdisk），空间效率高，整条带写入性能优秀</li>
</ul><hr /></section></section><section><h2>3.11 HPE Smart Array（传统硬件 RAID）<a href="#311-hpe-smart-array传统硬件-raid"><span>#</span></a></h2><p>HPE Smart Array 是 HPE ProLiant 和 Synergy 服务器配套的<strong>硬件 RAID 控制器</strong>系列，支持标准 RAID 0/1/5/6/10 等级别。</p><section><h3>3.11.1 技术特色<a href="#3111-技术特色"><span>#</span></a></h3><ul>
<li><strong>硬件加速</strong>：专用处理器和缓存（2-4GB）处理 RAID 计算，不占用主机 CPU</li>
<li><strong>SmartCache</strong>：SSD 缓存加速层，将热点数据缓存到 SSD 提升读性能</li>
<li><strong>在线扩展</strong>：支持在线扩容和 RAID 级别迁移</li>
<li><strong>深度集成</strong>：与 HPE iLO 管理平台集成，支持远程监控和固件更新</li>
</ul></section><section><h3>3.11.2 定位<a href="#3112-定位"><span>#</span></a></h3><p>HPE Smart Array 属于<strong>传统硬件 RAID 控制器</strong>方案，与 RAID 2.0+、CRAID 等”新一代存储架构”不同，它仍然基于固定 RAID 组的管理模式。</p><hr /></section></section><section><h2>3.12 综合横向对比<a href="#312-综合横向对比"><span>#</span></a></h2>

<table><thead><tr><th>技术方案</th><th>厂商/平台</th><th>数据管理粒度</th><th>容错能力</th><th>热备机制</th><th>扩容方式</th><th>核心优势</th></tr></thead><tbody><tr><td><strong>RAID 2.0+</strong></td><td>华为</td><td>CK/CKG/Grain 三层</td><td>最多 3 盘（RAID-TP）</td><td>分布式预留</td><td>加盘自动平衡</td><td>全局池化，细粒度管理</td></tr><tr><td><strong>CRAID 3.0</strong></td><td>宏杉科技</td><td>CK/DCG/Cell 三层</td><td>最多 3 盘</td><td>分布式预留</td><td>加盘自动平衡</td><td>三重校验+多种智能重建</td></tr><tr><td><strong>RAID-DP/TEC</strong></td><td>NetApp</td><td>传统 RAID 组</td><td>2-3 盘</td><td>专用热备盘</td><td>需重建聚合</td><td><strong>无写惩罚</strong>（NVRAM）</td></tr><tr><td><strong>ADAPT</strong></td><td>Dell</td><td>分布式擦除编码</td><td>2 盘</td><td>内置备用容量</td><td>加盘自动扩展</td><td>运维极简，最少 12 盘</td></tr><tr><td><strong>DDP</strong></td><td>IBM</td><td>D-piece/D-chunk</td><td>2 盘</td><td>分布式预留</td><td>加盘自动再平衡</td><td>早期全局热备方案</td></tr><tr><td><strong>RAID-Z/Z2/Z3</strong></td><td>ZFS（开源）</td><td>动态条带宽度</td><td>1-3 盘</td><td>无（依赖冗余盘）</td><td>加盘新建 vdev</td><td><strong>消除写入漏洞</strong>+自愈</td></tr><tr><td><strong>CRUSH</strong></td><td>Ceph（开源）</td><td>对象/PG 级</td><td>3 副本或纠删码</td><td>无（算法重计算）</td><td>加 OSD 自动迁移</td><td>去中心化，超大规模</td></tr><tr><td><strong>RAID 7.3</strong></td><td>RAIDIX</td><td>N+M 编码</td><td>可配置 M 值</td><td>无专用热备</td><td>阶段性扩展</td><td>超高带宽，HPC/AI</td></tr><tr><td><strong>Reed-Solomon</strong></td><td>IBM Storage Scale</td><td>vdisk 级</td><td>2-3 盘校验</td><td>副本+纠删码混合</td><td>加 NSD 扩展</td><td>空间效率极高</td></tr><tr><td><strong>Smart Array</strong></td><td>HPE</td><td>传统 RAID 组</td><td>1-2 盘</td><td>专用热备盘</td><td>在线扩容</td><td>硬件加速，成熟稳定</td></tr></tbody></table>

<table><thead><tr><th>场景</th><th>推荐方案</th><th>理由</th></tr></thead><tbody><tr><td>中高端统一存储</td><td>华为 RAID 2.0+ / 宏杉 CRAID 3.0</td><td>全局池化，细粒度管理，三重容错</td></tr><tr><td>数据库/低延迟场景</td><td>NetApp RAID-DP/TEC</td><td>无写惩罚，NVRAM 保护，性能稳定</td></tr><tr><td>中小型企业存储</td><td>Dell ADAPT</td><td>运维简单，12 盘起步，自动管理</td></tr><tr><td>开源/软件定义存储</td><td>ZFS RAID-Z2 / Ceph CRUSH</td><td>零硬件成本，自愈能力强</td></tr><tr><td>超大规模分布式存储</td><td>Ceph CRUSH</td><td>去中心化，支持数千节点</td></tr><tr><td>HPC/AI 高性能场景</td><td>RAIDIX RAID 7.3</td><td>超高带宽，线性扩展</td></tr><tr><td>大规模并行文件系统</td><td>IBM Storage Scale RS 编码</td><td>空间效率极高，适合海量数据</td></tr></tbody></table><hr /><blockquote><p><strong>总结</strong>：企业级 RAID 技术正在从”固定 RAID 组”向”全局池化+细粒度数据分布”演进。华为 RAID 2.0+、宏杉 CRAID、Dell ADAPT、IBM DDP 都属于这一趋势的代表；NetApp 则走了另一条路，通过 NVRAM 消除写惩罚来优化传统 RAID 的性能；ZFS RAID-Z 从文件系统层面解决了写入漏洞问题；Ceph CRUSH 则彻底颠覆了传统 RAID 的架构思维，用算法替代了硬件映射表。选择哪种方案，取决于你的规模、性能需求、运维能力和预算。</p></blockquote></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/%E5%AD%98%E5%82%A8%E6%8A%80%E6%9C%AF/</id>
      <title type="text">存储技术</title>
      <published>2026-09-15T00:00:00.000Z</published>
      <updated>2026-09-15T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/%E5%AD%98%E5%82%A8%E6%8A%80%E6%9C%AF/"/>
      <summary type="text">存储技术</summary>
      <content type="html"><![CDATA[<section><h1>一、SAN 存储协议体系<a href="#一san-存储协议体系"><span>#</span></a></h1><section><h2>1.1 协议全景：先建立层次观<a href="#11-协议全景先建立层次观"><span>#</span></a></h2><p>在逐一深入之前，需要先建立一个关键认知：<strong>这些协议并不是同一层次的东西</strong>，它们分布在存储通信栈的不同层级，彼此之间既有竞争关系也有组合关系。可以按以下维度分类理解：</p>

<table><thead><tr><th>维度</th><th>协议/技术</th></tr></thead><tbody><tr><td><strong>存储命令集</strong>（告诉存储设备”做什么”）</td><td>SCSI、NVMe</td></tr><tr><td><strong>本地物理接口</strong>（设备与主机直连的”路”）</td><td>SAS（SCSI的载体）、PCIe（NVMe的载体）</td></tr><tr><td><strong>网络传输协议</strong>（把存储命令搬到网络上）</td><td>FC/FCP、iSCSI、NVMe-oF</td></tr><tr><td><strong>高性能网络传输技术</strong>（绕过内核直接访问内存）</td><td>RDMA、RoCE</td></tr></tbody></table><p>理解了这个分层，后面每个协议的定位就清晰了。</p><hr /></section><section><h2>1.2 SCSI<a href="#12-scsi"><span>#</span></a></h2><p>SCSI（Small Computer System Interface，小型计算机系统接口）是存储领域最古老、最核心的<strong>命令协议标准</strong>。它定义的不是某根线或某个接口，而是一套完整的<strong>指令集</strong>——告诉存储设备”读哪个块""写哪个块""查询设备状态”等。你可以把它理解为存储世界的”语言”。</p><section><h3>1.2.1 历史演进<a href="#121-历史演进"><span>#</span></a></h3><p>SCSI 最初是<strong>并行总线</strong>架构（Parallel SCSI），多个设备共享一条总线，存在严重的先天限制：</p><ul>
<li><strong>地址空间极小</strong>：总线最多只能挂 8 或 16 个设备</li>
<li><strong>传输距离极短</strong>：单端模式仅 6 米，差分模式 25 米</li>
<li><strong>无法共享链路</strong>：多个 I/O 控制器不能共享一条 SCSI 总线，存在单一故障点</li>
<li><strong>带宽瓶颈</strong>：并行信号在高频下的串扰问题限制了速率提升</li>
</ul><p>并行 SCSI 已被彻底淘汰，但它定义的<strong>命令集</strong>（CDB 命令描述块）生命力极强，至今仍在 SAS、FCP、iSCSI 中被广泛承载。</p></section><section><h3>1.2.2 核心地位<a href="#122-核心地位"><span>#</span></a></h3><p>SCSI 命令集是整个存储协议体系的”上层语言”。无论是后来的<code> SAS 直连、FC 光纤网络还是 iSCSI 以太网</code>，本质上都是<strong>用不同的传输方式搬运 SCSI 命令</strong>。理解这一点，是理解后续所有协议的关键。</p><hr /></section></section><section><h2>1.3 SAS<a href="#13-sas"><span>#</span></a></h2><p>SAS（Serial Attached SCSI，串行连接 SCSI）是并行 SCSI 的<strong>串行化演进</strong>，属于<strong>本地直连接口</strong>标准。它继承了 SCSI 命令集，但彻底抛弃了并行总线架构，改用点对点串行链路。</p><section><h3>1.3.1 核心技术特点<a href="#131-核心技术特点"><span>#</span></a></h3><ul>
<li><strong>点对点架构</strong>：每个设备独享一条链路，不再有总线争用问题</li>
<li><strong>强大的寻址能力</strong>：通过 SAS Expander（扩展器），一个域最多可寻址 <strong>65,535</strong> 个设备，远超并行 SCSI 的 16 个上限</li>
<li><strong>双端口冗余</strong>：支持双端口连接，提供链路级容错</li>
<li><strong>向下兼容 SATA</strong>：SAS 接口在物理层和协议层兼容 SATA 设备，SATA 硬盘可以直接插入 SAS 背板使用</li>
<li><strong>交换式组网</strong>：支持通过 Expander 构建交换拓扑，实现灵活的存储连接</li>
</ul></section><section><h3>1.3.2 速率演进<a href="#132-速率演进"><span>#</span></a></h3>

<table><thead><tr><th>代际</th><th>单链路速率</th></tr></thead><tbody><tr><td>SAS-1</td><td>3 Gb/s</td></tr><tr><td>SAS-2</td><td>6 Gb/s</td></tr><tr><td>SAS-3</td><td>12 Gb/s</td></tr><tr><td>SAS-4</td><td>24 Gb/s</td></tr></tbody></table></section><section><h3>1.3.3 定位与场景<a href="#133-定位与场景"><span>#</span></a></h3><p>SAS 是<strong>企业级硬盘（HDD 和 SSD）的主流直连接口</strong>，主要用于服务器内部连接硬盘、磁盘阵列柜（JBOD/ enclosure）。它的连接距离短（通常数米以内），不适合远距离组网，但在机箱内和近距扩展场景中仍是主力。</p><hr /></section></section><section><h2>1.4 FC / FCP<a href="#14-fc--fcp"><span>#</span></a></h2><p>FC（Fibre Channel，光纤通道）是一套专为存储网络设计的<strong>高速网络协议栈</strong>，是构建 FC-SAN 的基础。它不是简单的”光纤”，而是一个完整的五层协议体系：</p>

<table><thead><tr><th>层级</th><th>名称</th><th>功能</th></tr></thead><tbody><tr><td>FC-0</td><td>物理层</td><td>定义传输介质（光纤/铜缆）、信号机制、接口标准</td></tr><tr><td>FC-1</td><td>编码层</td><td>定义 8b/10b 或 64b/66b 编解码规则</td></tr><tr><td>FC-2</td><td>帧协议层</td><td>定义帧结构、流控制、服务质量和仲裁机制</td></tr><tr><td>FC-3</td><td>通用服务层</td><td>定义加密、压缩等通用服务</td></tr><tr><td>FC-4</td><td>协议映射层</td><td>定义上层协议（如 SCSI）到 FC 的映射接口</td></tr></tbody></table><section><h3>1.4.1 FCP：FC上的SCSI<a href="#141-fcpfc上的scsi"><span>#</span></a></h3><p>FCP（Fibre Channel Protocol）是 FC-4 层最重要的映射协议，它把 <strong>SCSI 命令封装在 FC 帧中</strong>传输。传统 FC-SAN 的核心就是 FC + FCP 的组合。</p></section><section><h3>1.4.2 三种拓扑结构<a href="#142-三种拓扑结构"><span>#</span></a></h3><ul>
<li><strong>点对点（Point-to-Point）</strong>：两台设备直连</li>
<li><strong>仲裁环（FC-AL）</strong>：设备以环形拓扑连接，共享带宽</li>
<li><strong>交换式 Fabric（最主流）</strong>：通过 FC 交换机构建大规模存储网络，支持多设备并发通信</li>
</ul></section><section><h3>1.4.3 核心优势与代价<a href="#143-核心优势与代价"><span>#</span></a></h3><p><strong>优势：</strong></p><ul>
<li><strong>高带宽</strong>：主流速率 16Gbps / 32Gbps，Gen6 可达 128Gbps</li>
<li><strong>极低延迟</strong>：端到端延迟可低至 2 微秒以内</li>
<li><strong>无损传输</strong>：内建流控机制，天然保证不丢包、不乱序</li>
<li><strong>高可靠性</strong>：专为存储设计的协议栈，成熟稳定</li>
</ul><p><strong>代价：</strong></p><ul>
<li><strong>需要专用硬件</strong>：必须使用 FC HBA 卡和 FC 光纤交换机</li>
<li><strong>成本高昂</strong>：整套基础设施（HBA、交换机、光模块、光纤线缆）价格远高于以太网方案</li>
<li><strong>管理复杂</strong>：需要独立的存储专网，运维门槛高</li>
</ul></section><section><h3>1.4.4 适用场景<a href="#144-适用场景"><span>#</span></a></h3><p>FC-SAN 长期是企业核心数据库、金融交易系统、大型虚拟化的首选存储网络方案，尤其在对延迟和可靠性要求极高的场景中占据主导地位。</p><hr /></section></section><section><h2>1.5 iSCSI<a href="#15-iscsi"><span>#</span></a></h2><p>iSCSI（Internet SCSI）由 Cisco 和 IBM 联合发起，核心思想是：<strong>把 SCSI 命令封装在 TCP/IP 协议中，通过普通以太网传输</strong>，从而用廉价的 IP 网络替代昂贵的 FC 专网来构建 SAN。用以太网”平替”光纤通道</p><section><h3>1.5.1 协议封装<a href="#151-协议封装"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>┌──────────────┐</span></div></div><div><div><div>2</div></div><div><span>│  SCSI 命令    │  ← 存储命令集</span></div></div><div><div><div>3</div></div><div><span>├──────────────┤</span></div></div><div><div><div>4</div></div><div><span>│  iSCSI 协议   │  ← 封装层：添加 iSCSI 头</span></div></div><div><div><div>5</div></div><div><span>├──────────────┤</span></div></div><div><div><div>6</div></div><div><span>│  TCP          │  ← 保证可靠传输</span></div></div><div><div><div>7</div></div><div><span>├──────────────┤</span></div></div><div><div><div>8</div></div><div><span>│  IP           │  ← 路由寻址</span></div></div><div><div><div>9</div></div><div><span>├──────────────┤</span></div></div><div><div><div>10</div></div><div><span>│  以太网       │  ← 物理承载</span></div></div><div><div><div>11</div></div><div><span>└──────────────┘</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.5.2 核心优势与代价<a href="#152-核心优势与代价"><span>#</span></a></h3><p><strong>优势：</strong></p><ul>
<li><strong>成本极低</strong>：复用现有以太网基础设施（网卡、交换机、网线），无需专用硬件</li>
<li><strong>部署灵活</strong>：不受距离限制，可跨广域网传输</li>
<li><strong>管理简单</strong>：IT 团队熟悉的 IP 网络技术即可管理</li>
<li><strong>兼容性好</strong>：任何支持 TCP/IP 的网络都能运行</li>
</ul><p><strong>代价：</strong></p><ul>
<li><strong>延迟较高</strong>：TCP/IP 协议栈开销大，每个数据包处理需消耗约 500-1000 个 CPU 周期</li>
<li><strong>CPU 占用高</strong>：大部分 iSCSI 实现依赖主机 CPU 处理协议栈，缺乏硬件卸载</li>
<li><strong>无内建流控</strong>：TCP 本身有拥塞控制，但不像 FC 那样提供存储级别的流控保障</li>
<li><strong>传输效率低</strong>：多层封装导致额外开销，性能受网络带宽和延迟影响明显</li>
</ul></section><section><h3>1.5.3 适用场景<a href="#153-适用场景"><span>#</span></a></h3><p>iSCSI-SAN 适合中小型企业或中等性能需求场景。建议配合独立 VLAN 或万兆以太网使用，避免与业务流量争抢带宽。</p><hr /></section></section><section><h2>1.6 PCIe<a href="#16-pcie"><span>#</span></a></h2><p>PCIe（Peripheral Component Interconnect Express）是计算机内部<strong>高速串行扩展总线</strong>标准，用于连接 CPU 与各种高速外设（显卡、网卡、SSD 等）。在存储领域，PCIe 的核心角色是作为 <strong>NVMe 协议的物理传输通道</strong>。</p><p>传统存储协议（SCSI/SAS/FC）最初是为机械硬盘设计的，命令队列浅、并发能力弱。而 SSD 的闪存介质可以并行处理海量 I/O 请求，需要一条”更宽、更快”的通道来释放其性能。PCIe 正是这样一条通道：</p>

<table><thead><tr><th>PCIe 版本</th><th>单通道（x1）带宽</th><th>x4 通道带宽</th></tr></thead><tbody><tr><td>PCIe 3.0</td><td>~1 GB/s</td><td>~4 GB/s</td></tr><tr><td>PCIe 4.0</td><td>~2 GB/s</td><td>~8 GB/s</td></tr><tr><td>PCIe 5.0</td><td>~4 GB/s</td><td>~16 GB/s</td></tr></tbody></table><p>PCIe 天生是为<strong>机箱内直连</strong>设计的，不适合远距离网络传输。这催生了 NVMe over Fabrics（NVMe-oF）的需求——把 NVMe 协议”搬”到网络上，而 PCIe 本身则继续作为本地 NVMe SSD 与 CPU 之间的”最后一公里”通道。</p><hr /></section><section><h2>1.7 NVMe<a href="#17-nvme"><span>#</span></a></h2><p><strong>闪存时代的存储命令集</strong></p><p>NVMe（Non-Volatile Memory Express）是专为闪存存储设计的<strong>新一代主机控制器接口和存储协议</strong>，通过 PCIe 总线与 CPU 直接通信，从根本上替代了为机械硬盘设计的 SCSI/AHCI 协议。</p><section><h3>1.7.1 NVMe作用<a href="#171-nvme作用"><span>#</span></a></h3><p>传统 SCSI/AHCI 协议面对闪存时暴露了严重瓶颈：</p>

<table><thead><tr><th>对比维度</th><th>AHCI（SATA）</th><th>NVMe（PCIe）</th></tr></thead><tbody><tr><td>命令队列数</td><td>1 个</td><td>最多 64K 个</td></tr><tr><td>队列深度</td><td>32</td><td>每队列 64K</td></tr><tr><td>中断机制</td><td>单中断，共享</td><td>多核独立中断，无锁提交</td></tr><tr><td>寄存器访问</td><td>多次内存读取</td><td>单次内存映射</td></tr><tr><td>设计初衷</td><td>机械硬盘（毫秒级延迟）</td><td>闪存（微秒级延迟）</td></tr></tbody></table><p>NVMe 的设计充分利用了闪存的并行特性和 PCIe 的高带宽，大幅降低延迟并提升 IOPS。</p></section><section><h3>1.7.2 NVMe的核心设计<a href="#172-nvme的核心设计"><span>#</span></a></h3><ul>
<li><strong>多队列 + 深队列</strong>：64K 个 I/O 队列，每队列 64K 深度，完美匹配多核 CPU 和多闪存芯片的并行能力</li>
<li><strong>多核无锁提交</strong>：每个 CPU 核心拥有独立的提交队列和完成队列，避免锁竞争</li>
<li><strong>精简命令集</strong>：去掉了 SCSI 中大量针对机械硬盘的复杂命令，命令处理更高效</li>
<li><strong>流控制优化</strong>：减少软件层面的开销，让硬件直接处理 I/O 调度</li>
</ul></section><section><h3>1.7.3 NVMe 的定位<a href="#173-nvme-的定位"><span>#</span></a></h3><p>NVMe 是<strong>命令集层面</strong>的革新（对标 SCSI），PCIe 是它的<strong>本地物理载体</strong>（对标 SAS）。两者的关系正如 SCSI 之于 SAS：SCSI 定义”说什么语言”，SAS 定义”用什么线传输”；NVMe 定义”闪存时代的新语言”，PCIe 定义”本地高速通道”。</p><hr /></section></section><section><h2>1.8 NVMe over Fabrics<a href="#18-nvme-over-fabrics"><span>#</span></a></h2><p><strong>把 NVMe 搬到网络上</strong></p><section><h3>1.8.1 NVMe-oF作用<a href="#181-nvme-of作用"><span>#</span></a></h3><p>NVMe SSD 的延迟已经做到 10 微秒级别，但如果通过 iSCSI（延迟约 100 微秒）或传统 SCSI 协议栈连接到远端存储，网络延迟会完全抵消 NVMe 的性能优势。NVMe-oF 的使命就是：<strong>将 NVMe 的低延迟、高并行语义端到端地保留到网络中</strong>，不被中间协议”打折”。</p></section><section><h3>1.8.2 NVMe-oF 的三种传输方式<a href="#182-nvme-of-的三种传输方式"><span>#</span></a></h3>

<table><thead><tr><th>传输方式</th><th>底层网络</th><th>特点</th></tr></thead><tbody><tr><td><strong>NVMe/RDMA</strong></td><td>InfiniBand / RoCE / iWARP</td><td>最低延迟，需 RDMA 网卡</td></tr><tr><td><strong>NVMe/FC</strong>（FC-NVMe）</td><td>光纤通道</td><td>复用现有 FC 基础设施</td></tr><tr><td><strong>NVMe/TCP</strong></td><td>标准以太网</td><td>无需专用硬件，兼容性最强</td></tr></tbody></table><p>NVMe-oF 使用 <strong>Capsule 封装</strong>格式统一屏蔽传输层差异，引入 NQN（NVMe Qualified Name）作为存储目标的全局唯一标识。</p></section><section><h3>1.8.3 NVMe-oF 三大主流方案对比<a href="#183-nvme-of-三大主流方案对比"><span>#</span></a></h3>

<table><thead><tr><th>对比维度</th><th>NVMe over FC (FC-NVMe)</th><th>NVMe over RoCE (NVMe over RDMA)</th><th>NVMe over TCP</th></tr></thead><tbody><tr><td><strong>网络介质与硬件</strong></td><td>传统光纤通道（FC）网络，需专用FC HBA卡与FC交换机。</td><td>融合以太网，需支持RDMA的专用网卡（R-NIC）及支持无损网络的交换机。</td><td>标准以太网，使用通用网卡即可，无特殊硬件要求。</td></tr><tr><td><strong>性能与延迟</strong></td><td><strong>高</strong>。相比传统FC-SCSI性能有所提升，但受限于传统传输层，略逊于RDMA。</td><td><strong>极高（最优）</strong>。具备零拷贝、内核旁路特性，延迟可达微秒级，CPU占用极低。</td><td><strong>中高</strong>。性能显著优于传统iSCSI，但受限于TCP/IP协议栈开销，延迟和CPU消耗高于RDMA。</td></tr><tr><td><strong>部署与配置难度</strong></td><td><strong>低（利旧友好）</strong>。对已有FC SAN架构的企业最平滑，支持FC-NVMe与FC-SCSI共存。</td><td><strong>高（复杂）</strong>。需配置无损网络（如PFC、ECN等流控技术）以防丢包，对网络拓扑和参数调优要求苛刻。</td><td><strong>极低（简单）</strong>。基于成熟TCP/IP栈，无需改造现有网络，部署最简单，兼容性最强。</td></tr><tr><td><strong>建设成本</strong></td><td><strong>高</strong>。需采购专用光纤硬件设备，且存在一定厂商锁定风险。</td><td><strong>中高</strong>。硬件成本约为InfiniBand的30%-50%，但整体部署与运维技术门槛较高。</td><td><strong>低</strong>。可最大程度复用现有标准以太网基础设施，TCO（总拥有成本）最低。</td></tr><tr><td><strong>适用场景</strong></td><td><strong>传统企业关键业务</strong>。适合已重度投资FC SAN的金融、电信等保守型行业进行平滑升级。</td><td><strong>高性能计算与AI</strong>。适合AI大模型训练、高频交易、高性能计算（HPC）等对延迟极度敏感的场景。</td><td><strong>云原生与通用云存储</strong>。适合Kubernetes容器化环境、超融合架构、通用数据库后端及分布式存储。</td></tr><tr><td><strong>未来趋势</strong></td><td><strong>逐渐式微但地位稳固</strong>。生态相对封闭，但在庞大的存量市场中短期内仍具不可替代性。</td><td><strong>高性能领域绝对主流</strong>。随着智算中心爆发，RoCEv2正成为构建高性能存储网络的首选。</td><td><strong>最具普及前景</strong>。凭借高性价比和易用性，有望全面替代传统IP SAN，成为以太网重构存储的事实标准。</td></tr></tbody></table><p><strong>总结建议</strong>：</p><ul>
<li>如果您的组织<strong>已有大量FC SAN资产</strong>且业务对稳定性要求极高，<strong>NVMe over FC</strong> 是利旧升级的最佳跳板。</li>
<li>如果业务属于<strong>AI智算、高频交易</strong>，对存储延迟有极致要求且预算充足，<strong>NVMe over RoCE</strong> 是不二之选。</li>
<li>如果面向<strong>云原生、分布式架构</strong>，追求高性价比、易部署与强兼容性，<strong>NVMe over TCP</strong> 是最具潜力的主流选择。</li>
</ul><hr /></section></section><section><h2>1.9 RDMA<a href="#19-rdma"><span>#</span></a></h2><p><strong>高性能网络的”内核旁路”技术</strong></p><p>RDMA（Remote Direct Memory Access，远程直接内存访问）是一种允许网络中一台主机<strong>直接读写另一台主机内存</strong>的技术，核心特性是两个”零”：</p><ul>
<li><strong>零拷贝（Zero Copy）</strong>：数据直接在应用内存和网络之间传输，不经过内核缓冲区的拷贝</li>
<li><strong>零内核参与（Kernel Bypass）</strong>：数据路径完全绕过操作系统内核协议栈，由网卡硬件直接完成</li>
</ul><section><h3>1.9.1 RDMA的存储重要性<a href="#191-rdma的存储重要性"><span>#</span></a></h3><p>传统 TCP/IP 协议栈处理每个数据包需要消耗约 500-1000 个 CPU 周期，而 RDMA 仅需硬件层面的几个时钟周期即可完成一次内存读写。在 100GbE 网络下：</p><ul>
<li><strong>RDMA 单流延迟</strong>：约 0.7 微秒</li>
<li><strong>TCP 延迟</strong>：约 15-20 微秒</li>
<li><strong>差距</strong>：20 倍以上</li>
</ul><p>这意味着 RDMA 可以将网络存储的延迟降低到接近本地 PCIe 直连的水平。</p></section><section><h3>1.9.2 RDMA 的三种实现<a href="#192-rdma-的三种实现"><span>#</span></a></h3><p>RDMA 本身是一套<strong>编程接口标准</strong>（Verbs API），底层有三种物理实现：</p>

<table><thead><tr><th>实现方式</th><th>物理网络</th><th>延迟（100G）</th><th>特点</th></tr></thead><tbody><tr><td><strong>InfiniBand</strong></td><td>IB 专用交换机/线缆</td><td>~0.5 μs</td><td>原生无损，性能最强，但生态封闭、成本高</td></tr><tr><td><strong>RoCE v2</strong></td><td>标准以太网</td><td>~0.7 μs</td><td>基于 UDP/IP，支持路由，需配置无损网络</td></tr><tr><td><strong>iWARP</strong></td><td>标准以太网</td><td>~3-5 μs</td><td>基于 TCP，无需无损网络，但延迟较高</td></tr></tbody></table></section><section><h3>1.9.3 RDMA 的核心操作语义<a href="#193-rdma-的核心操作语义"><span>#</span></a></h3><ul>
<li><strong>Send/Recv</strong>：双边操作，发送端和接收端都需参与（类似传统消息传递）</li>
<li><strong>RDMA Write</strong>：单边操作，发起端直接写入远端内存，远端 CPU 完全不感知</li>
<li><strong>RDMA Read</strong>：单边操作，发起端直接读取远端内存，远端 CPU 完全不感知</li>
<li><strong>Atomic 操作</strong>：原子的 Compare&amp;Swap、Fetch&amp;Add 等操作</li>
</ul><p>单边操作（Read/Write）是 RDMA 最强大的特性——远端 CPU 和操作系统对数据搬运完全无感知，真正实现了”零开销”。</p><hr /></section></section><section><h2>1.10 RoCE<a href="#110-roce"><span>#</span></a></h2><p><strong>在以太网上实现 RDMA</strong></p><p>RoCE（RDMA over Converged Ethernet）是在<strong>标准以太网</strong>上承载 RDMA 流量的协议，由 IBTA（InfiniBand Trade Association）于 2010 年提出。它的出现解决了 InfiniBand 生态封闭、成本高昂的问题，让企业可以在现有以太网基础设施上获得 RDMA 性能。</p>

<table><thead><tr><th>特性</th><th>RoCE v1</th><th>RoCE v2（主流）</th></tr></thead><tbody><tr><td>工作层级</td><td>数据链路层（L2）</td><td>网络层（L3）</td></tr><tr><td>封装方式</td><td>以太网帧直接封装（Ethertype 0x8915）</td><td>UDP/IPv4 或 UDP/IPv6 封装（UDP 端口 4791）</td></tr><tr><td>路由能力</td><td>仅限同一广播域</td><td>支持跨子网路由</td></tr><tr><td>部署范围</td><td>单层网络</td><td>数据中心级组网</td></tr><tr><td>当前地位</td><td>基本淘汰</td><td>业界主流</td></tr></tbody></table><p>RoCE v2 是当前分布式存储、AI 训练、高性能计算等场景的主流协议选择。</p><section><h3>1.10.1 无损网络：RoCE 的”生命线”<a href="#1101-无损网络roce-的生命线"><span>#</span></a></h3><p>RDMA 对丢包<strong>极度敏感</strong>（因为绕过了 TCP 的重传机制），因此 RoCE 网络必须配置为<strong>无损网络</strong>。这依赖以下关键机制：</p><ul>
<li><strong>PFC（Priority-based Flow Control）</strong>：基于优先级的链路级流控，当某个优先级的队列即将溢出时，向上游发送暂停帧，防止丢包</li>
<li><strong>ECN（Explicit Congestion Notification）</strong>：交换机在队列拥塞时标记报文，接收端生成 CNP（拥塞通知包）反馈给发送端降速</li>
<li><strong>DCQCN 算法</strong>：发送端根据 CNP 反馈动态调整发送速率，缓解全局拥塞</li>
<li><strong>ETS（Enhanced Transmission Selection）</strong>：按优先级分配带宽，隔离存储流量与普通流量</li>
</ul><p>这些机制需要在<strong>主机网卡、交换机、存储设备三端统一配置</strong>，任何一个环节缺失都可能导致性能劣化。</p></section><section><h3>1.10.2 RoCE 的部署要点<a href="#1102-roce-的部署要点"><span>#</span></a></h3><ul>
<li>需使用支持 RDMA 的网卡（RNIC），主流厂商包括 NVIDIA（Mellanox）、Broadcom、QLogic</li>
<li>RoCE 流量通常标记为 DSCP=48（CS6）和 VLAN PCP Priority 3</li>
<li>推荐 Spine-Leaf 三层 ECMP 架构，RoCE 存储网与业务 TCP 网物理隔离</li>
<li>全链路 MTU 必须一致（25GE 建议 2500，100GE 建议 5500）</li>
</ul><hr /></section></section><section><h2>1.11 对比总结<a href="#111-对比总结"><span>#</span></a></h2><section><h3>1.11.1 协议关系图谱<a href="#1111-协议关系图谱"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>存储命令层:     SCSI ──────────────────────→ NVMe</span></div></div><div><div><div>2</div></div><div><span><span>                  </span></span><span>│                           │</span></div></div><div><div><div>3</div></div><div><span>本地直连接口:    SAS（串行SCSI）             PCIe（高速总线）</span></div></div><div><div><div>4</div></div><div><span><span>                  </span></span><span>│                           │</span></div></div><div><div><div>5</div></div><div><span>网络传输层:    ┌──┴──┐                    ┌───┴──────────────┐</span></div></div><div><div><div>6</div></div><div><span><span>              </span></span><span>FC/FCP  iSCSI          NVMe/RDMA    NVMe/FC   NVMe/TCP</span></div></div><div><div><div>7</div></div><div><span><span>             </span></span><span>(光纤)  (以太网/TCP)     (RDMA网络)  (光纤)    (以太网/TCP)</span></div></div><div><div><div>8</div></div><div><span><span>                                        </span></span><span>│</span></div></div><div><div><div>9</div></div><div><span><span>                                    </span></span><span>┌───┴───┐</span></div></div><div><div><div>10</div></div><div><span><span>                              </span></span><span>RDMA 实现方式</span></div></div><div><div><div>11</div></div><div><span><span>                             </span></span><span>IB   RoCE   iWARP</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.11.2 关键指标横向对比<a href="#1112-关键指标横向对比"><span>#</span></a></h3>

<table><thead><tr><th>协议</th><th>延迟</th><th>带宽</th><th>CPU 开销</th><th>硬件成本</th><th>部署复杂度</th><th>典型场景</th></tr></thead><tbody><tr><td>FC/FCP</td><td>极低（~2μs）</td><td>高（32-128Gbps）</td><td>低（HBA 卸载）</td><td>高</td><td>高</td><td>核心数据库、金融交易</td></tr><tr><td>iSCSI</td><td>较高（~100μs）</td><td>中（1-100Gbps）</td><td>高</td><td>低</td><td>低</td><td>中小企业、中等性能需求</td></tr><tr><td>NVMe/PCIe（本地）</td><td>极低（&lt;10μs）</td><td>极高（~16GB/s x4）</td><td>极低</td><td>中</td><td>低</td><td>本地高性能 SSD</td></tr><tr><td>NVMe/RDMA（RoCE）</td><td>极低（~2-5μs）</td><td>极高（100-400Gbps）</td><td>极低</td><td>中高</td><td>高</td><td>AI 训练、全闪存阵列</td></tr><tr><td>NVMe/TCP</td><td>中（~10-30μs）</td><td>高（25-100Gbps）</td><td>中</td><td>低</td><td>低</td><td>云计算、超融合</td></tr><tr><td>NVMe/FC</td><td>极低</td><td>高</td><td>低</td><td>高</td><td>高</td><td>FC 网络升级至 NVMe</td></tr></tbody></table></section><section><h3>1.11.3 技术演进趋势<a href="#1113-技术演进趋势"><span>#</span></a></h3><ul>
<li><strong>FC-SAN → NVMe/FC</strong>：传统 FC 网络通过 FC-NVMe 升级，复用现有基础设施获得 NVMe 性能</li>
<li><strong>iSCSI → NVMe/TCP</strong>：IP-SAN 的自然演进路径，无需专用硬件</li>
<li><strong>RoCE v2 成为主流</strong>：在以太网生态上实现接近 InfiniBand 的性能，已成为新建高性能存储网络的首选</li>
<li><strong>NVMe-oF 统一存储网络</strong>：NVMe 命令集 + 多种 Fabric 传输，端到端保留闪存性能，正在成为现代数据中心的标配</li>
</ul><p>总结一句话：<strong>SCSI 和 NVMe 是”说什么”（命令语言），SAS 和 PCIe 是”本地怎么说”（直连接口），FC、iSCSI、RDMA/RoCE 是”远程怎么说”（网络传输），而 NVMe-oF 则是把闪存时代的新语言高效地搬到远程网络上的完整方案。</strong></p><hr /></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/</id>
      <title type="text">存储系统相关知识</title>
      <published>2026-09-15T00:00:00.000Z</published>
      <updated>2026-09-15T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/"/>
      <summary type="text">存储系统相关知识</summary>
      <content type="html"><![CDATA[<section><h1>一、常见存储介质<a href="#一常见存储介质"><span>#</span></a></h1><section><h2>1.1 HDD（机械硬盘）<a href="#11-hdd机械硬盘"><span>#</span></a></h2><p><strong>工作原理</strong>：HDD通过高速旋转的磁性盘片与精密移动的读写磁头协同工作，数据存取严格遵循“寻道—旋转—读写”三阶段物理时序。磁头需要先移动到目标磁道（寻道），等待盘片旋转到目标扇区（旋转延迟），然后才能进行读写操作。</p><p><strong>读写特性</strong>：</p><ul>
<li>顺序读写速度约100–200 MB/s，高端型号可达200 MB/s以上</li>
<li>随机IOPS仅100–200，受限于磁头寻道时间（约5–15ms）</li>
<li>读写对称，但随机性能远低于顺序性能</li>
<li>CMR（传统磁记录）适合持续读写，SMR（叠瓦式磁记录）密度更高但持续写入性能下降</li>
</ul><p><strong>适用场景</strong>：大容量冷数据归档、视频监控存储、备份与容灾、以顺序大文件读写为主的场景。HDD的核心优势是单位容量成本最低、容量上限高（单盘可达20TB以上）。</p></section><section><h2>1.2 SSD（固态硬盘）<a href="#12-ssd固态硬盘"><span>#</span></a></h2><p><strong>SSD（含闪存颗粒 + 主控）</strong>：SSD 内部是 NAND 闪存颗粒（TLC、QLC 等）加一颗主控芯片</p><p><strong>工作原理</strong>：SSD基于NAND闪存颗粒和控制器实现全电子寻址，无需机械运动，随机读写响应极快。</p><p><strong>读写特性</strong>：</p><ul>
<li>SATA SSD顺序读取最高约550 MB/s，NVMe SSD（PCIe 4.0）可达3,000–7,000 MB/s</li>
<li>企业级NVMe SSD的4K随机读IOPS可达110万–160万，随机写IOPS可达40万–55万</li>
<li>读写不对称：随机4K性能是核心关键指标，写入性能通常低于读取</li>
<li>寿命有限（P/E次数），有DWPD指标约束</li>
</ul><p><strong>SCM补充定位</strong>：存储级内存（SCM）填补DRAM与NAND Flash之间的性能鸿沟。DRAM延迟约50–100纳秒，NAND Flash延迟约50–100微秒，两者之间存在约三个数量级的差距。SCM目标延迟为100纳秒至10微秒，容量数十GB至数TB，每比特成本介于DRAM与NAND之间。</p><p><strong>适用场景</strong>：操作系统与软件系统盘、数据库主数据文件与事务日志、AI训练数据集缓存、企业虚拟化平台、容器持久化存储。OLTP数据库、Web服务器、开发环境编译等高频随机访问场景首选SSD。</p></section><section><h2>1.3 SCM（存储级内存）<a href="#13-scm存储级内存"><span>#</span></a></h2><p><strong>技术现状</strong>：英特尔傲腾（Optane）基于3D XPoint技术是SCM商业化最成功的尝试，但英特尔已于2022年停止Optane业务。2026年，基于PCM、ReRAM与MRAM的新型SCM方案正在加速产业化，CXL互连技术的成熟也为SCM在数据中心中的部署提供了新路径。</p><p><strong>当前代表产品</strong>：铠侠第二代XL-FLASH是当前最活跃的SCM方案。KIOXIA GP1系列采用该技术，支持512字节小粒度随机读取，随机读取IOPS目标可达1000万，耐久度高达50 DWPD，符合PCIe Gen6和NVMe 2.2规范。XL-FLASH的读取延迟降至5–10微秒，填补了DRAM（纳秒级）与NAND（百微秒级）之间的性能鸿沟。</p><p><strong>读写特性</strong>：</p><ul>
<li>非易失性，断电数据不丢失</li>
<li>亚微秒至微秒级低延迟</li>
<li>高耐久性（每日全盘写入次数可达数十次）</li>
<li>读写对称性好，适合写密集型持久化场景</li>
</ul><p><strong>特性简单理解</strong>：</p><ul>
<li><strong>断电数据不丢</strong>：不像内存，断电数据就消失</li>
</ul><ul>
<li><strong>能像内存一样直接读写</strong>：叫“字节寻址”。内存可以一个字节一个字节直接改；硬盘/SSD 通常要一整块搬来搬去。SCM 更像内存，CPU 可以直接访问。</li>
<li><strong>速度介于内存和 SSD 之间</strong>：比 SSD 快很多，但比内存慢一些。</li>
</ul><p><strong>适用场景</strong>：大容量内存扩展、持久化内存、高速缓存与存储级加速。典型应用包括数据库加速（消除WAL日志落盘开销，PostgreSQL事务提交延迟降低60%）、大容量内存计算扩展、AI模型训练checkpoint快速保存等。</p><p><strong>SCM简单理解</strong>：</p><ol>
<li><strong>SCM 是夹在内存和硬盘之间的东西。</strong></li>
<li><strong>它断电不丢，又能像内存一样直接读写。</strong></li>
<li><strong>它比内存慢一点、便宜大一点；比硬盘快很多、贵很多。</strong></li>
</ol></section></section>
<section><h1>二、存储接口与协议<a href="#二存储接口与协议"><span>#</span></a></h1><blockquote><p>存储的<code>物理接口、传输总线、传输协议</code>，对于<code>消费级存储、企业级存储</code>这两个使用场景，<code>规定的也会有所不同</code></p><p>这里使用两种方式进行讲解：<code>一是将消费级存储单个进行讲解</code>，<code>二是再次讲解相关理论</code>。</p></blockquote><section><h2>2.1 消费级常见存储<a href="#21-消费级常见存储"><span>#</span></a></h2><p>消费级存储的组成逻辑：<strong>存储介质（HDD/SSD/闪存）---物理接口（M.2 / 2.5 SATA / U.2 / E1.S）---传输总线（SATA 或 PCIe）---传输协议（AHCI 或 NVMe）---CPU/操作系统</strong></p><p>所以再购买<code>消费级固态硬盘</code>时会看到商品名称：<strong>M.2 NVMe PCle 3.0 x4 512G固态硬盘</strong></p><p>这里<code>介质层</code>就再不在讲解，无论是<code>消费级存储还是企业级存储</code>，本质上介质都是一样的。这里主要讲解<strong>物理接口、传输总线、传输协议</strong></p><section><h3>2.1.1 物理接口层<a href="#211-物理接口层"><span>#</span></a></h3><p>常见的接口有：<strong>M.2、2.5 英寸 SATA、U.2、E1.S 等</strong></p><p>指的是盘插在哪儿、长什么样。M.2 就是一条 22mm 宽、长度有 2230/2242/2260/2280/22110 等规格的小卡（2280 最主流），直接插在主板上的 M.2 插槽里。2.5 英寸 SATA 盘则是一块 7mm 厚的小方盒，用 SATA 数据线 + 电源线连接。M.2 和 2.5 英寸只是”插座形状”，不代表速度。</p></section><section><h3>2.1.2 总线层<a href="#212-总线层"><span>#</span></a></h3><p>常见的总线有：<strong>SATA、PCIe</strong></p><p>指的是数据传输走的”公路”。SATA 3.0 的带宽只有 6 Gbps，理论最高约 550~600 MB/s，这是 SATA 硬盘永远绕不过去的天花板。PCIe 是另一条带宽高得多的总线，PCIe 3.0 x4 约 32 Gbps、PCIe 4.0 x4 约 64 Gbps、PCIe 5.0 x4 约 128 Gbps，对应顺序读速约 3500 / 7500 / 15000 MB/s。</p></section><section><h3>2.1.3 协议层<a href="#213-协议层"><span>#</span></a></h3><p>常见的协议层：<strong>AHCI、NVMe</strong></p><p>指的是数据在总线上”怎么说话”。SATA 总线配套的传统协议是 AHCI，针对机械硬盘时代设计，指令队列深、延迟高；NVMe 则是专为闪存和 PCIe 通道量身定制的新协议，并发队列多、延迟极低，性能上限远高于 AHCI。</p></section><section><h3>2.1.4 主流方案组合<a href="#214-主流方案组合"><span>#</span></a></h3>

<table><thead><tr><th>方案</th><th>物理接口</th><th>总线</th><th>协议</th><th>典型速度上限</th></tr></thead><tbody><tr><td>2.5 英寸 SATA SSD</td><td>2.5” SATA</td><td>SATA</td><td>AHCI</td><td>≈550 MB/s</td></tr><tr><td>M.2 SATA SSD</td><td>M.2（多为 B+M Key）</td><td>SATA</td><td>AHCI</td><td>≈550 MB/s</td></tr><tr><td>M.2 NVMe SSD</td><td>M.2（多为 M Key）</td><td>PCIe</td><td>NVMe</td><td>3500~15000 MB/s+</td></tr><tr><td>U.2 NVMe SSD</td><td>U.2（SFF-8639）</td><td>PCIe</td><td>NVMe</td><td>3500~15000 MB/s+</td></tr></tbody></table></section><section><h3>2.1.5 其他注意事项<a href="#215-其他注意事项"><span>#</span></a></h3><p><strong>M.2 ≠ 一定是 NVMe。</strong> M.2 是物理形态，既可以走 SATA 总线（即”M.2 SATA”），也可以走 PCIe 总线（即”M.2 NVMe”）。市面上有一种 M.2 SATA 盘，外形和 M.2 NVMe 一模一样，但走的仍是 SATA 协议，速度同样被锁在 550 MB/s 左右，价格有时还挺贵。</p><p><strong>从金手指缺口可辅助判断。</strong> M.2 盘的金手指上通常有防呆缺口：B+M Key（双缺口）多为 M.2 SATA；M Key（单缺口，靠右侧）多为 M.2 NVMe。但这只是大概率规律，最可靠的方式仍是查看商品详情页的”接口协议”字段，或插上后用 CrystalDiskInfo 等工具验证。</p><p><strong>速度瓶颈取决于整条链路中最弱的一环。</strong> 就算介质是顶级闪存、协议是 NVMe，如果走的是 SATA 总线，速度照样被压到 550 MB/s。反过来，M.2 NVMe 盘插在 PCIe 3.0 的主板上只能跑到 3500 MB/s，插在 PCIe 4.0 主板上才能跑到 7000 MB/s，PCIe 是向下兼容但会降速的。</p></section></section><section><h2>2.2 存储互联协议<a href="#22-存储互联协议"><span>#</span></a></h2><p>存储互联协议是连接服务器与存储设备、实现数据高效传输的“通信规则”。定义了一整套<strong>从物理层到传输层的完整协议栈</strong>——既规定了线缆、接口、电气信号，也规定了链路建立、数据帧格式，甚至上层命令如何封装。</p><section><h3>2.2.1 SATA<a href="#221-sata"><span>#</span></a></h3><blockquote><h3>1. SATA协议栈<a href="#1-sata协议栈"><span>#</span></a></h3><p>SATA（串行高级技术附件）采用经典的四层分层设计模型，将复杂的功能分解到不同的逻辑层次中，各司其职：</p><ul>
<li><strong>物理层（Physical Layer）</strong>：负责最底层的电气连接和机械连接。它定义了传输线缆、连接器，并使用 8b/10b 编码将数字比特流转换为差分电信号。此外，它还通过带外信号（OOB）来完成链路初始化、速度协商和复位等功能。</li>
<li><strong>链路层（Link Layer）</strong>：负责数据帧的可靠传递。它通过生成控制原语（Primitive）来管理通信状态，实现数据的加解扰、CRC校验以及基于 HOLD/HOLDA 机制的流量控制，防止数据溢出。</li>
<li><strong>传输层（Transport Layer）</strong>：负责将上层的命令和数据封装成标准化的“帧信息结构”（FIS）。它定义了多种 FIS 帧类型（如寄存器 FIS、数据 FIS、DMA 激活 FIS 等），实现主机与设备间的数据交互和 NCQ 队列管理。</li>
<li><strong>应用层（Application Layer）</strong>：直接与操作系统或驱动程序交互，负责解析和执行 ATA/ATAPI 指令集，管理设备的状态寄存器，并实现具体的读写缓存、SMART 监控等高级特性。</li>
</ul><h3>2. SATA工程化视角理解<a href="#2-sata工程化视角理解"><span>#</span></a></h3><p>SATA 是面向消费级和入门级企业存储的接口，其设计核心是<strong>成本与容量的平衡</strong>。</p><ul>
<li>
<p><strong>物理接口层</strong></p>
</li>
<li>
<p><strong>连接器</strong>：采用 <strong>7针数据接口</strong>（L型防呆设计）和 <strong>15针电源接口</strong>。</p>
</li>
<li>
<p><strong>信号</strong>：使用两对低压差分信号线（TX+/-, RX+/-）实现全双工通信，典型峰对峰值差模电压为 500mV。</p>
</li>
<li>
<p><strong>线缆</strong>：内部线缆最大长度通常为 1-2 米（SATA 3.0 为 2米），不支持长距离传输。</p>
</li>
<li>
<p><strong>拓扑</strong>：严格的<strong>点对点（Point-to-Point）</strong> 连接，一个端口只能连接一个设备，无总线争用。</p>
</li>
<li>
<p><strong>总线层</strong></p>
</li>
<li>
<p><strong>链路管理</strong>：通过 <strong>OOB（带外信号）</strong> 机制（COMRESET, COMINIT, COMWAKE）完成链路初始化、速度协商和热插拔检测，不依赖高速数据时钟。</p>
</li>
<li>
<p><strong>数据编码</strong>：采用 <strong>8b/10b 编码</strong>，将数据流转换为电信号，同时提供时钟恢复和直流平衡，但带来 20% 的协议开销。</p>
</li>
<li>
<p><strong>流控与纠错</strong>：链路层通过原语（Primitives）进行流量控制（HOLD/HOLDA），并使用 CRC 校验和加解扰（Scrambling）保障数据完整性。</p>
</li>
<li>
<p><strong>协议层</strong></p>
</li>
<li>
<p><strong>帧格式</strong>：使用 <strong>FIS（Frame Information Structure，帧信息结构）</strong> 作为数据传输的基本单元，包括寄存器 FIS、数据 FIS、DMA 激活 FIS 等。</p>
</li>
<li>
<p><strong>命令集</strong>：上层运行 <strong>ATA/ATAPI 指令集</strong>，由主机通过 <strong>AHCI（高级主机控制器接口）</strong> 规范与设备交互，支持 NCQ（原生指令队列）优化机械硬盘的寻道性能。</p>
</li>
</ul></blockquote></section><section><h3>2.2.2 SAS<a href="#222-sas"><span>#</span></a></h3><blockquote><h3>1. SAS协议栈<a href="#1-sas协议栈"><span>#</span></a></h3><p>SAS（串行连接 SCSI）为了突破并行 SCSI 的性能瓶颈，采用了更为细致的六层功能架构，实现了命令逻辑与传输层的解耦：</p><ul>
<li><strong>物理层（Physical Layer）</strong>：作为硬件基础层，规范了通信的硬件载体细节，包括线缆、连接器的物理形态、引脚布局以及传输介质的电气特性。</li>
<li><strong>PHY 层</strong>：衔接物理硬件与上层协议，包含 8b/10b 编解码方案，并规范了设备初始化流程（如复位序列、链路握手逻辑）。</li>
<li><strong>链路层（Link Layer）</strong>：负责连接管理和数据预处理，通过原语实现链路初始化与维持，处理数据加解扰、CRC校验以及速率匹配，保障传输可靠性。</li>
<li><strong>端口层（Port Layer）</strong>：作为调度接口层，协调链路层的硬件资源，完成多设备场景下的连接建立，处理中断信号并实现链路的动态切换或故障响应。</li>
<li><strong>传输层（Transport Layer）</strong>：负责数据的封装与解包。它将应用层下发的命令、状态、数据按照 SAS 帧的结构规范进行封装，或拆解接收到的 SAS 帧并传递给应用层。</li>
<li><strong>应用层（Application Layer）</strong>：作为业务落地层，聚焦于具体场景的交互逻辑。它内置了 SSP（串行 SCSI 协议）、STP（SATA 隧道协议）和 SMP（SCSI 管理协议）三大子协议，完美兼容 SCSI 和 SATA 设备的读写与管理需求。</li>
</ul><h3>2. SAS工程化视角理解<a href="#2-sas工程化视角理解"><span>#</span></a></h3><p>SAS 是面向企业级存储的接口，其设计核心是<strong>高性能、高可靠与强扩展性</strong>，并在物理和协议层面<strong>向下兼容 SATA</strong>。</p><ul>
<li>
<p><strong>物理接口层</strong></p>
</li>
<li>
<p><strong>连接器</strong>：内部直连常用 <strong>SFF-8482</strong> 接口，外观与 SATA 类似但<strong>中间无缺口</strong>，且支持<strong>双端口（Dual Port）</strong> 设计以实现路径冗余。多盘连接则使用 <strong>Mini-SAS HD (SFF-8643)</strong> 等高密度接口。</p>
</li>
<li>
<p><strong>信号</strong>：同样采用低压差分信号，但电气规范更严格，支持更长的线缆和更复杂的背板环境。</p>
</li>
<li>
<p><strong>拓扑</strong>：支持<strong>点对点直连</strong>，更关键的是支持通过 <strong>SAS Expander（扩展器）</strong> 构建扇出（Fan-out）或边缘（Edge）拓扑，单域理论上可支持高达 <strong>65,535</strong> 个设备。</p>
</li>
<li>
<p><strong>总线层</strong></p>
</li>
<li>
<p><strong>链路管理</strong>：链路建立机制与 SATA 类似，但支持更复杂的速率协商和链路宽度聚合（Wide Port），可将多个 PHY 捆绑以提升带宽和冗余。</p>
</li>
<li>
<p><strong>数据编码</strong>：SAS-1/2/3 使用 <strong>8b/10b 编码</strong>；从 SAS-4 开始，为降低开销，演进为更高效的 <strong>128b/150b 编码</strong>（含 Reed-Solomon 前向纠错），有效带宽显著提升。</p>
</li>
<li>
<p><strong>连接管理</strong>：端口层（Port Layer）负责管理 PHY 到 Port 的映射，处理连接的建立、断开及故障切换，这是 SATA 所不具备的。</p>
</li>
<li>
<p><strong>协议层</strong></p>
</li>
<li>
<p>多协议融合</p>
<p>：传输层包含三大核心协议：</p>
<ol>
<li><strong>SSP (Serial SCSI Protocol)</strong>：用于与 SAS 设备通信，承载 SCSI 命令集，支持 T10 DIF/DIX 端到端数据保护、多路径 I/O (MPIO) 等企业级特性。</li>
<li><strong>STP (Serial ATA Tunneling Protocol)</strong>：用于在 SAS 域内透明传输 SATA 命令，实现 SAS 控制器对 SATA 硬盘的管理。</li>
<li><strong>SMP (Serial Management Protocol)</strong>：用于发现、配置和管理 SAS Expander 及域内设备。</li>
</ol>
</li>
<li>
<p><strong>命令集</strong>：上层运行 <strong>SCSI 指令集</strong>，支持更深的命令队列、更复杂的错误恢复逻辑和存储虚拟化功能。</p>
</li>
</ul></blockquote></section><section><h3>2.2.3 FC<a href="#223-fc"><span>#</span></a></h3><blockquote><h3>1. FC协议栈<a href="#1-fc协议栈"><span>#</span></a></h3><p>FC（光纤通道）协议栈包含五层结构，主要应用于企业级存储区域网络（SAN），具备通道和网络的双重优势：</p><ul>
<li><strong>FC-0（物理层）</strong>：定义了物理传输介质（光纤或铜缆）、连接器、信号速率及电气特性，支持热插拔。</li>
<li><strong>FC-1（传输/编码层）</strong>：负责信号的编码与解码（如 8B/10B 或 64b/66b 编码），确保数据流的直流平衡和时钟恢复。</li>
<li><strong>FC-2（信令/帧层）</strong>：这是 FC 协议的核心层，定义了帧结构、流控制（基于硬件的 BB_Credits 机制）、服务类别及交换机制。FC 交换机在此层基于 24 位 Fabric ID 进行数据帧的转发。</li>
<li><strong>FC-3（公共服务层）</strong>：提供数据条带化、组播、加密等通用服务。</li>
<li><strong>FC-4（协议映射层）</strong>：实现上层协议（如 SCSI、IP、NVMe 等）到 FC 网络的映射，支持这些协议的透明传输。</li>
</ul><h3>2. FC工程化视角理解<a href="#2-fc工程化视角理解"><span>#</span></a></h3><p>FC 是面向高端 SAN 网络的接口，其设计核心是<strong>无损网络、低延迟与长距离传输</strong>，本质上是一个<strong>存储网络协议</strong>。</p><ul>
<li>
<p><strong>物理接口层 (FC-0)</strong></p>
</li>
<li>
<p><strong>连接器</strong>：主流为 <strong>SFP/SFP+</strong> 光模块接口，也支持铜缆（如 Twinax），但非 L型 SATA 接口。</p>
</li>
<li>
<p><strong>介质</strong>：支持<strong>光纤</strong>（长距离、高抗扰）和<strong>铜缆</strong>（短距离、低成本），传输距离可达数公里甚至更远，这是 SATA/SAS 无法企及的。</p>
</li>
<li>
<p><strong>拓扑</strong>：支持 <strong>点对点、仲裁环（FC-AL）</strong> 和 <strong>交换式 Fabric（FC-SW）</strong> 拓扑，其中 Fabric 是主流，通过 FC 交换机连接大量设备。</p>
</li>
<li>
<p><strong>总线层 (FC-1 &amp; FC-2)</strong></p>
</li>
<li>
<p><strong>编码与帧</strong>：FC-1 层负责 <strong>8b/10b 或 64b/66b 编码</strong>；FC-2 层定义<strong>帧结构、流控制和交换机制</strong>。</p>
</li>
<li>
<p><strong>无损流控</strong>：核心是 <strong>BB_Credits（Buffer-to-Buffer Credits）</strong> 机制，这是一种基于硬件的、逐跳的信用流控，确保在链路拥塞时发送方暂停，<strong>从根本上杜绝丢包</strong>，保障存储 I/O 的确定性延迟。</p>
</li>
<li>
<p><strong>寻址</strong>：在 Fabric 拓扑中，设备通过 <strong>24位 Fabric ID</strong> 进行寻址和路由，由交换机基于硬件转发表进行线速转发。</p>
</li>
<li>
<p><strong>协议层 (FC-4)</strong></p>
</li>
<li>
<p><strong>协议映射</strong>：FC-4 层是<strong>协议映射层</strong>，负责将上层协议封装到 FC 帧中。</p>
</li>
<li>
<p>主流协议</p>
<p>：</p>
<ol>
<li><strong>FCP (Fibre Channel Protocol for SCSI)</strong>：最主流的映射，将 <strong>SCSI 命令</strong> 封装在 FC 帧中传输，保留了 SCSI 的全部企业级特性。</li>
<li><strong>FC-NVMe</strong>：新兴标准，将 <strong>NVMe 命令</strong> 直接映射到 FC，以发挥 NVMe SSD 的低延迟优势，同时利用 FC 网络的无损和长距离特性。</li>
<li>也支持 IP、FICON 等其他协议的映射。</li>
</ol>
</li>
</ul><h3>3. FC涉及的组件<a href="#3-fc涉及的组件"><span>#</span></a></h3><p>当有人说“这台服务器走 FC”时，通常意味着一整套东西：</p><ul>
<li>
<p><strong>HBA 卡</strong>：服务器端的 FC 主机总线适配器（区别于网卡和 RAID 卡）；</p>
</li>
<li>
<p><strong>SFP/SFP+ 光模块 + LC 光纤</strong>：物理连接介质；</p>
</li>
<li>
<p><strong>FC 交换机</strong>：组建 Fabric，做 zoning（分区隔离）；</p>
</li>
<li>
<p><strong>存储阵列的 FC 前端端口</strong>：接收主机访问；</p>
</li>
<li>
<p><strong>多路径软件</strong>（如 multipath、PowerPath）：利用 FC 多链路实现冗余。</p>
</li>
</ul></blockquote></section></section><section><h2>2.3 网络存储协议<a href="#23-网络存储协议"><span>#</span></a></h2><section><h3>2.3.1 SAN网络存储协议（网络块存储，远端裸 LUN）<a href="#231-san网络存储协议网络块存储远端裸-lun"><span>#</span></a></h3><blockquote><p>给主机提供块设备，主机需要自己格式化建文件系统</p></blockquote><ol>
<li>
<p><strong>FCP（SCSI over FC）</strong> 光纤通道 SAN，FC 网络上承载 SCSI 命令。 网络：专用 FC 光纤交换机网络；协议栈：SCSI → FCP → FC 五层协议。 场景：传统企业核心 SAN，数据库。</p>
</li>
<li>
<p><strong>FCoE（FC over Ethernet）</strong> FC 帧封装在以太网，<strong>保留 FC 原生 FCP</strong>，跑在以太网上，不需要单独 FC 交换机，但要无损以太网。 缺点：对网络要求高，现在用得少。</p>
</li>
<li>
<p><strong>iSCSI</strong> SCSI over TCP/IP，普通以太网承载 SCSI。 协议栈：SCSI → iSCSI → TCP → IP → 以太网。 优点：复用现有局域网，成本低；虚拟化、中小型 SAN 大量使用。</p>
</li>
<li>
<p>NVMe-oF（NVMe over Fabrics）</p>
<p>新一代高性能网络块协议，把 NVMe 命令放到网络传输，包含 3 种传输：</p>
<ul>
<li><strong>NVMe/TCP</strong>：NVMe over TCP/IP，普通以太网，目前主流</li>
<li><strong>NVMe/RoCE</strong>：RDMA over 以太网，低延迟，需要无损网络</li>
<li><strong>NVMe/IB</strong>：NVMe over InfiniBand，高性能 HPC 集群</li>
</ul>
</li>
</ol></section><section><h3>2.3.2 NAS 网络存储协议（网络文件存储，远端文件共享）<a href="#232-nas-网络存储协议网络文件存储远端文件共享"><span>#</span></a></h3><blockquote><p>存储自带文件系统，客户端直接挂载目录，读写文件，不需要格式化裸盘</p></blockquote><ol>
<li><strong>NFS（Network File System）</strong> Unix/Linux 主流文件共享，基于 RPC。版本：v3 /v4 /v4.2；v4 支持锁、安全认证。</li>
<li><strong>SMB / CIFS（Server Message Block）</strong> Windows 原生文件共享协议，CIFS 是老版本，SMB2/SMB3 现代版本。Windows、Linux、mac 都可以访问 NAS。</li>
<li><strong>WebDAV</strong> HTTP 扩展协议，通过 HTTP 访问远程文件，跨平台，性能一般。</li>
<li><strong>FTP / SFTP</strong> 文件传输协议，多用于下载上传，<strong>不支持操作系统原生挂载作为持久存储</strong>，一般不算标准 NAS 协议。</li>
</ol></section><section><h3>2.3.3 对象存储网络协议（网络对象访问，REST API）<a href="#233-对象存储网络协议网络对象访问rest-api"><span>#</span></a></h3><blockquote><p>基于 HTTP，操作对象（数据 + 元数据），不是块也不是传统文件</p></blockquote><ol>
<li><strong>S3（S3 REST API）</strong> AWS S3 协议，对象存储事实标准。MinIO、各大厂商对象存储全部兼容 S3。</li>
<li><strong>Swift API</strong> OpenStack Swift 原生对象 API，现在使用变少。</li>
<li><strong>Azure Blob Storage API</strong> 微软对象存储接口。</li>
</ol></section></section></section>
<section><h1>三、数据存储组件<a href="#三数据存储组件"><span>#</span></a></h1><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914111137335.png" alt="image-20260914111137335" /><figcaption>image-20260914111137335</figcaption></figure><p></p><section><h2>3.1 控制框<a href="#31-控制框"><span>#</span></a></h2><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914101924472.png" alt="image-20260914101924472" /><figcaption>image-20260914101924472</figcaption></figure><p></p><ul>
<li><strong>控制框</strong>是承载了控制器的机框，对外提供存储服务，它是存储系统中的核心组件。
<ul>
<li><code>系统插框</code>&lt;通过背板为各种接口模块提供可靠的连接&gt;,实现各个模块之间的信号互连与电源互连。</li>
<li><code>BBU模块</code>：能够在系统外部供电失效的情况下,提供后备电源支持,以保证存储阵列中业务数据的安全性。</li>
<li><code>管理模块</code>&lt;主要提供管理接口&gt;,包括管理网口、串口和维护网口。</li>
<li><code>电源模块</code>: PSU ( Power Supply Unit)电源模块为交流电源模块,可以支持控制框在最大功耗模式下正常运行。</li>
<li><code>接口模块</code>: IM,承载业务或管理接口的现场可更换模块。</li>
</ul>
</li>
</ul><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914102102081.png" alt="image-20260914102102081" /><figcaption>image-20260914102102081</figcaption></figure><p></p><ul>
<li>Huawei OceanStor Dorado V6控制框:
<ul>
<li>2U盘控一体内置25*2.5寸硬盘；</li>
<li><em>2U盘控一体内置36</em>PALM硬盘（NVMe）；</li>
<li>4U盘控分离控制框。</li>
</ul>
</li>
</ul><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914102221797.png" alt="image-20260914102221797" /><figcaption>image-20260914102221797</figcaption></figure><p></p><section><h3>3.1.1 控制器<a href="#311-控制器"><span>#</span></a></h3><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914102329850.png" alt="image-20260914102329850" /><figcaption>image-20260914102329850</figcaption></figure><p></p><ul>
<li>
<p><strong>控制器，Ctrl</strong>：存储系统中承载业务处理的核心模块。</p>
</li>
<li>
<p>控制器上的CPU和Cache共同实现对来自主机系统I/O请求的操作和对磁盘阵列的RAID管理。</p>
</li>
<li>
<p>每个控制器可内置多个硬盘，用于保存存储系统的数据和系统掉电后Cache中的数据。控制器间的硬盘互相冗余。</p>
</li>
<li>
<p><code>前端端口, FE ( Front End)</code> &lt;用于应用服务器和存储设备进行业务通信&gt;,即对主机I/0进行处理。</p>
</li>
<li>
<p><code>后端端口， BE ( Back End )</code>：负责连接控制框和硬盘框，是数据从硬盘读写的通道。</p>
</li>
<li>
<p><code> 缓存(Cache)</code>&lt;是硬盘控制器上的一块内存芯片&gt;,具有极快的存取速度,它是硬盘内部存储和外界接口之间的缓冲器。</p>
</li>
<li>
<p><code>引擎(Engine)</code>：引擎（Engine）是电子平台上开发程序或系统的核心组件，通常是一个程序或一套系统的支持部分。</p>
</li>
</ul></section><section><h3>3.1.2 BBU和风扇模板<a href="#312-bbu和风扇模板"><span>#</span></a></h3><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914105956392.png" alt="image-20260914105956392" /><figcaption>image-20260914105956392</figcaption></figure><p></p><ul>
<li>“风扇模块`为系统提供散热功能，可以支持控制框在最大功耗下的正常运行。</li>
<li><code>BBU</code>能够在系统外部供电失效的情况下，提供后备电源支持，以保证存储阵列中业务数据的安全性。
<ul>
<li>在系统电源输出正常时处于备份状态，<strong>当外部电源断开时</strong>，<code>BBU</code>能够继续给系统供电。BBU支持失效隔离，当BBU出故障时不会影响系统的正常运行。当系统掉电时BBU能确保系统将Cache数据写入控制器内置硬盘，保证数据不丢失。在系统外部电源故障恢复时，驱动软件将保存在控制器内置硬盘上的数据读出恢复至Cache中。使用锂电池备电的系统，都需要通过对电池进行充放电来刷新和检测电池容量，用于提前发现电池部件在网长时间不使用导致容量衰减，无法满足系统备电应用，导致数据备份失败的问题，提升系统掉电数据保护的可靠性。</li>
</ul>
</li>
</ul></section><section><h3>3.1.3 保险箱盘<a href="#313-保险箱盘"><span>#</span></a></h3><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914110326051.png" alt="image-20260914110326051" /><figcaption>image-20260914110326051</figcaption></figure><p></p><ul>
<li>
<p><code>保险箱盘</code>用于<strong>保存存储系统的数据、系统配置信息和日志、系统掉电后Cache中的数据</strong>。</p>
</li>
<li>
<p>存储系统中存在两种保险箱盘:<code>内置的保险箱盘和外置的保险箱盘</code>。</p>
</li>
<li>
<p>内置的保险箱盘：</p>
<ul>
<li>Huawei OceanStor Dorado V6每个控制器内置1块或2块SSD硬盘作为保险箱盘，详细配置请参考产品文档。</li>
</ul>
</li>
<li>
<p>外置的保险箱盘：</p>
<ul>
<li>存储系统会自动选择系统中的4块硬盘规划为保险箱盘，每块硬盘各取2GB空间组成RAID1，保险箱盘上的其他容量可以用来存储业务数据。当保险箱盘故障时，为保障冗余性，系统会自动从其余硬盘中选择状态正常的盘来替代故障保险箱盘。</li>
</ul>
</li>
</ul></section><section><h3>3.1.4 电源模块<a href="#314-电源模块"><span>#</span></a></h3><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914110653335.png" alt="image-20260914110653335" /><figcaption>image-20260914110653335</figcaption></figure><p></p></section></section><section><h2>3.2 硬盘框<a href="#32-硬盘框"><span>#</span></a></h2><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914110819836.png" alt="image-20260914110819836" /><figcaption>image-20260914110819836</figcaption></figure><p></p><ul>
<li>
<p><code>系统插框</code>&lt;通过背板为各种接口模块提供可靠的连接&gt;，实现各个模块之间的信号互连与电源互连。</p>
</li>
<li>
<p><code>级联模块</code>&lt;通过级联端口来级联控制框和其他硬盘框&gt;，实现与控制框和其他硬盘框的通信，是控制框与硬盘框之间、硬盘框与硬“盘框之间进行数据传输的连接点。</p>
</li>
<li>
<p><code>电源模块</code>&lt;可以支持硬盘框在最大功耗模式下正常运行&gt;。</p>
</li>
<li>
<p><code>硬盘模块</code>&lt;为存储系统提供存储容量&gt;，可作为系统保险箱，并且可以实现业务数据、系统数据和缓存数据的存储作用。</p>
</li>
</ul><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914111230649.png" alt="image-20260914111230649" /><figcaption>image-20260914111230649</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914111241138.png" alt="image-20260914111241138" /><figcaption>image-20260914111241138</figcaption></figure><p></p></section><section><h2>3.3 级联模块<a href="#33-级联模块"><span>#</span></a></h2><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914111407171.png" alt="image-20260914111407171" /><figcaption>image-20260914111407171</figcaption></figure><p></p><p><code>每个级联模块</code>提供<strong>1个级联端口“P0”和1个级联端口“P1”</strong>。级联模块使用级联端口来级联<code>控制框或硬盘框</code>，实现与控制框或硬盘框的通信，是控制框与硬盘框之间进行数据传输的连接点。</p><section><h3>3.3.1 级联所需设备组件<a href="#331-级联所需设备组件"><span>#</span></a></h3><section><h4>3.3.1.1 CE交换机<a href="#3311-ce交换机"><span>#</span></a></h4><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914111657782.png" alt="image-20260914111657782" /><figcaption>image-20260914111657782</figcaption></figure><p></p><ul>
<li>华为CloudEngine系列盒式交换机是面向数据中心推出的新一代高性能、高密度、低时延以太网交换机，采用灵活的前后/后前风道设计。</li>
<li>可以应用于<strong>IP SAN组网，分布式存储</strong>组网场景。</li>
</ul></section><section><h4>3.3.1.2 FC交换机<a href="#3312-fc交换机"><span>#</span></a></h4><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914111812604.png" alt="image-20260914111812604" /><figcaption>image-20260914111812604</figcaption></figure><p></p><ul>
<li>光纤交换机是一种高速的网络传输中继设备，它较普通交换机而言采用了<code>光纤电缆</code>作为传输介质。光纤传输的优点是速度快、抗干扰能力强。</li>
<li>可应用于<strong>FC SAN组网</strong>场景。</li>
</ul></section><section><h4>3.3.1.3 设备线缆<a href="#3313-设备线缆"><span>#</span></a></h4><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914112144452.png" alt="image-20260914112144452" /><figcaption>image-20260914112144452</figcaption></figure><p></p><ul>
<li>
<p><strong>串口线缆</strong>：用来连接设备的系统串口到维护终端。</p>
</li>
<li>
<p><strong>mini SASHD线缆</strong>：存储系统中mini SASHD线缆用于连接级联端口，连接控制框到硬盘框。线缆分为<code>mini SAS HD电缆和mini SAS HD光缆。</code></p>
</li>
<li>
<p><strong>100GQSFP28线缆</strong>：主要用于多控间直连组网或连接智能硬盘框。</p>
</li>
<li>
<p><strong>25GSFP28线缆</strong>&lt;主要用于前端主机组网&gt;。</p>
</li>
<li>
<p><strong>光纤</strong>：设备通过光纤与光纤交换机进行通信。光纤的一端可连接<code>FC(FibreChannel)HBA(Host Bus Adapter)卡</code>，另一端连接光纤交换机或存储。光纤两端都为LC(Lucent Connector)连接器。存储到光纤交换机可以使用<code>MPO-4*DLC光纤线</code>连接，<strong>MPO-4*DLC光纤是8GbFC接口模块(8端口)和16GbFC接口模块(8端口)专用线缆。</strong></p>
</li>
</ul></section></section></section><section><h2>3.4 接口模块<a href="#34-接口模块"><span>#</span></a></h2><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914113405100.png" alt="image-20260914113405100" /><figcaption>image-20260914113405100</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/ade01c55e8e2ca719fa28eabfa5dca59.png" alt="ade01c55e8e2ca719fa28eabfa5dca59" /><figcaption>ade01c55e8e2ca719fa28eabfa5dca59</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914113649183.png" alt="image-20260914113649183" /><figcaption>image-20260914113649183</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914113936767.png" alt="image-20260914113936767" /><figcaption>image-20260914113936767</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914113955482.png" alt="image-20260914113955482" /><figcaption>image-20260914113955482</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914114005876.png" alt="image-20260914114005876" /><figcaption>image-20260914114005876</figcaption></figure><p></p></section></section>
<section><h1>四、存储系统扩展方式<a href="#四存储系统扩展方式"><span>#</span></a></h1><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914114403257.png" alt="image-20260914114403257" /><figcaption>image-20260914114403257</figcaption></figure><p></p><ul>
<li><strong>Scale-Up</strong>：传统的纵向扩展架构，即利用现有的存储系统，通过不断增加存储器件来满足需求
<ul>
<li>优点：初期操作简单;</li>
<li>缺点：随着存储系统规模增加，资源的增加已经到达瓶颈。</li>
</ul>
</li>
<li><strong>Scale-Out</strong>： 横向扩展架构的扩容通常是以节点为单位，通过扩展更多的控制器来满足需求;
<ul>
<li>优点：随着规模增加，单位价格降低，效率提升</li>
<li>缺点：软件复杂度和管理复杂度增加</li>
</ul>
</li>
</ul><section><h2>4.1 Scale-up组网<a href="#41-scale-up组网"><span>#</span></a></h2><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914115142919.png" alt="image-20260914115142919" /><figcaption>image-20260914115142919</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914115219657.png" alt="image-20260914115219657" /><figcaption>image-20260914115219657</figcaption></figure><p></p></section><section><h2>4.2 Scale-out组网<a href="#42-scale-out组网"><span>#</span></a></h2><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/14/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/image-20260914115304672.png" alt="image-20260914115304672" /><figcaption>image-20260914115304672</figcaption></figure><p></p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/%E5%B8%B8%E8%A7%81%E5%AD%98%E5%82%A8%E7%B1%BB%E5%9E%8B/</id>
      <title type="text">常见存储产品类型</title>
      <published>2026-09-15T00:00:00.000Z</published>
      <updated>2026-09-15T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/%E5%B8%B8%E8%A7%81%E5%AD%98%E5%82%A8%E7%B1%BB%E5%9E%8B/"/>
      <summary type="text">常见的存储产品类型</summary>
      <content type="html"><![CDATA[<section><h1>一、企业存储常见类型<a href="#一企业存储常见类型"><span>#</span></a></h1><hr /><section><h2>1.1 全闪存存储（All-Flash Array, AFA）<a href="#11-全闪存存储all-flash-array-afa"><span>#</span></a></h2><p>全闪存存储专为企业中<strong>对性能要求极高</strong>的核心业务设计，典型场景包括金融核心交易系统、高频交易数据库、AI大模型训练与推理、高性能计算（HPC）、大规模虚拟化桌面（VDI）以及实时大数据分析等。</p><section><h3>1.1.1 特点<a href="#111-特点"><span>#</span></a></h3><ul>
<li><strong>极致性能</strong>：完全由SSD/NAND闪存介质构成，无机械部件。单一脚本可达50万至100万IOPS，部分端到端NVMe系统可达亿级IOPS，延迟通常在1毫秒以下，部分低至数十微秒。</li>
<li><strong>低能耗、小体积</strong>：相比混闪方案，在承载100PB数据时，机架空间和功耗可降低75%~80%。例如8U机架即可容纳PB级可用数据。</li>
<li><strong>软件栈全面优化</strong>：真正的全闪存储不仅在介质上使用SSD，其软件栈也针对闪存特性进行了全面优化（如磨损均衡、垃圾回收优化、数据缩减等），充分发挥闪存低延迟和高IOPS的优势。</li>
<li><strong>支持高级数据服务</strong>：支持重复数据删除（Deduplication）和数据压缩（Compression），可有效降低每GB实际成本。</li>
</ul></section><section><h3>1.1.2 局限<a href="#112-局限"><span>#</span></a></h3><p>SSD单位容量成本仍高于HDD，且SSD存在写入寿命限制（如SLC约10万次、MLC约1万次写入周期），需要通过磨损均衡和数据缩减技术来优化使用寿命。</p><hr /></section></section><section><h2>1.2 混合闪存存储（Hybrid Flash Storage）<a href="#12-混合闪存存储hybrid-flash-storage"><span>#</span></a></h2><p>混合闪存存储面向<strong>预算有限但需要一定性能提升</strong>的企业场景，适合中低事务量的数据库、一般性虚拟化环境、开发测试环境、中小型关系数据库以及容量需求大但对延迟不敏感的业务。</p><section><h3>1.2.1 特点<a href="#121-特点"><span>#</span></a></h3><ul>
<li><strong>二级分层架构</strong>：由SSD组成”性能层”（用于缓存热点数据），HDD组成”容量层”（提供大容量存储）。系统根据数据访问热度自动在两层之间迁移数据。</li>
<li><strong>成本效益突出</strong>：相比全闪方案，每GB成本显著更低。对于大容量、顺序读写为主、对延迟要求不苛刻的场景，混闪的部署成本优势明显。</li>
<li><strong>性能表现</strong>：读写性能较传统纯HDD存储显著提升，但延迟受缓存命中率影响波动较大——命中SSD缓存时性能优异，未命中时性能回落至HDD水平（通常在5ms左右）。</li>
<li><strong>数据保护</strong>：支持RAID 2.0+、RAID-TP（容忍3盘失效）、快照、克隆、双活等企业级数据保护技术。</li>
</ul></section><section><h3>1.2.2 局限<a href="#122-局限"><span>#</span></a></h3><p>自动分层（Auto-tiering）机制无法100%适应持续变化的应用负载，可能出现”缓存拥挤”导致性能下降；此外，混闪形态通常不支持重复数据删除特性，仅支持数据压缩。</p><hr /></section></section><section><h2>1.3 分布式存储（Distributed Storage）<a href="#13-分布式存储distributed-storage"><span>#</span></a></h2><p>分布式存储面向<strong>海量数据、高扩展性需求</strong>的场景，是云计算、大数据和AI时代的核心基础设施。按接口类型分为三大类：</p><ul>
<li><strong>分布式文件系统</strong>（如HDFS、CephFS、GlusterFS）：适用于大数据平台、离线分析、大文件顺序读写、影视渲染等场景。</li>
<li><strong>分布式对象存储</strong>（如Amazon S3、MinIO、Ceph RGW）：适用于海量小对象、数据湖、备份归档及云原生应用。</li>
<li><strong>分布式块存储</strong>（如Ceph RBD、Longhorn）：适用于虚拟机磁盘、Kubernetes持久卷、数据库等低延迟敏感业务。</li>
</ul><section><h3>1.3.1 特点<a href="#131-特点"><span>#</span></a></h3><ul>
<li><strong>横向扩展（Scale-Out）</strong>：通过增加节点即可线性扩展容量和性能，理论上可延伸至EB级别，突破了传统集中式存储的扩展瓶颈。</li>
<li><strong>高可用与容错</strong>：通过多副本（通常3副本）或纠删码（Erasure Coding）机制保障数据安全，任意节点故障时系统可自动从其他副本恢复数据，无需人工干预。</li>
<li><strong>去中心化架构</strong>：数据通过算法（如CRUSH、一致性哈希）自动分片并分散存储在多个节点，消除单点故障，同时实现负载均衡。</li>
<li><strong>多协议融合</strong>：先进的分布式存储系统可同时支持块、文件、对象和HDFS多种协议，通过统一命名空间实现数据互通。</li>
</ul></section><section><h3>1.3.2 局限<a href="#132-局限"><span>#</span></a></h3><p>架构复杂度较高，对网络质量依赖大（推荐使用RDMA等高速网络），运维门槛较高，小规模部署时性价比不如集中式存储。</p><hr /></section></section><section><h2>1.4 超融合（Hyper-Converged Infrastructure, HCI）<a href="#14-超融合hyper-converged-infrastructure-hci"><span>#</span></a></h2><p>超融合面向<strong>中大规模私有云/混合云建设、虚拟桌面（VDI）、远程/分支机构（ROBO）、边缘计算</strong>以及需要快速部署、简化运维的成长型企业场景。</p><section><h3>1.4.1 特点<a href="#141-特点"><span>#</span></a></h3><ul>
<li><strong>深度融合架构</strong>：将计算虚拟化 + 分布式存储 + 网络虚拟化 + 统一管理全部集成到标准x86/ARM服务器中，将传统三层架构（服务器+FC交换机+集中存储）简化为两层（交换机+服务器）。</li>
<li><strong>软件定义存储</strong>：通过SDS技术将各服务器节点的本地存储资源池化为统一的分布式共享存储，无需专用SAN/NAS存储阵列。</li>
<li><strong>开箱即用、统一管理</strong>：预集成软硬件，一个管理平台统一管理计算、存储、网络所有资源，新节点上线仅需15分钟即可完成自动化配置。</li>
<li><strong>线性弹性扩展</strong>：通过增加节点即可同时扩展计算和存储资源，扩容过程对业务影响小。</li>
</ul></section><section><h3>1.4.2 局限<a href="#142-局限"><span>#</span></a></h3><p>计算与存储紧耦合，不能独立扩容（例如只需加存储容量时也必须加整个节点）；存在供应商锁定风险；节点数量多时管理复杂度上升；存储与计算共享资源，极端负载下可能互相影响。</p><hr /></section></section><section><h2>1.5 备份存储（Backup Storage）<a href="#15-备份存储backup-storage"><span>#</span></a></h2><p>备份存储专门用于<strong>企业数据保护与灾难恢复</strong>，承载数据库备份、虚拟机备份、文件系统备份、归档数据以及合规留存数据，确保在系统故障、勒索病毒攻击、人为错误等情况下能快速恢复业务。</p><section><h3>1.5.1 特点<a href="#151-特点"><span>#</span></a></h3><ul>
<li><strong>以容量和成本为核心导向</strong>：备份数据量通常达到生产容量的数倍乃至数十倍，因此对单位存储成本极为敏感，通常采用性价比较高的存储介质。</li>
<li><strong>高数据缩减比</strong>：通过全局重删（Deduplication）和压缩技术，数据缩减比可达72&lt;1甚至更高&gt;，大幅节省存储空间。</li>
<li><strong>安全性设计</strong>：支持WORM（一次写入多次读取）防篡改、Air Gap物理隔离、端到端加密、勒索软件检测等安全机制，确保备份数据不被篡改或删除。</li>
<li><strong>快速恢复能力</strong>：现代备份存储支持即时挂载（Instant Mount）、增量备份秒级合成等技术，将恢复时间目标（RTO）从小时级缩短到分钟级。</li>
</ul></section><section><h3>1.5.2 局限<a href="#152-局限"><span>#</span></a></h3><p>备份存储通常不作为生产存储使用，其随机读写性能有限，主要面向顺序写入和偶尔的恢复读取场景。</p><hr /></section></section><section><h2>1.6 虚拟化存储（Virtualized Storage）<a href="#16-虚拟化存储virtualized-storage"><span>#</span></a></h2><p>虚拟化存储是<strong>企业IT基础设施的”通用底座”</strong>，为服务器虚拟化（VMware、KVM、Hyper-V）、容器平台（Kubernetes）、云桌面（VDI）以及各类上层应用提供统一的、可弹性分配的存储资源。</p><section><h3>1.6.1 特点<a href="#161-特点"><span>#</span></a></h3><ul>
<li><strong>存储资源抽象与池化</strong>：通过软件层将底层异构的物理存储设备（不同品牌、不同型号的磁盘阵列、SSD、HDD等）抽象为统一的逻辑存储池，对上层应用屏蔽硬件差异。</li>
<li><strong>灵活的资源调配</strong>：支持自动精简配置（Thin Provisioning）、动态资源分配、在线扩容，IT团队可按需为虚拟机或容器分配存储，无需手动配置物理设备。</li>
<li><strong>简化备份与容灾</strong>：虚拟化存储提供集中化的快照、复制和一致的数据逻辑视图，DRaaS方案可轻松将虚拟存储池复制到异地或云端，提升业务连续性。</li>
<li><strong>广泛的兼容性</strong>：可对接多种底层存储硬件，支持FC、iSCSI、NFS、NVMe over Fabrics等多种协议，适配不同虚拟化平台和容器编排系统。</li>
</ul></section><section><h3>1.6.2 局限<a href="#162-局限"><span>#</span></a></h3><p>虚拟化层本身会引入一定的性能开销；存储虚拟化依赖底层物理存储的性能上限；若管理平台故障，可能影响所有上层存储服务的可用性。</p><hr /></section></section></section>
<section><h1>二、六种存储类型对比<a href="#二六种存储类型对比"><span>#</span></a></h1>

<table><thead><tr><th>维度</th><th>全闪存存储</th><th>混合闪存存储</th><th>分布式存储</th><th>超融合</th><th>备份存储</th><th>虚拟化存储</th></tr></thead><tbody><tr><td><strong>核心定位</strong></td><td>极致性能</td><td>性能与成本平衡</td><td>海量数据高扩展</td><td>一体化融合架构</td><td>数据保护与恢复</td><td>资源抽象与池化</td></tr><tr><td><strong>存储介质</strong></td><td>纯SSD/NAND</td><td>SSD + HDD</td><td>SSD/HDD均可</td><td>SSD/HDD均可</td><td>HDD/SSD/磁带均可</td><td>异构介质统一池化</td></tr><tr><td><strong>延迟</strong></td><td>亚毫秒~微秒级</td><td>毫秒级（受缓存命中率影响）</td><td>取决于介质和网络</td><td>取决于介质配置</td><td>较高（非性能导向）</td><td>取决于底层介质</td></tr><tr><td><strong>扩展方式</strong></td><td>Scale-up/out</td><td>Scale-up</td><td>Scale-out</td><td>Scale-out</td><td>Scale-up/out</td><td>Scale-up/out</td></tr><tr><td><strong>单位成本</strong></td><td>最高</td><td>中等</td><td>较低</td><td>中等</td><td>最低</td><td>取决于底层介质</td></tr><tr><td><strong>典型场景</strong></td><td>金融交易、AI训练</td><td>中型数据库、开发测试</td><td>云存储、大数据、归档</td><td>私有云、VDI、边缘</td><td>备份归档、容灾</td><td>虚拟化/容器底座</td></tr><tr><td><strong>管理复杂度</strong></td><td>低（无分层）</td><td>中（需管理分层策略）</td><td>高</td><td>低（统一管理）</td><td>中</td><td>中</td></tr></tbody></table><hr /><section><h2>2.1 总结<a href="#21-总结"><span>#</span></a></h2><p>这六种存储类型并非相互替代的关系，而是在企业IT架构中<strong>各司其职、协同配合</strong>：</p><ul>
<li><strong>全闪存</strong>和<strong>混合闪存</strong>是集中式存储阵列的两种介质形态，前者追求极致性能，后者追求性价比平衡；</li>
<li><strong>分布式存储</strong>解决的是海量数据的扩展性和可靠性问题，是云和大数据的基石；</li>
<li><strong>超融合</strong>是一种架构理念，将计算与存储融合简化，本质上是”分布式存储 + 虚拟化”的一体化交付；</li>
<li><strong>备份存储</strong>专注于数据保护，是业务连续性的最后一道防线；</li>
<li><strong>虚拟化存储</strong>则是一种”胶水层”技术，将异构存储统一管理，为上层应用提供灵活的存储服务。</li>
</ul><p>在实际企业部署中，业界最佳实践是采用<strong>分层存储策略</strong>——热数据放在全闪存保障性能，温冷数据放在混闪或分布式存储控制成本，备份数据放在专用备份存储确保安全，最终通过虚拟化存储层统一管理，实现性能、成本与安全的最优平衡。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/Elastic%20Stack%E9%83%A8%E7%BD%B2%E4%BD%BF%E7%94%A8/</id>
      <title type="text">Elastic Stack部署使用</title>
      <published>2026-09-03T00:00:00.000Z</published>
      <updated>2026-09-09T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/Elastic%20Stack%E9%83%A8%E7%BD%B2%E4%BD%BF%E7%94%A8/"/>
      <summary type="text">Elastic Stack各组件部署及使用</summary>
      <content type="html"><![CDATA[<section><h1>一 、elk stack 简述<a href="#一-elk-stack-简述"><span>#</span></a></h1><p>ELK 早期是 <strong>Elasticsearch + Logstash + Kibana</strong> 三个组件的简称，现在官方统一命名为 <strong>Elastic Stack</strong>，增加了 Beats 系列采集组件，专门用来做<strong>日志收集、日志清洗、存储检索、可视化分析、告警</strong>，是运维最主流的日志解决方案。</p><section><h2>1.1 核心三大件<a href="#11-核心三大件"><span>#</span></a></h2><ol>
<li><strong>Elasticsearch</strong> 分布式搜索引擎、存储引擎。 负责<strong>存储、索引、检索</strong>日志 / 数据，提供 RESTful API，底层基于 Lucene。</li>
<li><strong>Logstash</strong> 数据采集处理管道。 负责<strong>接收、过滤、转换、输出</strong>数据；支持丰富输入输出插件，对日志做清洗、格式化、字段提取。</li>
<li><strong>Kibana</strong> 可视化 Web 界面。 对接 Elasticsearch，做日志查询、图表、仪表盘、告警，Web 操作 ES。</li>
</ol></section><section><h2>1.2 常用配套组件（扩展）<a href="#12-常用配套组件扩展"><span>#</span></a></h2><section><h3>1.2.1 Beats<a href="#121-beats"><span>#</span></a></h3><p>轻量采集器，替代 Logstash 做客户端采集，部署在业务服务器上。</p><ul>
<li><strong>Filebeat</strong>：采集日志文件（最常用）</li>
<li><strong>Metricbeat</strong>：采集系统 / 服务指标（CPU、内存、进程、数据库）</li>
<li><strong>Packetbeat</strong>：网络流量抓包分析</li>
<li><strong>Heartbeat</strong>：服务存活探测（uptime 监控）</li>
<li><strong>Auditbeat</strong>：系统审计日志采集</li>
</ul><blockquote><p>典型架构：Filebeat → Logstash → Elasticsearch ← Kibana</p><p>经典数据流：业务机器(Filebeat) → Logstash(清洗) → Elasticsearch(存储索引) ← Kibana(查看)</p><p>很多生产环境：Filebeat 直接输出 ES，省略 Logstash，简化架构。</p><p>简单区分：Logstash：功能强、占资源，适合服务端集中处理；Beats：轻量，部署在业务机器上做采集</p></blockquote></section><section><h3>1.2.2 其他重要组件<a href="#122-其他重要组件"><span>#</span></a></h3><ul>
<li><strong>Elastic Agent</strong>：新一代统一代理，可以整合所有 Beats 功能，单 agent 采集日志 + 指标 + 安全数据。</li>
<li><strong>APM Server</strong>：应用性能监控，收集链路追踪、应用指标、错误日志。</li>
<li><strong>Elasticsearch Security</strong>：安全模块，权限、认证、加密。</li>
<li><strong>Logstash Pipeline</strong>：管道处理，也支持持久队列防止丢数据。</li>
</ul></section></section></section>
<section><h1>二、elk stack组件安装<a href="#二elk-stack组件安装"><span>#</span></a></h1><section><h2>2.1 Elasticsearch部署<a href="#21-elasticsearch部署"><span>#</span></a></h2><blockquote><p>官网地址：<a href="https://www.elastic.co/docs/deploy-manage/deploy/self-managed/installing-elasticsearch" target="_blank">https://www.elastic.co/docs/deploy-manage/deploy/self-managed/installing-elasticsearch</a></p><p>安装文档：<a href="https://www.elastic.co/docs/deploy-manage/deploy/self-managed/install-elasticsearch-from-archive-on-linux-macos" target="_blank">https://www.elastic.co/docs/deploy-manage/deploy/self-managed/install-elasticsearch-from-archive-on-linux-macos</a></p><p>开源地址：<a href="https://github.com/elastic/elasticsearch" target="_blank">https://github.com/elastic/elasticsearch</a></p><p>下载地址：<a href="https://www.elastic.co/cn/downloads/elasticsearch" target="_blank">https://www.elastic.co/cn/downloads/elasticsearch</a></p><p>查看版本支持的操作系统：<a href="https://www.elastic.co/support/matrix" target="_blank">https://www.elastic.co/support/matrix</a></p></blockquote><section><h3>2.1.1 下载二进制包并配置<a href="#211-下载二进制包并配置"><span>#</span></a></h3><p>下载 Elasticsearch 二进制包，并指定解压到 <code>/usr/local</code> 目录下，并重命名为 <code>elasticsearch</code> ：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/usr/local/src</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>wget</span><span> </span><span>https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-9.5.2-linux-x86_64.tar.gz</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>tar</span><span> </span><span>-xzf</span><span> </span><span>elasticsearch-9.5.2-linux-x86_64.tar.gz</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>mv</span><span> </span><span>elasticsearch-9.5.2</span><span> </span><span>/usr/local/elasticsearch</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>配置环境变量：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>/etc/profile.d/elasticsearch.sh</span><span> &lt;&lt;</span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>export ES_HOME=/usr/local/elasticsearch</span></div></div><div><div><div>3</div></div><div><span>export PATH=$PATH:$ES_HOME/bin</span></div></div><div><div><div>4</div></div><div><span>EOF</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>source</span><span> </span><span>/etc/profile</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>验证版本：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>[root@localhost /root]# elasticsearch -V</span></div></div><div><div><div>2</div></div><div><span>warning:</span><span> </span><span>ignoring</span><span> </span><span>JAVA_HOME=/usr/local/java/jdk</span><span>; </span><span>using</span><span> </span><span>bundled</span><span> </span><span>JDK</span></div></div><div><div><div>3</div></div><div><span>Version:</span><span> </span><span>9.5.2,</span><span> </span><span>Build:</span><span> </span><span>tar/b42549c72e6e040825b13e5d8ebf7ff63886b24d/2026-08-18T10:07:58.745010960Z,</span><span> </span><span>JVM:</span><span> </span><span>26.0.2</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.1.2 ES环境配置<a href="#212-es环境配置"><span>#</span></a></h3><ol>
<li>调整系统底层参数：</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 调整虚拟内存（vm.max_map_count）</span></div></div><div><div><div>2</div></div><div><span>sysctl</span><span> </span><span>-w</span><span> </span><span>vm.max_map_count=</span><span>655360</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 写入配置文件使其永久生效</span></div></div><div><div><div>5</div></div><div><span>echo</span><span> </span><span>"vm.max_map_count=655360"</span><span> &gt;&gt; </span><span>/etc/sysctl.conf</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 重新加载</span></div></div><div><div><div>8</div></div><div><span>sysctl</span><span> </span><span>-p</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 验证配置</span></div></div><div><div><div>11</div></div><div><span>sysctl</span><span> </span><span>vm.max_map_count</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>
<p>调整文件描述符限制：编辑 <code>/etc/security/limits.conf</code>，添加以下配置：</p>
<p>修改<code>elk</code>用户的文件描述符限制</p>
</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt;&gt; </span><span>/etc/security/limits.conf</span><span> &lt;&lt; </span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>elk soft nofile 65535</span></div></div><div><div><div>3</div></div><div><span>elk hard nofile 65535</span></div></div><div><div><div>4</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>
<p>创建专用用户并赋权：</p>
<p>Elasticsearch 禁止使用 root 用户启动。需要创建专用用户并赋予安装目录权限：</p>
</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 创建 elk 用户组</span></div></div><div><div><div>2</div></div><div><span>groupadd</span><span> </span><span>-r</span><span> </span><span>elk</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 创建 elk 用户，指定主组为 elk，并限制登录和家目录</span></div></div><div><div><div>5</div></div><div><span>useradd</span><span> </span><span>-r</span><span> </span><span>-g</span><span> </span><span>elk</span><span> </span><span>-s</span><span> </span><span>/sbin/nologin</span><span> </span><span>-M</span><span> </span><span>elk</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 赋予目录权限</span></div></div><div><div><div>8</div></div><div><span>chown</span><span> </span><span>-R</span><span> </span><span>elk:elk</span><span> </span><span>/usr/local/elasticsearch</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>
<p>创建数据目录并赋权：</p>
<p>在<code>/usr/local/elk/data/es</code>目录中创建两个目录分别为<code>data</code>和<code>logs</code>，分别存放数据和日志：</p>
</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/usr/local/elk/data/es/{data,logs}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>赋予 <code>elk</code> 用户和 <code>elk</code> 组所有权：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>chown</span><span> </span><span>-R</span><span> </span><span>elk:elk</span><span> </span><span>/usr/local/elk</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.1.3 ES配置文件修改<a href="#213-es配置文件修改"><span>#</span></a></h3><p><code>elasticsearch.yml</code> 是 Elasticsearch 主要的配置文件，包含了很多参数信息。在 <code>/usr/local/elasticsearch/config</code> 目录下，编辑 <code>elasticsearch.yml</code>文件，配置以下内容：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 备份原配置文件</span></div></div><div><div><div>2</div></div><div><span>cp</span><span> </span><span>/usr/local/elasticsearch/config/elasticsearch.yml{,.bak}</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 指定集群名称：</span></div></div><div><div><div>5</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'/#cluster.name/c cluster.name: es-cluster'</span><span> </span><span>/usr/local/elasticsearch/config/elasticsearch.yml</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 指定节点名称：node-1</span></div></div><div><div><div>8</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'/#node.name/c node.name: node-1'</span><span> </span><span>/usr/local/elasticsearch/config/elasticsearch.yml</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 指定ES索引数据存储路径</span></div></div><div><div><div>11</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'/#path.data/c path.data: /usr/local/elk/data/es/data'</span><span> </span><span>/usr/local/elasticsearch/config/elasticsearch.yml</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span># 指定日志文件存储路径</span></div></div><div><div><div>14</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'/#path.logs/c path.logs: /usr/local/elk/data/es/logs'</span><span> </span><span>/usr/local/elasticsearch/config/elasticsearch.yml</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span># 设置锁定内存以防止交换</span></div></div><div><div><div>17</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'/#bootstrap.memory_lock/c bootstrap.memory_lock: true'</span><span> </span><span>/usr/local/elasticsearch/config/elasticsearch.yml</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span># 设置ES监听所有网络接口的请求</span></div></div><div><div><div>20</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'/#network.host/c network.host: 0.0.0.0'</span><span> </span><span>/usr/local/elasticsearch/config/elasticsearch.yml</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span># 指定Elasticsearch HTTP服务的端口。默认是9200</span></div></div><div><div><div>23</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'/#http.port/c http.port: 9200'</span><span> </span><span>/usr/local/elasticsearch/config/elasticsearch.yml</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>**注意：**目前是单节点运行，因此需要进行以下配置：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 在 cluster.name这一行的下方插入discovery.type: single-node</span></div></div><div><div><div>2</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'/^cluster.name/a discovery.type: single-node'</span><span> </span><span>/usr/local/elasticsearch/config/elasticsearch.yml</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 注释初始主节点配置</span></div></div><div><div><div>5</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'s/^cluster.initial_master_nodes/# cluster.initial_master_nodes: ["localhost"]/'</span><span> </span><span>/usr/local/elasticsearch/config/elasticsearch.yml</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.1.4 修改 JVM 内存配置<a href="#214-修改-jvm-内存配置"><span>#</span></a></h3><p>Elasticsearch 的 JVM 配置文件 <code>/usr/local/elasticsearch/jvm.options</code> ，这个文件用于配置 Elasticsearch 运行时的 JVM（Java 虚拟机）选项，包括堆内存的初始大小（ <code>-Xms</code> ）和最大大小（ <code>-Xmx</code> ）。编辑 <code>jvm.options</code> 文件，修改以下内容：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 指定 Elasticsearch 进程的初始堆内存大小</span></div></div><div><div><div>2</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'s/## -Xms4g/-Xms2g/g'</span><span> </span><span>/usr/local/elasticsearch/config/jvm.options</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 指定 Elasticsearch 进程的最大堆内存大小</span></div></div><div><div><div>5</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'s/## -Xmx4g/-Xmx2g/g'</span><span> </span><span>/usr/local/elasticsearch/config/jvm.options</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.1.5 配置启动服务并启动<a href="#215-配置启动服务并启动"><span>#</span></a></h3><p>创建一个名为 <code>elasticsearch.service</code> 的 systemd 服务单元文件，用于管理 Elasticsearch 服务，存放于<code>/usr/lib/systemd/system</code>目录下：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>/usr/lib/systemd/system/elasticsearch.service</span><span> &lt;&lt;</span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>[Unit]</span></div></div><div><div><div>3</div></div><div><span>Description=Elasticsearch</span></div></div><div><div><div>4</div></div><div><span>Documentation=https://www.elastic.co</span></div></div><div><div><div>5</div></div><div><span>Wants=network-online.target</span></div></div><div><div><div>6</div></div><div><span>After=network-online.target</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>[Service]</span></div></div><div><div><div>9</div></div><div><span>Type=forking</span></div></div><div><div><div>10</div></div><div><span>User=elk</span></div></div><div><div><div>11</div></div><div><span>Group=elk</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>NotifyAccess=all</span></div></div><div><div><div>14</div></div><div><span>RuntimeDirectory=elasticsearch</span></div></div><div><div><div>15</div></div><div><span>PrivateTmp=true</span></div></div><div><div><div>16</div></div><div><span>Environment=ES_HOME=/usr/local/elasticsearch</span></div></div><div><div><div>17</div></div><div><span>Environment=ES_PATH_CONF=/usr/local/elasticsearch/config</span></div></div><div><div><div>18</div></div><div><span>Environment=ES_SD_NOTIFY=true</span></div></div><div><div><div>19</div></div><div><span>WorkingDirectory=/usr/local/elasticsearch</span></div></div><div><div><div>20</div></div><div><span>ExecStart=/usr/local/elasticsearch/bin/elasticsearch -d -p pid</span></div></div><div><div><div>21</div></div><div><span>StandardOutput=journal</span></div></div><div><div><div>22</div></div><div><span>StandardError=inherit</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>LimitNOFILE=65535</span></div></div><div><div><div>25</div></div><div><span>LimitNPROC=4096</span></div></div><div><div><div>26</div></div><div><span>LimitAS=infinity</span></div></div><div><div><div>27</div></div><div><span>LimitFSIZE=infinity</span></div></div><div><div><div>28</div></div><div><span>LimitMEMLOCK=infinity</span></div></div><div><div><div>29</div></div><div><span>TimeoutStopSec=0</span></div></div><div><div><div>30</div></div><div><span>KillSignal=SIGTERM</span></div></div><div><div><div>31</div></div><div><span>KillMode=process</span></div></div><div><div><div>32</div></div><div><span>SendSIGKILL=no</span></div></div><div><div><div>33</div></div><div><span>SuccessExitStatus=143</span></div></div><div><div><div>34</div></div><div><span>TimeoutStartSec=900</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>[Install]</span></div></div><div><div><div>37</div></div><div><span>WantedBy=multi-user.target</span></div></div><div><div><div>38</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 重载配置</span></div></div><div><div><div>2</div></div><div><span>systemctl</span><span> </span><span>daemon-reload</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 启动服务</span></div></div><div><div><div>5</div></div><div><span>systemctl</span><span> </span><span>start</span><span>  </span><span>elasticsearch.service</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>首次启动 Elasticsearch 节点时，它会自动执行以下安全设置：</p><ul>
<li>为传输层和 HTTP 层生成TLS 证书，对应 <code>/usr/local/elasticsearch/config/certs</code> 目录；</li>
<li>将 TLS 配置设置应用于 <code>elasticsearch.yml</code> ，即结尾的内容；</li>
<li>为<code>elastic</code> 超级用户设置密码。</li>
</ul></section><section><h3>2.1.6 设置 elastic 用户密码<a href="#216-设置-elastic-用户密码"><span>#</span></a></h3><p>执行以下命令，为内置的 elastic 用户设置一个密码，这里设置为<code>admin@123</code></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>[root@localhost /usr/local/elasticsearch]# elasticsearch-reset-password -u elastic -i</span></div></div><div><div><div>2</div></div><div><span>warning:</span><span> </span><span>ignoring</span><span> </span><span>JAVA_HOME=/usr/local/java/jdk</span><span>; </span><span>using</span><span> </span><span>bundled</span><span> </span><span>JDK</span></div></div><div><div><div>3</div></div><div><span>This</span><span> </span><span>tool</span><span> </span><span>will</span><span> </span><span>reset</span><span> </span><span>the</span><span> </span><span>password</span><span> </span><span>of</span><span> </span><span>the</span><span> [elastic] user.</span></div></div><div><div><div>4</div></div><div><span>You</span><span> </span><span>will</span><span> </span><span>be</span><span> </span><span>prompted</span><span> </span><span>to</span><span> </span><span>enter</span><span> </span><span>the</span><span> </span><span>password.</span></div></div><div><div><div>5</div></div><div><span>Please</span><span> </span><span>confirm</span><span> </span><span>that</span><span> </span><span>you</span><span> </span><span>would</span><span> </span><span>like</span><span> </span><span>to</span><span> </span><span>continue</span><span> [y/N]y</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>Enter</span><span> </span><span>password</span><span> </span><span>for</span><span> [elastic]:</span></div></div><div><div><div>9</div></div><div><span>Re-enter</span><span> </span><span>password</span><span> </span><span>for</span><span> [elastic]:</span></div></div><div><div><div>10</div></div><div><span>Password</span><span> </span><span>for</span><span> </span><span>the</span><span> [elastic] user successfully reset.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>内置用户：</p>

<table><thead><tr><th>用户名</th><th>作用</th></tr></thead><tbody><tr><td>elastic</td><td>超级用户</td></tr><tr><td>kibana_system</td><td>用于负责Kibana连接Elasticsearch</td></tr><tr><td>logstash_system</td><td>Logstash将监控信息存储在Elasticsearch中时使用</td></tr><tr><td>beats_system</td><td>Beats在Elasticsearch中存储监视信息时使用</td></tr><tr><td>apm_system</td><td>APM服务器在Elasticsearch中存储监视信息时使用</td></tr><tr><td>remote_monitoring_user</td><td>Metricbeat用户在Elasticsearch中收集和存储监视信息时使用</td></tr></tbody></table><p>密码管理：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 设置用户密码</span></div></div><div><div><div>2</div></div><div><span>elasticsearch-setup-passwords</span><span> </span><span>interactive</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 重置密码，随机生成</span></div></div><div><div><div>5</div></div><div><span>elasticsearch-reset-password</span><span> </span><span>-u</span><span> </span><span>elastic</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 重置密码，指定密码</span></div></div><div><div><div>8</div></div><div><span>elasticsearch-reset-password</span><span> </span><span>-u</span><span> </span><span>elastic</span><span> </span><span>-i</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 随机密码</span></div></div><div><div><div>11</div></div><div><span>elasticsearch-setup-passwords</span><span> </span><span>auto</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.1.7 访问ES<a href="#217-访问es"><span>#</span></a></h3><p>浏览器访问 Elasticsearch 平台地址 <code>https://&lt;IP&gt;:9200</code> ，在弹出的窗口中输入用户名为 <code>elastic</code> ，密码为之前设置的 <code>admin@123</code> ，进行登录。登录成功后将出现以下内容：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>{</span></div></div><div><div><div>2</div></div><div><span>  </span><span>"name"</span><span> </span><span>:</span><span> </span><span>"node-1",</span></div></div><div><div><div>3</div></div><div><span>  </span><span>"cluster_name"</span><span> </span><span>:</span><span> </span><span>"es-cluster",</span></div></div><div><div><div>4</div></div><div><span>  </span><span>"cluster_uuid"</span><span> </span><span>:</span><span> </span><span>"h8z6N-qAQD6PYN_kfsvCYg",</span></div></div><div><div><div>5</div></div><div><span>  </span><span>"version"</span><span> </span><span>:</span><span> </span><span>{</span></div></div><div><div><div>6</div></div><div><span>    </span><span>"number"</span><span> </span><span>:</span><span> </span><span>"9.5.2",</span></div></div><div><div><div>7</div></div><div><span>    </span><span>"build_flavor"</span><span> </span><span>:</span><span> </span><span>"default",</span></div></div><div><div><div>8</div></div><div><span>    </span><span>"build_type"</span><span> </span><span>:</span><span> </span><span>"tar",</span></div></div><div><div><div>9</div></div><div><span>    </span><span>"build_hash"</span><span> </span><span>:</span><span> </span><span>"b42549c72e6e040825b13e5d8ebf7ff63886b24d",</span></div></div><div><div><div>10</div></div><div><span>    </span><span>"build_date"</span><span> </span><span>:</span><span> </span><span>"2026-08-18T10:07:58.745010960Z",</span></div></div><div><div><div>11</div></div><div><span>    </span><span>"build_snapshot"</span><span> </span><span>:</span><span> </span><span>false</span><span>,</span></div></div><div><div><div>12</div></div><div><span>    </span><span>"lucene_version"</span><span> </span><span>:</span><span> </span><span>"10.5.1",</span></div></div><div><div><div>13</div></div><div><span>    </span><span>"minimum_wire_compatibility_version"</span><span> </span><span>:</span><span> </span><span>"8.19.0",</span></div></div><div><div><div>14</div></div><div><span>    </span><span>"minimum_index_compatibility_version"</span><span> </span><span>:</span><span> </span><span>"8.0.0"</span></div></div><div><div><div>15</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>16</div></div><div><span>  </span><span>"tagline"</span><span> </span><span>:</span><span> </span><span>"You Know, for Search"</span></div></div><div><div><div>17</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>2.1.8 调用API查看ES<a href="#218-调用api查看es"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 查看内置用户</span></div></div><div><div><div>2</div></div><div><span>curl</span><span> </span><span>-sk</span><span> </span><span>-u</span><span> </span><span>elastic:admin@123</span><span> </span><span>"https://localhost:9200/_security/user"</span><span> | </span><span>jq</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 只提取出所用的用户</span></div></div><div><div><div>5</div></div><div><span>curl</span><span> </span><span>-sk</span><span> </span><span>-u</span><span> </span><span>elastic:admin@123</span><span> </span><span>"https://localhost:9200/_security/user"</span><span> | </span><span>jq</span><span> </span><span>-r</span><span> </span><span>'keys[]'</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 集群状态</span></div></div><div><div><div>8</div></div><div><span>curl</span><span> </span><span>-k</span><span> </span><span>-u</span><span> </span><span>elastic:admin@123</span><span> </span><span>https://localhost:9200/_cluster/health?pretty</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 节点状态</span></div></div><div><div><div>11</div></div><div><span>curl</span><span> </span><span>-k</span><span> </span><span>-u</span><span> </span><span>elastic:admin@123</span><span> </span><span>https://localhost:9200/_nodes/process?pretty</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span># 分片状态</span></div></div><div><div><div>14</div></div><div><span>curl</span><span> </span><span>-k</span><span> </span><span>-u</span><span> </span><span>elastic:admin@123</span><span> </span><span>https://localhost:9200/_cat/shards</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span># 索引分片存储信息</span></div></div><div><div><div>17</div></div><div><span>curl</span><span> </span><span>-k</span><span> </span><span>-u</span><span> </span><span>elastic:admin@123</span><span> </span><span>https://localhost:9200/index/_shard_stores?pretty</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span># 索引状态</span></div></div><div><div><div>20</div></div><div><span>curl</span><span> </span><span>-k</span><span> </span><span>-u</span><span> </span><span>elastic:admin@123</span><span> </span><span>https://localhost:9200/index/_stats?pretty</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span># 索引元数据</span></div></div><div><div><div>23</div></div><div><span>curl</span><span> </span><span>-k</span><span> </span><span>-u</span><span> </span><span>elastic:admin@123</span><span> </span><span>https://localhost:9200/index?pretty</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span># 索引信息</span></div></div><div><div><div>26</div></div><div><span>curl</span><span> </span><span>-k</span><span> </span><span>-u</span><span> </span><span>elastic:admin@123</span><span> </span><span>https://localhost:9200/_cat/indices?v</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span># 节点信息</span></div></div><div><div><div>29</div></div><div><span>curl</span><span> </span><span>-k</span><span> </span><span>-u</span><span> </span><span>elastic:admin@123</span><span> </span><span>https://localhost:9200/_cat/nodes?v</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><hr /></section></section><section><h2>2.2 Kibana部署<a href="#22-kibana部署"><span>#</span></a></h2><blockquote><p>官网地址：<a href="https://www.elastic.co/docs/deploy-manage/deploy/self-managed/install-kibana" target="_blank">https://www.elastic.co/docs/deploy-manage/deploy/self-managed/install-kibana</a></p><p>安装文档：<a href="https://www.elastic.co/docs/deploy-manage/deploy/self-managed/install-kibana-from-archive-on-linux-macos" target="_blank">https://www.elastic.co/docs/deploy-manage/deploy/self-managed/install-kibana-from-archive-on-linux-macos</a></p><p>开源地址：<a href="https://github.com/elastic/kibana/" target="_blank">https://github.com/elastic/kibana/</a></p><p>下载地址：<a href="https://www.elastic.co/cn/downloads/kibana" target="_blank">https://www.elastic.co/cn/downloads/kibana</a></p></blockquote><p>Kibana 是 Elastic Stack（ELK）的<strong>Web 可视化前端组件</strong>，基于 Node.js 开发，专门对接 Elasticsearch，提供浏览器操作 ES 的界面。</p><p>一、核心作用：</p><ol>
<li><strong>日志检索（Discover）</strong>：查看、过滤、搜索 ES 里存储的日志，按时间、关键词、字段排查问题。</li>
<li><strong>数据可视化</strong>：将 ES 数据做成折线图、饼图、表格等图表。</li>
<li><strong>仪表盘 Dashboard</strong>：把多个图表组合成监控大屏，直观展示指标。</li>
<li><strong>开发工具 Dev Tools</strong>：直接执行 ES 的 REST API，调试查询语句。</li>
<li><strong>告警与报告</strong>：根据日志条件触发告警，生成报表。</li>
<li><strong>权限管理</strong>（X‑Pack）：用户、角色控制，限制不同人员访问不同索引。</li>
</ol><p>二、注意点：</p><ul>
<li>本身<strong>不存储数据</strong>，所有数据都来自 Elasticsearch；</li>
<li>需要和 ES 版本严格保持一致，版本不匹配会报错；</li>
<li>常用端口：<strong>5601</strong>；</li>
<li>可以配置索引模式，告诉 Kibana 读取 ES 哪些索引。</li>
</ul><section><h3>2.2.1 下载二进制包并配置环境<a href="#221-下载二进制包并配置环境"><span>#</span></a></h3><p>下载 Kibana 二进制包，并指定解压到 <code>/usr/local</code> 目录下，并重命名为 <code>kibana</code> ：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/usr/local/src/</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>wget</span><span> </span><span>https://artifacts.elastic.co/downloads/kibana/kibana-9.5.2-linux-x86_64.tar.gz</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>tar</span><span> </span><span>-xzf</span><span> </span><span>kibana-9.5.2-linux-x86_64.tar.gz</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>mv</span><span> </span><span>kibana-9.5.2</span><span> </span><span>/usr/local/kibana</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>chown</span><span> </span><span>-R</span><span> </span><span>elk:elk</span><span> </span><span>/usr/local/kibana</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>创建数据目录，并给目录赋权</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/usr/local/elk/data/kibana/{data,logs}</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>chown</span><span> </span><span>-R</span><span> </span><span>elk:elk</span><span> </span><span>/usr/local/elk/data/kibana</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.2.2 Kibana配置文件修改<a href="#222-kibana配置文件修改"><span>#</span></a></h3><p><code>kibana.yml</code>是 Kibana 主要的配置文件，包含了很多参数信息。在 <code>/usr/local/kibana/config</code> 目录下，编辑 <code>kibana.yml</code> 文件，配置以下内容：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 备份原配置文件</span></div></div><div><div><div>2</div></div><div><span>cp</span><span> </span><span>/usr/local/kibana/config/kibana.yml{,.bak}</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 修改新配置文件</span></div></div><div><div><div>5</div></div><div><span>cat</span><span> &gt; </span><span>/usr/local/kibana/config/kibana.yml</span><span> &lt;&lt;</span><span>EOF</span></div></div><div><div><div>6</div></div><div><span># 监听端口</span></div></div><div><div><div>7</div></div><div><span>server.port: 5601</span></div></div><div><div><div>8</div></div><div><span>server.host: "0.0.0.0"</span></div></div><div><div><div>9</div></div><div><span># 指定Kibana在生成URL时使用的基础URL</span></div></div><div><div><div>10</div></div><div><span>server.publicBaseUrl: "http://$(</span><span>hostname</span><span> </span><span>-I</span><span> </span><span>|</span><span> </span><span>awk</span><span> '{print $1}')"</span></div></div><div><div><div>11</div></div><div><span># 指定Kibana数据存储路径</span></div></div><div><div><div>12</div></div><div><span>path.data: /usr/local/elk/data/kibana/data</span></div></div><div><div><div>13</div></div><div><span># 配置Kibana的日志记录设置，指示将日志记录到指定的文件中</span></div></div><div><div><div>14</div></div><div><span>logging.appenders.default:</span></div></div><div><div><div>15</div></div><div><span><span>  </span></span><span>type: file</span></div></div><div><div><div>16</div></div><div><span><span>  </span></span><span>fileName: /usr/local/elk/data/kibana/logs/kibana.log</span></div></div><div><div><div>17</div></div><div><span><span>  </span></span><span>layout:</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>type: json</span></div></div><div><div><div>19</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>2.2.3 配置启动服务并启动<a href="#223-配置启动服务并启动"><span>#</span></a></h3><p>创建一个名为 <code>kibana.service</code> 的 systemd 服务单元文件，用于管理 Kibana 服务，存放于<code>/usr/lib/systemd/system</code>目录下：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>/usr/lib/systemd/system/kibana.service</span><span> &lt;&lt;</span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>[Unit]</span></div></div><div><div><div>3</div></div><div><span>Description=Kibana</span></div></div><div><div><div>4</div></div><div><span>Documentation=https://www.elastic.co</span></div></div><div><div><div>5</div></div><div><span>Wants=network-online.target</span></div></div><div><div><div>6</div></div><div><span>After=network-online.target</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>[Service]</span></div></div><div><div><div>9</div></div><div><span>Type=simple</span></div></div><div><div><div>10</div></div><div><span>User=elk</span></div></div><div><div><div>11</div></div><div><span>Group=elk</span></div></div><div><div><div>12</div></div><div><span>PrivateTmp=true</span></div></div><div><div><div>13</div></div><div><span>Environment=KBN_HOME=/usr/local/kibana</span></div></div><div><div><div>14</div></div><div><span>Environment=KBN_PATH_CONF=/usr/local/kibana/config</span></div></div><div><div><div>15</div></div><div><span>WorkingDirectory=/usr/local/kibana</span></div></div><div><div><div>16</div></div><div><span>ExecStart=/usr/local/kibana/bin/kibana</span></div></div><div><div><div>17</div></div><div><span>StandardOutput=journal</span></div></div><div><div><div>18</div></div><div><span>StandardError=inherit</span></div></div><div><div><div>19</div></div><div><span>Restart=on-failure</span></div></div><div><div><div>20</div></div><div><span>RestartSec=3</span></div></div><div><div><div>21</div></div><div><span>StartLimitBurst=3</span></div></div><div><div><div>22</div></div><div><span>StartLimitInterval=60</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>[Install]</span></div></div><div><div><div>25</div></div><div><span>WantedBy=multi-user.target</span></div></div><div><div><div>26</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 重载配置</span></div></div><div><div><div>2</div></div><div><span>systemctl</span><span> </span><span>daemon-reload</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 启动服务</span></div></div><div><div><div>5</div></div><div><span>systemctl</span><span> </span><span>start</span><span>  </span><span>kibana.service</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.2.4 生成注册令牌并访问Kibana<a href="#224-生成注册令牌并访问kibana"><span>#</span></a></h3><p>ES重新生成新的注册令牌</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># -s参数即 --scope参数，用来指定生成的token用途。</span></div></div><div><div><div>2</div></div><div><span>elasticsearch-create-enrollment-token</span><span> </span><span>-s</span><span> </span><span>kibana</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 输出信息如下</span></div></div><div><div><div>5</div></div><div><span>eyJ2ZXIiOiI4LjE0LjAiLCJhZHIiOlsiMTAuMjIuNTEuOTE6OTIwMCJdLCJmZ3IiOiI3ZmM1ZGMzMmNmMjg4NjA2ZGE5ZWFiNTNmZTU1MDNlZmU4YWU0ZDIzNDBlNzJlMzE4MDY4N2UzYzExY2Q1NGRkIiwia2V5IjoidUNUMVZxQUJmWmJmekptLWpEbXY6UldNYURmQlVxN3hPUF94dXZnUEREdyJ9</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>浏览器访问 Kibana 平台地址 <code>&lt;IP&gt;:5601</code> ，输入生成的注册令牌，然后点击<code>配置Elastic</code></p><p>之后需要在<code>Kibana</code>服务器运行<code>bin\kibana-verification-code</code>获取验证码，然后输入</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>[root@localhost /usr/local/kibana/bin]# ./kibana-verification-code</span></div></div><div><div><div>2</div></div><div><span>Your</span><span> </span><span>verification</span><span> </span><span>code</span><span> </span><span>is:</span><span>  </span><span>568</span><span> </span><span>767</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>在浏览器上配置Kibana完毕后，回到后台，查看 <code>kibana.yml</code> 文件，结尾会自动新增配置。<strong>该配置在后续部署Logstash时会用到</strong></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>[root@localhost /usr/local/kibana/bin]# cat /usr/local/kibana/config/kibana.yml | </span><span>tail</span><span> </span><span>-n5</span></div></div><div><div><div>2</div></div><div><span>elasticsearch.hosts:</span><span> [https://10.22.51.91:9200]</span></div></div><div><div><div>3</div></div><div><span>elasticsearch.serviceAccountToken:</span><span> </span><span>AAEAAWVsYXN0aWMva2liYW5hL2Vucm9sbC1wcm9jZXNzLXRva2VuLTE3ODgxNjU3NTk4NzQ6ZlEzbkZvRG1SQ1dQY1Q1SnFid01EUQ</span></div></div><div><div><div>4</div></div><div><span>elasticsearch.ssl.certificateAuthorities:</span><span> [/usr/local/kibana/data/ca_1788165761022.crt]</span></div></div><div><div><div>5</div></div><div><span>xpack.fleet.outputs:</span><span> [{</span><span>id:</span><span> </span><span>fleet-default-output,</span><span> </span><span>name:</span><span> </span><span>default,</span><span> </span><span>is_default:</span><span> </span><span>true</span><span>,</span><span> </span><span>is_default_monitoring:</span><span> </span><span>true</span><span>,</span><span> </span><span>type:</span><span> </span><span>elasticsearch,</span><span> </span><span>hosts:</span><span> [https://10.22.51.91:9200], ca_trusted_fingerprint: 7fc5dc32cf288606da9eab53fe5503efe8ae4d2340e72e3180687e3c11cd54dd}]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p><strong>Search Autocomplete搜索自动完成设置：</strong></p><ul>
<li><code>elasticsearch.hosts</code>：定义 Kibana 要连接的 Elasticsearch 节点地址。</li>
<li><code>elasticsearch.serviceAccountToken</code>：这是一个 Service Account Token（服务账户令牌），Kibana 启动时用它来认证自己，而不是用用户名/密码。</li>
<li><code>elasticsearch.ssl.certificateAuthorities</code>: 指定 CA 根证书文件路径，Kibana 会用这个证书去验证 Elasticsearch 的 HTTPS 证书，确保连接的是真实可信的 ES 节点，而不是中间人攻击。这个 <code>.crt</code> 文件是 ES 第一次启动时自动生成的，通常会被 Kibana enrollment 过程复制过来。</li>
<li><code>xpack.fleet.outputs</code>：这是 Fleet（Elastic Agent 管理功能） 的输出配置。Kibana 里的 Fleet 需要知道往哪里写数据，这里配置了一个默认的 Elasticsearch 输出。关键字段：</li>
<li><code>id: fleet-default-output</code>：输出 ID。</li>
<li><code>name: default</code>：输出名称。</li>
<li><code>is_default: true</code>：是否作为默认输出。</li>
<li><code>is_default_monitoring: true</code>：是否作为监控默认输出。</li>
<li><code>type: elasticsearch</code>：输出类型是 Elasticsearch。</li>
<li><code>hosts: [https://10.22.51.91:9200]</code>：输出目标 ES 节点。</li>
<li><code>ca_trusted_fingerprint</code>：CA 证书指纹，用来验证 TLS 连接的安全性。</li>
</ul></blockquote></section></section><section><h2>2.3 Logstash部署<a href="#23-logstash部署"><span>#</span></a></h2><blockquote><p>官网地址：<a href="https://www.elastic.co/docs/reference/logstash" target="_blank">https://www.elastic.co/docs/reference/logstash</a></p><p>安装文档：<a href="https://www.elastic.co/docs/reference/logstash/installing-logstash" target="_blank">https://www.elastic.co/docs/reference/logstash/installing-logstash</a></p><p>开源地址：<a href="https://github.com/elastic/logstash" target="_blank">https://github.com/elastic/logstash</a></p><p>下载地址：<a href="https://www.elastic.co/cn/downloads/logstash" target="_blank">https://www.elastic.co/cn/downloads/logstash</a></p></blockquote><p>Logstash 是 Elastic Stack 的<strong>数据处理管道工具</strong>，Java 编写，用来做日志 / 数据的接收、清洗转换、转发输出。</p><p>三大核心模块：</p><ol>
<li><strong>Input 输入</strong>：接收数据源，支持 file、beats、kafka、syslog、tcp 等，获取原始数据。</li>
<li><strong>Filter 过滤（核心）</strong>：数据清洗，切割文本、提取字段、时间格式化、数据过滤、数据脱敏、字段增删改。</li>
<li><strong>Output 输出</strong>：处理完成后输出，最常见输出到 Elasticsearch，也可输出 kafka、文件、redis 等。</li>
</ol><p>特点：</p><ul>
<li>插件生态极其丰富，各类输入、过滤、输出都有插件；</li>
<li><strong>资源消耗较高</strong>，占用 CPU 内存大，生产环境一般集中部署，不装在业务服务器上；</li>
<li>常接收 Filebeat 推送过来的数据，做集中清洗；</li>
<li>自带持久队列，防止宕机丢失数据。</li>
</ul><p>典型定位：</p><ul>
<li>
<p>Filebeat 负责<strong>采集</strong>，Logstash 负责<strong>清洗加工</strong>，加工完交给 Elasticsearch 存储。</p>
</li>
<li>
<p>如果日志已经是规整 JSON 格式，可跳过 Logstash，Filebeat 直接写入 ES，减少组件开销。</p>
</li>
</ul><section><h3>2.3.1 下载二进制包并配置环境<a href="#231-下载二进制包并配置环境"><span>#</span></a></h3><p>下载 Logstash 二进制包，并指定解压到 <code>/usr/local</code> 目录下，并重命名为 <code>logstash</code> ：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/usr/local/src</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>wget</span><span> </span><span>https://artifacts.elastic.co/downloads/logstash/logstash-9.5.2-linux-x86_64.tar.gz</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>tar</span><span> </span><span>-xf</span><span> </span><span>logstash-9.5.2-linux-x86_64.tar.gz</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>mv</span><span> </span><span>logstash-9.5.2</span><span> </span><span>/usr/local/logstash</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>配置环境变量：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>echo</span><span> </span><span>'export PATH=$PATH:/usr/local/logstash/bin'</span><span> &gt; </span><span>/etc/profile.d/logstash.sh</span></div></div><div><div><div>2</div></div><div><span>source</span><span> </span><span>/etc/profile</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>验证版本：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>[root@localhost /root]# logstash -V</span></div></div><div><div><div>2</div></div><div><span>Using</span><span> </span><span>bundled</span><span> </span><span>JDK:</span><span> </span><span>/usr/local/logstash/jdk</span></div></div><div><div><div>3</div></div><div><span>logstash</span><span> </span><span>9.5.2</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.3.2 配置Logstash<a href="#232-配置logstash"><span>#</span></a></h3><p>通过 <code>chown</code> 命令递归地更改 <code>/usr/local/logstash</code> 目录及其所有子目录和文件的所有权，赋予 <code>elk</code> 用户和 <code>elk</code> 组所有权：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>chown</span><span> </span><span>-R</span><span> </span><span>elk:elk</span><span> </span><span>/usr/local/logstash/</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>在<code>/usr/local/elk/data/logstash</code>目录下创建两个目录分别为<code>data</code>和<code>logs</code>，分别存放数据和日志。同时授予权限：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/usr/local/elk/data/logstash/{data,logs}</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>chown</span><span> </span><span>-R</span><span> </span><span>elk:elk</span><span> </span><span>/usr/local/elk/data/logstash</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>复制 Elasticsearch 证书到 Logstash 目录并赋权：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mkdir</span><span> </span><span>/usr/local/logstash/config/certs</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>cp</span><span> </span><span>/usr/local/elasticsearch/config/certs/http_ca.crt</span><span> </span><span>/usr/local/logstash/config/certs</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>chmod</span><span> </span><span>660</span><span> </span><span>/usr/local/logstash/config/certs/http_ca.crt</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>chown</span><span> </span><span>-R</span><span> </span><span>elk:elk</span><span> </span><span>/usr/local/logstash/config/certs</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.3.3 修改logstash配置文件<a href="#233-修改logstash配置文件"><span>#</span></a></h3><p><code>logstash.yml</code> 是 Logstash 主要的配置文件，包含了很多参数信息。在 <code>/usr/local/logstash/config</code> 目录下，编辑 <code>logstash.yml</code> 文件，配置以下内容，其中**【X-Pack Settings】配置**可以从前面配置Kibana时自动生成到配置文件中的最后的内容信息中获取：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 备份原配置文件</span></div></div><div><div><div>2</div></div><div><span>cp</span><span> </span><span>/usr/local/logstash/config/logstash.yml{,.bak}</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 修改新配置文件</span></div></div><div><div><div>5</div></div><div><span>cat</span><span> &gt; </span><span>/usr/local/logstash/config/logstash.yml</span><span> &lt;&lt;</span><span>'EOF'</span></div></div><div><div><div>6</div></div><div><span># 指定 Logstash 用于存储数据的路径</span></div></div><div><div><div>7</div></div><div><span>path.data: /usr/local/elk/data/logstash/data</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>log.level: info</span></div></div><div><div><div>10</div></div><div><span># 指定 Logstash 日志文件的存储路径</span></div></div><div><div><div>11</div></div><div><span>path.logs: /usr/local/elk/data/logstash/logs</span></div></div><div><div><div>12</div></div><div><span># 启用 X-Pack 监控功能，允许 Logstash 发送监控数据到 Elasticsearch</span></div></div><div><div><div>13</div></div><div><span>xpack.monitoring.enabled: true</span></div></div><div><div><div>14</div></div><div><span># 连接 Elasticsearch 的认证信息</span></div></div><div><div><div>15</div></div><div><span>xpack.monitoring.elasticsearch.username: elastic</span></div></div><div><div><div>16</div></div><div><span>xpack.monitoring.elasticsearch.password: admin@123</span></div></div><div><div><div>17</div></div><div><span># 指定用于监控的 Elasticsearch 集群的地址</span></div></div><div><div><div>18</div></div><div><span>xpack.monitoring.elasticsearch.hosts: ["https://localhost:9200"]</span></div></div><div><div><div>19</div></div><div><span># 指定用于验证 Elasticsearch 集群 SSL 连接的 CA 证书路径。</span></div></div><div><div><div>20</div></div><div><span>xpack.monitoring.elasticsearch.ssl.certificate_authority: "/usr/local/logstash/config/certs/http_ca.crt"</span></div></div><div><div><div>21</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>2.3.4 修改startup.options 文件<a href="#234-修改startupoptions-文件"><span>#</span></a></h3><p><code>startup.options</code> 是 Logstash 的一个配置文件，用于定义 Logstash 启动时使用的一些系统级参数和设置。该文件通常用于配置 Logstash 作为系统服务运行时的参数，例如指定 JVM 内存设置、日志路径等。配置完成后，这些选项会被应用于 systemd 或其他服务管理器，以便正确启动和管理 Logstash 服务。</p><p>在 <code>/usr/local/logstash/config</code> 目录下，编辑 <code>startup.options</code> 文件，配置以下内容：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 指定 Logstash 安装的位置</span></div></div><div><div><div>2</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'/LS_HOME=/c LS_HOME=/usr/local/logstash'</span><span> </span><span>/usr/local/logstash/config/startup.options</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 指定 Logstash 配置文件的目录</span></div></div><div><div><div>5</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'/LS_SETTINGS_DIR=/c LS_SETTINGS_DIR=/usr/local/logstash/config'</span><span> </span><span>/usr/local/logstash/config/startup.options</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 指定运行 Logstash 的用户和用户组。</span></div></div><div><div><div>8</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'/LS_USER=/c LS_USER=elk'</span><span> </span><span>/usr/local/logstash/config/startup.options</span></div></div><div><div><div>9</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'/LS_GROUP=/c LS_GROUP=elk'</span><span> </span><span>/usr/local/logstash/config/startup.options</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.3.5 修改pipelines.yml文件<a href="#235-修改pipelinesyml文件"><span>#</span></a></h3><p><code>pipelines.yml</code> 是 Logstash 的一个配置文件，用于定义和管理多个数据处理管道（pipelines）。在 Logstash 中，一个管道包括输入（input）、过滤器（filter）和输出（output）三个部分。<code>pipelines.yml</code> 文件允许在一个 Logstash 实例中运行多个独立的管道，每个管道可以有自己的输入、过滤器和输出配置。</p><p>在 <code>/usr/local/logstash/config</code> 目录下，编辑 <code>pipelines.yml</code> 文件，配置以下内容：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 备份原配置文件</span></div></div><div><div><div>2</div></div><div><span>cp</span><span> </span><span>/usr/local/logstash/config/pipelines.yml{,.bak}</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 修改新配置文件，添加两个管道示例</span></div></div><div><div><div>5</div></div><div><span>cat</span><span> &gt; </span><span>/usr/local/logstash/config/pipelines.yml</span><span> &lt;&lt;</span><span>'EOF'</span></div></div><div><div><div>6</div></div><div><span># pipeline1：处理nginx日志</span></div></div><div><div><div>7</div></div><div><span>- pipeline.id: nginx-log</span></div></div><div><div><div>8</div></div><div><span># 指定管道配置文件的路径。每个管道都有自己的配置文件，包含 input、filter 和 output 的具体配置</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>path.config: "/usr/local/logstash/pipelines/nginx/*.conf"</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>pipeline.workers: 2</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># pipeline2：处理业务应用日志</span></div></div><div><div><div>13</div></div><div><span>- pipeline.id: app-log</span></div></div><div><div><div>14</div></div><div><span># 匹配该目录下所有.conf文件，全部合并成同一个 pipeline</span></div></div><div><div><div>15</div></div><div><span><span>  </span></span><span>path.config: "/usr/local/logstash/pipelines/app/*.conf"</span></div></div><div><div><div>16</div></div><div><span><span>  </span></span><span>pipeline.workers: 4</span></div></div><div><div><div>17</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p><strong>这里先创建了<code>两个管道的基础设置（理解为管道外壳）</code>，还缺少<code>具体的处理流程</code>。在后续第4章节会在<code>/usr/local/logstash/pipelines/nginx/</code>目录下创建包含<code>input、filter、output</code>的处理流程文件</strong></p><blockquote><p><strong>常用参数：</strong></p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>-</span><span> </span><span>pipeline.id:</span><span> </span><span>my-pipeline-1</span><span>          </span><span># 【必选】管道唯一ID，日志里会显示，用于区分不同业务</span></div></div><div><div><div>2</div></div><div><span> </span><span>path.config:</span><span> </span><span>"/etc/logstash/conf.d/p1/*.conf"</span><span> </span><span># 【必选】管道加载的配置文件路径，支持通配符</span></div></div><div><div><div>3</div></div><div><span> </span><span>path.queue:</span><span> </span><span>"/var/lib/logstash/queue/my-p1"</span><span>   </span><span># 持久化队列存储目录，每个pipeline独立队列目录</span></div></div><div><div><div>4</div></div><div><span> </span><span>queue.type:</span><span> </span><span>persisted</span><span>               </span><span># 队列类型：memory(内存，默认) / persisted(磁盘持久队列，宕机不丢消息)</span></div></div><div><div><div>5</div></div><div><span> </span><span>queue.max_bytes:</span><span> </span><span>4gb</span><span>                </span><span># 持久队列最大磁盘占用，达到就阻塞input</span></div></div><div><div><div>6</div></div><div><span> </span><span>queue.checkpoint.writes:</span><span> </span><span>1024</span><span>       </span><span># 每多少条写一次checkpoint磁盘快照</span></div></div><div><div><div>7</div></div><div><span> </span><span>queue.drain:</span><span> </span><span>true</span><span>                   </span><span># 关闭实例时，是否把队列剩余数据消费完成再退出</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span> </span><span>pipeline.workers:</span><span> </span><span>4</span><span>                 </span><span># filter+output 工作线程数，默认CPU核心数</span></div></div><div><div><div>10</div></div><div><span> </span><span>pipeline.batch.size:</span><span> </span><span>125</span><span>            </span><span># 批量大小：每次攒多少条事件交给filter/output处理</span></div></div><div><div><div>11</div></div><div><span> </span><span>pipeline.batch.delay:</span><span> </span><span>50</span><span>            </span><span># 批量等待超时(毫秒)：凑不够batch.size最多等多久就提交</span></div></div><div><div><div>12</div></div><div><span> </span><span>pipeline.ordered:</span><span> </span><span>auto</span><span>              </span><span># 事件顺序：auto(true/false)；开启会降低吞吐量，保证事件原始顺序</span></div></div><div><div><div>13</div></div><div><span> </span><span>pipeline.java_execution:</span><span> </span><span>true</span><span>       </span><span># 使用Java执行引擎(Logstash 8+默认开启)</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span> </span><span>config.reload.automatic:</span><span> </span><span>true</span><span>       </span><span># 是否自动监控配置文件变更，重载pipeline</span></div></div><div><div><div>16</div></div><div><span> </span><span>config.reload.interval:</span><span> </span><span>3s</span><span>          </span><span># 配置文件扫描间隔</span></div></div><div><div><div>17</div></div><div><span> </span><span>config.debug:</span><span> </span><span>false</span><span>                 </span><span># 打印配置调试信息</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span> </span><span>dead_letter_queue.enable:</span><span> </span><span>true</span><span>      </span><span># 开启死信队列DLQ，处理解析失败无法处理的事件</span></div></div><div><div><div>20</div></div><div><span> </span><span>dead_letter_queue.max_bytes:</span><span> </span><span>1gb</span><span>    </span><span># DLQ最大占用磁盘</span></div></div><div><div><div>21</div></div><div><span> </span><span>dead_letter_queue.path:</span><span> </span><span>"/var/lib/logstash/dlq/my-p1"</span><span> </span><span># DLQ存储路径</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></blockquote></section><section><h3>2.3.6 配置启动服务<a href="#236-配置启动服务"><span>#</span></a></h3><p>创建一个名为 <code>logstash.service</code> 的 systemd 服务单元文件，用于管理 Logstash 服务，存放于<code>/usr/lib/systemd/system</code>目录下：</p><p><code>CAP_NET_BIND_SERVICE</code>目的正是使其能够使用 syslog 514 端口（因为1024以下的端口只能root进行监听）</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>/usr/lib/systemd/system/logstash.service</span><span> &lt;&lt;</span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>[Unit]</span></div></div><div><div><div>3</div></div><div><span>Description=logstash</span></div></div><div><div><div>4</div></div><div><span>Documentation=https://www.elastic.co</span></div></div><div><div><div>5</div></div><div><span>Wants=network-online.target</span></div></div><div><div><div>6</div></div><div><span>After=network-online.target</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>[Service]</span></div></div><div><div><div>9</div></div><div><span>Type=simple</span></div></div><div><div><div>10</div></div><div><span>User=elk</span></div></div><div><div><div>11</div></div><div><span>Group=elk</span></div></div><div><div><div>12</div></div><div><span># 授予绑定特权端口的能力</span></div></div><div><div><div>13</div></div><div><span>AmbientCapabilities=CAP_NET_BIND_SERVICE</span></div></div><div><div><div>14</div></div><div><span># 可选，限制进程可用的能力集合（保持一致）</span></div></div><div><div><div>15</div></div><div><span>CapabilityBoundingSet=CAP_NET_BIND_SERVICE</span></div></div><div><div><div>16</div></div><div><span>WorkingDirectory=/usr/local/logstash</span></div></div><div><div><div>17</div></div><div><span>ExecStart=/usr/local/logstash/bin/logstash --path.settings /usr/local/logstash/config/</span></div></div><div><div><div>18</div></div><div><span>Restart=always</span></div></div><div><div><div>19</div></div><div><span>Nice=19</span></div></div><div><div><div>20</div></div><div><span>LimitNOFILE=16384</span></div></div><div><div><div>21</div></div><div><span>TimeoutStopSec=0</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>[Install]</span></div></div><div><div><div>24</div></div><div><span>WantedBy=multi-user.target</span></div></div><div><div><div>25</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 重载配置</span></div></div><div><div><div>2</div></div><div><span>systemctl</span><span> </span><span>daemon-reload</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 启动服务</span></div></div><div><div><div>5</div></div><div><span>systemctl</span><span> </span><span>start</span><span>  </span><span>logstash.service</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>2.4 Beats 组件<a href="#24-beats-组件"><span>#</span></a></h2><blockquote><p>官网地址：<a href="https://www.elastic.co/docs/reference/beats/filebeat" target="_blank">https://www.elastic.co/docs/reference/beats/filebeat</a></p><p>安装文档：<a href="https://www.elastic.co/docs/reference/beats/filebeat/running-with-systemd" target="_blank">https://www.elastic.co/docs/reference/beats/filebeat/running-with-systemd</a></p><p>开源地址：<a href="https://github.com/elastic/beats/blob/master/filebeat/README.md" target="_blank">https://github.com/elastic/beats/blob/master/filebeat/README.md</a></p><p>下载地址：<a href="https://www.elastic.co/cn/downloads/beats" target="_blank">https://www.elastic.co/cn/downloads/beats</a></p></blockquote><p>Beats 是 Elastic Stack 提供的<strong>一系列轻量级数据采集器</strong>，用 Go 语言开发，体积小、资源占用低，部署在业务主机上做数据采集，采集后可输出给 Logstash、Elasticsearch、Kafka。</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260901105004889.png" alt="image-20260901105004889" /><figcaption>image-20260901105004889</figcaption></figure><p></p><ol>
<li><strong>Filebeat</strong> 日志文件采集器，最常用。读取服务器磁盘上的日志文件（nginx、应用程序日志），支持断点续传，日志滚动。</li>
<li><strong>Metricbeat</strong> 指标采集器。采集系统指标（CPU、内存、磁盘、网络），也可以采集中间件指标，MySQL、Nginx、Redis 等服务运行指标。</li>
<li><strong>Packetbeat</strong> 网络数据包采集器。抓包分析网络流量，解析 TCP/UDP 等协议，统计网络请求、延时、访问情况。</li>
<li><strong>Winlogbeat</strong> Windows 专属采集器。专门读取 Windows 系统事件日志，系统安全日志、应用事件日志。</li>
<li><strong>Auditbeat</strong> 审计采集器。收集 Linux 系统审计信息，监控文件改动、用户操作行为，用于安全审计。</li>
<li><strong>Heartbeat</strong> 状态探测采集器。主动探测服务可用性，检测端口、HTTP 接口是否存活，做服务可用性监控。</li>
</ol><section><h3>2.4.1 FileBeat部署<a href="#241-filebeat部署"><span>#</span></a></h3><p>下载 Filebeat 二进制包，并指定解压到 <code>/usr/local</code> 目录下，并重命名为 <code>filebeat</code> ：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/usr/local/src</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>wget</span><span> </span><span>https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-9.5.2-linux-x86_64.tar.gz</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>tar</span><span> </span><span>-xf</span><span> </span><span>filebeat-9.5.2-linux-x86_64.tar.gz</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>mv</span><span> </span><span>filebeat-9.5.2-linux-x86_64</span><span> </span><span>/usr/local/filebeat</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>创建数据目录：在 <code>usr/local/elk/data/filebeat</code> 目录下创建两个目录分别为 <code>data</code> 和 <code>logs</code> ，分别存放数据和日志：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/usr/local/elk/data/filebeat/{data,logs}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.4.2 修改FileBeat配置文件<a href="#242-修改filebeat配置文件"><span>#</span></a></h3><p><code>filebeat.yml</code> 是 Filebeat 主要的配置文件，包含了很多参数信息。在 <code>/usr/local/filebeat</code> 目录下，编辑 <code>filebeat.yml</code> 文件，配置以下内容：（<strong>这里配置采集的数据直接发给ES，不经过Logstash</strong>）</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 备份原配置文件</span></div></div><div><div><div>2</div></div><div><span>cp</span><span> </span><span>/usr/local/filebeat/filebeat.yml{,.bak}</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 修改新配置文件</span></div></div><div><div><div>5</div></div><div><span>cat</span><span> &gt; </span><span>/usr/local/filebeat/filebeat_es.yml</span><span> &lt;&lt;</span><span>'EOF'</span></div></div><div><div><div>6</div></div><div><span># ============================== 1. 输入源配置 (Inputs) ==============================</span></div></div><div><div><div>7</div></div><div><span># 定义 Filebeat 需要采集的日志来源</span></div></div><div><div><div>8</div></div><div><span>filebeat.inputs:</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>- type: filestream          # 采集类型：推荐使用 filestream，它比旧版的 log 类型更稳定，能更好地处理日志轮转</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>id: my-messages-log       # 唯一标识符：为当前输入源分配一个固定的 ID，确保重启后能准确追踪读取进度</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>enabled: true             # 启用状态：设置为 true 表示开启此采集规则</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>paths:                    # 采集路径：指定要读取的日志文件或目录（支持通配符）</span></div></div><div><div><div>13</div></div><div><span><span>      </span></span><span>- /var/log/messages     # 此处指定采集 Linux 系统的 messages 日志</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span># ============================== 2. 索引模板配置 (Template) ==============================</span></div></div><div><div><div>16</div></div><div><span>setup.template.name: "my-log"         # 模板名称：在 Elasticsearch 中创建的索引模板的名称</span></div></div><div><div><div>17</div></div><div><span>setup.template.pattern: "my-log-*"    # 模板匹配模式：指定该模板应用于哪些索引（通常与自定义索引前缀对应）</span></div></div><div><div><div>18</div></div><div><span>setup.ilm.enabled: false              # 关闭 ILM（索引生命周期管理）：防止 ES 自动接管索引命名，确保下方的自定义索引名生效</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span># ============================== 3. 模块配置 (Modules) ==============================</span></div></div><div><div><div>21</div></div><div><span># 控制 Filebeat 预置模块的加载行为</span></div></div><div><div><div>22</div></div><div><span>filebeat.config.modules:</span></div></div><div><div><div>23</div></div><div><span><span>  </span></span><span>path: ${path.config}/modules.d/*.yml  # 模块配置路径：指定预置模块配置文件所在的目录</span></div></div><div><div><div>24</div></div><div><span><span>  </span></span><span>reload.enabled: false                 # 动态重载：设置为 false 表示不自动检测模块配置的变更，需重启生效</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span># ============================== 4. 输出配置 (Output) ==============================</span></div></div><div><div><div>27</div></div><div><span># 定义采集到的日志数据最终发送到的目的地</span></div></div><div><div><div>28</div></div><div><span>output.elasticsearch:</span></div></div><div><div><div>29</div></div><div><span><span>  </span></span><span>hosts: ["https://localhost:9200"]             # ES 集群地址：Elasticsearch 节点的 IP 和端口</span></div></div><div><div><div>30</div></div><div><span><span>  </span></span><span>index: "test-%{+yyyy.MM.dd}"          # 自定义索引名：按天生成索引，例如 test-2026.09.01</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span><span>  </span></span><span># --- SSL/TLS 加密与认证配置 ---</span></div></div><div><div><div>33</div></div><div><span><span>  </span></span><span>ssl.verification_mode: none           # 证书验证模式：none 表示不验证服务端证书（适用于自签名证书环境）</span></div></div><div><div><div>34</div></div><div><span><span>  </span></span><span>ssl.certificate_authorities:          # CA 证书路径：指定用于验证 ES 服务端证书的根证书文件路径</span></div></div><div><div><div>35</div></div><div><span><span>    </span></span><span>- "/usr/local/elasticsearch/config/certs/http_ca.crt"</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span><span>  </span></span><span># --- 访问凭证 ---</span></div></div><div><div><div>38</div></div><div><span><span>  </span></span><span>username: "elastic"                   # 认证用户名：连接 Elasticsearch 所需的账号</span></div></div><div><div><div>39</div></div><div><span><span>  </span></span><span>password: "admin@123"                   # 认证密码：连接 Elasticsearch 所需的密码（️ 生产环境建议使用 Keystore 加密）</span></div></div><div><div><div>40</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><p><strong>默认模板简化</strong>：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># ====================== 输入源配置 ======================</span></div></div><div><div><div>2</div></div><div><span>filebeat.inputs:</span></div></div><div><div><div>3</div></div><div><span> </span><span># 文件流输入：采集本地日志文件</span></div></div><div><div><div>4</div></div><div><span> </span><span>-</span><span> </span><span>type:</span><span> </span><span>filestream</span></div></div><div><div><div>5</div></div><div><span>   </span><span>id:</span><span> </span><span>my-filestream-id</span><span>                 </span><span># 输入项唯一ID</span></div></div><div><div><div>6</div></div><div><span>   </span><span>enabled:</span><span> </span><span>false</span><span>                       </span><span># 是否启用该输入</span></div></div><div><div><div>7</div></div><div><span>   </span><span>paths:</span><span>                               </span><span># 待采集日志路径，支持通配符</span></div></div><div><div><div>8</div></div><div><span>     </span><span>-</span><span> </span><span>/var/log/</span><span>*</span><span>.log</span></div></div><div><div><div>9</div></div><div><span>   </span><span>#exclude_lines: ['^DBG']             # 排除匹配正则的日志行</span></div></div><div><div><div>10</div></div><div><span>   </span><span>#include_lines: ['^ERR', '^WARN']    # 只采集匹配正则的日志行</span></div></div><div><div><div>11</div></div><div><span>   </span><span>#prospector.scanner.exclude_files: ['.gz$']  # 排除匹配的文件</span></div></div><div><div><div>12</div></div><div><span>   </span><span>#fields:                             # 自定义附加字段</span></div></div><div><div><div>13</div></div><div><span>   </span><span>#  level: debug</span></div></div><div><div><div>14</div></div><div><span>   </span><span>#  review: 1</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span> </span><span># journald输入：采集系统journald日志</span></div></div><div><div><div>17</div></div><div><span> </span><span>#- type: journald</span></div></div><div><div><div>18</div></div><div><span> </span><span>#  id: my-journald-id                  # 输入项唯一ID</span></div></div><div><div><div>19</div></div><div><span> </span><span>#  seek: head                          # 读取起始位置：head开头/tail尾部/since指定时间</span></div></div><div><div><div>20</div></div><div><span> </span><span>#  since: -24h                         # 起始时间偏移（seek=since时生效）</span></div></div><div><div><div>21</div></div><div><span> </span><span>#  units:                              # 指定采集的systemd服务</span></div></div><div><div><div>22</div></div><div><span> </span><span>#    - docker.service</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span># ====================== 模块配置 ======================</span></div></div><div><div><div>25</div></div><div><span>filebeat.config.modules:</span></div></div><div><div><div>26</div></div><div><span> </span><span>path:</span><span> </span><span><span>${</span><span>path</span></span><span>.</span><span><span>config</span><span>}</span></span><span>/modules.d/</span><span>*</span><span>.yml</span><span>   </span><span># 模块配置文件路径</span></div></div><div><div><div>27</div></div><div><span> </span><span>reload.enabled:</span><span> </span><span>false</span><span>                  </span><span># 是否开启配置热重载</span></div></div><div><div><div>28</div></div><div><span> </span><span>#reload.period: 10s                    # 配置文件检查周期</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span># ====================== ES索引模板 ======================</span></div></div><div><div><div>31</div></div><div><span>setup.template.settings:</span></div></div><div><div><div>32</div></div><div><span> </span><span>index.number_of_shards:</span><span> </span><span>1</span><span>              </span><span># 索引分片数量</span></div></div><div><div><div>33</div></div><div><span> </span><span>#index.codec: best_compression         # 索引压缩编码</span></div></div><div><div><div>34</div></div><div><span> </span><span>#_source.enabled: false                # 是否关闭_source字段存储</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span># ====================== 通用配置 ======================</span></div></div><div><div><div>37</div></div><div><span>#name:                                  # 采集器标识名称</span></div></div><div><div><div>38</div></div><div><span>#tags: ["service-X", "web-tier"]        # 全局标签，用于分类过滤</span></div></div><div><div><div>39</div></div><div><span>#fields:                                # 全局附加字段</span></div></div><div><div><div>40</div></div><div><span>#  env: staging</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span># ====================== Kibana配置 ======================</span></div></div><div><div><div>43</div></div><div><span>setup.kibana:</span></div></div><div><div><div>44</div></div><div><span> </span><span>#host: "localhost:5601"               # Kibana服务地址</span></div></div><div><div><div>45</div></div><div><span> </span><span>#space.id:                             # Kibana空间ID</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span># ====================== Elastic Cloud ======================</span></div></div><div><div><div>48</div></div><div><span>#cloud.id:                              # Cloud实例ID，覆盖ES/Kibana地址</span></div></div><div><div><div>49</div></div><div><span>#cloud.auth:                            # Cloud认证，格式 user:pass</span></div></div><div><div><div>50</div></div><div>
</div></div><div><div><div>51</div></div><div><span># ====================== 输出配置 ======================</span></div></div><div><div><div>52</div></div><div><span># Elasticsearch输出</span></div></div><div><div><div>53</div></div><div><span>output.elasticsearch:</span></div></div><div><div><div>54</div></div><div><span> </span><span>hosts:</span><span> [</span><span>"localhost:9200"</span><span>]              </span><span># ES节点地址列表</span></div></div><div><div><div>55</div></div><div><span> </span><span>preset:</span><span> </span><span>balanced</span><span>                       </span><span># 性能预设：balanced/throughput/scale/latency/custom</span></div></div><div><div><div>56</div></div><div><span> </span><span>#protocol: "https"                     # 通信协议</span></div></div><div><div><div>57</div></div><div><span> </span><span>#api_key: "id:api_key"                 # API密钥认证</span></div></div><div><div><div>58</div></div><div><span> </span><span>#username: "elastic"                   # 用户名认证</span></div></div><div><div><div>59</div></div><div><span> </span><span>#password: "changeme"                  # 密码认证</span></div></div><div><div><div>60</div></div><div>
</div></div><div><div><div>61</div></div><div><span># Logstash输出</span></div></div><div><div><div>62</div></div><div><span>#output.logstash:</span></div></div><div><div><div>63</div></div><div><span>#  hosts: ["localhost:5044"]            # Logstash地址列表</span></div></div><div><div><div>64</div></div><div><span>#  ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]  # CA根证书</span></div></div><div><div><div>65</div></div><div><span>#  ssl.certificate: "/etc/pki/client/cert.pem"            # 客户端证书</span></div></div><div><div><div>66</div></div><div><span>#  ssl.key: "/etc/pki/client/cert.key"                    # 客户端私钥</span></div></div><div><div><div>67</div></div><div>
</div></div><div><div><div>68</div></div><div><span># ====================== 数据处理器 ======================</span></div></div><div><div><div>69</div></div><div><span>processors:</span></div></div><div><div><div>70</div></div><div><span> </span><span>-</span><span> </span><span>add_host_metadata:</span></div></div><div><div><div>71</div></div><div><span>     </span><span>when.not.contains.tags:</span><span> </span><span>forwarded</span><span>  </span><span># 无forward标签时添加主机元数据</span></div></div><div><div><div>72</div></div><div><span> </span><span>-</span><span> </span><span>add_cloud_metadata:</span><span> </span><span>~</span><span>                </span><span># 添加云环境元数据</span></div></div><div><div><div>73</div></div><div><span> </span><span>-</span><span> </span><span>add_docker_metadata:</span><span> </span><span>~</span><span>               </span><span># 添加Docker容器元数据</span></div></div><div><div><div>74</div></div><div><span> </span><span>-</span><span> </span><span>add_kubernetes_metadata:</span><span> </span><span>~</span><span>           </span><span># 添加K8s元数据</span></div></div><div><div><div>75</div></div><div>
</div></div><div><div><div>76</div></div><div><span># ====================== 自身日志 ======================</span></div></div><div><div><div>77</div></div><div><span>#logging.level: debug                   # 日志级别：error/warning/info/debug</span></div></div><div><div><div>78</div></div><div><span>#logging.selectors: ["*"]               # 启用日志的组件</span></div></div><div><div><div>79</div></div><div>
</div></div><div><div><div>80</div></div><div><span># ====================== X-Pack监控 ======================</span></div></div><div><div><div>81</div></div><div><span>#monitoring.enabled: false              # 是否开启监控上报</span></div></div><div><div><div>82</div></div><div><span>#monitoring.cluster_uuid:               # 监控集群UUID</span></div></div><div><div><div>83</div></div><div><span>#monitoring.elasticsearch:              # 监控专用ES集群配置</span></div></div><div><div><div>84</div></div><div>
</div></div><div><div><div>85</div></div><div><span># ====================== 链路追踪 ======================</span></div></div><div><div><div>86</div></div><div><span>#instrumentation:</span></div></div><div><div><div>87</div></div><div><span>#  enabled: false                        # 是否启用APM埋点</span></div></div><div><div><div>88</div></div><div><span>#  environment: ""                       # 运行环境</span></div></div><div><div><div>89</div></div><div><span>#  hosts:                                # APM Server地址</span></div></div><div><div><div>90</div></div><div><span>#    - http://localhost:8200</span></div></div><div><div><div>91</div></div><div><span>#  api_key:                              # APM API密钥</span></div></div><div><div><div>92</div></div><div><span>#  secret_token:                         # APM密钥令牌</span></div></div><div><div><div>93</div></div><div>
</div></div><div><div><div>94</div></div><div><span># ====================== 版本迁移 ======================</span></div></div><div><div><div>95</div></div><div><span>#migration.6_to_7.enabled: true         # 启用6.x到7.x迁移别名</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></blockquote></section><section><h3>2.4.3 配置测试<a href="#243-配置测试"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 测试配置文件语法是否正确</span></div></div><div><div><div>2</div></div><div><span>[root@localhost /]# /usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml test config</span></div></div><div><div><div>3</div></div><div><span>Config</span><span> </span><span>OK</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 测试能否连通 Elasticsearch</span></div></div><div><div><div>6</div></div><div><span>[root@localhost /]# /usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml test output</span></div></div><div><div><div>7</div></div><div><span>elasticsearch:</span><span> </span><span>https://localhost:9200...</span></div></div><div><div><div>8</div></div><div><span>  </span><span>parse</span><span> </span><span>url...</span><span> </span><span>OK</span></div></div><div><div><div>9</div></div><div><span>  </span><span>connection...</span></div></div><div><div><div>10</div></div><div><span>    </span><span>parse</span><span> </span><span>host...</span><span> </span><span>OK</span></div></div><div><div><div>11</div></div><div><span>    </span><span>dns</span><span> </span><span>lookup...</span><span> </span><span>OK</span></div></div><div><div><div>12</div></div><div><span>    </span><span>addresses:</span><span> </span><span>127.0.0.1,</span><span> </span><span>127.0.1.1,</span><span> </span><span>::1</span></div></div><div><div><div>13</div></div><div><span>    </span><span>dial</span><span> </span><span>up...</span><span> </span><span>OK</span></div></div><div><div><div>14</div></div><div><span>  </span><span>TLS...</span></div></div><div><div><div>15</div></div><div><span>    </span><span>security...</span><span> </span><span>WARN</span><span> </span><span>server's certificate chain verification is disabled</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>handshake... OK</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>TLS version: TLSv1.3</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>dial up... OK</span></div></div><div><div><div>19</div></div><div><span><span>  </span></span><span>talk to server... OK</span></div></div><div><div><div>20</div></div><div><span><span>  </span></span><span>version: 9.5.2</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span># 前台运行查看实时日志（确认没有报错）</span></div></div><div><div><div>23</div></div><div><span>/usr/local/filebeat/filebeat -e -c /usr/local/filebeat/filebeat.yml</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>2.4.4 配置启动服务<a href="#244-配置启动服务"><span>#</span></a></h3><p>创建一个名为 <code>filebeat.service</code> 的 systemd 服务单元文件，用于管理 Filebeat 服务，存放于<code>/usr/lib/systemd/system</code>目录下：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>/usr/lib/systemd/system/filebeat.service</span><span> &lt;&lt;</span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>[Unit]</span></div></div><div><div><div>3</div></div><div><span>Description=Filebeat sends log files to Logstash or directly to Elasticsearch.</span></div></div><div><div><div>4</div></div><div><span>Documentation=https://www.elastic.co/beats/filebeat</span></div></div><div><div><div>5</div></div><div><span>Wants=network-online.target</span></div></div><div><div><div>6</div></div><div><span>After=network-online.target</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>[Service]</span></div></div><div><div><div>9</div></div><div><span>UMask=0027</span></div></div><div><div><div>10</div></div><div><span>Environment="GODEBUG='madvdontneed=1'"</span></div></div><div><div><div>11</div></div><div><span>Environment="BEAT_LOG_OPTS="</span></div></div><div><div><div>12</div></div><div><span>Environment="BEAT_CONFIG_OPTS=-c /usr/local/filebeat/filebeat.yml"</span></div></div><div><div><div>13</div></div><div><span>Environment="BEAT_PATH_OPTS=--path.home /usr/local/filebeat --path.config /usr/local/filebeat --path.data /usr/local/elk/data/filebeat/data --path.logs /usr/local/elk/data/filebeat/logs"</span></div></div><div><div><div>14</div></div><div><span>ExecStart=/usr/local/filebeat/filebeat --environment systemd $BEAT_LOG_OPTS $BEAT_CONFIG_OPTS $BEAT_PATH_OPTS</span></div></div><div><div><div>15</div></div><div><span>Restart=always</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>[Install]</span></div></div><div><div><div>18</div></div><div><span>WantedBy=multi-user.target</span></div></div><div><div><div>19</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 重载配置</span></div></div><div><div><div>2</div></div><div><span>systemctl</span><span> </span><span>daemon-reload</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 启动服务</span></div></div><div><div><div>5</div></div><div><span>systemctl</span><span> </span><span>start</span><span> </span><span>filebeat.service</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section></section></section>
<section><h1>三、Kibana组件使用<a href="#三kibana组件使用"><span>#</span></a></h1><blockquote><p><strong>官方中文文档：</strong><a href="https://www.elastic.co/guide/cn/kibana/current/index.html" target="_blank">Kibana 用户手册 | Elastic</a></p></blockquote><section><h2>3.1添加数据视图<a href="#31添加数据视图"><span>#</span></a></h2><p>由于之前部署Beats组件时<code>将采集的数据发送到ES</code>，且在配置中自定义了索引名称（<code>test-%{+yyyy.MM.dd}</code>），Kibana 默认不会自动显示它。</p><section><h3>3.1.1 确认数据已成功写入ES<a href="#311-确认数据已成功写入es"><span>#</span></a></h3><p>在去 Kibana 之前，建议先在终端确认数据确实已经写进去了：</p><p>能看到类似 <code>test-2026.09.01</code> 的索引，说明数据已成功写入</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 先写入数据</span></div></div><div><div><div>2</div></div><div><span>echo</span><span> </span><span>"你好世界"</span><span> &gt;&gt; </span><span>/var/log/messages</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 检查是否存在以 test- 开头的索引</span></div></div><div><div><div>5</div></div><div><span>curl</span><span> </span><span>-k</span><span> </span><span>-u</span><span> </span><span>elastic:sunline</span><span> </span><span>https://localhost:9200/_cat/indices?v</span><span> | </span><span>grep</span><span> </span><span>test-</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 结果如下：</span></div></div><div><div><div>8</div></div><div><span>[root@localhost /root]# curl -k -u elastic:admin@123  https://localhost:9200/_cat/indices?v | </span><span>grep</span><span> </span><span>test-</span></div></div><div><div><div>9</div></div><div><span>  </span><span>%</span><span> </span><span>Total</span><span>    </span><span>%</span><span> </span><span>Received</span><span> </span><span>%</span><span> </span><span>Xferd</span><span>  </span><span>Average</span><span> </span><span>Speed</span><span>   </span><span>Time</span><span>    </span><span>Time</span><span>     </span><span>Time</span><span>  </span><span>Current</span></div></div><div><div><div>10</div></div><div><span>                                 </span><span>Dload</span><span>  </span><span>Upload</span><span>   </span><span>Total</span><span>   </span><span>Spent</span><span>    </span><span>Left</span><span>  </span><span>Speed</span></div></div><div><div><div>11</div></div><div><span>100</span><span>   </span><span>780</span><span>    </span><span>0</span><span>   </span><span>780</span><span>    </span><span>0</span><span>     </span><span>0</span><span>  </span><span>13088</span><span>      </span><span>0</span><span> </span><span>--:--:--</span><span> </span><span>--:--:--</span><span> </span><span>--:--:--</span><span> </span><span>13220</span></div></div><div><div><div>12</div></div><div><span>yellow</span><span> </span><span>open</span><span>   </span><span>test-2026.09.01</span><span>                                 </span><span>sBBj_X_ISgm0HELW1Wl6XQ</span><span>   </span><span>1</span><span>   </span><span>1</span><span>          </span><span>7</span><span>            </span><span>0</span><span>     </span><span>56.4kb</span><span>         </span><span>56.4kb</span><span>       </span><span>56.4kb</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>3.1.2 在Kibana中创建数据视图<a href="#312-在kibana中创建数据视图"><span>#</span></a></h3><ol>
<li>
<p>打开浏览器，访问 Kibana 界面（默认地址：<code>https://&lt;Kibana服务器IP&gt;:5601</code>），使用 <code>elastic/admin@123</code> 登录。</p>
</li>
<li>
<p>在左侧菜单栏，向下滚动找到 <strong>Management</strong>点击进入</p>
<p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260901155359207.png" alt="image-20260901155359207" /><figcaption>image-20260901155359207</figcaption></figure><p></p>
</li>
<li>
<p>进入后找到<code>Kibana</code>下的<strong>数据视图</strong>点击，进入后选择<strong>创建数据视图</strong></p>
<p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260901155505367.png" alt="image-20260901155505367" /><figcaption>image-20260901155505367</figcaption></figure><p></p>
</li>
<li>
<p><code>索引模式</code>填入**test-***与Filebeat 配置中的 <code>test-%{+yyyy.MM.dd}</code> 相匹配，点击保存</p>
<p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260901155703959.png" alt="image-20260901155703959" /><figcaption>image-20260901155703959</figcaption></figure><p></p>
</li>
<li>
<p>可以看到监控的一些字段数据</p>
<p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260901161840335.png" alt="image-20260901161840335" /><figcaption>image-20260901161840335</figcaption></figure><p></p>
</li>
</ol></section></section><section><h2>3.2 使用Discover模块查看数据<a href="#32-使用discover模块查看数据"><span>#</span></a></h2><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260901164129653.png" alt="image-20260901164129653" /><figcaption>image-20260901164129653</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260901163954607.png" alt="image-20260901163954607" /><figcaption>image-20260901163954607</figcaption></figure><p></p></section><section><h2>3.3 创建可视化图表<a href="#33-创建可视化图表"><span>#</span></a></h2><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260901164147147.png" alt="image-20260901164147147" /><figcaption>image-20260901164147147</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260901170213691.png" alt="image-20260901170213691" /><figcaption>image-20260901170213691</figcaption></figure><p></p><p>可以添加<code>图层</code></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260901170546536.png" alt="image-20260901170546536" /><figcaption>image-20260901170546536</figcaption></figure><p></p><p>最后点击<code>保存并添加到库中</code></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260901171634120.png" alt="image-20260901171634120" /><figcaption>image-20260901171634120</figcaption></figure><p></p></section><section><h2>3.4 创建仪表盘<a href="#34-创建仪表盘"><span>#</span></a></h2><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260901173203536.png" alt="image-20260901173203536" /><figcaption>image-20260901173203536</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260901173254285.png" alt="image-20260901173254285" /><figcaption>image-20260901173254285</figcaption></figure><p></p><p>可选择<code>新建、或者使用库中的图标</code></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260901173341737.png" alt="image-20260901173341737" /><figcaption>image-20260901173341737</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260901173503647.png" alt="image-20260901173503647" /><figcaption>image-20260901173503647</figcaption></figure><p></p><p><strong>最后的效果：</strong></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260901173522414.png" alt="image-20260901173522414" /><figcaption>image-20260901173522414</figcaption></figure><p></p><hr /></section></section>
<section><h1>四、Logstash组件使用<a href="#四logstash组件使用"><span>#</span></a></h1><p>这里使用一个案例来阐述Logstash组件的基本使用：监控nginx的日志文件，这次<code>Filebeat</code>的链路走向不直接对接<code>ES</code>，而是先交给<code>Logstash</code>进行过滤清洗，然后再交给<code>ES</code>。整个链路走向为 <strong>Filebeat → Logstash → Elasticsearch</strong> 。最后在 <strong>Kibana</strong> 中完成可视化</p><section><h2>4.1 配置 Logstash<a href="#41-配置-logstash"><span>#</span></a></h2><p>Logstash 负责接收 Filebeat 的数据，解析 Nginx 日志格式，然后写入 ES。</p><ol>
<li>
<p>在 Logstash 的配置目录下创建或修改配置文件。（<strong>根据2.3的管道示例，这里需要在<code>/usr/local/logstash/pipelines/nginx</code>目录下创建配置文件</strong>）</p>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 创建目录</span></div></div><div><div><div>2</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/usr/local/logstash/pipelines/nginx/</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>配置 Input 接收 Filebeat 数据，Filter 解析日志，Output 写入 ES：</p>
</li>
</ol><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>/usr/local/logstash/pipelines/nginx/nginx-log.conf</span><span> </span><span>&lt;</span><span>&lt; </span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>input</span><span> </span><span>{</span></div></div><div><div><div>3</div></div><div><span>  </span><span>beats</span><span> </span><span>{</span></div></div><div><div><div>4</div></div><div><span>    </span><span>port</span><span> </span><span>=&gt;</span><span> </span><span>5044</span><span> </span><span># 监听端口，需与 Filebeat 配置一致</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>filter</span><span> </span><span>{</span></div></div><div><div><div>9</div></div><div><span>  </span><span># 使用 Grok 插件解析非结构化的 Nginx 访问日志</span></div></div><div><div><div>10</div></div><div><span>  </span><span>grok</span><span> </span><span>{</span></div></div><div><div><div>11</div></div><div><span>    </span><span>match</span><span> =&gt; </span><span>{</span></div></div><div><div><div>12</div></div><div><span>      </span><span>"message"</span><span> =&gt; </span><span>'%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer}) %{QS:agent}'</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span>    </span><span>break_on_match</span><span> =&gt; </span><span>false</span></div></div><div><div><div>15</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>output</span><span> </span><span>{</span></div></div><div><div><div>19</div></div><div><span>  </span><span>elasticsearch</span><span> </span><span>{</span></div></div><div><div><div>20</div></div><div><span>    </span><span>hosts</span><span> =&gt; [</span><span>"https://localhost:9200"</span><span>] </span><span>#  ES 地址</span></div></div><div><div><div>21</div></div><div><span>    </span><span>index</span><span> =&gt; </span><span>"nginx-logs-%{+YYYY.MM.dd}"</span><span> </span><span># 按天生成索引</span></div></div><div><div><div>22</div></div><div><span>    </span><span># 如果 ES 开启了安全认证，需加上用户名和密码</span></div></div><div><div><div>23</div></div><div><span>    </span><span>user</span><span> =&gt; </span><span>"elastic"</span></div></div><div><div><div>24</div></div><div><span>    </span><span>password</span><span> =&gt; </span><span>"admin@123"</span></div></div><div><div><div>25</div></div><div><span>    </span><span>ssl_verification_mode</span><span> =&gt; </span><span>"none"</span><span>    </span><span># 不验证证书</span></div></div><div><div><div>26</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span>}</span></div></div><div><div><div>28</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 修改用户所有权</span></div></div><div><div><div>2</div></div><div><span>chown</span><span> </span><span>-R</span><span> </span><span>elk:elk</span><span> </span><span>/usr/local/logstash</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 重启</span></div></div><div><div><div>5</div></div><div><span>systemctl</span><span> </span><span>restart</span><span> </span><span>logstash.service</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 查看5044端口是否开启监听</span></div></div><div><div><div>8</div></div><div><span>netstat</span><span> </span><span>-tunlp</span><span> | </span><span>grep</span><span> </span><span>5044</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>4.2 配置 Filebeat<a href="#42-配置-filebeat"><span>#</span></a></h2><p>Filebeat 部署在 Nginx 所在的服务器，负责实时采集日志并推送到 Logstash。</p><ol>
<li>
<p>修改 Filebeat 的配置文件 <code>filebeat.yml</code>。</p>
</li>
<li>
<p>配置输入源（Nginx 日志路径）和输出目标（Logstash）：</p>
<p><strong>因在2.4.2配置过一个将采集的日志直接发送到ES，这里直接去掉，保留的话可以查看后面的另一个流程</strong></p>
</li>
</ol><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 备份之前的文件</span></div></div><div><div><div>2</div></div><div><span>cp</span><span> </span><span>/usr/local/filebeat/filebeat.yml{,.bak.bak}</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># ============================== 1. 输入源配置 (Inputs) ==============================</span></div></div><div><div><div>5</div></div><div><span># 定义 Filebeat 需要采集的日志来源</span></div></div><div><div><div>6</div></div><div><span>filebeat.inputs:</span></div></div><div><div><div>7</div></div><div><span>  </span><span>-</span><span> </span><span>type:</span><span> </span><span>filestream</span><span>          </span><span># 采集类型：推荐使用 filestream，它比旧版的 log 类型更稳定，能更好地处理日志轮转</span></div></div><div><div><div>8</div></div><div><span>    </span><span>id:</span><span> </span><span>my-nginx-log</span><span>          </span><span># 唯一标识符：为当前输入源分配一个固定的 ID，确保重启后能准确追踪读取进度，ID不可与其他输入源重复</span></div></div><div><div><div>9</div></div><div><span>    </span><span>enabled:</span><span> </span><span>true</span><span>             </span><span># 启用状态：设置为 true 表示开启此采集规则</span></div></div><div><div><div>10</div></div><div><span>    </span><span>paths:</span><span>                    </span><span># 采集路径：指定要读取的日志文件或目录（支持通配符）</span></div></div><div><div><div>11</div></div><div><span>      </span><span>-</span><span> </span><span>/var/log/nginx/</span><span>*</span><span>.log</span><span>  </span><span># 需要采集的日志路径，请修改为实际日志文件</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span># ============================== 2. 索引模板配置 (Template) ==============================</span></div></div><div><div><div>14</div></div><div><span># 当前输出为Logstash，模板配置不会生效，保留配置文件结构不删除</span></div></div><div><div><div>15</div></div><div><span>setup.template.name:</span><span> </span><span>"my-log"</span><span>         </span><span># 模板名称：在 Elasticsearch 中创建的索引模板的名称</span></div></div><div><div><div>16</div></div><div><span>setup.template.pattern:</span><span> </span><span>"my-log-*"</span><span>    </span><span># 模板匹配模式：指定该模板应用于哪些索引（通常与自定义索引前缀对应）</span></div></div><div><div><div>17</div></div><div><span>setup.ilm.enabled:</span><span> </span><span>false</span><span>              </span><span># 关闭 ILM（索引生命周期管理）：防止 ES 自动接管索引命名，确保下方的自定义索引名生效</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span># ============================== 3. 模块配置 (Modules) ==============================</span></div></div><div><div><div>20</div></div><div><span># 控制 Filebeat 预置模块的加载行为</span></div></div><div><div><div>21</div></div><div><span>filebeat.config.modules:</span></div></div><div><div><div>22</div></div><div><span>  </span><span>path:</span><span> </span><span><span>${</span><span>path</span></span><span>.</span><span><span>config</span><span>}</span></span><span>/modules.d/</span><span>*</span><span>.yml</span><span>  </span><span># 模块配置路径：指定预置模块配置文件所在的目录</span></div></div><div><div><div>23</div></div><div><span>  </span><span>reload.enabled:</span><span> </span><span>false</span><span>                 </span><span># 动态重载：设置为 false 表示不自动检测模块配置的变更，需重启生效</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span># ============================== 4. 输出配置 (Output) ==============================</span></div></div><div><div><div>26</div></div><div><span># 定义采集到的日志数据最终发送到的目的地</span></div></div><div><div><div>27</div></div><div><span>output.logstash:</span></div></div><div><div><div>28</div></div><div><span>  </span><span>hosts:</span><span> [</span><span>"127.0.0.1:5044"</span><span>]             </span><span># Logstash 地址端口，请修改为你的实际 Logstash 服务地址</span></div></div><div><div><div>29</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><section><h3><strong>保留多个采集源：</strong><a href="#保留多个采集源"><span>#</span></a></h3><p>将两路日志全部推送到 logstash 的 5044 端口，依靠 <code>fields.dest</code> 字段区分。<strong>在 Logstash 里面做分流</strong>（messages 不处理直接进 ES，nginx 日志在 logstash的filter字段 处理后进入ES）</p><section><h4>1. filebeat配置<a href="#1-filebeat配置"><span>#</span></a></h4><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>/usr/local/filebeat/filebeat.yml</span><span> &lt;&lt; </span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span># ============================== 1. 输入源配置 (Inputs) ==============================</span></div></div><div><div><div>3</div></div><div><span># 定义 Filebeat 需要采集的日志来源</span></div></div><div><div><div>4</div></div><div><span>filebeat.inputs:</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>- type: filestream          # 采集类型：推荐使用 filestream，它比旧版的 log 类型更稳定，能更好地处理日志轮转</span></div></div><div><div><div>6</div></div><div><span><span>   </span></span><span>id: my-messages-log       # 唯一标识符：为当前输入源分配一个固定的 ID，确保重启后能准确追踪读取进度</span></div></div><div><div><div>7</div></div><div><span><span>   </span></span><span>enabled: true             # 启用状态：设置为 true 表示开启此采集规则</span></div></div><div><div><div>8</div></div><div><span><span>   </span></span><span>paths:                    # 采集路径：指定要读取的日志文件或目录（支持通配符）</span></div></div><div><div><div>9</div></div><div><span><span>     </span></span><span>- /var/log/messages     # 此处指定采集 Linux 系统的 messages 日志</span></div></div><div><div><div>10</div></div><div><span><span>   </span></span><span>fields:</span></div></div><div><div><div>11</div></div><div><span><span>     </span></span><span>dest: "es"              # 自定义标记字段：用于Logstash内部分流，该路日志发送到 Elasticsearch</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span><span> </span></span><span># ========== 追加第二个采集源：nginx日志 ==========</span></div></div><div><div><div>14</div></div><div><span><span> </span></span><span>- type: filestream          # 采集类型：推荐使用 filestream，它比旧版的 log 类型更稳定，能更好地处理日志轮转</span></div></div><div><div><div>15</div></div><div><span><span>   </span></span><span>id: my-nginx-log          # 唯一标识符：为当前输入源分配一个固定的 ID，确保重启后能准确追踪读取进度，ID不可与其他输入源重复</span></div></div><div><div><div>16</div></div><div><span><span>   </span></span><span>enabled: true             # 启用状态：设置为 true 表示开启此采集规则</span></div></div><div><div><div>17</div></div><div><span><span>   </span></span><span>paths:                    # 采集路径：指定要读取的日志文件或目录（支持通配符）</span></div></div><div><div><div>18</div></div><div><span><span>     </span></span><span>- /var/log/nginx/*.log  # 需要采集的日志路径，请修改为实际日志文件</span></div></div><div><div><div>19</div></div><div><span><span>   </span></span><span>fields:</span></div></div><div><div><div>20</div></div><div><span><span>     </span></span><span>dest: "logstash"        # 自定义标记字段：用于Logstash内部分流，该路日志留在logstash处理</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span># ============================== 2. 索引模板配置 (Template) ==============================</span></div></div><div><div><div>23</div></div><div><span>setup.template.name: "my-log"         # 模板名称：在 Elasticsearch 中创建的索引模板的名称</span></div></div><div><div><div>24</div></div><div><span>setup.template.pattern: "my-log-*"    # 模板匹配模式：指定该模板应用于哪些索引（通常与自定义索引前缀对应）</span></div></div><div><div><div>25</div></div><div><span>setup.ilm.enabled: false              # 关闭 ILM（索引生命周期管理）：防止 ES 自动接管索引命名，确保下方的自定义索引名生效</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span># ============================== 3. 模块配置 (Modules) ==============================</span></div></div><div><div><div>28</div></div><div><span># 控制 Filebeat 预置模块的加载行为</span></div></div><div><div><div>29</div></div><div><span>filebeat.config.modules:</span></div></div><div><div><div>30</div></div><div><span><span> </span></span><span>path: ${path.config}/modules.d/*.yml  # 模块配置路径：指定预置模块配置文件所在的目录</span></div></div><div><div><div>31</div></div><div><span><span> </span></span><span>reload.enabled: false                 # 动态重载：设置为 false 表示不自动检测模块配置的变更，需重启生效</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span># ============================== 4. 输出配置 (Output) ==============================</span></div></div><div><div><div>34</div></div><div><span># 定义采集到的日志数据最终发送到的目的地</span></div></div><div><div><div>35</div></div><div><span># Filebeat只允许一个output，全部数据发送给Logstash，分流逻辑交给Logstash</span></div></div><div><div><div>36</div></div><div><span>output.logstash:</span></div></div><div><div><div>37</div></div><div><span><span> </span></span><span>hosts: ["127.0.0.1:5044"]             # Logstash 地址端口，请修改为你的实际 Logstash 服务地址</span></div></div><div><div><div>38</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h4>2. nginx-log.conf配置<a href="#2-nginx-logconf配置"><span>#</span></a></h4><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>/usr/local/logstash/pipelines/nginx/nginx-log.conf</span><span> </span><span>&lt;</span><span>&lt; </span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>input</span><span> </span><span>{</span></div></div><div><div><div>3</div></div><div><span> </span><span>beats</span><span> </span><span>{</span></div></div><div><div><div>4</div></div><div><span>   </span><span>port</span><span> </span><span>=&gt;</span><span> </span><span>5044</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>filter</span><span> </span><span>{</span></div></div><div><div><div>9</div></div><div><span> </span><span># 只对 Nginx 日志做 grok 解析（通过 dest 字段区分），避免系统日志匹配失败</span></div></div><div><div><div>10</div></div><div><span> </span><span>if</span><span> [fields][dest] == </span><span>"logstash"</span><span> {</span></div></div><div><div><div>11</div></div><div><span>   </span><span>grok</span><span> </span><span>{</span></div></div><div><div><div>12</div></div><div><span>     </span><span>match</span><span> =&gt; </span><span>{</span></div></div><div><div><div>13</div></div><div><span>       </span><span>"message"</span><span> =&gt; </span><span>'%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer}) %{QS:agent}'</span></div></div><div><div><div>14</div></div><div><span><span>     </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>     </span><span>break_on_match</span><span> =&gt; </span><span>false</span></div></div><div><div><div>16</div></div><div><span><span>   </span></span><span>}</span></div></div><div><div><div>17</div></div><div><span><span> </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span> </span><span># 如果你也想解析 messages 日志，可以再增加一个 grok，但此处不需要</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>output</span><span> </span><span>{</span></div></div><div><div><div>22</div></div><div><span> </span><span># 分流：dest=es 的日志（messages）写入 test-* 索引</span></div></div><div><div><div>23</div></div><div><span> </span><span>if</span><span> [fields][dest] == </span><span>"es"</span><span> {</span></div></div><div><div><div>24</div></div><div><span>   </span><span>elasticsearch</span><span> </span><span>{</span></div></div><div><div><div>25</div></div><div><span>     </span><span>hosts</span><span> =&gt; [</span><span>"https://localhost:9200"</span><span>]</span></div></div><div><div><div>26</div></div><div><span>     </span><span>index</span><span> =&gt; </span><span>"test-%{+yyyy.MM.dd}"</span></div></div><div><div><div>27</div></div><div><span>     </span><span>user</span><span> =&gt; </span><span>"elastic"</span></div></div><div><div><div>28</div></div><div><span>     </span><span>password</span><span> =&gt; </span><span>"admin@123"</span></div></div><div><div><div>29</div></div><div><span>     </span><span>ssl_verification_mode</span><span> =&gt; </span><span>"none"</span><span>          </span><span># 统一使用 8.x 写法，更简洁</span></div></div><div><div><div>30</div></div><div><span>     </span><span># 如果你的 Logstash 版本较旧，可换为：</span></div></div><div><div><div>31</div></div><div><span>     </span><span># ssl_certificate_verification =&gt; false</span></div></div><div><div><div>32</div></div><div><span><span>   </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span><span> </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span> </span><span># 分流：dest=logstash 的日志（nginx）写入 nginx-log-* 索引</span></div></div><div><div><div>35</div></div><div><span> </span><span>else</span><span> </span><span>if</span><span> [fields][dest] == </span><span>"logstash"</span><span> {</span></div></div><div><div><div>36</div></div><div><span>   </span><span>elasticsearch</span><span> </span><span>{</span></div></div><div><div><div>37</div></div><div><span>     </span><span>hosts</span><span> =&gt; [</span><span>"https://localhost:9200"</span><span>]</span></div></div><div><div><div>38</div></div><div><span>     </span><span>index</span><span> =&gt; </span><span>"nginx-log-%{+yyyy.MM.dd}"</span><span>      </span><span># 统一用小写 yyyy，避免跨年周问题</span></div></div><div><div><div>39</div></div><div><span>     </span><span>user</span><span> =&gt; </span><span>"elastic"</span></div></div><div><div><div>40</div></div><div><span>     </span><span>password</span><span> =&gt; </span><span>"admin@123"</span></div></div><div><div><div>41</div></div><div><span>     </span><span>ssl_verification_mode</span><span> =&gt; </span><span>"none"</span></div></div><div><div><div>42</div></div><div><span><span>   </span></span><span>}</span></div></div><div><div><div>43</div></div><div><span><span> </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span> </span><span># 可选：调试时打开下面的 else，查看未匹配 dest 的事件（生产环境请注释掉）</span></div></div><div><div><div>45</div></div><div><span> </span><span># else {</span></div></div><div><div><div>46</div></div><div><span> </span><span>#   stdout { codec =&gt; rubydebug }</span></div></div><div><div><div>47</div></div><div><span> </span><span># }</span></div></div><div><div><div>48</div></div><div><span>}</span></div></div><div><div><div>49</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section></blockquote><p>之后回到<code>kibana</code>进行数据视图、可视化图表、仪表盘的创建（具体步骤可参考<code>第三章节</code>）</p><hr /></section></section>
<section><h1>五、APM server组件<a href="#五apm-server组件"><span>#</span></a></h1><p>Elastic APM Server 是 Elastic Stack（ELK Stack）中专门用于<strong>接收、处理和转发应用性能监控（APM）数据</strong>的组件。</p><p>简单来说，它充当了**应用程序（Agent）**与 **Elasticsearch（存储/分析引擎）**之间的“网关”或“缓冲层”。</p><ul>
<li><strong>核心功能</strong>：它接收来自各种编程语言 APM Agent 发送的性能数据（如 HTTP 请求耗时、数据库查询、错误日志、分布式追踪 Trace 等）。</li>
<li><strong>数据处理</strong>：它对原始数据进行验证、转换和丰富（例如添加 GeoIP 信息、User-Agent 解析等），然后将其转换为 Elasticsearch 文档格式。</li>
<li><strong>缓冲与解耦</strong>：它防止大量监控数据直接冲击 Elasticsearch 集群，起到削峰填谷的作用，同时让应用程序无需关心后端的存储细节。</li>
<li><strong>架构演进注意</strong>：在 Elastic Stack <strong>8.x</strong> 及更高版本中，APM Server 已经不再是一个必须独立部署的二进制文件，而是被集成到了 <strong>Elastic Agent</strong> 中作为一个托管服务运行。但在逻辑上，它的功能依然存在。</li>
</ul><section><h2>5.1 搭配的组件<a href="#51-搭配的组件"><span>#</span></a></h2><ol>
<li><strong>APM Agent（探针）【必须】</strong> 部署在业务应用侧，不是 APM‑Server。
<ul>
<li>各语言 SDK：Java Agent、Python、Go、NodeJS、.NET、PHP 等</li>
<li>作用：采集应用指标、调用链路、错误堆栈、慢请求，把数据上报给 APM Server。</li>
<li>Agent 只负责采集上报，<strong>不存储数据</strong>。</li>
</ul>
</li>
<li><strong>APM Server【中间转发服务】</strong> 接收 Agent 发过来的链路数据，做预处理、解析、字段增强，再写入 Elasticsearch。 两种部署：二进制、docker。</li>
<li><strong>Elasticsearch【存储，必须】</strong> APM Server 所有链路、指标、异常数据最终全部写入 ES 索引，没有 ES 就无法持久化。</li>
<li><strong>Kibana【可视化，必须】</strong> 提供 APM 专属 UI 面板：服务地图、链路详情、慢事务、错误统计、服务指标，做查询、告警、图表展示。</li>
</ol><section><h3>5.1.1 可选组件<a href="#511-可选组件"><span>#</span></a></h3><ul>
<li><strong>Fleet Server / Elastic Agent</strong>（8.x+ 推荐）：用于集中管理和部署 APM Server 集成，简化运维。</li>
<li><strong>Logstash</strong>：如果你需要在数据进入 ES 之前进行复杂的自定义 ETL 处理，可以让 APM Server 输出到 Logstash 而非直接写入 ES。</li>
<li><strong>Kafka / Redis</strong>：作为中间消息队列，当数据量极大时，可置于 APM Server 与 Elasticsearch 之间提供额外的缓冲能力。</li>
<li><strong>Machine Learning</strong>：Elastic 内置的 ML 功能可以对 APM 数据进行异常检测（如响应时间突增、流量异常等）。</li>
</ul><blockquote><p>最简最小组合：<code>业务应用 + APM Agent + APM Server + Elasticsearch + Kibana</code></p><p>如果使用的是 <strong>Elastic Stack 8.x 或更新版本</strong>，官方推荐使用 <strong>Fleet + Elastic Agent</strong> 的方式来部署 APM Server，而不是手动下载独立的 <code>apm-server</code> 二进制包。这种方式支持通过 Kibana UI 进行集中配置、升级和监控，大幅降低了运维复杂度。</p></blockquote><hr /></section></section></section>
<section><h1>六、Fleet组件使用<a href="#六fleet组件使用"><span>#</span></a></h1><p>Fleet 由两部分组成：</p><ul>
<li><strong>Fleet UI</strong> 是一个带有可视化界面的 Kibana 应用程序，用户可以在界面配置和管理 Elastic Agent 的策略，并且在 Fleet 页面上查看所有 Elastic Agent 的状态。</li>
<li><strong>Fleet Server</strong> 负责集中管理 Elastic Agent 的策略和生命周期，它提供了用于更新 Elastic Agent 的控制平面，并指示 Elastic Agent 执行一些操作，例如更新监控策略，跨主机运行 Osquery 或在网络层隔离主机以遏制安全威胁。<strong>Fleet Server 也是一个特殊的 Elastic Agent。</strong></li>
</ul><p>打开<code>kibana</code>的UI界面，进入<code>Fleet</code>（左侧菜单 → <strong>Management → Fleet</strong>）：（<code>如果进入后出现如下界面</code>）</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260903141521762.png" alt="image-20260903141521762" /><figcaption>image-20260903141521762</figcaption></figure><p></p><p>这是因为<strong>Kibana 的 <code>kibana.yml</code> 里没有配置加密密钥</strong></p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 1. 生成随机字符串作为秘钥</span></div></div><div><div><div>2</div></div><div><span>openssl</span><span> </span><span>rand</span><span> </span><span>-hex</span><span> </span><span>32</span></div></div><div><div><div>3</div></div><div><span># 输出结果：</span></div></div><div><div><div>4</div></div><div><span>a3f1c9e8b7d24f6a1c0e9b8d7f6a5c4e3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 2. 将秘钥填入字段，之后将以下内容追加到kiban的配置文件中</span></div></div><div><div><div>7</div></div><div><span>cat</span><span> &gt;&gt; </span><span>/usr/local/kibana/config/kibana.yml</span><span> &lt;&lt; </span><span>'EOF'</span></div></div><div><div><div>8</div></div><div><span># 用于加密 Fleet 的 enrollment token、API key 等敏感 saved object</span></div></div><div><div><div>9</div></div><div><span>xpack.encryptedSavedObjects.encryptionKey: "a3f1c9e8b7d24f6a1c0e9b8d7f6a5c4e3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8"</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span># 以下两个是 9.x 强烈建议一并配置的（Alerting / Actions / Security Solution 也依赖）</span></div></div><div><div><div>12</div></div><div><span>xpack.reporting.encryptionKey:        "a3f1c9e8b7d24f6a1c0e9b8d7f6a5c4e3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8"</span></div></div><div><div><div>13</div></div><div><span>xpack.security.encryptionKey:         "a3f1c9e8b7d24f6a1c0e9b8d7f6a5c4e3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8"</span></div></div><div><div><div>14</div></div><div><span>EOF</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span># 3. 重启kibana</span></div></div><div><div><div>17</div></div><div><span>systemctl</span><span> </span><span>restart</span><span> </span><span>kibana</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>出现如下画面说明<code>fleet</code>可以正常使用了</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260903142210608.png" alt="image-20260903142210608" /><figcaption>image-20260903142210608</figcaption></figure><p></p><section><h2>6.1 创建Fleet服务器<a href="#61-创建fleet服务器"><span>#</span></a></h2><section><h3>6.1.1 快速创建<a href="#611-快速创建"><span>#</span></a></h3><p>填写<code>名称和URL</code>，点击继续</p><p><strong>其中URL填写的是<code>fleet服务器的URL</code>，后续<code>elastic agent</code>就是通过这个找到<code>fleet server</code></strong>。</p><p><strong>如果要修改端口，那么后续安装fleet server的命令也需要修改，默认给出的命令是8220端口</strong></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260903143145479.png" alt="image-20260903143145479" /><figcaption>image-20260903143145479</figcaption></figure><p></p><p>在上一步点击<code>确认后</code>自动生成<code>代理策略和注册令牌</code>，会出现以下命令，选择对应的架构安装对应的<code>elastic agent</code>，这里在主机（<code>10.22.51.91</code>）上进行安装·<code>fleet 服务器</code>。</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260903150933223.png" alt="image-20260903150933223" /><figcaption>image-20260903150933223</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260903143447176.png" alt="image-20260903143447176" /><figcaption>image-20260903143447176</figcaption></figure><p></p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 进入下载目录</span></div></div><div><div><div>2</div></div><div><span>cd</span><span> </span><span>/usr/local/src</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>curl</span><span> </span><span>-L</span><span> </span><span>-O</span><span> </span><span>https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-9.5.2-linux-x86_64.tar.gz</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>tar</span><span> </span><span>xzf</span><span> </span><span>elastic-agent-9.5.2-linux-x86_64.tar.gz</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>mv</span><span> </span><span>elastic-agent-9.5.2-linux-x86_64</span><span> </span><span>/usr/local/elastic-agent</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>cd</span><span> </span><span>/usr/local/elastic-agent</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># 执行命令</span></div></div><div><div><div>13</div></div><div><span> </span><span>./elastic-agent</span><span> </span><span>install</span><span> </span><span>\</span></div></div><div><div><div>14</div></div><div><span>  </span><span>--fleet-server-es=https://10.22.51.91:9200</span><span> </span><span>\</span></div></div><div><div><div>15</div></div><div><span>  </span><span>--fleet-server-service-token=AAEAAWVsYXN0aWMvZmxlZXQtc2VydmVyL3Rva2VuLTE3ODg0MTcxNjU2MTg6WDhsOXVJUmhReGVVZnB5NnBoeUtjZw</span><span> </span><span>\</span></div></div><div><div><div>16</div></div><div><span>  </span><span>--fleet-server-policy=fleet-server-policy</span><span> </span><span>\</span></div></div><div><div><div>17</div></div><div><span>  </span><span>--fleet-server-es-ca-trusted-fingerprint=7fc5dc32cf288606da9eab53fe5503efe8ae4d2340e72e3180687e3c11cd54dd</span><span> </span><span>\</span></div></div><div><div><div>18</div></div><div><span>  </span><span>--fleet-server-port=8220</span><span> </span><span>\</span></div></div><div><div><div>19</div></div><div><span>  </span><span>--install-servers</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span># 出现以下结果：输入y，会向fleet服务器下载配置文件，并安装在/opt/Elastic/Agent</span></div></div><div><div><div>22</div></div><div><span>Elastic</span><span> </span><span>Agent</span><span> </span><span>will</span><span> </span><span>be</span><span> </span><span>installed</span><span> </span><span>at</span><span> </span><span>/opt/Elastic/Agent</span><span> </span><span>and</span><span> </span><span>will</span><span> </span><span>run</span><span> </span><span>as</span><span> </span><span>a</span><span> </span><span>service.</span><span> </span><span>Do</span><span> </span><span>you</span><span> </span><span>want</span><span> </span><span>to</span><span> </span><span>continue?</span><span> [Y/n]:y</span></div></div><div><div><div>23</div></div><div><span>[    ] Service Started  [48s] Elastic Agent successfully installed, starting enrollment.</span></div></div><div><div><div>24</div></div><div><span><span>[</span><span>==</span><span>  ] Waiting For Enroll...  [50s] {</span></span><span>"log.level"</span><span>:</span><span>"info"</span><span>,</span><span>"@timestamp"</span><span>:</span><span>"2026-09-03T15:12:15.206+0800"</span><span>,</span><span>"log.origin"</span><span>:</span><span>{</span><span>"</span><span>function</span><span>":"</span><span>github.com/elastic/elastic-agent/internal/pkg/agent/cmd.(*enrollCmd</span><span>).prepareFleetTLS</span><span>","</span><span>file.name</span><span>":"</span><span>cmd/enroll_cmd.go</span><span>","</span><span>file.line</span><span>":373},"</span><span>message</span><span>":"</span><span>Generating self-signed certificate </span><span>for</span><span> Fleet Server</span><span>","</span><span>ecs.version</span><span>":"</span><span>1.6.0</span><span>"}</span></div></div><div><div><div>25</div></div><div><span>[==  ] Waiting For Enroll...  [51s] {"</span><span>log.level</span><span>":"</span><span>info</span><span>","</span><span>@timestamp</span><span>":"</span><span>2026-09-03T15:12:16.007+0800</span><span>","</span><span>log.origin</span><span>":{"</span><span>function</span><span>":"</span><span>github.com/elastic/elastic-agent/internal/pkg/agent/cmd.(*enrollCmd).daemonReloadWithBackoff</span><span>","</span><span>file.name</span><span>":"</span><span>cmd/enroll_cmd.go</span><span>","</span><span>file.line</span><span>":417},"</span><span>message</span><span>":"</span><span>Restarting agent daemon, attempt 0</span><span>","</span><span>ecs.version</span><span>":"</span><span>1.6.0</span><span>"}</span></div></div><div><div><div>26</div></div><div><span>[ ===] Waiting For Enroll...  [53s] {"</span><span>log.level</span><span>":"</span><span>info</span><span>","</span><span>@timestamp</span><span>":"</span><span>2026-09-03T15:12:18.018+0800</span><span>","</span><span>log.origin</span><span>":{"</span><span>function</span><span>":"</span><span>github.com/elastic/elastic-agent/internal/pkg/agent/cmd.waitForFleetServer.func1</span><span>","</span><span>file.name</span><span>":"</span><span>cmd/enroll_cmd.go</span><span>","</span><span>file.line</span><span>":613},"</span><span>message</span><span>":"</span><span>Fleet Server - waiting for output unit</span><span>","</span><span>ecs.version</span><span>":"</span><span>1.6.0</span><span>"}</span></div></div><div><div><div>27</div></div><div><span>[ ===] Waiting For Enroll...  [1m5s] {"</span><span>log.level</span><span>":"</span><span>info</span><span>","</span><span>@timestamp</span><span>":"</span><span>2026-09-03T15:12:30.030+0800</span><span>","</span><span>log.origin</span><span>":{"</span><span>function</span><span>":"</span><span>github.com/elastic/elastic-agent/internal/pkg/agent/cmd.waitForFleetServer.func1</span><span>","</span><span>file.name</span><span>":"</span><span>cmd/enroll_cmd.go</span><span>","</span><span>file.line</span><span>":594},"</span><span>message</span><span>":"</span><span>Fleet Server - Running on policy with Fleet Server integration: fleet-server-policy; </span><span>missing</span><span> </span><span>config</span><span> </span><span>fleet.agent.id</span><span> (expected </span><span>during</span><span> </span><span>bootstrap</span><span> </span><span>process</span><span>)</span><span>","</span><span>ecs.version</span><span>":"</span><span>1.6.0</span><span>"}</span></div></div><div><div><div>28</div></div><div><span>[ ===] Waiting For Enroll...  [1m5s] {"</span><span>log.level</span><span>":"</span><span>info</span><span>","</span><span>@timestamp</span><span>":"</span><span>2026-09-03T15:12:30.808+0800</span><span>","</span><span>log.origin</span><span>":{"</span><span>function</span><span>":"</span><span>github.com/elastic/elastic-agent/internal/pkg/agent/application/enroll.EnrollWithBackoff</span><span>","</span><span>file.name</span><span>":"</span><span>enroll/enroll.go</span><span>","</span><span>file.line</span><span>":87},"</span><span>message</span><span>":"</span><span>Starting enrollment to URL: https://localhost:8221/</span><span>","</span><span>ecs.version</span><span>":"</span><span>1.6.0</span><span>"}</span></div></div><div><div><div>29</div></div><div><span>[==  ] Waiting For Enroll...  [1m8s] {"</span><span>log.level</span><span>":"</span><span>info</span><span>","</span><span>@timestamp</span><span>":"</span><span>2026-09-03T15:12:33.543+0800</span><span>","</span><span>log.origin</span><span>":{"</span><span>function</span><span>":"</span><span>github.com/elastic/elastic-agent/internal/pkg/agent/cmd.(*enrollCmd).daemonReloadWithBackoff</span><span>","</span><span>file.name</span><span>":"</span><span>cmd/enroll_cmd.go</span><span>","</span><span>file.line</span><span>":417},"</span><span>message</span><span>":"</span><span>Restarting agent daemon, attempt 0</span><span>","</span><span>ecs.version</span><span>":"</span><span>1.6.0</span><span>"}</span></div></div><div><div><div>30</div></div><div><span>{"</span><span>log.level</span><span>":"</span><span>info</span><span>","</span><span>@timestamp</span><span>":"</span><span>2026-09-03T15:12:33.546+0800</span><span>","</span><span>log.origin</span><span>":{"</span><span>function</span><span>":"</span><span>github.com/elastic/elastic-agent/internal/pkg/agent/cmd.(*enrollCmd).Execute</span><span>","</span><span>file.name</span><span>":"</span><span>cmd/enroll_cmd.go</span><span>","</span><span>file.line</span><span>":206},"</span><span>message</span><span>":"</span><span>Successfully triggered restart on running Elastic Agent.</span><span>","</span><span>ecs.version</span><span>":"</span><span>1.6.0</span><span>"}</span></div></div><div><div><div>31</div></div><div><span>Successfully enrolled the Elastic Agent.</span></div></div><div><div><div>32</div></div><div><span>[==  ] Done  [1m8s]</span></div></div><div><div><div>33</div></div><div><span>Elastic Agent has been successfully installed.</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>回到<code>kibana</code>界面，发现已经连接成功</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260903151406137.png" alt="image-20260903151406137" /><figcaption>image-20260903151406137</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260903152259622.png" alt="image-20260903152259622" /><figcaption>image-20260903152259622</figcaption></figure><p></p></section><section><h3>6.1.2 高级选项创建<a href="#612-高级选项创建"><span>#</span></a></h3><p>高级创建有更多的选项可自定义，更加灵活。这次<code>安装fleet server</code>使用另一台独立的机器<code>10.22.51.74</code>，不再与<code>elastic组件服务器（10.22.51.91）</code>安装在一起</p><p>这里事先创建了两个不同的<code>代理策略</code>，指定不同的<code>fleet server</code>，供不同的<code>fleet srever</code>使用</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260909093243768.png" alt="image-20260909093243768" /><figcaption>image-20260909093243768</figcaption></figure><p></p><p>之后选择<code>部署模式和fleet服务器主机</code></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260909093540993.png" alt="image-20260909093540993" /><figcaption>image-20260909093540993</figcaption></figure><p></p><p>最后生成令牌，将fleet 服务器安装到对应ip（<code>10.22.51.74</code>）中</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260909093656392.png" alt="image-20260909093656392" /><figcaption>image-20260909093656392</figcaption></figure><p></p></section></section><section><h2>6.2 代理策略使用<a href="#62-代理策略使用"><span>#</span></a></h2><section><h3>6.2.1 代理策略概念<a href="#621-代理策略概念"><span>#</span></a></h3><p><strong>代理策略 = 配置模板</strong>，里面定义采集什么日志、指标、输出给谁。 业务机器安装 Elastic Agent 的时候，<strong>绑定某一个策略</strong>，Agent 就自动下载这套配置，不需要去业务机器改配置文件。</p></section><section><h3>6.2.2 默认代理策略<a href="#622-默认代理策略"><span>#</span></a></h3><p><code>Fleet Server Policy</code>：<strong>专门给 Fleet‑Server 服务端用，普通业务 agent 绝对不要选它</strong>（已经有 1 个代理绑定它，就是之前的 fleet‑server 节点）</p><p>如果有<code>多个fleet server使用不同的代理策略</code>，建议修改<code>代理策略的名字</code>。同时修改<code>策略使用的fleet 服务器（不修改则为默认）</code>。否则将出现<strong>fleet server无法更新</strong></p><p>对于其他的策略需要指定其需要通信的fleet server，否则使用的是默认的fleet server地址。</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260909094435687.png" alt="image-20260909094435687" /><figcaption>image-20260909094435687</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260909094450672.png" alt="image-20260909094450672" /><figcaption>image-20260909094450672</figcaption></figure><p></p></section><section><h3>6.2.3 创建普通代理策略<a href="#623-创建普通代理策略"><span>#</span></a></h3><ul>
<li>
<p>点右上角【创建代理策略】新建空白策略，填写<code>名称</code>后点击创建</p>
<p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260904154851809.png" alt="image-20260904154851809" /><figcaption>image-20260904154851809</figcaption></figure><p></p>
<p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260904155019636.png" alt="image-20260904155019636" /><figcaption>image-20260904155019636</figcaption></figure><p></p>
</li>
</ul></section><section><h3>6.2.4 进入策略页面<a href="#624-进入策略页面"><span>#</span></a></h3><p>可以看到有个默认的<code>system</code>集成，这是因为之前创建时勾选了<code>收集系统日志和指标</code></p><ol>
<li>
<p><strong>添加集成</strong>：比如 Nginx、System (系统指标)、Filebeat 自定义日志、MySQL 等。这里添加<code>nginx的集成</code></p>
<p><strong>添加集成就是告诉 Agent</strong>：要采集什么数据。 例如<code>nginx监控策略</code>这个策略，添加 Nginx 集成来采集nginx的数据。</p>
<p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260904155416256.png" alt="image-20260904155416256" /><figcaption>image-20260904155416256</figcaption></figure><p></p>
<p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260904162739761.png" alt="image-20260904162739761" /><figcaption>image-20260904162739761</figcaption></figure><p></p>
</li>
</ol><blockquote><p>关键点：<strong>只要网页修改策略保存，所有绑定这个策略的 Agent，会自动拉取新配置，不需要登录业务机器重启 agent！Fleet 的核心价值就在这里，集中管理。</strong></p></blockquote></section></section><section><h2>6.3 代理策略选项<a href="#63-代理策略选项"><span>#</span></a></h2><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260904163308647.png" alt="image-20260904163308647" /><figcaption>image-20260904163308647</figcaption></figure><p></p><section><h3>6.3.1 添加 Fleet 服务器<a href="#631-添加-fleet-服务器"><span>#</span></a></h3><blockquote><p><strong>只针对 <code>Fleet Server Policy</code> 才有用，普通业务策略不要点！</strong>
功能：弹出向导，生成 Fleet‑Server 安装脚本，就是你最开始部署 fleet‑server 那套 install 命令。</p></blockquote><ul>
<li>作用：用于部署第二台、多台 Fleet‑Server 节点做高可用。</li>
</ul><p>在 <code>nginx监控策略</code> 普通策略点这个是无效的，普通策略不能用来安装 Fleet‑Server。</p></section><section><h3>6.3.2 添加代理<a href="#632-添加代理"><span>#</span></a></h3><ol>
<li>点击直接跳转到 Agent 安装向导，并且<strong>自动选定当前策略</strong>。</li>
</ol><ul>
<li>系统直接生成安装脚本，脚本内置绑定此策略。</li>
<li>复制脚本到业务服务器执行安装 elastic‑agent。</li>
</ul><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260904164318678.png" alt="image-20260904164318678" /><figcaption>image-20260904164318678</figcaption></figure><p></p></section><section><h3>6.3.3 在此策略上升级代理<a href="#633-在此策略上升级代理"><span>#</span></a></h3><p><strong>批量升级该策略下全部 Agent 版本</strong>。</p><ul>
<li>当 Kibana 检测到有新版本 Elastic‑Agent 可用，这个按钮激活。</li>
<li>一键把所有绑定此策略的 agent，远程升级到新版本，<strong>不需要登录业务机器操作</strong>。</li>
</ul></section><section><h3>6.3.4 在此策略上卸载代理<a href="#634-在此策略上卸载代理"><span>#</span></a></h3><p><strong>批量远程卸载该策略下所有 Agent</strong>。 触发后，Kibana 下发指令，所有绑定该策略机器上的 elastic‑agent 执行卸载，停止服务、删除程序。</p></section></section><section><h2>6.4 集成修改<a href="#64-集成修改"><span>#</span></a></h2><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260904164939906.png" alt="image-20260904164939906" /><figcaption>image-20260904164939906</figcaption></figure><p></p><p>当选择的集成采集的数据不符合要求时，可以<code>编辑集成</code>进行自定义</p></section><section><h2>6.5 创建代理<a href="#65-创建代理"><span>#</span></a></h2><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260904165133234.png" alt="image-20260904165133234" /><figcaption>image-20260904165133234</figcaption></figure><p></p><ol>
<li>
<p><strong>选择代理策略：</strong><code>nginx监控策略</code></p>
<p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260904165750887.png" alt="image-20260904165750887" /><figcaption>image-20260904165750887</figcaption></figure><p></p>
</li>
<li>
<p><strong>选择在fleet中注册</strong></p>
<p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260904165828303.png" alt="image-20260904165828303" /><figcaption>image-20260904165828303</figcaption></figure><p></p>
</li>
<li>
<p>在被监控的主机<code>10.22.51.72</code>中执行命令</p>
<p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260904165915976.png" alt="image-20260904165915976" /><figcaption>image-20260904165915976</figcaption></figure><p></p>
<p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260904170939979.png" alt="image-20260904170939979" /><figcaption>image-20260904170939979</figcaption></figure><p></p>
</li>
<li></li>
</ol></section></section>
<section><h1>七、Elastic Agent<a href="#七elastic-agent"><span>#</span></a></h1><p><strong>Elastic Agent</strong> 是 Elastic 官方推出的<strong>统一数据采集与管理代理</strong>，用来<strong>替代过去散落的 Beats 家族（Filebeat、Metricbeat、Packetbeat、Heartbeat、Auditbeat、Winlogbeat…）以及独立的 APM Server</strong>，把它们的能力收敛到<strong>一个二进制、一个进程、一套配置</strong>里。</p><p><strong>Elastic Agent = 一个跑在每台主机/容器上的”全能采集器”，由 Kibana Fleet 远程统一管理，按需开启日志、指标、APM、安全、合成监控等各种能力。</strong></p><blockquote><p><strong>参考文档：</strong><a href="https://www.modb.pro/db/582644" target="_blank">Elastic Stack 实战教程 4：使用 Fleet 管理 Elastic Agent 监控应用 - 墨天轮</a></p><p><a href="https://blog.csdn.net/UbuntuTouch/article/details/123230233" target="_blank">安装独立的 Elastic Agents 并采集数据 - Elastic Stack 8.0_copy this policy to the elastic-agent.yml on the h-CSDN博客</a></p><p><a href="https://blog.csdn.net/UbuntuTouch/article/details/122956622" target="_blank">Observability：使用 Elastic Agent 来摄入日志及指标 - Elastic Stack 8.0-CSDN博客</a></p></blockquote><section><h2>7.1 基本认识<a href="#71-基本认识"><span>#</span></a></h2><section><h3>7.1.1 核心组件和概念<a href="#711-核心组件和概念"><span>#</span></a></h3>

<table><thead><tr><th>概念</th><th>作用</th><th>类比</th></tr></thead><tbody><tr><td><strong>Elastic Agent</strong></td><td>跑在被监控机器上的实际进程，负责采集和上报</td><td>“士兵”：<code>执行采集数据的角色</code></td></tr><tr><td><strong>Integration（集成）</strong></td><td>一个个可插拔的能力包，如 System、Nginx、MySQL、<strong>Elastic APM</strong>、Endpoint Security</td><td>“技能卡”：<code>规定采集哪些数据</code></td></tr><tr><td><strong>Agent Policy（代理策略）</strong></td><td>一组集成的集合 + 输出配置，决定”这个 Agent 要干什么”</td><td>“任务清单”</td></tr><tr><td><strong>Fleet / Fleet Server</strong></td><td>Kibana 里的管理中心 + 通信中转，把策略下发给所有 Agent</td><td>“指挥部”</td></tr></tbody></table><p>工作流：</p><ol>
<li>你在 <strong>Kibana Fleet UI</strong> 里创建一个<code> Policy（代理策略）</code>，往里加几个 <code>Integration（集成）</code>（比如 System + Nginx + APM）。</li>
<li>Fleet Server 把这份 Policy 推送给所有挂在该 Policy 下的 Elastic Agent。</li>
<li>Agent <strong>热加载</strong>新配置，立刻开始按新策略采集，<strong>无需重启、无需登录机器</strong>。</li>
<li>数据写入 Elasticsearch，在 Kibana 里查看。</li>
</ol></section><section><h3>7.1.2 核心能力<a href="#712-核心能力"><span>#</span></a></h3><p>Elastic Agent 通过加载不同的 <strong>Integration（集成）</strong> 覆盖几乎所有观测与安全场景：</p>

<table><thead><tr><th>领域</th><th>典型 Integration</th><th>替代的老组件</th></tr></thead><tbody><tr><td><strong>日志</strong></td><td>System logs、Nginx、Apache、Kafka、Docker、Kubernetes、自定义文件/JSON/Syslog</td><td>Filebeat</td></tr><tr><td><strong>指标</strong></td><td>System metrics、CPU/Memory/Disk、Prometheus scrape、各种中间件 metrics</td><td>Metricbeat</td></tr><tr><td><strong>APM</strong></td><td><strong>Elastic APM</strong></td><td>独立 APM Server</td></tr><tr><td><strong>可用性监控</strong></td><td>HTTP/TCP/ICMP 探活</td><td>Heartbeat</td></tr><tr><td><strong>合成监控</strong></td><td>Browser journeys（Playwright 脚本）</td><td>Synthetics</td></tr><tr><td><strong>安全 / EDR</strong></td><td>Elastic Defend（Endpoint Security）、Auditd、Osquery</td><td>Auditbeat + Endpoint</td></tr><tr><td><strong>网络</strong></td><td>Flow、Packet capture</td><td>Packetbeat</td></tr><tr><td><strong>云</strong></td><td>AWS、Azure、GCP 全套服务指标和日志</td><td>各 cloud beat</td></tr></tbody></table><blockquote><p>在 Elastic 官方的 <strong>Integrations 市场</strong>里目前有 <strong>300+</strong> 个开箱即用的集成，点几下就能启用。</p></blockquote></section><section><h3>7.1.3 流程详情<a href="#713-流程详情"><span>#</span></a></h3><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/09/09/Elastic-Stack/image-20260903164440901.png" alt="image-20260903164440901" /><figcaption>image-20260903164440901</figcaption></figure><p></p><ul>
<li>主进程根据 Fleet 下发的 Policy，<strong>动态拉起/停止若干子 component</strong>（很多其实就是内嵌的 Beat 或 APM Server 逻辑）。</li>
<li>与 Fleet Server 之间维持<strong>长连接</strong>，实时接收策略变更、上报自身健康状态。</li>
<li>所有 component 共享同一个输出管道（ES / Logstash / Kafka），统一背压和重试。</li>
</ul></section><section><h3>7.1.4 运行模式<a href="#714-运行模式"><span>#</span></a></h3>

<table><thead><tr><th>模式</th><th>说明</th><th>适用场景</th></tr></thead><tbody><tr><td><strong>Fleet-managed（推荐）</strong></td><td>由 Kibana Fleet 远程管理，UI 点点鼠标即可改配置</td><td>生产环境、规模化部署</td></tr><tr><td><strong>Standalone（独立）</strong></td><td>不连 Fleet，本地用 <code>elastic-agent.yml</code> 配置</td><td>离线环境、极简场景、调试</td></tr></tbody></table><p>99% 的场景都应该用 Fleet-managed，也就是你前两轮在做的方向。</p><section><h4>7.1.4.1 模式特性<a href="#7141-模式特性"><span>#</span></a></h4>

<table><thead><tr><th>特性</th><th>Fleet</th><th>Standalone</th></tr></thead><tbody><tr><td>中央管理</td><td>支持</td><td>不支持</td></tr><tr><td>Kibana UI</td><td>支持</td><td>部分</td></tr><tr><td>Agent Policy</td><td>核心机制</td><td>本地配置</td></tr><tr><td>Integration</td><td>强</td><td>支持</td></tr><tr><td>大规模 Agent</td><td>推荐</td><td>不推荐</td></tr><tr><td>自动配置下发</td><td>支持</td><td>不支持</td></tr><tr><td>集中升级</td><td>支持</td><td>手工</td></tr><tr><td>配置文件</td><td>Fleet生成</td><td>自己维护</td></tr><tr><td>学习难度</td><td>中</td><td>低</td></tr><tr><td>生产环境</td><td>推荐</td><td>特殊场景</td></tr><tr><td>Ansible 管理</td><td>可结合</td><td>很适合</td></tr></tbody></table></section></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/ansible%E7%9A%84playbook/</id>
      <title type="text">ansible的playbook</title>
      <published>2026-08-04T00:00:00.000Z</published>
      <updated>2026-08-04T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/ansible%E7%9A%84playbook/"/>
      <summary type="text">ansible的playbook</summary>
      <content type="html"><![CDATA[<section><h1>一、YAML语法<a href="#一yaml语法"><span>#</span></a></h1><section><h2>1.1 YAML 基本规则<a href="#11-yaml-基本规则"><span>#</span></a></h2><ul>
<li>
<p><strong>基本结构</strong>：AML 文件后缀通常为<code>.yml</code>或<code>.yaml</code>，顶层可以是<strong>键值对（映射）</strong>、<strong>数组（序列）</strong> 或单个值，支持多层嵌套。</p>
</li>
<li>
<p><strong>大小写敏感</strong>：<code>Name</code> 和 <code>name</code> 是两个不同的键。</p>
</li>
<li>
<p><strong>缩进规则</strong>：用<strong>空格</strong>缩进（禁止使用 Tab 键），缩进数量不固定（通常 2 个空格），但同一层级必须保持一致；</p>
<p>​		  缩进层级代表层级关系。</p>
</li>
<li>
<p><strong>注释</strong>：以 <code>#</code> 开头，注释内容不会被执行。</p>
</li>
</ul><section><h3>1.1.1 数据类型<a href="#111-数据类型"><span>#</span></a></h3><p>​	字符串：默认无需引号（含空格需加引号），支持单 / 双引号，双引号支持转义（<code>\n</code>/<code>\t</code>），单引号不转义；</p><p>​	数字：整数、浮点数、科学计数法（如 123、-45.6、7.8e9），直接写；</p><p>​	布尔值：<code>true/false</code>（小写）、<code>yes/no</code>（等价），均可；</p><p>​	空值：<code>null</code>、<code>~</code> 或空行（推荐用<code>null</code>）；</p><p>​	日期 / 时间：支持 ISO 格式（如<code>2026-01-29</code>、<code>2026-01-29T10:30:00+08:00</code>），会被解析为日期类型；</p><p>​	数组 / 列表：用<code>-</code>（短横线 + 空格）表示列表项，同一层级的<code>-</code>对齐；</p><p>​	映射 / 对象：键值对用<code>:</code>（冒号 + 空格）分隔，键无需引号（除非含特殊字符）。</p></section></section><section><h2>1.2 YAML 核心数据结构<a href="#12-yaml-核心数据结构"><span>#</span></a></h2>

<table><thead><tr><th>结构类型</th><th>语法特征</th><th>示例</th></tr></thead><tbody><tr><td>键值对</td><td><code>键: 值</code>（冒号后必须加 1 个空格）</td><td><code>web_server: nginx``port: 8080</code></td></tr><tr><td>列表</td><td>每行以 <code>-</code> 开头（横杠后加 1 个空格）</td><td><code>- nginx``- mysql``- redis</code></td></tr><tr><td>嵌套结构</td><td>通过缩进体现层级</td><td><code>server:``  name: nginx``  port: 80``  enabled: true</code></td></tr></tbody></table></section><section><h2>1.3 YAML 特殊值<a href="#13-yaml-特殊值"><span>#</span></a></h2><ul>
<li>多行文本：用 <code>|</code>（保留换行）或 <code>&gt;</code>（折叠换行），适合写脚本 / 配置内容：</li>
<li>支持锚点（<code>&amp;</code>）和引用（<code>*</code>）、多行字符串、合并键等语法</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># | 保留换行（原样输出）</span></div></div><div><div><div>2</div></div><div><span>script</span><span>: </span><span>|</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>echo "hello ansible"</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>ls -l /tmp</span></div></div><div><div><div>5</div></div><div><span># &gt; 折叠换行（合并为一行）</span></div></div><div><div><div>6</div></div><div><span>desc</span><span>: </span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>这是一段</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>多行的描述</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>会被折叠成一行</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>1.4 yaml示例<a href="#14-yaml示例"><span>#</span></a></h2><section><h3>1.4.1 基础示例<a href="#141-基础示例"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># 这是单行注释（应用基础配置）</span></div></div><div><div><div>2</div></div><div><span>app_name</span><span>: </span><span>"用户管理系统"</span><span>  </span><span># 字符串加双引号（可选）</span></div></div><div><div><div>3</div></div><div><span>version</span><span>: </span><span>1.0.2</span><span>            </span><span># 数字（无需引号）</span></div></div><div><div><div>4</div></div><div><span>port</span><span>: </span><span>8080</span><span>                </span><span># 整数</span></div></div><div><div><div>5</div></div><div><span>debug</span><span>: </span><span>false</span><span>              </span><span># 布尔值（等价于 no）</span></div></div><div><div><div>6</div></div><div><span>timeout</span><span>: </span><span>30.5</span><span>             </span><span># 浮点数</span></div></div><div><div><div>7</div></div><div><span>empty_value</span><span>: </span><span>null</span><span>         </span><span># 空值（也可写 ~）</span></div></div><div><div><div>8</div></div><div><span>create_time</span><span>: </span><span>2026-01-29</span><span>   </span><span># 日期类型</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p><strong>说明：</strong></p><p>​	<code>#</code> 后的内容是注释，不会被解析；</p><p>​	键（如<code>app_name</code>）无需引号，值的类型由写法自动识别；</p><p>​	布尔值<code>false</code>和<code>no</code>等价，<code>true</code>和<code>yes</code>等价。</p></blockquote></section><section><h3>1.4.2 层级嵌套结构<a href="#142-层级嵌套结构"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>database</span><span>:</span></div></div><div><div><div>2</div></div><div><span>  </span><span>type</span><span>: </span><span>mysql</span></div></div><div><div><div>3</div></div><div><span>  </span><span>host</span><span>: </span><span>127.0.0.1</span></div></div><div><div><div>4</div></div><div><span>  </span><span>port</span><span>: </span><span>3306</span></div></div><div><div><div>5</div></div><div><span>  </span><span>credentials</span><span>:  </span><span># 嵌套的映射</span></div></div><div><div><div>6</div></div><div><span>    </span><span>username</span><span>: </span><span>root</span></div></div><div><div><div>7</div></div><div><span>    </span><span>password</span><span>: </span><span>123456</span></div></div><div><div><div>8</div></div><div><span>    </span><span>db_name</span><span>: </span><span>user_db</span></div></div><div><div><div>9</div></div><div><span>  </span><span>options</span><span>:      </span><span># 嵌套的映射+列表</span></div></div><div><div><div>10</div></div><div><span>    </span><span>charset</span><span>: </span><span>utf8mb4</span></div></div><div><div><div>11</div></div><div><span>    </span><span>connect_timeout</span><span>: </span><span>10</span></div></div><div><div><div>12</div></div><div><span>    </span><span>allow_multi_queries</span><span>: </span><span>yes</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p><strong>说明：</strong></p><p>​	<code>credentials</code>和<code>options</code>是<code>database</code>的子键，通过缩进（2 个空格）体现层级；</p><p>​	嵌套层级无数量限制，只要缩进一致即可。</p></blockquote></section><section><h3>1.4.3 数组列表<a href="#143-数组列表"><span>#</span></a></h3><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># 简单列表（字符串）</span></div></div><div><div><div>2</div></div><div><span>allow_ips</span><span>:</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>- </span><span>192.168.1.1</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>- </span><span>192.168.1.2</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>- </span><span>10.0.0.0/8</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 列表嵌套映射（常用！）</span></div></div><div><div><div>8</div></div><div><span>users</span><span>:</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>- </span><span>name</span><span>: </span><span>张三</span></div></div><div><div><div>10</div></div><div><span>    </span><span>age</span><span>: </span><span>25</span></div></div><div><div><div>11</div></div><div><span>    </span><span>is_admin</span><span>: </span><span>true</span></div></div><div><div><div>12</div></div><div><span>    </span><span>hobbies</span><span>: [</span><span>篮球</span><span>, </span><span>游泳</span><span>]  </span><span># 行内列表（简写形式，等价于- 篮球\n- 游泳）</span></div></div><div><div><div>13</div></div><div><span><span>  </span></span><span>- </span><span>name</span><span>: </span><span>李四</span></div></div><div><div><div>14</div></div><div><span>    </span><span>age</span><span>: </span><span>30</span></div></div><div><div><div>15</div></div><div><span>    </span><span>is_admin</span><span>: </span><span>false</span></div></div><div><div><div>16</div></div><div><span>    </span><span>hobbies</span><span>:</span></div></div><div><div><div>17</div></div><div><span><span>      </span></span><span>- </span><span>读书</span></div></div><div><div><div>18</div></div><div><span><span>      </span></span><span>- </span><span>旅行</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><p><strong>说明：</strong></p><p>​	列表项以<code>- </code>开头，同一列表的<code>-</code>必须对齐；</p><p>​	行内列表用<code>[]</code>包裹（类似 JSON），适合短列表，和分行<code>-</code>等价。</p></blockquote></section><section><h3>1.4.4 多行字符串<a href="#144-多行字符串"><span>#</span></a></h3><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># 写法1：| 保留换行和末尾空行（适合需要严格换行的文本，如代码、日志）</span></div></div><div><div><div>2</div></div><div><span>multi_line_text1</span><span>: </span><span>|</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>第一行内容</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>第二行内容</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>第三行内容（末尾换行保留）</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 写法2：&gt; 折叠换行（将换行转为空格，适合段落文本）</span></div></div><div><div><div>8</div></div><div><span>multi_line_text2</span><span>: </span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>这是一段很长的文本，</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>希望在YAML中分行写，</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>但解析后会合并为一行（换行变空格）</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span># 写法3：单/双引号（转义差异）</span></div></div><div><div><div>14</div></div><div><span>string_escape1</span><span>: </span><span>"Hello</span><span>\n</span><span>World"</span><span>  </span><span># 双引号：\n 会被解析为换行</span></div></div><div><div><div>15</div></div><div><span>string_escape2</span><span>: </span><span>'Hello\nWorld'</span><span>  </span><span># 单引号：\n 原样保留，不转义</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>1.4.5 锚点与引用<a href="#145-锚点与引用"><span>#</span></a></h3><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># 定义锚点（&amp;common_config）</span></div></div><div><div><div>2</div></div><div><span>common_config</span><span>: </span><span>&amp;</span><span>common_config</span></div></div><div><div><div>3</div></div><div><span>  </span><span>timeout</span><span>: </span><span>30</span></div></div><div><div><div>4</div></div><div><span>  </span><span>retry</span><span>: </span><span>3</span></div></div><div><div><div>5</div></div><div><span>  </span><span>log_level</span><span>: </span><span>info</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 引用锚点（*common_config）</span></div></div><div><div><div>8</div></div><div><span>service1</span><span>:</span></div></div><div><div><div>9</div></div><div><span>  </span><span>name</span><span>: </span><span>用户服务</span></div></div><div><div><div>10</div></div><div><span>  </span><span>&lt;&lt;</span><span>: </span><span>*</span><span>common_config</span><span>  </span><span># 合并锚点的所有键值对</span></div></div><div><div><div>11</div></div><div><span>  </span><span>port</span><span>: </span><span>8081</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>service2</span><span>:</span></div></div><div><div><div>14</div></div><div><span>  </span><span>name</span><span>: </span><span>订单服务</span></div></div><div><div><div>15</div></div><div><span>  </span><span>&lt;&lt;</span><span>: </span><span>*</span><span>common_config</span><span>  </span><span># 复用相同配置</span></div></div><div><div><div>16</div></div><div><span>  </span><span>port</span><span>: </span><span>8082</span></div></div><div><div><div>17</div></div><div><span>  </span><span>retry</span><span>: </span><span>5</span><span>  </span><span># 覆盖锚点的retry值</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><p><strong>说明：</strong></p><p>​	<code>&amp;锚点名</code> 定义可复用的片段；</p><p>​	<code>&lt;&lt;: *锚点名</code> 表示 “将锚点的键值对合并到当前层级”；</p><p>​	引用后可覆盖锚点的字段（如 service2 的<code>retry: 5</code>）。</p></blockquote></section></section></section>
<section><h1>二、Ansible Playbook 核心用法<a href="#二ansible-playbook-核心用法"><span>#</span></a></h1><p>Playbook（剧本）是 Ansible 的「任务编排文件」，由一个或多个「Play」组成，每个 Play 定义：<strong>对哪些主机执行哪些任务</strong>。</p><section><h2>2.1 Playbook 核心元素<a href="#21-playbook-核心元素"><span>#</span></a></h2>

<table><thead><tr><th>元素</th><th>作用</th><th>示例</th></tr></thead><tbody><tr><td><code>hosts</code></td><td>指定目标主机 / 主机组（来自 inventory）</td><td><code>hosts: webservers</code>（执行给 webservers 组）<code>hosts: all</code>（执行给所有主机）</td></tr><tr><td><code>tasks</code></td><td>任务列表（按顺序执行），每个任务调用 Ansible 模块</td><td><code>tasks:``  - name: 安装nginx``    yum: name=nginx state=present</code></td></tr><tr><td><code>remote_user</code></td><td>远程执行任务的用户</td><td><code>remote_user: root</code></td></tr><tr><td><code>become</code></td><td>是否提权（比如普通用户提权到 root）</td><td><code>become: true</code>（开启提权）<code>become_method: sudo</code>（提权方式，默认 sudo）</td></tr><tr><td><code>vars</code></td><td>定义变量（可在任务中引用）</td><td><code>vars:``  nginx_port: 80``  pkg_name: nginx</code></td></tr><tr><td><code>handlers</code></td><td>「触发式任务」（仅被 notify 调用时执行），常用于重启服务</td><td><code>handlers:``  - name: 重启nginx``    service: name=nginx state=restarted</code></td></tr><tr><td><code>notify</code></td><td>触发 handlers 中的任务（任务执行成功后触发）</td><td>在 tasks 中加：<code>notify: 重启ngin</code></td></tr></tbody></table></section><section><h2>2.2 playbook 执行命令<a href="#22-playbook-执行命令"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 基本执行</span></div></div><div><div><div>2</div></div><div><span>ansible-playbook</span><span> </span><span>your_playbook.yml</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 常用选项</span></div></div><div><div><div>5</div></div><div><span>ansible-playbook</span><span> </span><span>your_playbook.yml</span><span> </span><span>\</span></div></div><div><div><div>6</div></div><div><span>  </span><span>--check</span><span>  </span><span># 只检查语法/执行计划，不实际执行（干跑验证，不会真正执行）</span></div></div><div><div><div>7</div></div><div><span>  </span><span>--limit</span><span> </span><span>web01</span><span>  </span><span># 仅执行给web01主机（覆盖hosts配置）</span></div></div><div><div><div>8</div></div><div><span>  </span><span>-v</span><span>  </span><span># 详细输出（-vvv 更详细，排错用）</span></div></div><div><div><div>9</div></div><div><span>  </span><span>-u</span><span> </span><span>root</span><span>  </span><span># 指定远程用户（覆盖playbook中的remote_user）</span></div></div><div><div><div>10</div></div><div><span>  </span><span>-i</span><span> </span><span>/etc/ansible/hosts</span><span> </span><span># 指定主机清单</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>2.3 playbook使用示例<a href="#23-playbook使用示例"><span>#</span></a></h2><section><h3>2.3.1 基础playbook<a href="#231-基础playbook"><span>#</span></a></h3><p>功能：对所有主机执行「创建 /tmp/test 目录」和「查看磁盘使用情况」两个任务。</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># filename: basic_task.yml</span></div></div><div><div><div>2</div></div><div><span>-</span><span> </span><span>name:</span><span> </span><span>基础任务示例（对所有主机执行）</span></div></div><div><div><div>3</div></div><div><span>  </span><span>hosts:</span><span> </span><span>all</span><span>          </span><span># 目标主机：所有主机</span></div></div><div><div><div>4</div></div><div><span>  </span><span>remote_user:</span><span> </span><span>root</span><span>   </span><span># 远程执行用户：root</span></div></div><div><div><div>5</div></div><div><span>  </span><span>tasks:</span><span>              </span><span># 任务列表</span></div></div><div><div><div>6</div></div><div><span>    </span><span>-</span><span> </span><span>name:</span><span> </span><span>创建/tmp/test目录</span><span>  </span><span># 任务名称（可选，但建议写，便于排错）</span></div></div><div><div><div>7</div></div><div><span>      </span><span>file:</span><span>            </span><span># 调用ansible的file模块</span></div></div><div><div><div>8</div></div><div><span>        </span><span>path:</span><span> </span><span>/tmp/test</span></div></div><div><div><div>9</div></div><div><span>        </span><span>state:</span><span> </span><span>directory</span><span>  </span><span># 确保目录存在</span></div></div><div><div><div>10</div></div><div><span>        </span><span>mode:</span><span> </span><span>'0755'</span><span>      </span><span># 目录权限</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>    </span><span>-</span><span> </span><span>name:</span><span> </span><span>查看磁盘使用情况</span></div></div><div><div><div>13</div></div><div><span>      </span><span>command</span><span>:</span><span> </span><span>df</span><span> </span><span>-h</span><span>     </span><span># 调用command模块执行shell命令</span></div></div><div><div><div>14</div></div><div><span>      </span><span>register:</span><span> </span><span>df_result</span><span>  </span><span># 把命令输出保存到df_result变量</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>    </span><span>-</span><span> </span><span>name:</span><span> </span><span>打印磁盘信息</span></div></div><div><div><div>17</div></div><div><span>      </span><span>debug:</span><span>              </span><span># 调用debug模块输出变量</span></div></div><div><div><div>18</div></div><div><span>        </span><span>var:</span><span> </span><span>df_result.stdout_lines</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>2.3.2 带变量 + 提权的 Playbook<a href="#232-带变量--提权的-playbook"><span>#</span></a></h3><p>功能：给 webservers 组的主机安装 Nginx，修改监听端口，启动服务（普通用户提权执行）。</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># filename: install_nginx.yml</span></div></div><div><div><div>2</div></div><div><span>-</span><span> </span><span>name:</span><span> </span><span>安装并配置Nginx</span></div></div><div><div><div>3</div></div><div><span>  </span><span>hosts:</span><span> </span><span>webservers</span><span>    </span><span># 目标主机：webservers组</span></div></div><div><div><div>4</div></div><div><span>  </span><span>remote_user:</span><span> </span><span>centos</span><span>  </span><span># 普通用户（需有sudo权限）</span></div></div><div><div><div>5</div></div><div><span>  </span><span>become:</span><span> </span><span>true</span><span>         </span><span># 开启提权（默认提权到root）</span></div></div><div><div><div>6</div></div><div><span>  </span><span>become_method:</span><span> </span><span>sudo</span><span>  </span><span># 提权方式：sudo</span></div></div><div><div><div>7</div></div><div><span>  </span><span>vars:</span><span>                </span><span># 定义变量</span></div></div><div><div><div>8</div></div><div><span>    </span><span>nginx_port:</span><span> </span><span>8080</span><span>   </span><span># Nginx监听端口</span></div></div><div><div><div>9</div></div><div><span>    </span><span>nginx_conf:</span><span> </span><span>/etc/nginx/nginx.conf</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>  </span><span>tasks:</span></div></div><div><div><div>12</div></div><div><span>    </span><span>-</span><span> </span><span>name:</span><span> </span><span>安装EPEL源（CentOS）</span></div></div><div><div><div>13</div></div><div><span>      </span><span>yum:</span></div></div><div><div><div>14</div></div><div><span>        </span><span>name:</span><span> </span><span>epel-release</span></div></div><div><div><div>15</div></div><div><span>        </span><span>state:</span><span> </span><span>present</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>    </span><span>-</span><span> </span><span>name:</span><span> </span><span>安装Nginx</span></div></div><div><div><div>18</div></div><div><span>      </span><span>yum:</span></div></div><div><div><div>19</div></div><div><span>        </span><span>name:</span><span> </span><span>nginx</span></div></div><div><div><div>20</div></div><div><span>        </span><span>state:</span><span> </span><span>present</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>    </span><span>-</span><span> </span><span>name:</span><span> </span><span>修改Nginx监听端口</span></div></div><div><div><div>23</div></div><div><span>      </span><span>lineinfile:</span><span>       </span><span># 调用lineinfile模块修改配置文件</span></div></div><div><div><div>24</div></div><div><span>        </span><span>path:</span><span> </span><span>"{{ nginx_conf }}"</span><span>  </span><span># 引用变量（用{{ }}）</span></div></div><div><div><div>25</div></div><div><span>        </span><span>regexp:</span><span> </span><span>'^listen\s+80;'</span><span>   </span><span># 匹配以listen开头、后跟80的行</span></div></div><div><div><div>26</div></div><div><span>        </span><span>line:</span><span> </span><span>"listen {{ nginx_port }};"</span><span>  </span><span># 替换为变量端口</span></div></div><div><div><div>27</div></div><div><span>        </span><span>backup:</span><span> </span><span>yes</span><span>     </span><span># 修改前备份配置文件</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>    </span><span>-</span><span> </span><span>name:</span><span> </span><span>启动并开机自启Nginx</span></div></div><div><div><div>30</div></div><div><span>      </span><span>service:</span></div></div><div><div><div>31</div></div><div><span>        </span><span>name:</span><span> </span><span>nginx</span></div></div><div><div><div>32</div></div><div><span>        </span><span>state:</span><span> </span><span>started</span></div></div><div><div><div>33</div></div><div><span>        </span><span>enabled:</span><span> </span><span>true</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>2.3.3 带 Handlers 的 Playbook<a href="#233-带-handlers-的-playbook"><span>#</span></a></h3><p>Handlers 是「懒执行」的任务，只有被<code>notify</code>触发时才会执行（适合修改配置后重启服务）。</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># filename: nginx_with_handler.yml</span></div></div><div><div><div>2</div></div><div><span>-</span><span> </span><span>name:</span><span> </span><span>Nginx配置修改+重启（Handlers示例）</span></div></div><div><div><div>3</div></div><div><span>  </span><span>hosts:</span><span> </span><span>webservers</span></div></div><div><div><div>4</div></div><div><span>  </span><span>remote_user:</span><span> </span><span>root</span></div></div><div><div><div>5</div></div><div><span>  </span><span>vars:</span></div></div><div><div><div>6</div></div><div><span>    </span><span>nginx_port:</span><span> </span><span>8081</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>  </span><span>tasks:</span></div></div><div><div><div>9</div></div><div><span>    </span><span>-</span><span> </span><span>name:</span><span> </span><span>修改Nginx监听端口</span></div></div><div><div><div>10</div></div><div><span>      </span><span>lineinfile:</span></div></div><div><div><div>11</div></div><div><span>        </span><span>path:</span><span> </span><span>/etc/nginx/nginx.conf</span></div></div><div><div><div>12</div></div><div><span>        </span><span>regexp:</span><span> </span><span>'^listen\s+8080;'</span></div></div><div><div><div>13</div></div><div><span>        </span><span>line:</span><span> </span><span>"listen {{ nginx_port }};"</span></div></div><div><div><div>14</div></div><div><span>      </span><span>notify:</span><span> </span><span>重启Nginx</span><span>  </span><span># 上面任务执行成功后，触发Handlers中的「重启Nginx」</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>  </span><span>handlers:</span><span>  </span><span># 定义Handlers（触发式任务）</span></div></div><div><div><div>17</div></div><div><span>    </span><span>-</span><span> </span><span>name:</span><span> </span><span>重启Nginx</span></div></div><div><div><div>18</div></div><div><span>      </span><span>service:</span></div></div><div><div><div>19</div></div><div><span>        </span><span>name:</span><span> </span><span>nginx</span></div></div><div><div><div>20</div></div><div><span>        </span><span>state:</span><span> </span><span>restarted</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>只有「修改端口」任务实际修改了配置文件（状态为 changed），才会触发重启；如果配置文件无变化（状态为 ok），则不会重启。</p></section><section><h3>2.3.4 多 Play 的 Playbook<a href="#234-多-play-的-playbook"><span>#</span></a></h3><p>一个 Playbook 可以包含多个 Play，每个 Play 针对不同主机 / 组执行不同任务。</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># filename: multi_play.yml</span></div></div><div><div><div>2</div></div><div><span># Play1：给webservers组安装Nginx</span></div></div><div><div><div>3</div></div><div><span>-</span><span> </span><span>name:</span><span> </span><span>配置web服务器</span></div></div><div><div><div>4</div></div><div><span>  </span><span>hosts:</span><span> </span><span>webservers</span></div></div><div><div><div>5</div></div><div><span>  </span><span>remote_user:</span><span> </span><span>root</span></div></div><div><div><div>6</div></div><div><span>  </span><span>tasks:</span></div></div><div><div><div>7</div></div><div><span>    </span><span>-</span><span> </span><span>name:</span><span> </span><span>安装Nginx</span></div></div><div><div><div>8</div></div><div><span>      </span><span>yum:</span><span> </span><span>name=nginx</span><span> </span><span>state=present</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># Play2：给dbservers组安装MySQL</span></div></div><div><div><div>11</div></div><div><span>-</span><span> </span><span>name:</span><span> </span><span>配置数据库服务器</span></div></div><div><div><div>12</div></div><div><span>  </span><span>hosts:</span><span> </span><span>dbservers</span></div></div><div><div><div>13</div></div><div><span>  </span><span>remote_user:</span><span> </span><span>root</span></div></div><div><div><div>14</div></div><div><span>  </span><span>tasks:</span></div></div><div><div><div>15</div></div><div><span>    </span><span>-</span><span> </span><span>name:</span><span> </span><span>安装MySQL</span></div></div><div><div><div>16</div></div><div><span>      </span><span>yum:</span><span> </span><span>name=mariadb-server</span><span> </span><span>state=present</span></div></div><div><div><div>17</div></div><div><span>    </span><span>-</span><span> </span><span>name:</span><span> </span><span>启动MySQL</span></div></div><div><div><div>18</div></div><div><span>      </span><span>service:</span><span> </span><span>name=mariadb</span><span> </span><span>state=started</span><span> </span><span>enabled=</span><span>true</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>2.3.5 风格yaml示例对比<a href="#235-风格yaml示例对比"><span>#</span></a></h3><p>字典风格：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>---</span></div></div><div><div><div>2</div></div><div><span>-</span><span> </span><span>name:</span><span> </span><span>这是一个安装nginx的剧本</span></div></div><div><div><div>3</div></div><div><span>  </span><span>hosts:</span><span> </span><span>172.16.1.7,172.16.1.8,nfs</span></div></div><div><div><div>4</div></div><div><span>  </span><span>tasks:</span></div></div><div><div><div>5</div></div><div><span>  </span><span>-</span><span> </span><span>name:</span><span> </span><span>01</span><span> </span><span>安装nginx</span></div></div><div><div><div>6</div></div><div><span>    </span><span>yum:</span></div></div><div><div><div>7</div></div><div><span>      </span><span>name:</span><span> </span><span>nginx</span><span>  </span><span># 值之间是以键值对的形式表示的</span></div></div><div><div><div>8</div></div><div><span>      </span><span>state:</span><span> </span><span>installed</span></div></div><div><div><div>9</div></div><div><span>  </span><span>-</span><span> </span><span>name:</span><span> </span><span>02</span><span> </span><span>启动nginx</span></div></div><div><div><div>10</div></div><div><span>    </span><span>systemd:</span></div></div><div><div><div>11</div></div><div><span>      </span><span>name:</span><span> </span><span>nginx</span></div></div><div><div><div>12</div></div><div><span>      </span><span>state:</span><span> </span><span>started</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>变量风格：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>---</span></div></div><div><div><div>2</div></div><div><span>-</span><span> </span><span>name:</span><span> </span><span>这是一个安装nginx的剧本</span></div></div><div><div><div>3</div></div><div><span>  </span><span>hosts:</span><span> </span><span>172.16.1.7,172.16.1.8,nfs</span></div></div><div><div><div>4</div></div><div><span>  </span><span>tasks:</span></div></div><div><div><div>5</div></div><div><span>  </span><span>-</span><span> </span><span>name:</span><span> </span><span>01</span><span> </span><span>安装nginx</span></div></div><div><div><div>6</div></div><div><span>    </span><span>yum:</span><span> </span><span>name=nginx</span><span> </span><span>state=installed</span><span>   </span><span>#模块下的参数以变量的形式表示</span></div></div><div><div><div>7</div></div><div><span>  </span><span>-</span><span> </span><span>name:</span><span> </span><span>02</span><span> </span><span>启动nginx</span></div></div><div><div><div>8</div></div><div><span>    </span><span>systemd:</span><span> </span><span>name=nginx</span><span> </span><span>state=started</span></div></div><div><div><div>9</div></div><div><span>  </span><span>-</span><span> </span><span>name:</span><span> </span><span>03</span><span> </span><span>设置nginx开机自启</span></div></div><div><div><div>10</div></div><div><span>    </span><span>systemd:</span><span> </span><span>name=nginx</span><span> </span><span>enabled=yes</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>2.4 使用循环变量多任务的playbook<a href="#24-使用循环变量多任务的playbook"><span>#</span></a></h2><section><h3>2.4.1 核心定义<a href="#241-核心定义"><span>#</span></a></h3>

<table><thead><tr><th>参数</th><th>类型 / 性质</th><th>核心作用</th></tr></thead><tbody><tr><td><code>loop</code></td><td>任务级关键字</td><td>指定<strong>循环的数据源</strong>（通常是列表、字典列表等），让当前任务按数据源重复执行</td></tr><tr><td><code>item</code></td><td>内置循环变量</td><td>Ansible 自动生成，代表<code>loop</code>列表中<strong>当前迭代的元素</strong>，仅在循环任务内有效</td></tr></tbody></table><p>简单来说：<code>loop</code>告诉 Ansible“要循环多少次、每次用什么数据”，<code>item</code>告诉 Ansible “本次循环该用列表里的哪一个数据”。</p></section><section><h3>2.4.2 具体示例<a href="#242-具体示例"><span>#</span></a></h3><div><div><div><figure><figcaption><span>install_rsync.yml</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>- </span><span>hosts</span><span>: </span><span>test</span></div></div><div><div><div>2</div></div><div><span>  </span><span>vars</span><span>:</span></div></div><div><div><div>3</div></div><div><span>    </span><span>user_id</span><span>: </span><span>'666'</span></div></div><div><div><div>4</div></div><div><span>    </span><span>rsync_user</span><span>: </span><span>'www'</span></div></div><div><div><div>5</div></div><div><span>  </span><span>tasks</span><span>:</span></div></div><div><div><div>6</div></div><div><span>  </span><span># 1.创建www用户和组</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>- </span><span>name</span><span>: </span><span>01_create_group</span></div></div><div><div><div>8</div></div><div><span>    </span><span>group</span><span>:</span></div></div><div><div><div>9</div></div><div><span>      </span><span>name</span><span>: </span><span>"{{ rsync_user }}"</span></div></div><div><div><div>10</div></div><div><span>      </span><span>gid</span><span>: </span><span>"{{ user_id }}"</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>  </span><span># 2.创建www用户</span></div></div><div><div><div>13</div></div><div><span><span>  </span></span><span>- </span><span>name</span><span>: </span><span>02_create_user</span></div></div><div><div><div>14</div></div><div><span>    </span><span>user</span><span>:</span></div></div><div><div><div>15</div></div><div><span>      </span><span>name</span><span>: </span><span>"{{ rsync_user }}"</span></div></div><div><div><div>16</div></div><div><span>      </span><span>gid</span><span>: </span><span>"{{ user_id }}"</span></div></div><div><div><div>17</div></div><div><span>      </span><span>group</span><span>: </span><span>"{{ rsync_user}}"</span></div></div><div><div><div>18</div></div><div><span>      </span><span>create_home</span><span>: </span><span>no</span></div></div><div><div><div>19</div></div><div><span>      </span><span>shell</span><span>: </span><span>/sbin/nologin</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>  </span><span># 3.创建数据目录且授权</span></div></div><div><div><div>22</div></div><div><span><span>  </span></span><span>- </span><span>name</span><span>: </span><span>03_createUdata</span></div></div><div><div><div>23</div></div><div><span>    </span><span>file</span><span>:</span></div></div><div><div><div>24</div></div><div><span>      </span><span>path</span><span>: </span><span>"{{ item }}"</span></div></div><div><div><div>25</div></div><div><span>      </span><span>state</span><span>: </span><span>direcotry</span></div></div><div><div><div>26</div></div><div><span>      </span><span>owner</span><span>: </span><span>"{{ rsync_user }}"</span></div></div><div><div><div>27</div></div><div><span>      </span><span>group</span><span>: </span><span>"{{ rsync_user}}"</span></div></div><div><div><div>28</div></div><div><span>      </span><span>mode</span><span>: </span><span>"755"</span></div></div><div><div><div>29</div></div><div><span>    </span><span>loop</span><span>:</span></div></div><div><div><div>30</div></div><div><span><span>      </span></span><span>- </span><span>/data</span></div></div><div><div><div>31</div></div><div><span><span>      </span></span><span>- </span><span>/backup</span></div></div><div><div><div>32</div></div><div><span>  </span><span># 4.安装rsync软件</span></div></div><div><div><div>33</div></div><div><span><span>  </span></span><span>- </span><span>name</span><span>: </span><span>04_install_rsync</span></div></div><div><div><div>34</div></div><div><span>    </span><span>yum</span><span>:</span></div></div><div><div><div>35</div></div><div><span>      </span><span>name</span><span>: </span><span>rsync</span></div></div><div><div><div>36</div></div><div><span>      </span><span>state</span><span>: </span><span>latest</span></div></div><div><div><div>37</div></div><div><span>  </span><span># 5.复制配置文件与密码文件</span></div></div><div><div><div>38</div></div><div><span><span>  </span></span><span>- </span><span>name</span><span>: </span><span>05_copy_config</span></div></div><div><div><div>39</div></div><div><span>    </span><span>copy</span><span>:</span></div></div><div><div><div>40</div></div><div><span>      </span><span>src</span><span>: </span><span>"{{ item.src }}"</span></div></div><div><div><div>41</div></div><div><span>      </span><span>dest</span><span>: </span><span>/etc/</span></div></div><div><div><div>42</div></div><div><span>      </span><span>mode</span><span>: </span><span>"{{ item.mode }}"</span></div></div><div><div><div>43</div></div><div><span>    </span><span>notify</span><span>:</span></div></div><div><div><div>44</div></div><div><span><span>      </span></span><span>- </span><span>restart_rsyncd</span></div></div><div><div><div>45</div></div><div><span>    </span><span>loop</span><span>:</span></div></div><div><div><div>46</div></div><div><span><span>      </span></span><span>- { </span><span>src:/script/rsyncd.conf</span><span>,</span><span>mode:'644'</span><span>}</span></div></div><div><div><div>47</div></div><div><span><span>      </span></span><span>- { </span><span>src:/script/rsync.passwd</span><span>,</span><span>mode:'600'</span><span>}</span></div></div><div><div><div>48</div></div><div>
</div></div><div><div><div>49</div></div><div><span>  </span><span># 6.启动服务</span></div></div><div><div><div>50</div></div><div><span><span>  </span></span><span>- </span><span>name</span><span>: </span><span>06_start_rsync</span></div></div><div><div><div>51</div></div><div><span>    </span><span>systemd</span><span>:</span></div></div><div><div><div>52</div></div><div><span>      </span><span>name</span><span>: </span><span>rsyncd</span></div></div><div><div><div>53</div></div><div><span>      </span><span>state</span><span>: </span><span>started</span></div></div><div><div><div>54</div></div><div><span>      </span><span>enabled</span><span>: </span><span>yes</span></div></div><div><div><div>55</div></div><div><span>  </span><span># 7.重启服务</span></div></div><div><div><div>56</div></div><div><span>  </span><span>handlers</span><span>:</span></div></div><div><div><div>57</div></div><div><span><span>    </span></span><span>- </span><span>name</span><span>: </span><span>restart_rsyncd</span></div></div><div><div><div>58</div></div><div><span>      </span><span>systemd</span><span>:</span></div></div><div><div><div>59</div></div><div><span>        </span><span>name</span><span>: </span><span>rsyncd</span></div></div><div><div><div>60</div></div><div><span>        </span><span>state</span><span>: </span><span>restarted</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section></section>
<section><h1>三、json语法<a href="#三json语法"><span>#</span></a></h1><ol>
<li>
<p><strong>数据组织形式</strong>：JSON 的顶层只能是两种结构 ——<code>对象（{}）</code> 或 <code>数组（[]）</code>（单个值如 “hello” 虽部分解析器兼容，但不符合标准语法）。</p>
</li>
<li>
<p><strong>键值对规则</strong>（仅对象）：</p>
<ul>
<li>
<p>键（key）必须用<strong>双引号</strong>包裹（单引号 / 无引号都不合法）；</p>
</li>
<li>
<p>键和值之间用冒号<code>:</code>分隔；</p>
</li>
<li>
<p>多个键值对用逗号<code>,</code>分隔，<strong>最后一个键值对不能加逗号</strong>（尾逗号非法）。</p>
</li>
</ul>
</li>
<li>
<p><strong>支持的数据类型</strong>：</p>
<ul>
<li>
<p>字符串（String）：双引号包裹，支持转义字符（\n、\t、”、\ 等）；</p>
</li>
<li>
<p>数字（Number）：整数、浮点数、负数、科学计数法（如 123、-45.6、7.8e9）；</p>
</li>
<li>
<p>布尔值（Boolean）：仅<code>true</code>/<code>false</code>（小写，区分 Python 的 True/False）；</p>
</li>
<li>
<p>空值（Null）：仅<code>null</code>（小写，区分 Python 的 None）；</p>
</li>
<li>
<p>数组（Array）：方括号包裹，元素用逗号分隔，元素可以是任意合法 JSON 类型；</p>
</li>
<li>
<p>对象（Object）：大括号包裹，由键值对组成。</p>
</li>
</ul>
</li>
<li>
<p><strong>其他限制</strong>：标准 JSON<strong>不支持注释</strong>（// 或 /* */），如需注释需使用 JSON5 等扩展格式。</p>
</li>
</ol><section><h2>3.1 json示例<a href="#31-json示例"><span>#</span></a></h2><section><h3>3.1.1 基础json对象<a href="#311-基础json对象"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>{</span></div></div><div><div><div>2</div></div><div><span>  </span><span>"name"</span><span>: </span><span>"张三"</span><span>,</span></div></div><div><div><div>3</div></div><div><span>  </span><span>"age"</span><span>: </span><span>25</span><span>,</span></div></div><div><div><div>4</div></div><div><span>  </span><span>"isStudent"</span><span>: </span><span>false</span><span>,</span></div></div><div><div><div>5</div></div><div><span>  </span><span>"score"</span><span>: </span><span>98.5</span><span>,</span></div></div><div><div><div>6</div></div><div><span>  </span><span>"hobby"</span><span>: </span><span>null</span><span>,</span></div></div><div><div><div>7</div></div><div><span>  </span><span>"address"</span><span>: {</span></div></div><div><div><div>8</div></div><div><span>    </span><span>"province"</span><span>: </span><span>"广东省"</span><span>,</span></div></div><div><div><div>9</div></div><div><span>    </span><span>"city"</span><span>: </span><span>"深圳市"</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>11</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p><strong>说明：</strong></p><p><code>name</code>是键，必须用双引号；<code>"张三"</code>是字符串值，也必须用双引号；</p><p><code>age</code>的值是数字，无需引号；<code>isStudent</code>是布尔值，小写 false；</p><p><code>address</code>的值是嵌套对象，符合 “对象可以嵌套对象” 的规则。</p></blockquote></section><section><h3>3.1.2 json数组<a href="#312-json数组"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>{</span></div></div><div><div><div>3</div></div><div><span>    </span><span>"id"</span><span>: </span><span>1001</span><span>,</span></div></div><div><div><div>4</div></div><div><span>    </span><span>"name"</span><span>: </span><span>"手机"</span><span>,</span></div></div><div><div><div>5</div></div><div><span>    </span><span>"price"</span><span>: </span><span>2999.99</span><span>,</span></div></div><div><div><div>6</div></div><div><span>    </span><span>"tags"</span><span>: [</span><span>"智能"</span><span>, </span><span>"5G"</span><span>, </span><span>"大屏"</span><span>]</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>{</span></div></div><div><div><div>9</div></div><div><span>    </span><span>"id"</span><span>: </span><span>1002</span><span>,</span></div></div><div><div><div>10</div></div><div><span>    </span><span>"name"</span><span>: </span><span>"耳机"</span><span>,</span></div></div><div><div><div>11</div></div><div><span>    </span><span>"price"</span><span>: </span><span>199.0</span><span>,</span></div></div><div><div><div>12</div></div><div><span>    </span><span>"tags"</span><span>: [</span><span>"无线"</span><span>, </span><span>"降噪"</span><span>]</span></div></div><div><div><div>13</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span>]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p><strong>说明：</strong></p><p>​	顶层是数组，包含两个对象元素；</p><p>​	<code>tags</code>的值是字符串数组，数组元素用逗号分隔，最后一个元素无尾逗号。</p></blockquote></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/ansible%E7%9A%84role%E8%A7%92%E8%89%B2/</id>
      <title type="text">ansible的role角色</title>
      <published>2026-08-04T00:00:00.000Z</published>
      <updated>2026-08-04T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/ansible%E7%9A%84role%E8%A7%92%E8%89%B2/"/>
      <summary type="text">ansible的role角色</summary>
      <content type="html"><![CDATA[<section><h1>一、role角色概念<a href="#一role角色概念"><span>#</span></a></h1><p>Role 本质是按<strong>固定目录规范</strong>组织 Ansible 任务、变量、文件、模板等资源的集合。Ansible 会自动识别这些目录并加载对应内容，无需手动指定路径。</p><blockquote><p>(简单理解就是role角色的概念就是<code>将原本糅合在一个yaml文件里的模块任务分别拆分归类到各自的目录当中</code>)</p></blockquote><section><h2>1.1 role角色标准目录结构<a href="#11-role角色标准目录结构"><span>#</span></a></h2><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>roles/</span><span>                  </span><span># 所有角色的根目录（可自定义，建议默认）</span></div></div><div><div><div>2</div></div><div><span>├──</span><span> </span><span>第一个角色名/</span><span>             </span><span># 单个角色的目录（比如nginx、mysql）</span></div></div><div><div><div>3</div></div><div><span>│</span><span>   </span><span>├──</span><span> </span><span>defaults/</span><span>       </span><span># 【默认变量】优先级最低，可被用户覆盖</span></div></div><div><div><div>4</div></div><div><span>│</span><span>   </span><span>│</span><span>   </span><span>└──</span><span> </span><span>main.yml</span><span>    </span><span># 变量定义文件（必须命名为main.yml）</span></div></div><div><div><div>5</div></div><div><span>│</span><span>   </span><span>├──</span><span> </span><span>files/</span><span>          </span><span># 【静态文件】无需模板渲染的文件（如二进制包、静态配置）</span></div></div><div><div><div>6</div></div><div><span>│</span><span>   </span><span>├──</span><span> </span><span>handlers/</span><span>       </span><span># 【处理器】触发式任务（如重启服务、重载配置）</span></div></div><div><div><div>7</div></div><div><span>│</span><span>   </span><span>│</span><span>   </span><span>└──</span><span> </span><span>main.yml</span></div></div><div><div><div>8</div></div><div><span>│</span><span>   </span><span>├──</span><span> </span><span>meta/</span><span>           </span><span># 【元数据】角色依赖、作者、版本等信息</span></div></div><div><div><div>9</div></div><div><span>│</span><span>   </span><span>│</span><span>   </span><span>└──</span><span> </span><span>main.yml</span></div></div><div><div><div>10</div></div><div><span>│</span><span>   </span><span>├──</span><span> </span><span>tasks/</span><span>          </span><span># 【核心任务】角色要执行的具体操作（必须有main.yml）</span></div></div><div><div><div>11</div></div><div><span>│</span><span>   </span><span>│</span><span>   </span><span>└──</span><span> </span><span>main.yml</span></div></div><div><div><div>12</div></div><div><span>│</span><span>   </span><span>├──</span><span> </span><span>templates/</span><span>      </span><span># 【Jinja2模板】需要变量渲染的配置文件（如nginx.conf.j2）</span></div></div><div><div><div>13</div></div><div><span>│</span><span>   </span><span>├──</span><span> </span><span>tests/</span><span>          </span><span># 【测试用例】角色的测试脚本（可选）</span></div></div><div><div><div>14</div></div><div><span>│</span><span>   </span><span>│</span><span>   </span><span>├──</span><span> </span><span>inventory</span><span>   </span><span># 测试用清单</span></div></div><div><div><div>15</div></div><div><span>│</span><span>   </span><span>│</span><span>   </span><span>└──</span><span> </span><span>test.yml</span><span>    </span><span># 测试用Playbook</span></div></div><div><div><div>16</div></div><div><span>│</span><span>   </span><span>└──</span><span> </span><span>vars/</span><span>           </span><span># 【自定义变量】优先级高，一般为角色内部固定变量</span></div></div><div><div><div>17</div></div><div><span>│</span><span>       </span><span>└──</span><span> </span><span>main.yml</span></div></div><div><div><div>18</div></div><div><span>├──</span><span> </span><span>第二个角色名/</span><span>             </span><span># 角色的目录（比如nginx、mysql）</span></div></div><div><div><div>19</div></div><div><span>│</span><span>   </span><span>├──</span><span> </span><span>defaults/</span><span>       </span><span># 【默认变量】优先级最低，可被用户覆盖</span></div></div><div><div><div>20</div></div><div><span>│</span><span>   </span><span>│</span><span>   </span><span>└──</span><span> </span><span>main.yml</span><span>    </span><span># 变量定义文件（必须命名为main.yml）</span></div></div><div><div><div>21</div></div><div><span>│</span><span>   </span><span>├──</span><span> </span><span>files/</span><span>          </span><span># 【静态文件】无需模板渲染的文件（如二进制包、静态配置）</span></div></div><div><div><div>22</div></div><div><span>│</span><span>   </span><span>├──</span><span> </span><span>handlers/</span><span>       </span><span># 【处理器】触发式任务（如重启服务、重载配置）</span></div></div><div><div><div>23</div></div><div><span>│</span><span>   </span><span>│</span><span>   </span><span>└──</span><span> </span><span>main.yml</span></div></div><div><div><div>24</div></div><div><span>│</span><span>   </span><span>├──</span><span> </span><span>meta/</span><span>           </span><span># 【元数据】角色依赖、作者、版本等信息</span></div></div><div><div><div>25</div></div><div><span>│</span><span>   </span><span>│</span><span>   </span><span>└──</span><span> </span><span>main.yml</span></div></div><div><div><div>26</div></div><div><span>│</span><span>   </span><span>├──</span><span> </span><span>tasks/</span><span>          </span><span># 【核心任务】角色要执行的具体操作（必须有main.yml）</span></div></div><div><div><div>27</div></div><div><span>│</span><span>   </span><span>│</span><span>   </span><span>└──</span><span> </span><span>main.yml</span></div></div><div><div><div>28</div></div><div><span>│</span><span>   </span><span>├──</span><span> </span><span>templates/</span><span>      </span><span># 【Jinja2模板】需要变量渲染的配置文件（如nginx.conf.j2）</span></div></div><div><div><div>29</div></div><div><span>│</span><span>   </span><span>├──</span><span> </span><span>tests/</span><span>          </span><span># 【测试用例】角色的测试脚本（可选）</span></div></div><div><div><div>30</div></div><div><span>│</span><span>   </span><span>│</span><span>   </span><span>├──</span><span> </span><span>inventory</span><span>   </span><span># 测试用清单</span></div></div><div><div><div>31</div></div><div><span>│</span><span>   </span><span>│</span><span>   </span><span>└──</span><span> </span><span>test.yml</span><span>    </span><span># 测试用Playbook</span></div></div><div><div><div>32</div></div><div><span>│</span><span>   </span><span>└──</span><span> </span><span>vars/</span><span>           </span><span># 【自定义变量】优先级高，一般为角色内部固定变量</span></div></div><div><div><div>33</div></div><div><span>│</span><span>       </span><span>└──</span><span> </span><span>main.yml</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><p><strong>role文件夹下可以有多个角色，playbook通过role参数调用不同的角色</strong></p></blockquote><section><h3>1.1.1 快捷创建标准目录<a href="#111-快捷创建标准目录"><span>#</span></a></h3><p>用<code>ansible-galaxy init</code>命令自动生成标准化目录（避免手动建目录出错）：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 创建nginx角色，指定存放路径为/etc/ansible/roles/nginx</span></div></div><div><div><div>2</div></div><div><span>ansible-galaxy</span><span> </span><span>init</span><span> </span><span>/etc/ansible/roles/nginx</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.1.2 目录优先级<a href="#112-目录优先级"><span>#</span></a></h3><p><code>vars/main.yml</code> &gt; <code>defaults/main.yml</code>：vars 里的变量优先级更高，一般用于角色内部固定值；defaults 用于可被用户覆盖的默认值。</p><p>角色内变量 <code>小于</code> Playbook 中定义的变量 <code>小于</code> 命令行<code>-e</code>传递的变量：用户可灵活覆盖角色默认配置。</p></section></section><section><h2>1.2  编写role核心文件<a href="#12--编写role核心文件"><span>#</span></a></h2><section><h3>1.2.1 defaults/main.yml（默认变量，可被覆盖）<a href="#121-defaultsmainyml默认变量可被覆盖"><span>#</span></a></h3><p>定义 Nginx 的默认端口、文档根目录等可配置项：</p><div><figure><figcaption><span>/etc/ansible/roles/nginx/defaults/main.yml</span></figcaption><pre><code><div><div><div>1</div></div><div><span>nginx_port:</span><span> </span><span>80</span><span>                </span><span># 默认监听80端口</span></div></div><div><div><div>2</div></div><div><span>nginx_docroot:</span><span> </span><span>/usr/share/nginx/html</span><span>  </span><span># 默认文档根目录</span></div></div><div><div><div>3</div></div><div><span>nginx_conf_path:</span><span> </span><span>/etc/nginx/nginx.conf</span><span>  </span><span># 配置文件路径</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.2.2 vars/main.yml（角色内部固定变量）<a href="#122-varsmainyml角色内部固定变量"><span>#</span></a></h3><p>定义无需用户修改的固定值（如包名、服务名）：</p><div><figure><figcaption><span>/etc/ansible/roles/nginx/vars/main.yml</span></figcaption><pre><code><div><div><div>1</div></div><div><span>nginx_package:</span><span> </span><span>nginx</span><span>          </span><span># Nginx包名</span></div></div><div><div><div>2</div></div><div><span>nginx_service:</span><span> </span><span>nginx</span><span>          </span><span># Nginx服务名</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.2.3 tasks/main.yml（核心执行任务）<a href="#123-tasksmainyml核心执行任务"><span>#</span></a></h3><p>编写安装、配置、启动 Nginx 的具体步骤：</p><div><div><div><figure><figcaption><span>/etc/ansible/roles/nginx/tasks/main.yml</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 1. 安装Nginx（CentOS用yum，Ubuntu可换apt）</span></div></div><div><div><div>2</div></div><div><span>-</span><span> </span><span>name:</span><span> </span><span>安装Nginx软件包</span></div></div><div><div><div>3</div></div><div><span>  </span><span>yum:</span></div></div><div><div><div>4</div></div><div><span>    </span><span>name:</span><span> </span><span>"{{ nginx_package }}"</span><span>  </span><span># 变量放在vars/main.yml</span></div></div><div><div><div>5</div></div><div><span>    </span><span>state:</span><span> </span><span>present</span><span>  </span><span># 确保包存在</span></div></div><div><div><div>6</div></div><div><span>  </span><span>become:</span><span> </span><span>yes</span><span>       </span><span># 提权执行</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 2. 渲染并拷贝Nginx配置模板</span></div></div><div><div><div>9</div></div><div><span>-</span><span> </span><span>name:</span><span> </span><span>拷贝Nginx配置模板</span></div></div><div><div><div>10</div></div><div><span>  </span><span>template:</span></div></div><div><div><div>11</div></div><div><span>    </span><span>src:</span><span> </span><span>nginx.conf.j2</span><span>        </span><span># 模板文件（放在templates目录）</span></div></div><div><div><div>12</div></div><div><span>    </span><span>dest:</span><span> </span><span>"{{ nginx_conf_path }}"</span><span>  </span><span># 目标路径</span></div></div><div><div><div>13</div></div><div><span>    </span><span>mode:</span><span> </span><span>0644</span><span>                </span><span># 文件权限</span></div></div><div><div><div>14</div></div><div><span>  </span><span>become:</span><span> </span><span>yes</span></div></div><div><div><div>15</div></div><div><span>  </span><span>notify:</span><span> </span><span>重启Nginx</span><span>           </span><span># 配置变更时触发处理器</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span># 3. 创建文档根目录</span></div></div><div><div><div>18</div></div><div><span>-</span><span> </span><span>name:</span><span> </span><span>创建Nginx文档根目录</span></div></div><div><div><div>19</div></div><div><span>  </span><span>file:</span></div></div><div><div><div>20</div></div><div><span>    </span><span>path:</span><span> </span><span>"{{ nginx_docroot }}"</span></div></div><div><div><div>21</div></div><div><span>    </span><span>state:</span><span> </span><span>directory</span><span>          </span><span># 确保目录存在</span></div></div><div><div><div>22</div></div><div><span>    </span><span>mode:</span><span> </span><span>0755</span></div></div><div><div><div>23</div></div><div><span>  </span><span>become:</span><span> </span><span>yes</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span># 4. 启动并启用Nginx服务</span></div></div><div><div><div>26</div></div><div><span>-</span><span> </span><span>name:</span><span> </span><span>启动并设置Nginx开机自启</span></div></div><div><div><div>27</div></div><div><span>  </span><span>service:</span></div></div><div><div><div>28</div></div><div><span>    </span><span>name:</span><span> </span><span>"{{ nginx_service }}"</span></div></div><div><div><div>29</div></div><div><span>    </span><span>state:</span><span> </span><span>started</span><span>            </span><span># 启动服务</span></div></div><div><div><div>30</div></div><div><span>    </span><span>enabled:</span><span> </span><span>yes</span><span>              </span><span># 开机自启</span></div></div><div><div><div>31</div></div><div><span>  </span><span>become:</span><span> </span><span>yes</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>1.2.4 handlers/main.yml（处理器：触发重启）<a href="#124-handlersmainyml处理器触发重启"><span>#</span></a></h3><p>配置变更后重启 Nginx，仅在任务触发时执行：</p><div><figure><figcaption><span>/etc/ansible/roles/nginx/handlers/main.yml</span></figcaption><pre><code><div><div><div>1</div></div><div><span>-</span><span> </span><span>name:</span><span> </span><span>重启Nginx</span></div></div><div><div><div>2</div></div><div><span>  </span><span>service:</span></div></div><div><div><div>3</div></div><div><span>    </span><span>name:</span><span> </span><span>"{{ nginx_service }}"</span></div></div><div><div><div>4</div></div><div><span>    </span><span>state:</span><span> </span><span>restarted</span></div></div><div><div><div>5</div></div><div><span>  </span><span>become:</span><span> </span><span>yes</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.2.5 templates/nginx.conf.j2（Jinja2 配置模板）<a href="#125-templatesnginxconfj2jinja2-配置模板"><span>#</span></a></h3><p>编写带变量的 Nginx 配置模板（简化版）：</p><div><div><div><figure><figcaption><span>/etc/ansible/roles/nginx/templates/nginx.conf.j2</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>worker_processes</span><span> </span><span>auto</span><span>;</span></div></div><div><div><div>2</div></div><div><span>error_log</span><span> </span><span>/var/log/nginx/error.log</span><span>;</span></div></div><div><div><div>3</div></div><div><span>pid</span><span> </span><span>/run/nginx.pid</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>events</span><span> </span><span>{</span></div></div><div><div><div>6</div></div><div><span>    </span><span>worker_connections</span><span> </span><span>1024</span><span>;</span></div></div><div><div><div>7</div></div><div><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>http</span><span> </span><span>{</span></div></div><div><div><div>10</div></div><div><span>    </span><span>include</span><span> </span><span>/etc/nginx/mime.types</span><span>;</span></div></div><div><div><div>11</div></div><div><span>    </span><span>default_type</span><span> </span><span>application/octet-stream</span><span>;</span></div></div><div><div><div>12</div></div><div><span>    </span><span>sendfile</span><span> </span><span>on</span><span>;</span></div></div><div><div><div>13</div></div><div><span>    </span><span>keepalive_timeout</span><span> </span><span>65</span><span>;</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>    </span><span>server</span><span> </span><span>{</span></div></div><div><div><div>16</div></div><div><span>        </span><span>listen</span><span> </span><span>{{</span><span> </span><span>nginx_port</span><span> </span><span>}}</span><span> </span><span>default_server</span><span>;  </span><span># 渲染默认端口变量</span></div></div><div><div><div>17</div></div><div><span>        </span><span>listen</span><span> [::]:{{ nginx_port }} default_server;</span></div></div><div><div><div>18</div></div><div><span>        </span><span>root</span><span> </span><span>{{</span><span> </span><span>nginx_docroot</span><span> </span><span>}}</span><span>;                </span><span># 渲染文档根目录变量</span></div></div><div><div><div>19</div></div><div><span>        </span><span>index</span><span> </span><span>index.html</span><span> </span><span>index.htm</span><span>;</span></div></div><div><div><div>20</div></div><div><span>        </span><span>server_name</span><span> </span><span>_</span><span>;</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>        </span><span>location</span><span> </span><span>/</span><span> </span><span>{</span></div></div><div><div><div>23</div></div><div><span>            </span><span>try_files</span><span> </span><span>$uri</span><span> </span><span>$uri</span><span>/</span><span> </span><span>=</span><span>404</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section><section><h2>1.3 编写 Playbook 调用 Role<a href="#13-编写-playbook-调用-role"><span>#</span></a></h2><ol>
<li>创建<code>site.yml</code>文件，指定目标主机并调用 nginx 角色：</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># site.yml，名字无固定，任意即可，只是用于调用role角色的一个yml文件</span></div></div><div><div><div>2</div></div><div><span># 调用的site.yml文件与roles目录之间也无层级要求，但一般是放于同级目录下</span></div></div><div><div><div>3</div></div><div><span># 若site.yml与role目录之间完全独立，那么可以在ansib.cfg指定查找role目录（多个路径，冒号分割）</span></div></div><div><div><div>4</div></div><div><span># 或在调用时指定role目录的绝对路径</span></div></div><div><div><div>5</div></div><div><span>-</span><span> </span><span>hosts:</span><span> </span><span>webservers</span><span>  </span><span># 目标主机组（需在inventory中定义）</span></div></div><div><div><div>6</div></div><div><span>  </span><span>become:</span><span> </span><span>yes</span><span>        </span><span># 全局提权</span></div></div><div><div><div>7</div></div><div><span>  </span><span>roles:</span></div></div><div><div><div>8</div></div><div><span>    </span><span>-</span><span> </span><span>role:</span><span> </span><span>nginx</span><span>    </span><span># 调用roles/nginx角色</span></div></div><div><div><div>9</div></div><div><span>      </span><span># 可选：覆盖默认变量（比如把端口改成8080）</span></div></div><div><div><div>10</div></div><div><span>      </span><span>nginx_port:</span><span> </span><span>8080</span></div></div><div><div><div>11</div></div><div><span>        </span><span>when:</span><span> </span><span>ansible_os_family</span><span> </span><span>==</span><span> </span><span>"RedHat"</span><span>  </span><span># 仅RedHat系（CentOS）执行,(可选操作)</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>执行Playbook</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># -i 指定inventory清单文件，--ask-become-pass 提权密码（可选）</span></div></div><div><div><div>2</div></div><div><span>ansible-playbook</span><span> </span><span>-i</span><span> </span><span>inventory</span><span> </span><span>site.yml</span><span> </span><span>--ask-become-pass</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>1.4 将playbook拆解成为role角色案例<a href="#14-将playbook拆解成为role角色案例"><span>#</span></a></h2><p><code>使用案例：</code>此为安装rsync的一个playbook文件</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>- </span><span>hosts</span><span>: </span><span>test</span></div></div><div><div><div>2</div></div><div><span>  </span><span>vars</span><span>:</span></div></div><div><div><div>3</div></div><div><span>    </span><span>user_id</span><span>: </span><span>'666'</span></div></div><div><div><div>4</div></div><div><span>    </span><span>rsync_user</span><span>: </span><span>'www'</span></div></div><div><div><div>5</div></div><div><span>  </span><span>tasks</span><span>:</span></div></div><div><div><div>6</div></div><div><span>  </span><span># 1.创建www用户和组</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>- </span><span>name</span><span>: </span><span>01_create_group</span></div></div><div><div><div>8</div></div><div><span>    </span><span>group</span><span>:</span></div></div><div><div><div>9</div></div><div><span>      </span><span>name</span><span>: </span><span>"{{ rsync_user }}"</span></div></div><div><div><div>10</div></div><div><span>      </span><span>gid</span><span>: </span><span>"{{ user_id }}"</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>  </span><span># 2.创建www用户</span></div></div><div><div><div>13</div></div><div><span><span>  </span></span><span>- </span><span>name</span><span>: </span><span>02_create_user</span></div></div><div><div><div>14</div></div><div><span>    </span><span>user</span><span>:</span></div></div><div><div><div>15</div></div><div><span>      </span><span>name</span><span>: </span><span>"{{ rsync_user }}"</span></div></div><div><div><div>16</div></div><div><span>      </span><span>gid</span><span>: </span><span>"{{ user_id }}"</span></div></div><div><div><div>17</div></div><div><span>      </span><span>group</span><span>: </span><span>"{{ rsync_user}}"</span></div></div><div><div><div>18</div></div><div><span>      </span><span>create_home</span><span>: </span><span>no</span></div></div><div><div><div>19</div></div><div><span>      </span><span>shell</span><span>: </span><span>/sbin/nologin</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>  </span><span># 3.创建数据目录且授权</span></div></div><div><div><div>22</div></div><div><span><span>  </span></span><span>- </span><span>name</span><span>: </span><span>03_createUdata</span></div></div><div><div><div>23</div></div><div><span>    </span><span>file</span><span>:</span></div></div><div><div><div>24</div></div><div><span>      </span><span>path</span><span>: </span><span>"{{ item }}"</span></div></div><div><div><div>25</div></div><div><span>      </span><span>state</span><span>: </span><span>direcotry</span></div></div><div><div><div>26</div></div><div><span>      </span><span>owner</span><span>: </span><span>"{{ rsync_user }}"</span></div></div><div><div><div>27</div></div><div><span>      </span><span>group</span><span>: </span><span>"{{ rsync_user}}"</span></div></div><div><div><div>28</div></div><div><span>      </span><span>mode</span><span>: </span><span>"755"</span></div></div><div><div><div>29</div></div><div><span>    </span><span>loop</span><span>:</span></div></div><div><div><div>30</div></div><div><span><span>      </span></span><span>- </span><span>/data</span></div></div><div><div><div>31</div></div><div><span><span>      </span></span><span>- </span><span>/backup</span></div></div><div><div><div>32</div></div><div><span>  </span><span># 4.安装rsync软件</span></div></div><div><div><div>33</div></div><div><span><span>  </span></span><span>- </span><span>name</span><span>: </span><span>04_install_rsync</span></div></div><div><div><div>34</div></div><div><span>    </span><span>yum</span><span>:</span></div></div><div><div><div>35</div></div><div><span>      </span><span>name</span><span>: </span><span>rsync</span></div></div><div><div><div>36</div></div><div><span>      </span><span>state</span><span>: </span><span>latest</span></div></div><div><div><div>37</div></div><div><span>  </span><span># 5.复制配置文件与密码文件</span></div></div><div><div><div>38</div></div><div><span><span>  </span></span><span>- </span><span>name</span><span>: </span><span>05_copy_config</span></div></div><div><div><div>39</div></div><div><span>    </span><span>copy</span><span>:</span></div></div><div><div><div>40</div></div><div><span>      </span><span>src</span><span>: </span><span>"{{ item.src }}"</span></div></div><div><div><div>41</div></div><div><span>      </span><span>dest</span><span>: </span><span>/etc/</span></div></div><div><div><div>42</div></div><div><span>      </span><span>mode</span><span>: </span><span>"{{ item.mode }}"</span></div></div><div><div><div>43</div></div><div><span>    </span><span>notify</span><span>:</span></div></div><div><div><div>44</div></div><div><span><span>      </span></span><span>- </span><span>restart_rsyncd</span></div></div><div><div><div>45</div></div><div><span>    </span><span>loop</span><span>:</span></div></div><div><div><div>46</div></div><div><span><span>      </span></span><span>- { </span><span>src:/script/rsyncd.conf</span><span>,</span><span>mode:'644'</span><span>}</span></div></div><div><div><div>47</div></div><div><span><span>      </span></span><span>- { </span><span>src:/script/rsync.passwd</span><span>,</span><span>mode:'600'</span><span>}</span></div></div><div><div><div>48</div></div><div>
</div></div><div><div><div>49</div></div><div><span>  </span><span># 6.启动服务</span></div></div><div><div><div>50</div></div><div><span><span>  </span></span><span>- </span><span>name</span><span>: </span><span>06_start_rsync</span></div></div><div><div><div>51</div></div><div><span>    </span><span>systemd</span><span>:</span></div></div><div><div><div>52</div></div><div><span>      </span><span>name</span><span>: </span><span>rsyncd</span></div></div><div><div><div>53</div></div><div><span>      </span><span>state</span><span>: </span><span>started</span></div></div><div><div><div>54</div></div><div><span>      </span><span>enabled</span><span>: </span><span>yes</span></div></div><div><div><div>55</div></div><div><span>  </span><span># 7.重启服务</span></div></div><div><div><div>56</div></div><div><span>  </span><span>handlers</span><span>:</span></div></div><div><div><div>57</div></div><div><span><span>    </span></span><span>- </span><span>name</span><span>: </span><span>restart_rsyncd</span></div></div><div><div><div>58</div></div><div><span>      </span><span>systemd</span><span>:</span></div></div><div><div><div>59</div></div><div><span>        </span><span>name</span><span>: </span><span>rsyncd</span></div></div><div><div><div>60</div></div><div><span>        </span><span>state</span><span>: </span><span>restarted</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><section><h3>1.4.1 创建标准目录<a href="#141-创建标准目录"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 创建install_rsync角色，指定存放路径为./roles/install_rsync</span></div></div><div><div><div>2</div></div><div><span>ansible-galaxy</span><span> </span><span>init</span><span> </span><span>./roles/install_rsync</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 展示目录结构</span></div></div><div><div><div>5</div></div><div><span>[root@mater-22 ~/ansible_role]#tree</span></div></div><div><div><div>6</div></div><div><span>.</span></div></div><div><div><div>7</div></div><div><span>└──</span><span> </span><span>roles</span></div></div><div><div><div>8</div></div><div><span>    </span><span>└──</span><span> </span><span>install_rsync</span></div></div><div><div><div>9</div></div><div><span>        </span><span>├──</span><span> </span><span>defaults</span></div></div><div><div><div>10</div></div><div><span>        </span><span>│  </span><span> </span><span>└──</span><span> </span><span>main.yml</span></div></div><div><div><div>11</div></div><div><span>        </span><span>├──</span><span> </span><span>files</span></div></div><div><div><div>12</div></div><div><span>        </span><span>├──</span><span> </span><span>handlers</span></div></div><div><div><div>13</div></div><div><span>        </span><span>│  </span><span> </span><span>└──</span><span> </span><span>main.yml</span></div></div><div><div><div>14</div></div><div><span>        </span><span>├──</span><span> </span><span>meta</span></div></div><div><div><div>15</div></div><div><span>        </span><span>│  </span><span> </span><span>└──</span><span> </span><span>main.yml</span></div></div><div><div><div>16</div></div><div><span>        </span><span>├──</span><span> </span><span>README.md</span></div></div><div><div><div>17</div></div><div><span>        </span><span>├──</span><span> </span><span>tasks</span></div></div><div><div><div>18</div></div><div><span>        </span><span>│  </span><span> </span><span>└──</span><span> </span><span>main.yml</span></div></div><div><div><div>19</div></div><div><span>        </span><span>├──</span><span> </span><span>templates</span></div></div><div><div><div>20</div></div><div><span>        </span><span>├──</span><span> </span><span>tests</span></div></div><div><div><div>21</div></div><div><span>        </span><span>│  </span><span> </span><span>├──</span><span> </span><span>inventory</span></div></div><div><div><div>22</div></div><div><span>        </span><span>│  </span><span> </span><span>└──</span><span> </span><span>test.yml</span></div></div><div><div><div>23</div></div><div><span>        </span><span>└──</span><span> </span><span>vars</span></div></div><div><div><div>24</div></div><div><span>            </span><span>└──</span><span> </span><span>main.yml</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>1.4.2 拆分tasks部分<a href="#142-拆分tasks部分"><span>#</span></a></h3><p>最先拆分tasks部分，然后根据task里面所需的配置再进行创建</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 这是原playbook的tasks部分</span></div></div><div><div><div>2</div></div><div><span>  </span><span>tasks:</span></div></div><div><div><div>3</div></div><div><span>  </span><span># 1.创建www用户和组</span></div></div><div><div><div>4</div></div><div><span>  </span><span>-</span><span> </span><span>name:</span><span> </span><span>01_create_group</span></div></div><div><div><div>5</div></div><div><span>    </span><span>group:</span></div></div><div><div><div>6</div></div><div><span>      </span><span>name:</span><span> </span><span>"{{ rsync_user }}"</span></div></div><div><div><div>7</div></div><div><span>      </span><span>gid:</span><span> </span><span>"{{ user_id }}"</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>  </span><span># 2.创建www用户</span></div></div><div><div><div>10</div></div><div><span>  </span><span>-</span><span> </span><span>name:</span><span> </span><span>02_create_user</span></div></div><div><div><div>11</div></div><div><span>    </span><span>user:</span></div></div><div><div><div>12</div></div><div><span>      </span><span>name:</span><span> </span><span>"{{ rsync_user }}"</span></div></div><div><div><div>13</div></div><div><span>      </span><span>gid:</span><span> </span><span>"{{ user_id }}"</span></div></div><div><div><div>14</div></div><div><span>      </span><span>group:</span><span> </span><span>"{{ rsync_user}}"</span></div></div><div><div><div>15</div></div><div><span>      </span><span>create_home:</span><span> </span><span>no</span></div></div><div><div><div>16</div></div><div><span>      </span><span>shell:</span><span> </span><span>/sbin/nologin</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>  </span><span># 3.创建数据目录且授权</span></div></div><div><div><div>19</div></div><div><span>  </span><span>-</span><span> </span><span>name:</span><span> </span><span>03_createUdata</span></div></div><div><div><div>20</div></div><div><span>    </span><span>file:</span></div></div><div><div><div>21</div></div><div><span>      </span><span>path:</span><span> </span><span>"{{ item }}"</span></div></div><div><div><div>22</div></div><div><span>      </span><span>state:</span><span> </span><span>direcotry</span></div></div><div><div><div>23</div></div><div><span>      </span><span>owner:</span><span> </span><span>"{{ rsync_user }}"</span></div></div><div><div><div>24</div></div><div><span>      </span><span>group:</span><span> </span><span>"{{ rsync_user}}"</span></div></div><div><div><div>25</div></div><div><span>      </span><span>mode:</span><span> </span><span>"755"</span></div></div><div><div><div>26</div></div><div><span>    </span><span>loop:</span></div></div><div><div><div>27</div></div><div><span>      </span><span>-</span><span> </span><span>/data</span></div></div><div><div><div>28</div></div><div><span>      </span><span>-</span><span> </span><span>/backup</span></div></div><div><div><div>29</div></div><div><span>  </span><span># 4.安装rsync软件</span></div></div><div><div><div>30</div></div><div><span>  </span><span>-</span><span> </span><span>name:</span><span> </span><span>04_install_rsync</span></div></div><div><div><div>31</div></div><div><span>    </span><span>yum:</span></div></div><div><div><div>32</div></div><div><span>      </span><span>name:</span><span> </span><span>rsync</span></div></div><div><div><div>33</div></div><div><span>      </span><span>state:</span><span> </span><span>latest</span></div></div><div><div><div>34</div></div><div><span>  </span><span># 5.复制配置文件与密码文件</span></div></div><div><div><div>35</div></div><div><span>  </span><span>-</span><span> </span><span>name:</span><span> </span><span>05_copy_config</span></div></div><div><div><div>36</div></div><div><span>    </span><span>copy:</span></div></div><div><div><div>37</div></div><div><span>      </span><span>src:</span><span> </span><span>"{{ item.src }}"</span></div></div><div><div><div>38</div></div><div><span>      </span><span>dest:</span><span> </span><span>/etc/</span></div></div><div><div><div>39</div></div><div><span>      </span><span>mode:</span><span> </span><span>"{{ item.mode }}"</span></div></div><div><div><div>40</div></div><div><span>    </span><span>notify:</span></div></div><div><div><div>41</div></div><div><span>      </span><span>-</span><span> </span><span>restart_rsyncd</span></div></div><div><div><div>42</div></div><div><span>    </span><span>loop:</span></div></div><div><div><div>43</div></div><div><span>      </span><span>-</span><span> </span><span>{</span><span> </span><span>src:/script/rsyncd.conf,mode:'644'}</span></div></div><div><div><div>44</div></div><div><span>      </span><span>-</span><span> </span><span>{</span><span> </span><span>src:/script/rsync.passwd,mode:'600'}</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span>  </span><span># 6.启动服务</span></div></div><div><div><div>47</div></div><div><span>  </span><span>-</span><span> </span><span>name:</span><span> </span><span>06_start_rsync</span></div></div><div><div><div>48</div></div><div><span>    </span><span>systemd:</span></div></div><div><div><div>49</div></div><div><span>      </span><span>name:</span><span> </span><span>rsyncd</span></div></div><div><div><div>50</div></div><div><span>      </span><span>state:</span><span> </span><span>started</span></div></div><div><div><div>51</div></div><div><span>      </span><span>enabled:</span><span> </span><span>yes</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>将其编辑到tasks的main.yml文件里</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vim</span><span> </span><span>./roles/install_rsync/tasks/main.yml</span></div></div><div><div><div>2</div></div><div><span># 查看内容</span></div></div><div><div><div>3</div></div><div><span>[root@mater-22 ~/ansible_role]#cat ./roles/install_rsync/tasks/main.yml</span></div></div><div><div><div>4</div></div><div><span>---</span></div></div><div><div><div>5</div></div><div><span># tasks file for ./roles/install_rsync</span></div></div><div><div><div>6</div></div><div><span>-</span><span> </span><span>name:</span><span> </span><span>1.创建www用户组</span></div></div><div><div><div>7</div></div><div><span>  </span><span>group:</span></div></div><div><div><div>8</div></div><div><span>    </span><span>name:</span><span> </span><span>"{{rsync_user}}"</span></div></div><div><div><div>9</div></div><div><span>    </span><span>gid:</span><span> </span><span>"{{user_id}}"</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>-</span><span> </span><span>name:</span><span> </span><span>2.创建www用户</span></div></div><div><div><div>12</div></div><div><span>  </span><span>user:</span></div></div><div><div><div>13</div></div><div><span>    </span><span>name:</span><span> </span><span>"{{rsync_user}}"</span></div></div><div><div><div>14</div></div><div><span>    </span><span>uid:</span><span> </span><span>"{{user_id}}"</span></div></div><div><div><div>15</div></div><div><span>    </span><span>group:</span><span> </span><span>"{{rsync_user}}"</span></div></div><div><div><div>16</div></div><div><span>    </span><span>create_home:</span><span> </span><span>no</span></div></div><div><div><div>17</div></div><div><span>    </span><span>shell:</span><span> </span><span>/sbin/nologin</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>-</span><span> </span><span>name:</span><span> </span><span>3.创建数据目录并配置权限</span></div></div><div><div><div>20</div></div><div><span>  </span><span>file:</span></div></div><div><div><div>21</div></div><div><span>    </span><span>path:</span><span> </span><span>"{{item}}"</span></div></div><div><div><div>22</div></div><div><span>    </span><span>state:</span><span> </span><span>directory</span></div></div><div><div><div>23</div></div><div><span>    </span><span>owner:</span><span> </span><span>"{{rsync_user}}"</span></div></div><div><div><div>24</div></div><div><span>    </span><span>group:</span><span> </span><span>"{{rsync_user}}"</span></div></div><div><div><div>25</div></div><div><span>    </span><span>mode:</span><span> </span><span>755</span></div></div><div><div><div>26</div></div><div><span>  </span><span>loop:</span></div></div><div><div><div>27</div></div><div><span>      </span><span>-</span><span> </span><span>/data</span></div></div><div><div><div>28</div></div><div><span>      </span><span>-</span><span> </span><span>/backup</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>-</span><span> </span><span>name:</span><span> </span><span>4.安装rsync软件</span></div></div><div><div><div>31</div></div><div><span>  </span><span>yum:</span></div></div><div><div><div>32</div></div><div><span>    </span><span>name:</span><span> </span><span>rsync</span></div></div><div><div><div>33</div></div><div><span>    </span><span>state:</span><span> </span><span>latest</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>-</span><span> </span><span>name:</span><span> </span><span>5.复制配置文件和密码文件</span></div></div><div><div><div>36</div></div><div><span>  </span><span>copy:</span></div></div><div><div><div>37</div></div><div><span>    </span><span>src:</span><span> </span><span>"{{item.src}}"</span></div></div><div><div><div>38</div></div><div><span>    </span><span>dest:</span><span> </span><span>/etc/</span></div></div><div><div><div>39</div></div><div><span>    </span><span>mode:</span><span> </span><span>"{{item.mode}}"</span></div></div><div><div><div>40</div></div><div><span>  </span><span>notify:</span></div></div><div><div><div>41</div></div><div><span>    </span><span>-</span><span> </span><span>restart_rsyncd</span></div></div><div><div><div>42</div></div><div><span>  </span><span>loop:</span></div></div><div><div><div>43</div></div><div><span>    </span><span>-</span><span> </span><span>{src:rsyncd.conf,mode:'644'}</span></div></div><div><div><div>44</div></div><div><span>    </span><span>-</span><span> </span><span>{src:rsync.passwd,mode:'600'}</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span>-</span><span> </span><span>name:</span><span> </span><span>6.启动服务</span></div></div><div><div><div>47</div></div><div><span>  </span><span>systemd:</span></div></div><div><div><div>48</div></div><div><span>    </span><span>name:</span><span> </span><span>rsyncd</span></div></div><div><div><div>49</div></div><div><span>    </span><span>state:</span><span> </span><span>started</span></div></div><div><div><div>50</div></div><div><span>    </span><span>enabled:</span><span> </span><span>yes</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><p><strong>原playbook的tasks拆分后基本没什么变化，只有在调用配置文件和密码文件时的路径进行修改</strong></p></blockquote></section><section><h3>1.4.3 拆分var变量部分<a href="#143-拆分var变量部分"><span>#</span></a></h3><p>在task中使用了变量，因此需要编辑var目录下的文件</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 原playbook里面的var变量如下</span></div></div><div><div><div>2</div></div><div><span>vars:</span></div></div><div><div><div>3</div></div><div><span>    </span><span>user_id:</span><span> </span><span>'666'</span></div></div><div><div><div>4</div></div><div><span>    </span><span>rsync_user:</span><span> </span><span>'www'</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>将其编辑到vars目录下的main.yml下</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vim</span><span> </span><span>./roles/install_rsync/vars/main.yml</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 查看内容</span></div></div><div><div><div>4</div></div><div><span>[root@mater-22 ~/ansible_role]#cat ./roles/install_rsync/vars/main.yml</span></div></div><div><div><div>5</div></div><div><span>---</span></div></div><div><div><div>6</div></div><div><span># vars file for ./roles/install_rsync</span></div></div><div><div><div>7</div></div><div><span>user_id:</span><span> </span><span>'666'</span></div></div><div><div><div>8</div></div><div><span>rsync_user:</span><span> </span><span>'www'</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.4.4 拆分files部分<a href="#144-拆分files部分"><span>#</span></a></h3><p>在task任务中使用了文件，那么就需要将所需要的文件放入到files目录下</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>./roles/install_rsync/files/</span></div></div><div><div><div>2</div></div><div><span># 创建配置文件</span></div></div><div><div><div>3</div></div><div><span>vim</span><span> </span><span>rsyncd.conf</span></div></div><div><div><div>4</div></div><div><span>#粘贴如下内容</span></div></div><div><div><div>5</div></div><div><span>uid</span><span> </span><span>=</span><span> </span><span>www</span></div></div><div><div><div>6</div></div><div><span>gid</span><span> </span><span>=</span><span> </span><span>www</span></div></div><div><div><div>7</div></div><div><span>port</span><span> </span><span>=</span><span> </span><span>873</span></div></div><div><div><div>8</div></div><div><span>fake</span><span> </span><span>super</span><span> </span><span>=</span><span> </span><span>yes</span></div></div><div><div><div>9</div></div><div><span>use</span><span> </span><span>chroot</span><span> </span><span>=</span><span> </span><span>no</span></div></div><div><div><div>10</div></div><div><span>max</span><span> </span><span>connection</span><span> </span><span>=</span><span> </span><span>200</span></div></div><div><div><div>11</div></div><div><span>timeout</span><span> </span><span>=</span><span> </span><span>600</span></div></div><div><div><div>12</div></div><div><span>pid</span><span> </span><span>file</span><span> </span><span>=</span><span> </span><span>/var/run/rsyncd.pid</span></div></div><div><div><div>13</div></div><div><span>lock</span><span> </span><span>file</span><span> </span><span>=</span><span> </span><span>/var/run/rsync.lock</span></div></div><div><div><div>14</div></div><div><span>log</span><span> </span><span>file</span><span> </span><span>=</span><span> </span><span>/var/log/rsyncd.log</span></div></div><div><div><div>15</div></div><div><span>ignore</span><span> </span><span>errors</span></div></div><div><div><div>16</div></div><div><span>read</span><span> </span><span>only</span><span> </span><span>=</span><span> </span><span>false</span></div></div><div><div><div>17</div></div><div><span>list</span><span> </span><span>=</span><span> </span><span>yes</span></div></div><div><div><div>18</div></div><div><span>auth</span><span> </span><span>users</span><span> </span><span>=</span><span> </span><span>myuser</span></div></div><div><div><div>19</div></div><div><span>secrets</span><span> </span><span>file</span><span> </span><span>=</span><span> </span><span>/etc/rsync.passwd</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>[backup]</span></div></div><div><div><div>22</div></div><div><span>comment</span><span> </span><span>=</span><span> </span><span>backup_dir</span></div></div><div><div><div>23</div></div><div><span>path</span><span> </span><span>=</span><span> </span><span>/backup</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>[data]</span></div></div><div><div><div>26</div></div><div><span>comment</span><span> </span><span>=date_dir</span></div></div><div><div><div>27</div></div><div><span>path</span><span> </span><span>=</span><span> </span><span>/data</span></div></div><div><div><div>28</div></div><div><span># 保存退出</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span># 创建密码文件</span></div></div><div><div><div>31</div></div><div><span>vim</span><span> </span><span>rsync.passwd</span></div></div><div><div><div>32</div></div><div><span># 粘贴如下文件</span></div></div><div><div><div>33</div></div><div><span>myuser:123456</span></div></div><div><div><div>34</div></div><div><span># 保存退出</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>1.4.5 拆分handlers部分<a href="#145-拆分handlers部分"><span>#</span></a></h3><p>在原playbook中使用了handlers触发式任务，并且通过notify触发</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 原playbook的handlers部分：</span></div></div><div><div><div>2</div></div><div><span>  </span><span>handlers:</span></div></div><div><div><div>3</div></div><div><span>    </span><span>-</span><span> </span><span>name:</span><span> </span><span>restart_rsyncd</span></div></div><div><div><div>4</div></div><div><span>      </span><span>systemd:</span></div></div><div><div><div>5</div></div><div><span>        </span><span>name:</span><span> </span><span>rsyncd</span></div></div><div><div><div>6</div></div><div><span>        </span><span>state:</span><span> </span><span>restarted</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>将其编辑到handlers目录下的main.yml下</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vim</span><span> </span><span>./roles/install_rsync/handlers/main.yml</span></div></div><div><div><div>2</div></div><div><span># 查看内容</span></div></div><div><div><div>3</div></div><div><span>[root@mater-22 ~/ansible_role]#cat ./roles/install_rsync/handlers/main.yml</span></div></div><div><div><div>4</div></div><div><span>---</span></div></div><div><div><div>5</div></div><div><span># handlers file for ./roles/install_rsync</span></div></div><div><div><div>6</div></div><div><span>-</span><span> </span><span>name:</span><span> </span><span>restart_rsyncd</span></div></div><div><div><div>7</div></div><div><span>  </span><span>systemd:</span></div></div><div><div><div>8</div></div><div><span>    </span><span>name:</span><span> </span><span>rsyncd</span></div></div><div><div><div>9</div></div><div><span>    </span><span>state:</span><span> </span><span>restarted</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><code>至此，原playbook所需的任务、文件、变量等都已拆分到各个目录下，最后只需创建一个playbook调用该role角色即可</code></p></section><section><h3>1.4.6 创建调用role角色的playbook<a href="#146-创建调用role角色的playbook"><span>#</span></a></h3><p><code>这里直接在与roles目录同级下创建playbook，但调用的playbook的位置并没有要求</code></p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>[root@mater-22 ~/ansible_role]#touch install_rsync.yml</span></div></div><div><div><div>2</div></div><div><span>[root@mater-22 ~/ansible_role]#tree -L 1</span></div></div><div><div><div>3</div></div><div><span>.</span></div></div><div><div><div>4</div></div><div><span>├──</span><span> </span><span>install_rsync.yml</span></div></div><div><div><div>5</div></div><div><span>└──</span><span> </span><span>roles</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>1</span><span> </span><span>directory,</span><span> </span><span>1</span><span> </span><span>file</span></div></div><div><div><div>8</div></div><div><span>#================================</span></div></div><div><div><div>9</div></div><div><span># 编辑文件</span></div></div><div><div><div>10</div></div><div><span>vim</span><span> </span><span>install_rsync.yml</span></div></div><div><div><div>11</div></div><div><span># 查看内容</span></div></div><div><div><div>12</div></div><div><span>[root@mater-22 ~/ansible_role]#cat install_rsync.yml</span></div></div><div><div><div>13</div></div><div><span>-</span><span> </span><span>hosts:</span><span> </span><span>test</span></div></div><div><div><div>14</div></div><div><span>  </span><span>roles:</span></div></div><div><div><div>15</div></div><div><span>    </span><span>-</span><span> </span><span>install_rsync</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><section><h4>1.4.6.1 执行这个playbook<a href="#1461-执行这个playbook"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 测试是否有错误</span></div></div><div><div><div>2</div></div><div><span>ansible-playbook</span><span> </span><span>-C</span><span> </span><span>install_rsync.yml</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 真实使用</span></div></div><div><div><div>5</div></div><div><span>ansible-playbook</span><span> </span><span>install_rsync.yml</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 成功执行</span></div></div><div><div><div>2</div></div><div><span>[root@mater-22 ~/ansible_role]#ansible-playbook  install_rsync.yml</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>PLAY</span><span> [test] **************************************************************************************************************************</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>TASK</span><span> [Gathering </span><span>Facts]</span><span> </span><span>***************************************************************************************************************</span></div></div><div><div><div>7</div></div><div><span>ok:</span><span> [10.1.1.32]</span></div></div><div><div><div>8</div></div><div><span>ok:</span><span> [10.1.1.31]</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>TASK</span><span> [install_rsync </span><span>:</span><span> </span><span>创建www用户组]</span><span> </span><span>******************************************************************************************************</span></div></div><div><div><div>11</div></div><div><span>changed:</span><span> [10.1.1.31]</span></div></div><div><div><div>12</div></div><div><span>changed:</span><span> [10.1.1.32]</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>TASK</span><span> [install_rsync </span><span>:</span><span> </span><span>创建www用户]</span><span> </span><span>*******************************************************************************************************</span></div></div><div><div><div>15</div></div><div><span>changed:</span><span> [10.1.1.31]</span></div></div><div><div><div>16</div></div><div><span>changed:</span><span> [10.1.1.32]</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>TASK</span><span> [install_rsync </span><span>:</span><span> </span><span>创建数据目录并配置权限]</span><span> </span><span>***************************************************************************************************</span></div></div><div><div><div>19</div></div><div><span>changed:</span><span> [10.1.1.32] =&gt; (</span><span>item</span><span>=</span><span>/data</span><span>)</span></div></div><div><div><div>20</div></div><div><span>changed:</span><span> [10.1.1.31] =&gt; (</span><span>item</span><span>=</span><span>/data</span><span>)</span></div></div><div><div><div>21</div></div><div><span>changed:</span><span> [10.1.1.31] =&gt; (</span><span>item</span><span>=</span><span>/backup</span><span>)</span></div></div><div><div><div>22</div></div><div><span>changed:</span><span> [10.1.1.32] =&gt; (</span><span>item</span><span>=</span><span>/backup</span><span>)</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>TASK</span><span> [install_rsync </span><span>:</span><span> </span><span>安装rsync软件]</span><span> </span><span>*****************************************************************************************************</span></div></div><div><div><div>25</div></div><div><span>changed:</span><span> [10.1.1.32]</span></div></div><div><div><div>26</div></div><div><span>changed:</span><span> [10.1.1.31]</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>TASK</span><span> [install_rsync </span><span>:</span><span> </span><span>复制配置文件和密码文件]</span><span> </span><span>***************************************************************************************************</span></div></div><div><div><div>29</div></div><div><span>changed:</span><span> [10.1.1.32] =&gt; (</span><span>item</span><span><span>=</span><span>{</span></span><span>u</span><span>'src'</span><span>:</span><span> </span><span>u'rsyncd.conf',</span><span> </span><span>u'mode':</span><span> </span><span>u'644'}</span><span>)</span></div></div><div><div><div>30</div></div><div><span>changed:</span><span> [10.1.1.31] =&gt; (</span><span>item</span><span><span>=</span><span>{</span></span><span>u</span><span>'src'</span><span>:</span><span> </span><span>u'rsyncd.conf',</span><span> </span><span>u'mode':</span><span> </span><span>u'644'}</span><span>)</span></div></div><div><div><div>31</div></div><div><span>changed:</span><span> [10.1.1.32] =&gt; (</span><span>item</span><span><span>=</span><span>{</span></span><span>u</span><span>'src'</span><span>:</span><span> </span><span>u'rsync.passwd',</span><span> </span><span>u'mode':</span><span> </span><span>u'600'}</span><span>)</span></div></div><div><div><div>32</div></div><div><span>changed:</span><span> [10.1.1.31] =&gt; (</span><span>item</span><span><span>=</span><span>{</span></span><span>u</span><span>'src'</span><span>:</span><span> </span><span>u'rsync.passwd',</span><span> </span><span>u'mode':</span><span> </span><span>u'600'}</span><span>)</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>TASK</span><span> [install_rsync </span><span>:</span><span> </span><span>启动服务]</span><span> </span><span>**********************************************************************************************************</span></div></div><div><div><div>35</div></div><div><span>changed:</span><span> [10.1.1.32]</span></div></div><div><div><div>36</div></div><div><span>changed:</span><span> [10.1.1.31]</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>RUNNING</span><span> </span><span>HANDLER</span><span> [install_rsync </span><span>:</span><span> </span><span>restart_rsyncd]</span><span> </span><span>*************************************************************************************</span></div></div><div><div><div>39</div></div><div><span>changed:</span><span> [10.1.1.32]</span></div></div><div><div><div>40</div></div><div><span>changed:</span><span> [10.1.1.31]</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>PLAY</span><span> </span><span>RECAP</span><span> </span><span>***************************************************************************************************************************</span></div></div><div><div><div>43</div></div><div><span>10.1.1.31</span><span>                  </span><span>:</span><span> </span><span>ok=</span><span>8</span><span>    </span><span>changed=</span><span>7</span><span>    </span><span>unreachable=</span><span>0</span><span>    </span><span>failed=</span><span>0</span><span>    </span><span>skipped=</span><span>0</span><span>    </span><span>rescued=</span><span>0</span><span>    </span><span>ignored=</span><span>0</span></div></div><div><div><div>44</div></div><div><span>10.1.1.32</span><span>                  </span><span>:</span><span> </span><span>ok=</span><span>8</span><span>    </span><span>changed=</span><span>7</span><span>    </span><span>unreachable=</span><span>0</span><span>    </span><span>failed=</span><span>0</span><span>    </span><span>skipped=</span><span>0</span><span>    </span><span>rescued=</span><span>0</span><span>    </span><span>ignored=</span><span>0</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/%E5%88%B6%E4%BD%9Cdeb%E5%8C%85/</id>
      <title type="text">制作deb软件包</title>
      <published>2026-08-04T00:00:00.000Z</published>
      <updated>2026-08-04T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/%E5%88%B6%E4%BD%9Cdeb%E5%8C%85/"/>
      <summary type="text">制作deb软件包</summary>
      <content type="html"><![CDATA[<section><h1>一、制作deb包<a href="#一制作deb包"><span>#</span></a></h1><section><h2>1.1 deb包构建工具文件<a href="#11-deb包构建工具文件"><span>#</span></a></h2><p>制作deb包使用的依赖工具</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>apt</span><span> </span><span>update</span></div></div><div><div><div>2</div></div><div><span>sudo</span><span> </span><span>apt</span><span> </span><span>install</span><span> </span><span>build-essential</span><span> </span><span>devscripts</span><span> </span><span>debhelper</span><span> </span><span>dh-make</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>各工具作用：</p>

<table><thead><tr><th>工具</th><th>作用</th></tr></thead><tbody><tr><td>build-essential</td><td>提供基本编译环境</td></tr><tr><td>devscripts</td><td>包含大量有用脚本</td></tr><tr><td>debhelper</td><td>制作 deb 包的核心工具</td></tr><tr><td>dh-make</td><td>快速生成包的模板</td></tr></tbody></table><section><h3>1.1.1 基本结构<a href="#111-基本结构"><span>#</span></a></h3><p>假设打包一个名为 <code>mymonitor</code> 的监控工具：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mymonitor-1.0/</span><span>                      </span><span># 主工作目录</span></div></div><div><div><div>2</div></div><div><span>├──</span><span> </span><span>src/</span><span>                            </span><span># 源码目录</span></div></div><div><div><div>3</div></div><div><span>│</span><span>   </span><span>└──</span><span> </span><span>mymonitor</span><span>                   </span><span># 可执行文件</span></div></div><div><div><div>4</div></div><div><span>├──</span><span> </span><span>config/</span><span>                         </span><span># 配置文件目录</span></div></div><div><div><div>5</div></div><div><span>│</span><span>   </span><span>└──</span><span> </span><span>mymonitor.conf</span><span>              </span><span># 配置文件</span></div></div><div><div><div>6</div></div><div><span>├──</span><span> </span><span>systemd/</span><span>                        </span><span># systemd 服务文件目录</span></div></div><div><div><div>7</div></div><div><span>│</span><span>   </span><span>└──</span><span> </span><span>mymonitor.service</span><span>           </span><span># 服务文件</span></div></div><div><div><div>8</div></div><div><span>└──</span><span> </span><span>debian/</span><span>                         </span><span># deb 包制作目录</span></div></div><div><div><div>9</div></div><div><span>    </span><span>├──</span><span> </span><span>control</span><span>                     </span><span># 包信息文件</span></div></div><div><div><div>10</div></div><div><span>    </span><span>├──</span><span> </span><span>rules</span><span>                       </span><span># 构建规则文件</span></div></div><div><div><div>11</div></div><div><span>    </span><span>├──</span><span> </span><span>changelog</span><span>                   </span><span># 变更日志</span></div></div><div><div><div>12</div></div><div><span>    </span><span>├──</span><span> </span><span>copyright</span><span>                   </span><span># 版权信息</span></div></div><div><div><div>13</div></div><div><span>    </span><span>├──</span><span> </span><span>compat</span><span>                      </span><span># 兼容性版本</span></div></div><div><div><div>14</div></div><div><span>    </span><span>├──</span><span> </span><span>postinst</span><span>                    </span><span># 安装后脚本</span></div></div><div><div><div>15</div></div><div><span>    </span><span>├──</span><span> </span><span>prerm</span><span>                       </span><span># 卸载前脚本</span></div></div><div><div><div>16</div></div><div><span>    </span><span>└──</span><span> </span><span>postrm</span><span>                      </span><span># 卸载后脚本</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>1.1.2 核心构建文件<a href="#112-核心构建文件"><span>#</span></a></h3><section><h4>1.1.2.1 control 文件<a href="#1121-control-文件"><span>#</span></a></h4><p>这个文件定义了包的基本信息：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Source</span><span>: </span><span>mymonitor</span></div></div><div><div><div>2</div></div><div><span>Section</span><span>: </span><span>utils</span></div></div><div><div><div>3</div></div><div><span>Priority</span><span>: </span><span>optional</span></div></div><div><div><div>4</div></div><div><span>Maintainer</span><span>: </span><span>Your Name &lt;your.email@example.com&gt;</span></div></div><div><div><div>5</div></div><div><span>Build-Depends</span><span>: </span><span>debhelper (&gt;= 10)</span></div></div><div><div><div>6</div></div><div><span>Standards-Version</span><span>: </span><span>4.1.2</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>Package</span><span>: </span><span>mymonitor</span></div></div><div><div><div>9</div></div><div><span>Architecture</span><span>: </span><span>amd64</span></div></div><div><div><div>10</div></div><div><span>Depends</span><span>: </span><span>python3, systemd</span></div></div><div><div><div>11</div></div><div><span>Description</span><span>: </span><span>A simple monitoring tool</span></div></div><div><div><div>12</div></div><div><span> </span><span>This is a monitoring tool for system resources.</span></div></div><div><div><div>13</div></div><div><span> </span><span>It provides real-time monitoring capabilities and can</span></div></div><div><div><div>14</div></div><div><span> </span><span>send alerts when thresholds are exceeded.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>注意</strong>：Description字段的格式比较特殊。第一行是简短描述，后面的详细描述每行都要以空格开头，否则会构建失败</p></section><section><h4>1.1.2.2 rules 文件<a href="#1122-rules-文件"><span>#</span></a></h4><p>这个文件定义了如何构建和安装包：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>#!/usr/bin/make -f</span></div></div><div><div><div>2</div></div><div><span>%</span><span>:</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>dh </span><span>$@</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>override_dh_auto_install</span><span>:</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>mkdir -p debian/mymonitor/usr/bin</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>mkdir -p debian/mymonitor/etc/mymonitor</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>mkdir -p debian/mymonitor/var/log/mymonitor</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>mkdir -p debian/mymonitor/lib/systemd/system</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>cp src/mymonitor debian/mymonitor/usr/bin/</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>cp config/mymonitor.conf debian/mymonitor/etc/mymonitor/</span></div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>cp systemd/mymonitor.service debian/mymonitor/lib/systemd/system/</span></div></div><div><div><div>13</div></div><div><span><span>  </span></span><span>chmod +x debian/mymonitor/usr/bin/mymonitor</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>注意</strong>：需要给<code>rule</code>文件执行权限</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>chmod</span><span> </span><span>+x</span><span> </span><span>debian/rules</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><h3>rules 文件结构与语法<a href="#rules-文件结构与语法"><span>#</span></a></h3><p><code>debian/rules</code> 使用 GNU Make 语法，它的第一行必须是 Shebang，指定解释器：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>#!/usr/bin/make -f</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>指明了使用 <code>make</code> 程序来解析和执行这个文件。同时，这个文件本身必须具备可执行权限</p><ul>
<li><strong><code>%</code></strong>: 这是一个<strong>模式规则</strong>，它会匹配所有未明确指定的目标。</li>
<li><strong><code>dh $@</code></strong>: <code>dh</code> 是 debhelper 的核心命令，<code>$@</code> 是 Makefile 的自动变量，代表当前被调用的目标名。</li>
</ul><p>当执行 <code>debian/rules build</code> 时，<code>%</code> 规则会捕获 <code>build</code>，并执行 <code>dh build</code>。<code>dh</code> 命令则会按顺序调用一系列以 <code>dh_</code> 开头的工具（如 <code>dh_auto_configure</code>, <code>dh_auto_build</code> 等）来完成工作。</p><p>**例如：**自定义命令</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>#!/usr/bin/make -f</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 覆盖 dh_auto_build 默认行为，在构建前执行自定义脚本</span></div></div><div><div><div>4</div></div><div><span>override_dh_auto_build</span><span>:</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>./my-custom-build-script.sh</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>dh_auto_build</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 在安装阶段，将额外文件复制到临时目录</span></div></div><div><div><div>9</div></div><div><span>override_dh_auto_install</span><span>:</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>dh_auto_install</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>cp my-extra-file debian/my-package/usr/share/my-app/</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>%</span><span>:</span></div></div><div><div><div>14</div></div><div><span><span>  </span></span><span>dh </span><span>$@</span></div></div></code></pre><div><div></div><div></div></div></figure></div></blockquote></section><section><h4>1.1.2.3 changelog 文件<a href="#1123-changelog-文件"><span>#</span></a></h4><p>这个文件记录版本变更历史，格式很严格：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mymonitor</span><span> (1.0-1) unstable; </span><span>urgency</span><span>=</span><span>medium</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>  </span><span>*</span><span> </span><span>Initial</span><span> </span><span>release</span></div></div><div><div><div>4</div></div><div><span>  </span><span>*</span><span> </span><span>Added</span><span> </span><span>basic</span><span> </span><span>monitoring</span><span> </span><span>functionality</span></div></div><div><div><div>5</div></div><div><span>  </span><span>*</span><span> </span><span>Added</span><span> </span><span>systemd</span><span> </span><span>service</span><span> </span><span>support</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span> </span><span>--</span><span> </span><span>Your</span><span> </span><span>Name</span><span> </span><span>&lt;your.email@example.com&gt;</span><span>  </span><span>Mon,</span><span> </span><span>15</span><span> </span><span>Jan</span><span> </span><span>2024</span><span> </span><span>10:00:00</span><span> </span><span>+0800</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>**注意：**时间格式必须严格遵循 RFC 2822 标准，建议用 <code>date -R</code> 生成。</p></section><section><h4>1.1.2.4 copyright 文件<a href="#1124-copyright-文件"><span>#</span></a></h4><p>版权信息文件：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>Format:</span><span> </span><span>https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/</span></div></div><div><div><div>2</div></div><div><span>Upstream-Name:</span><span> </span><span>mymonitor</span></div></div><div><div><div>3</div></div><div><span>Source:</span><span> </span><span>https://github.com/yourname/mymonitor</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>Files:</span><span> </span><span>*</span></div></div><div><div><div>6</div></div><div><span>Copyright:</span><span> </span><span>2024</span><span> </span><span>Your</span><span> </span><span>Name</span><span> </span><span>&lt;your.email@example.com&gt;</span></div></div><div><div><div>7</div></div><div><span>License:</span><span> </span><span>MIT</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>1.1.2.5 compat 文件<a href="#1125-compat-文件"><span>#</span></a></h4><p>只需一个数字，表示 debhelper 的兼容级别：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>10</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>1.1.2.6 postinst 文件<a href="#1126-postinst-文件"><span>#</span></a></h4><p><code>安装后</code>执行执行的脚本文件，例如：<code>创建用户、设置权限、启用服务</code>等操作</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>#!/bin/bash</span></div></div><div><div><div>2</div></div><div><span>set</span><span> </span><span>-e</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 创建用户</span></div></div><div><div><div>5</div></div><div><span>if</span><span> ! </span><span>id</span><span> </span><span>"mymonitor"</span><span> &amp;&gt;/dev/null; </span><span>then</span></div></div><div><div><div>6</div></div><div><span>    </span><span>useradd</span><span> </span><span>-r</span><span> </span><span>-s</span><span> </span><span>/bin/</span><span>false</span><span> </span><span>mymonitor</span></div></div><div><div><div>7</div></div><div><span>fi</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 设置权限</span></div></div><div><div><div>10</div></div><div><span>chown</span><span> </span><span>mymonitor:mymonitor</span><span> </span><span>/var/log/mymonitor</span></div></div><div><div><div>11</div></div><div><span>chmod</span><span> </span><span>755</span><span> </span><span>/var/log/mymonitor</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span># 启用并启动服务</span></div></div><div><div><div>14</div></div><div><span>systemctl</span><span> </span><span>daemon-reload</span></div></div><div><div><div>15</div></div><div><span>systemctl</span><span> </span><span>enable</span><span> </span><span>mymonitor</span></div></div><div><div><div>16</div></div><div><span>systemctl</span><span> </span><span>start</span><span> </span><span>mymonitor</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>exit</span><span> </span><span>0</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h4>1.1.2.7 prerm 文件<a href="#1127-prerm-文件"><span>#</span></a></h4><p><code>卸载前</code>执行的脚本文件，例如<code>卸载钱停止服务</code>等操作</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>#!/bin/bash</span></div></div><div><div><div>2</div></div><div><span>set</span><span> </span><span>-e</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>if</span><span> </span><span>systemctl</span><span> </span><span>is-active</span><span> </span><span>--quiet</span><span> </span><span>mymonitor</span><span>; </span><span>then</span></div></div><div><div><div>5</div></div><div><span>    </span><span>systemctl</span><span> </span><span>stop</span><span> </span><span>mymonitor</span></div></div><div><div><div>6</div></div><div><span>fi</span></div></div><div><div><div>7</div></div><div><span>if</span><span> </span><span>systemctl</span><span> </span><span>is-enabled</span><span> </span><span>--quiet</span><span> </span><span>mymonitor</span><span>; </span><span>then</span></div></div><div><div><div>8</div></div><div><span>    </span><span>systemctl</span><span> </span><span>disable</span><span> </span><span>mymonitor</span></div></div><div><div><div>9</div></div><div><span>fi</span></div></div><div><div><div>10</div></div><div><span>exit</span><span> </span><span>0</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>1.1.2.8 postrm 文件<a href="#1128-postrm-文件"><span>#</span></a></h4><p><code>卸载后</code>执行的脚本文件，例如<code>清理用户和数据</code>等操作</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>#!/bin/bash</span></div></div><div><div><div>2</div></div><div><span>set</span><span> </span><span>-e</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>case</span><span> </span><span>"</span><span>$1</span><span>"</span><span> </span><span>in</span></div></div><div><div><div>5</div></div><div><span>    </span><span>purge</span><span>)</span></div></div><div><div><div>6</div></div><div><span>        </span><span>if</span><span> </span><span>id</span><span> </span><span>"mymonitor"</span><span> &amp;&gt;</span><span>/dev/null</span><span>; </span><span>then</span></div></div><div><div><div>7</div></div><div><span>            </span><span>userdel</span><span> </span><span>mymonitor</span></div></div><div><div><div>8</div></div><div><span>        </span><span>fi</span></div></div><div><div><div>9</div></div><div><span>        </span><span>rm</span><span> </span><span>-rf</span><span> </span><span>/var/log/mymonitor</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>;;</span></div></div><div><div><div>11</div></div><div><span>    </span><span>remove</span><span>)</span></div></div><div><div><div>12</div></div><div><span>        </span><span># 只是删除包，保留配置</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>;;</span></div></div><div><div><div>14</div></div><div><span>esac</span></div></div><div><div><div>15</div></div><div><span>systemctl</span><span> </span><span>daemon-reload</span></div></div><div><div><div>16</div></div><div><span>exit</span><span> </span><span>0</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>**注意：**所有脚本必须添加执行权限</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>chmod</span><span> </span><span>+x</span><span> </span><span>debian/postinst</span><span> </span><span>debian/prerm</span><span> </span><span>debian/postrm</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section></section><section><h2>1.2 准备源码文件<a href="#12-准备源码文件"><span>#</span></a></h2><section><h3>1.2.1 源码文件<a href="#121-源码文件"><span>#</span></a></h3><p>准备源码文件<code>src/mymonitor</code></p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>#!/usr/bin/env python3</span></div></div><div><div><div>2</div></div><div><span>import</span><span> time</span></div></div><div><div><div>3</div></div><div><span>import</span><span> psutil</span></div></div><div><div><div>4</div></div><div><span>import</span><span> json</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>def</span><span> </span><span>main</span><span>():</span></div></div><div><div><div>7</div></div><div><span>    </span><span>while</span><span> </span><span>True</span><span>:</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>cpu_percent </span><span>=</span><span> psutil.</span><span>cpu_percent</span><span>(</span><span>interval</span><span>=</span><span>1</span><span>)</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>memory </span><span>=</span><span> psutil.</span><span>virtual_memory</span><span>()</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>data </span><span>=</span><span> {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>'cpu'</span><span>: cpu_percent,</span></div></div><div><div><div>12</div></div><div><span>            </span><span>'memory'</span><span>: memory.percent,</span></div></div><div><div><div>13</div></div><div><span>            </span><span>'timestamp'</span><span><span>: time.</span><span>time</span><span>()</span></span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>        </span><span>print</span><span><span>(json.</span><span>dumps</span><span>(data))</span></span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>time.</span><span>sleep</span><span>(</span><span>10</span><span>)</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>if</span><span> </span><span>__name__</span><span><span> </span><span>==</span><span> </span></span><span>'__main__'</span><span>:</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>main</span><span>()</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>1.2.2 配置文件<a href="#122-配置文件"><span>#</span></a></h3><p>准备配置文件<code>config/mymonitor.conf</code></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[monitor]</span></div></div><div><div><div>2</div></div><div><span>interval</span><span><span> </span><span>=</span><span> 10</span></span></div></div><div><div><div>3</div></div><div><span>cpu_threshold</span><span><span> </span><span>=</span><span> 80</span></span></div></div><div><div><div>4</div></div><div><span>memory_threshold</span><span><span> </span><span>=</span><span> 85</span></span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>[logging]</span></div></div><div><div><div>7</div></div><div><span>level</span><span><span> </span><span>=</span><span> INFO</span></span></div></div><div><div><div>8</div></div><div><span>file</span><span><span> </span><span>=</span><span> /var/log/mymonitor/mymonitor.log</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.2.3 systemd 服务文件<a href="#123-systemd-服务文件"><span>#</span></a></h3><p>准备systemd 服务文件<code>systemd/mymonitor.service</code></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>[Unit]</span></div></div><div><div><div>2</div></div><div><span>Description</span><span>=</span><span>MyMonitor</span><span> </span><span>Service</span></div></div><div><div><div>3</div></div><div><span>After</span><span>=</span><span>network.target</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>[Service]</span></div></div><div><div><div>6</div></div><div><span>Type</span><span>=</span><span>simple</span></div></div><div><div><div>7</div></div><div><span>User</span><span>=</span><span>mymonitor</span></div></div><div><div><div>8</div></div><div><span>ExecStart</span><span>=</span><span>/usr/bin/mymonitor</span></div></div><div><div><div>9</div></div><div><span>Restart</span><span>=</span><span>always</span></div></div><div><div><div>10</div></div><div><span>RestartSec</span><span>=</span><span>10</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>[Install]</span></div></div><div><div><div>13</div></div><div><span>WantedBy</span><span>=</span><span>multi-user.target</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>1.3 构建与测试<a href="#13-构建与测试"><span>#</span></a></h2><section><h3>1.3.1 构建deb包<a href="#131-构建deb包"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>mymonitor-1.0</span></div></div><div><div><div>2</div></div><div><span>dpkg-buildpackage</span><span> </span><span>-us</span><span> </span><span>-uc</span><span> </span><span>-b</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>参数说明：</p><ul>
<li><code>-us</code>：不签名源码包</li>
<li><code>-uc</code>：不签名变更文件</li>
<li><code>-b</code>：只构建二进制包</li>
</ul><p>构建成功后在上级目录生成 <code>mymonitor_1.0-1_amd64.deb</code>。</p><blockquote><h3><strong>常见构建错误</strong><a href="#常见构建错误"><span>#</span></a></h3><ol>
<li>文件权限问题：确保所有脚本都有执行权限</li>
<li>格式错误：特别是 changelog 和 control 文件的格式</li>
<li>依赖问题：检查 Build-Depends 是否正确</li>
</ol></blockquote></section><section><h3>1.3.2 测试安装<a href="#132-测试安装"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 安装</span></div></div><div><div><div>2</div></div><div><span>sudo</span><span> </span><span>dpkg</span><span> </span><span>-i</span><span> </span><span>../mymonitor_1.0-1_amd64.deb</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 检查文件</span></div></div><div><div><div>5</div></div><div><span>ls</span><span> </span><span>-la</span><span> </span><span>/usr/bin/mymonitor</span></div></div><div><div><div>6</div></div><div><span>ls</span><span> </span><span>-la</span><span> </span><span>/etc/mymonitor/</span></div></div><div><div><div>7</div></div><div><span>ls</span><span> </span><span>-la</span><span> </span><span>/var/log/mymonitor/</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 检查服务</span></div></div><div><div><div>10</div></div><div><span>systemctl</span><span> </span><span>status</span><span> </span><span>mymonitor</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># 检查用户</span></div></div><div><div><div>13</div></div><div><span>id</span><span> </span><span>mymonitor</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span># 卸载（保留配置）</span></div></div><div><div><div>16</div></div><div><span>sudo</span><span> </span><span>dpkg</span><span> </span><span>-r</span><span> </span><span>mymonitor</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span># 完全清理（包括配置文件）</span></div></div><div><div><div>19</div></div><div><span>sudo</span><span> </span><span>dpkg</span><span> </span><span>-P</span><span> </span><span>mymonitor</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span># 查看包内容</span></div></div><div><div><div>22</div></div><div><span>dpkg</span><span> </span><span>-c</span><span> </span><span>mymonitor_1.0-1_amd64.deb</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span># 查看包信息</span></div></div><div><div><div>25</div></div><div><span>dpkg</span><span> </span><span>-I</span><span> </span><span>mymonitor_1.0-1_amd64.deb</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span># 模拟安装</span></div></div><div><div><div>28</div></div><div><span>dpkg</span><span> </span><span>--simulate</span><span> </span><span>-i</span><span> </span><span>mymonitor_1.0-1_amd64.deb</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span># 检查包质量</span></div></div><div><div><div>31</div></div><div><span>lintian</span><span> </span><span>mymonitor_1.0-1_amd64.deb</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section><section><h2>1.4 实用技巧<a href="#14-实用技巧"><span>#</span></a></h2><section><h3>1.4.1 使用 dh_make 快速生成模板<a href="#141-使用-dh_make-快速生成模板"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>dh_make</span><span> </span><span>-e</span><span> </span><span>your.email@example.com</span><span> </span><span>-f</span><span> </span><span>../mymonitor-1.0.tar.gz</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.4.2 处理配置文件<a href="#142-处理配置文件"><span>#</span></a></h3><p>如果<code>deb包</code>包含配置文件，可以在debian目录下创建<code>conffiles</code>文件：</p><p>添加以下内容</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>/etc/mymonitor/mymonitor.conf</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这样dpkg就知道这是配置文件，升级时会妥善处理</p></section><section><h3>1.4.3 添加依赖检查<a href="#143-添加依赖检查"><span>#</span></a></h3><p>在<code>postinst</code>脚本中可以添加一些依赖检查：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 检查Python3是否安装</span></div></div><div><div><div>2</div></div><div><span>if</span><span> ! </span><span>command</span><span> </span><span>-v</span><span> </span><span>python3</span><span> &amp;&gt; /dev/null; </span><span>then</span></div></div><div><div><div>3</div></div><div><span>    </span><span>echo</span><span> </span><span>"Error: Python3 is required but not installed"</span></div></div><div><div><div>4</div></div><div><span>    </span><span>exit</span><span> </span><span>1</span></div></div><div><div><div>5</div></div><div><span>fi</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 检查psutil模块</span></div></div><div><div><div>8</div></div><div><span>if</span><span> ! </span><span>python3</span><span> </span><span>-c</span><span> </span><span>"import psutil"</span><span> &amp;&gt; /dev/null; </span><span>then</span></div></div><div><div><div>9</div></div><div><span>    </span><span>echo</span><span> </span><span>"Installing psutil..."</span></div></div><div><div><div>10</div></div><div><span>    </span><span>pip3</span><span> </span><span>install</span><span> </span><span>psutil</span></div></div><div><div><div>11</div></div><div><span>fi</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.4.4 处理多架构<a href="#144-处理多架构"><span>#</span></a></h3><p>如果软件需要支持多种架构，可以在<code>control</code>文件中设置：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>Architecture:</span><span> </span><span>any</span></div></div><div><div><div>2</div></div><div><span># 或者指定具体架构：</span></div></div><div><div><div>3</div></div><div><span>Architecture:</span><span> </span><span>amd64</span><span> </span><span>arm64</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.4.5 添加预依赖和冲突<a href="#145-添加预依赖和冲突"><span>#</span></a></h3><p>有时候构建的包可能与其他包冲突，或者需要在某个包之前安装：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>Pre-Depends:</span><span> </span><span>some-package</span></div></div><div><div><div>2</div></div><div><span>Conflicts:</span><span> </span><span>conflicting-package</span></div></div><div><div><div>3</div></div><div><span>Replaces:</span><span> </span><span>old-package</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.4.6 使用triggers<a href="#146-使用triggers"><span>#</span></a></h3><p>如果构建的包需要在其他包安装后执行某些操作，可以使用<code>triggers</code>机制。创建<code>debian/triggers</code>文件，添加如下内容：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>interest</span><span> </span><span>/usr/share/applications</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后在<code>postinst</code>文件中处理<code>trigger</code>：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>case</span><span> </span><span>"</span><span>$1</span><span>"</span><span> </span><span>in</span></div></div><div><div><div>2</div></div><div><span>    </span><span>triggered</span><span>)</span></div></div><div><div><div>3</div></div><div><span>        </span><span># 处理trigger事件</span></div></div><div><div><div>4</div></div><div><span>        </span><span>update-desktop-database</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>;;</span></div></div><div><div><div>6</div></div><div><span>esac</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.4.7 分包<a href="#147-分包"><span>#</span></a></h3><p>对于复杂的软件，可能需要分成多个包。比如主程序包、开发包、文档包等。在control文件中定义多个Package段即可。</p></section></section><section><h2>1.5 定制nginx模块打包成deb包<a href="#15-定制nginx模块打包成deb包"><span>#</span></a></h2><p>把自定义编译的nginx打包成deb包，添加一些第三方模块</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 下载源码包</span></div></div><div><div><div>2</div></div><div><span>wget</span><span> </span><span>http://nginx.org/download/nginx-1.20.2.tar.gz</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>tar</span><span> </span><span>-xzf</span><span> </span><span>nginx-1.20.2.tar.gz</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>cd</span><span> </span><span>nginx-1.20.2</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 创建debian目录结构</span></div></div><div><div><div>9</div></div><div><span>mkdir</span><span> </span><span>debian</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>1.5.1 创建control 文件<a href="#151-创建control-文件"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>./debian/control</span><span> </span><span>&lt;</span><span>&lt; </span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>Source:</span><span> </span><span>nginx-custom</span></div></div><div><div><div>3</div></div><div><span>Section:</span><span> </span><span>httpd</span></div></div><div><div><div>4</div></div><div><span>Priority:</span><span> </span><span>optional</span></div></div><div><div><div>5</div></div><div><span>Maintainer:</span><span> </span><span>Your</span><span> </span><span>Name</span><span> &lt;</span><span>your.email@example.com&gt;</span></div></div><div><div><div>6</div></div><div><span>Build-Depends:</span><span> </span><span>debhelper</span><span> (&gt;= </span><span>10</span><span>), libssl-dev, libpcre3-dev, zlib1g-dev, libgeoip-dev</span></div></div><div><div><div>7</div></div><div><span>Standards-Version:</span><span> </span><span>4.1.2</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>Package:</span><span> </span><span>nginx-custom</span></div></div><div><div><div>10</div></div><div><span>Architecture:</span><span> </span><span>amd64</span></div></div><div><div><div>11</div></div><div><span>Depends:</span><span> </span><span><span>${</span><span>shlibs</span></span><span>:</span><span><span>Depends</span><span>}</span></span><span>,</span><span> </span><span><span>${</span><span>misc</span></span><span>:</span><span><span>Depends</span><span>}</span></span><span>,</span><span> </span><span>adduser,</span><span> </span><span>lsb-base</span></div></div><div><div><div>12</div></div><div><span>Provides:</span><span> </span><span>httpd,</span><span> </span><span>nginx</span></div></div><div><div><div>13</div></div><div><span>Conflicts:</span><span> </span><span>nginx,</span><span> </span><span>nginx-full,</span><span> </span><span>nginx-light</span></div></div><div><div><div>14</div></div><div><span>Description:</span><span> </span><span>High</span><span> </span><span>performance</span><span> </span><span>web</span><span> </span><span>server</span><span> (custom </span><span>build</span><span>)</span></div></div><div><div><div>15</div></div><div><span> </span><span>Nginx</span><span> </span><span>is</span><span> </span><span>a</span><span> </span><span>web</span><span> </span><span>server</span><span> </span><span>with</span><span> </span><span>a</span><span> </span><span>strong</span><span> </span><span>focus</span><span> </span><span>on</span><span> </span><span>high</span></div></div><div><div><div>16</div></div><div><span> </span><span>concurrency,</span><span> </span><span>performance</span><span> </span><span>and</span><span> </span><span>low</span><span> </span><span>memory</span><span> </span><span>usage.</span></div></div><div><div><div>17</div></div><div><span> </span><span>This</span><span> </span><span>is</span><span> </span><span>a</span><span> </span><span>custom</span><span> </span><span>build</span><span> </span><span>with</span><span> </span><span>additional</span><span> </span><span>modules.</span></div></div><div><div><div>18</div></div><div><span> </span><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p><code>${shlibs:Depends}</code>会自动检测动态库依赖，<code>Conflicts</code>字段防止与系统自带的nginx冲突。</p><blockquote><p><strong>参数解释：</strong></p><ul>
<li>Source: nginx-custom</li>
<li><strong>含义</strong>：定义了这个源码包的名称。</li>
<li><strong>作用</strong>：当你使用 <code>apt-get source</code> 下载源码时，会显示这个名字。</li>
<li>Section: httpd</li>
<li><strong>含义</strong>：软件分类。</li>
<li><strong>作用</strong>：告诉包管理器这个软件属于哪一类（这里是 Web 服务器）。在 Debian/Ubuntu 仓库中，常见的还有 <code>utils</code>, <code>net</code>, <code>admin</code> 等。</li>
<li>Priority: optional</li>
<li><strong>含义</strong>：安装优先级。</li>
<li><strong>作用</strong>：<code>optional</code> 表示这是大多数用户可能会用到的标准软件，但不是系统运行所必须的（区别于 <code>required</code> 或 <code>important</code>）。</li>
<li>Maintainer: Your Name <a href="#">your.email@example.com</a></li>
<li><strong>含义</strong>：维护者信息。</li>
<li><strong>作用</strong>：当用户遇到 Bug 或需要反馈时，会联系这个人。<strong>建议修改为你自己的真实邮箱</strong>。</li>
<li>Build-Depends: debhelper (&gt;= 10), libssl-dev, …</li>
<li><strong>含义</strong>：<strong>编译</strong>依赖。</li>
<li>作用：这是在打包过程（dpkg-buildpackage）中需要的库，而不是安装后运行需要的。
<ul>
<li><code>debhelper</code>: 辅助打包的工具集。</li>
<li><code>libssl-dev</code>: 编译 SSL 模块（HTTPS）必须的头文件。</li>
<li><code>libpcre3-dev</code>: 正则表达式库（Nginx 重写规则需要）。</li>
<li><code>zlib1g-dev</code>: 压缩库（Gzip 功能需要）。</li>
</ul>
</li>
<li>Standards-Version: 4.1.2</li>
<li><strong>含义</strong>：遵循的 Debian 策略版本。</li>
<li><strong>作用</strong>：声明你的包符合哪个版本的 Debian Policy Manual 规范。</li>
<li>Package: nginx-custom</li>
<li><strong>含义</strong>：最终安装时的软件包名称。</li>
<li><strong>作用</strong>：用户使用 <code>apt install nginx-custom</code> 时就是搜这个名字。</li>
<li>Architecture: amd64</li>
<li><strong>含义</strong>：适用架构。</li>
<li><strong>作用</strong>：限制该包只能在 64 位 x86 架构上安装。如果你希望它能在 arm64 或其他架构安装，应改为 <code>any</code>。</li>
<li>Depends: shlibs,<em>s<strong>h</strong>l<strong>ib</strong>s</em>:<em>De<strong>p</strong>e<strong>n</strong>d**s</em>, {misc}, adduser, lsb-base</li>
<li><strong>含义</strong>：<strong>运行</strong>依赖。</li>
<li>作用：安装此包之前必须先安装的软件。
<ul>
<li><code>${shlibs:Depends}</code>: <strong>非常重要</strong>。这是一个自动变量，打包工具会自动扫描你的二进制文件链接了哪些动态库（如 libc, libssl），并自动填入这里。</li>
<li><code>adduser</code>: Nginx 启动时需要创建 <code>nginx</code> 用户，依赖此工具。</li>
<li><code>lsb-base</code>: 提供标准的 init 脚本函数库（如果你的启动脚本用到了 <code>/lib/lsb/init-functions</code>）。</li>
</ul>
</li>
<li>Provides: httpd, nginx</li>
<li><strong>含义</strong>：虚拟包提供。</li>
<li><strong>作用</strong>：宣称“我就是 nginx”。如果有其他软件依赖 <code>nginx</code>，安装你的 <code>nginx-custom</code> 也能满足它的依赖要求。</li>
<li>Conflicts: nginx, nginx-full, nginx-light</li>
<li><strong>含义</strong>：冲突列表。</li>
<li><strong>作用</strong>：<strong>防止共存</strong>。因为你的包也会占用 80 端口或生成同名配置文件，所以不能与官方原版 Nginx 同时存在。如果用户电脑里装了官方版，dpkg 会报错阻止安装，或者提示卸载官方版。</li>
<li>Description: High performance web server…</li>
<li><strong>含义</strong>：软件描述。</li>
<li><strong>格式注意</strong>：第一行是短描述，第二行开始是长描述。<strong>长描述的每一行开头必须有一个空格</strong>，否则会被视为新段落或格式错误。</li>
</ul></blockquote></section><section><h3>1.5.2 创建rules 文件<a href="#152-创建rules-文件"><span>#</span></a></h3><p>建议不要修改程序的安装路径，遵循 Linux 文件系统层次结构标准，将二进制放在 <code>/usr/sbin</code>，配置放在 <code>/etc/nginx</code>，数据放在 <code>/var/www</code>。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>#!/usr/bin/make -f</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>export</span><span> </span><span>DEB_BUILD_MAINT_OPTIONS</span><span><span> </span><span>=</span><span> hardening=+all</span></span></div></div><div><div><div>4</div></div><div><span>export</span><span> </span><span>DEB_CFLAGS_MAINT_APPEND</span><span><span> </span><span>=</span><span> -Wp,-D_FORTIFY_SOURCE=2 -fPIC</span></span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>%</span><span>:</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>dh </span><span>$@</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>override_dh_auto_configure</span><span>:</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>./configure \</span></div></div><div><div><div>11</div></div><div><span>        </span><span>--prefix</span><span><span>=</span><span>/etc/nginx </span></span><span>\</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>--sbin-path=/usr/sbin/nginx </span><span>\</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>--modules-path=/usr/lib/nginx/modules </span><span>\</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>--conf-path=/etc/nginx/nginx.conf </span><span>\</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>--error-log-path=/var/log/nginx/error.log </span><span>\</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>--http-log-path=/var/log/nginx/access.log </span><span>\</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>--pid-path=/var/run/nginx.pid </span><span>\</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>--lock-path=/var/run/nginx.lock </span><span>\</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>--http-client-body-temp-path=/var/cache/nginx/client_temp </span><span>\</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>--http-proxy-temp-path=/var/cache/nginx/proxy_temp </span><span>\</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp </span><span>\</span></div></div><div><div><div>22</div></div><div><span><span>        </span></span><span>--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp </span><span>\</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>--http-scgi-temp-path=/var/cache/nginx/scgi_temp </span><span>\</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>--user=nginx </span><span>\</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>--group=nginx </span><span>\</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>--with-http_ssl_module </span><span>\</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>--with-http_realip_module </span><span>\</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>--with-http_addition_module </span><span>\</span></div></div><div><div><div>29</div></div><div><span><span>        </span></span><span>--with-http_sub_module </span><span>\</span></div></div><div><div><div>30</div></div><div><span><span>        </span></span><span>--with-http_dav_module </span><span>\</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>--with-http_flv_module </span><span>\</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>--with-http_mp4_module </span><span>\</span></div></div><div><div><div>33</div></div><div><span><span>        </span></span><span>--with-http_gunzip_module </span><span>\</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>--with-http_gzip_static_module </span><span>\</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>--with-http_random_index_module </span><span>\</span></div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>--with-http_secure_link_module </span><span>\</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>--with-http_stub_status_module </span><span>\</span></div></div><div><div><div>38</div></div><div><span><span>        </span></span><span>--with-http_auth_request_module </span><span>\</span></div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>--with-http_xslt_module=dynamic </span><span>\</span></div></div><div><div><div>40</div></div><div><span><span>        </span></span><span>--with-http_image_filter_module=dynamic </span><span>\</span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>--with-http_geoip_module=dynamic </span><span>\</span></div></div><div><div><div>42</div></div><div><span><span>        </span></span><span>--with-threads </span><span>\</span></div></div><div><div><div>43</div></div><div><span><span>        </span></span><span>--with-stream </span><span>\</span></div></div><div><div><div>44</div></div><div><span><span>        </span></span><span>--with-stream_ssl_module </span><span>\</span></div></div><div><div><div>45</div></div><div><span><span>        </span></span><span>--with-stream_ssl_preread_module </span><span>\</span></div></div><div><div><div>46</div></div><div><span><span>        </span></span><span>--with-stream_realip_module </span><span>\</span></div></div><div><div><div>47</div></div><div><span><span>        </span></span><span>--with-stream_geoip_module=dynamic </span><span>\</span></div></div><div><div><div>48</div></div><div><span><span>        </span></span><span>--with-http_slice_module </span><span>\</span></div></div><div><div><div>49</div></div><div><span><span>        </span></span><span>--with-file-aio </span><span>\</span></div></div><div><div><div>50</div></div><div><span><span>        </span></span><span>--with-http_v2_module</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>override_dh_auto_install</span><span>:</span></div></div><div><div><div>53</div></div><div><span>  </span><span>$(</span><span>MAKE</span><span>)</span><span> DESTDIR=</span><span>$(</span><span>CURDIR</span><span>)</span><span>/debian/nginx-custom install</span></div></div><div><div><div>54</div></div><div><span><span>  </span></span><span>mkdir -p debian/nginx-custom/var/cache/nginx</span></div></div><div><div><div>55</div></div><div><span><span>  </span></span><span>mkdir -p debian/nginx-custom/var/log/nginx</span></div></div><div><div><div>56</div></div><div><span><span>  </span></span><span>mkdir -p debian/nginx-custom/etc/nginx/conf.d</span></div></div><div><div><div>57</div></div><div><span><span>  </span></span><span>mkdir -p debian/nginx-custom/etc/nginx/sites-available</span></div></div><div><div><div>58</div></div><div><span><span>  </span></span><span>mkdir -p debian/nginx-custom/etc/nginx/sites-enabled</span></div></div><div><div><div>59</div></div><div><span><span>  </span></span><span>mkdir -p debian/nginx-custom/usr/share/nginx/html</span></div></div><div><div><div>60</div></div><div><span><span>  </span></span><span>mkdir -p debian/nginx-custom/lib/systemd/system</span></div></div><div><div><div>61</div></div><div><span><span>  </span></span><span>cp debian/nginx.conf debian/nginx-custom/etc/nginx/</span></div></div><div><div><div>62</div></div><div><span><span>  </span></span><span>cp debian/default.conf debian/nginx-custom/etc/nginx/conf.d/</span></div></div><div><div><div>63</div></div><div><span><span>  </span></span><span>cp debian/nginx.service debian/nginx-custom/lib/systemd/system/</span></div></div><div><div><div>64</div></div><div><span><span>  </span></span><span>cp debian/index.html debian/nginx-custom/usr/share/nginx/html/</span></div></div><div><div><div>65</div></div><div>
</div></div><div><div><div>66</div></div><div><span>override_dh_auto_clean</span><span>:</span></div></div><div><div><div>67</div></div><div><span><span>  </span></span><span>dh_auto_clean</span></div></div><div><div><div>68</div></div><div><span><span>  </span></span><span>rm -f objs/Makefile</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><p><strong>参数解释：</strong></p><ul>
<li>
<p><code>export DEB_BUILD_MAINT_OPTIONS = hardening=+all</code></p>
</li>
<li>
<p><strong>含义</strong>：开启所有安全加固选项。</p>
</li>
<li>
<p><strong>作用</strong>：这会让编译器启用如栈保护、位置无关代码等安全特性，防止软件被恶意利用漏洞攻击。这是现代 Linux 发行版的标准要求。</p>
</li>
<li>
<p><code>export DEB_CFLAGS_MAINT_APPEND = ...</code></p>
</li>
<li>
<p><strong>含义</strong>：追加额外的 C 语言编译标志。</p>
</li>
<li>
<p><strong>作用</strong>：<code>-fPIC</code> 确保生成的二进制文件是位置无关的，这对于共享库和某些安全机制是必须的。</p>
</li>
<li>
<p><code>verride_dh_auto_configure</code>&lt;这一部分覆盖了默认的自动配置行为&gt;，手动执行 Nginx 的 <code>./configure</code> 脚本。<strong>这里的路径决定了 Nginx 安装后的目录结构。</strong></p>
</li>
<li>
<p><code>override_dh_auto_install</code>&lt;这一部分告诉构建系统如何将编译好的文件&gt;“搬运”到临时的打包目录中</p>
</li>
<li>
<p><code>$(MAKE) DESTDIR=$(CURDIR)/debian/nginx-custom install</code></p>
</li>
<li>
<p><strong>含义</strong>：执行 <code>make install</code>，但通过 <code>DESTDIR</code> 将文件安装到一个<strong>临时目录</strong>，而不是真正的系统目录。</p>
</li>
<li>
<p><strong>作用</strong>：这是打包的关键！它创建了一个“虚拟的系统根目录”，所有文件都会进入 <code>debian/nginx-custom/</code> 文件夹下，最终这个文件夹的内容会被压缩成 <code>.deb</code> 包。</p>
</li>
</ul></blockquote></section><section><h3>1.5.3 创建postinst 脚本<a href="#153-创建postinst-脚本"><span>#</span></a></h3><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>./debian/postinst</span><span> &lt;&lt; </span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>#!/bin/bash</span></div></div><div><div><div>3</div></div><div><span>set -e</span></div></div><div><div><div>4</div></div><div><span>case "$1" in</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>configure)</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span># 创建 nginx 用户</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>if ! getent group nginx &gt;/dev/null; then</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>addgroup --system nginx</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>fi</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>if ! getent passwd nginx &gt;/dev/null; then</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>adduser --system --disabled-login --ingroup nginx \</span></div></div><div><div><div>12</div></div><div><span><span>                </span></span><span>--no-create-home --home /nonexistent \</span></div></div><div><div><div>13</div></div><div><span><span>                </span></span><span>--gecos "nginx user" --shell /bin/false nginx</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>fi</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span># 设置目录权限</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>chown -R nginx:nginx /var/log/nginx</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>chmod 755 /var/log/nginx</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>chown -R nginx:nginx /var/cache/nginx</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>chmod 700 /var/cache/nginx</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span># 测试配置文件并启动服务</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>if nginx -t 2&gt;/dev/null; then</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>systemctl daemon-reload</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>systemctl enable nginx.service</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>systemctl start nginx.service</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>fi</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>;;</span></div></div><div><div><div>27</div></div><div><span>esac</span></div></div><div><div><div>28</div></div><div><span>exit 0</span></div></div><div><div><div>29</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>1.5.4 创建changelog文件<a href="#154-创建changelog文件"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>./debian/changelog</span><span> </span><span>&lt;</span><span>&lt; </span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>nginx-custom</span><span> (1.20.2-1) unstable; </span><span>urgency</span><span>=</span><span>medium</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>  </span><span>*</span><span> </span><span>Custom</span><span> </span><span>nginx</span><span> </span><span>build</span><span> </span><span>with</span><span> </span><span>additional</span><span> </span><span>modules:</span></div></div><div><div><div>5</div></div><div><span>    </span><span>-</span><span> </span><span>--with-http_ssl_module</span></div></div><div><div><div>6</div></div><div><span>    </span><span>-</span><span> </span><span>--with-http_v2_module</span></div></div><div><div><div>7</div></div><div><span>    </span><span>-</span><span> </span><span>--with-stream</span></div></div><div><div><div>8</div></div><div><span>    </span><span>-</span><span> </span><span>--with-stream_ssl_module</span></div></div><div><div><div>9</div></div><div><span>  </span><span>*</span><span> </span><span>Optimized</span><span> </span><span>configuration</span><span> </span><span>path</span><span> </span><span>and</span><span> </span><span>default</span><span> </span><span>settings</span></div></div><div><div><div>10</div></div><div><span>  </span><span>*</span><span> </span><span>Added</span><span> </span><span>systemd</span><span> </span><span>service</span><span> </span><span>unit</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span> </span><span>--</span><span> </span><span>Zhang</span><span> </span><span>San</span><span> &lt;</span><span>zhangsan@example.com&gt;</span><span>  </span><span>Mon,</span><span> </span><span>13</span><span> </span><span>Jul</span><span> </span><span>2026</span><span> </span><span>14:30:00</span><span> </span><span>+0800</span></div></div><div><div><div>13</div></div><div><span> </span><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.5.5 创建prerm文件<a href="#155-创建prerm文件"><span>#</span></a></h3><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>./debian/prerm</span><span> &lt;&lt; </span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>#!/bin/bash</span></div></div><div><div><div>3</div></div><div><span>set -e</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>case "$1" in</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>remove|upgrade|deconfigure)</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>if [ -x /usr/sbin/nginx ]; then</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>if systemctl is-active nginx.service &gt;/dev/null 2&gt;&amp;1; then</span></div></div><div><div><div>9</div></div><div><span><span>                </span></span><span>systemctl stop nginx.service</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>fi</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>fi</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>;;</span></div></div><div><div><div>13</div></div><div><span>esac</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>exit 0</span></div></div><div><div><div>16</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>1.5.6 创建compat文件<a href="#156-创建compat文件"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>./debian/compat</span><span> &lt;&lt; </span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>10</span></div></div><div><div><div>3</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.5.7 创建ngin.conf文件<a href="#157-创建nginconf文件"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &lt;&lt;</span><span>eoof</span><span> &gt;</span><span>nginx.conf</span></div></div><div><div><div>2</div></div><div><span>user nginx;</span></div></div><div><div><div>3</div></div><div><span>worker_processes auto;</span></div></div><div><div><div>4</div></div><div><span>pid /run/nginx.pid;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>events {</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>worker_connections 1024;</span></div></div><div><div><div>8</div></div><div><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>http {</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>log_format main '</span><span>$remote_addr</span><span> - </span><span>$remote_user</span><span> [</span><span>$time_local</span><span>] "</span><span>$request</span><span>" '</span></div></div><div><div><div>12</div></div><div><span><span>                    </span></span><span>'</span><span>$status</span><span> </span><span>$body_bytes_sent</span><span> "</span><span>$http_referer</span><span>" '</span></div></div><div><div><div>13</div></div><div><span><span>                    </span></span><span>'"</span><span>$http_user_agent</span><span>" "</span><span>$http_x_forwarded_for</span><span>"';</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>access_log /var/log/nginx/access.log main;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>error_log /var/log/nginx/error.log;</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>sendfile on;</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>tcp_nopush on;</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>tcp_nodelay on;</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>keepalive_timeout 65;</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>types_hash_max_size 2048;</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>include /etc/nginx/mime.types;</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>default_type application/octet-stream;</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>include /etc/nginx/conf.d/*.conf;</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>include /etc/nginx/sites-enabled/*;</span></div></div><div><div><div>29</div></div><div><span>}</span></div></div><div><div><div>30</div></div><div><span>eoof</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>1.5.8 创建nginx.service文件<a href="#158-创建nginxservice文件"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &lt;&lt;</span><span>eoof</span><span> &gt;</span><span>nginx.service</span></div></div><div><div><div>2</div></div><div><span>[Unit]</span></div></div><div><div><div>3</div></div><div><span>Description=A high performance web server and a reverse proxy server</span></div></div><div><div><div>4</div></div><div><span>Documentation=man:nginx(8)</span></div></div><div><div><div>5</div></div><div><span>After=network.target nss-lookup.target</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>[Service]</span></div></div><div><div><div>8</div></div><div><span>Type=forking</span></div></div><div><div><div>9</div></div><div><span>PIDFile=/run/nginx.pid</span></div></div><div><div><div>10</div></div><div><span>ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'</span></div></div><div><div><div>11</div></div><div><span>ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'</span></div></div><div><div><div>12</div></div><div><span>ExecReload=/bin/kill -s HUP </span><span>$MAINPID</span></div></div><div><div><div>13</div></div><div><span>KillMode=mixed</span></div></div><div><div><div>14</div></div><div><span>KillSignal=SIGTERM</span></div></div><div><div><div>15</div></div><div><span>PrivateDevices=yes</span></div></div><div><div><div>16</div></div><div><span>LimitNOFILE=65536</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>[Install]</span></div></div><div><div><div>19</div></div><div><span>WantedBy=multi-user.target</span></div></div><div><div><div>20</div></div><div><span>eoof</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>1.5.9 创建 default.conf 文件<a href="#159-创建-defaultconf-文件"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>./debian/default.conf</span><span> &lt;&lt; </span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>server {</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>listen 80;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>server_name _;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>root /usr/share/nginx/html;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>index index.html;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>location / {</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>try_files $uri $uri/ =404;</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span>}</span></div></div><div><div><div>11</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.5.10 创建 index.html文件<a href="#1510-创建-indexhtml文件"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>./debian/index.html</span><span> </span><span>&lt;</span><span>&lt; </span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>&lt;!</span><span>DOCTYPE</span><span> </span><span>html&gt;</span></div></div><div><div><div>3</div></div><div><span>&lt;html</span><span> </span><span>lang="zh-CN"&gt;</span></div></div><div><div><div>4</div></div><div><span>&lt;head&gt;</span></div></div><div><div><div>5</div></div><div><span>    </span><span>&lt;meta</span><span> </span><span>charset="UTF-8"&gt;</span></div></div><div><div><div>6</div></div><div><span>    </span><span>&lt;meta</span><span> </span><span>name="viewport"</span><span> </span><span>content="width=device-width, initial-scale=1.0"&gt;</span></div></div><div><div><div>7</div></div><div><span>    </span><span>&lt;title&gt;Nginx</span><span> </span><span>自定义构建测试页&lt;/title&gt;</span></div></div><div><div><div>8</div></div><div><span>    </span><span>&lt;style&gt;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>body</span><span> </span><span>{</span></div></div><div><div><div>10</div></div><div><span>            </span><span>font-family:</span><span> </span><span>-apple-system,</span><span> </span><span>BlinkMacSystemFont,</span><span> </span><span>"Segoe UI",</span><span> </span><span>Roboto,</span><span> </span><span>"Helvetica Neue",</span><span> </span><span>Arial,</span><span> </span><span>sans-serif</span><span>;</span></div></div><div><div><div>11</div></div><div><span>            </span><span>background-color:</span><span> </span><span>#f4f6f9;</span></div></div><div><div><div>12</div></div><div><span>            </span><span>color:</span><span> </span><span>#333;</span></div></div><div><div><div>13</div></div><div><span>            </span><span>display:</span><span> </span><span>flex</span><span>;</span></div></div><div><div><div>14</div></div><div><span>            </span><span>justify-content:</span><span> </span><span>center</span><span>;</span></div></div><div><div><div>15</div></div><div><span>            </span><span>align-items:</span><span> </span><span>center</span><span>;</span></div></div><div><div><div>16</div></div><div><span>            </span><span>height:</span><span> </span><span>100vh</span><span>;</span></div></div><div><div><div>17</div></div><div><span>            </span><span>margin:</span><span> </span><span>0</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>        </span><span>.container</span><span> </span><span>{</span></div></div><div><div><div>20</div></div><div><span>            </span><span>background:</span><span> </span><span>white</span><span>;</span></div></div><div><div><div>21</div></div><div><span>            </span><span>padding:</span><span> </span><span>40px</span><span>;</span></div></div><div><div><div>22</div></div><div><span>            </span><span>border-radius:</span><span> </span><span>8px</span><span>;</span></div></div><div><div><div>23</div></div><div><span>            </span><span>box-shadow:</span><span> </span><span>0</span><span> </span><span>4px</span><span> </span><span>15px</span><span> </span><span>rgba</span><span>(</span><span>0,0,0,0.1</span><span>);</span></div></div><div><div><div>24</div></div><div><span>            </span><span>text-align:</span><span> </span><span>center</span><span>;</span></div></div><div><div><div>25</div></div><div><span>            </span><span>max-width:</span><span> </span><span>600px</span><span>;</span></div></div><div><div><div>26</div></div><div><span>            </span><span>width:</span><span> </span><span>90%</span><span>;</span></div></div><div><div><div>27</div></div><div><span>            </span><span>border-top:</span><span> </span><span>5px</span><span> </span><span>solid</span><span> </span><span>#27ae60; /* 绿色顶部边框代表成功 */</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>        </span><span>h1</span><span> </span><span>{</span></div></div><div><div><div>30</div></div><div><span>            </span><span>color:</span><span> </span><span>#2c3e50;</span></div></div><div><div><div>31</div></div><div><span>            </span><span>margin-bottom:</span><span> </span><span>10px</span><span>;</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span>        </span><span>.status-badge</span><span> </span><span>{</span></div></div><div><div><div>34</div></div><div><span>            </span><span>display:</span><span> </span><span>inline-block</span><span>;</span></div></div><div><div><div>35</div></div><div><span>            </span><span>background-color:</span><span> </span><span>#d4edda;</span></div></div><div><div><div>36</div></div><div><span>            </span><span>color:</span><span> </span><span>#155724;</span></div></div><div><div><div>37</div></div><div><span>            </span><span>padding:</span><span> </span><span>5px</span><span> </span><span>15px</span><span>;</span></div></div><div><div><div>38</div></div><div><span>            </span><span>border-radius:</span><span> </span><span>50px</span><span>;</span></div></div><div><div><div>39</div></div><div><span>            </span><span>font-weight:</span><span> </span><span>bold</span><span>;</span></div></div><div><div><div>40</div></div><div><span>            </span><span>font-size:</span><span> </span><span>0.9em</span><span>;</span></div></div><div><div><div>41</div></div><div><span>            </span><span>margin-bottom:</span><span> </span><span>20px</span><span>;</span></div></div><div><div><div>42</div></div><div><span>            </span><span>border:</span><span> </span><span>1px</span><span> </span><span>solid</span><span> </span><span>#c3e6cb;</span></div></div><div><div><div>43</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>44</div></div><div><span>        </span><span>p</span><span> </span><span>{</span></div></div><div><div><div>45</div></div><div><span>            </span><span>line-height:</span><span> </span><span>1.6</span><span>;</span></div></div><div><div><div>46</div></div><div><span>            </span><span>color:</span><span> </span><span>#666;</span></div></div><div><div><div>47</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>48</div></div><div><span>        </span><span>.info-box</span><span> </span><span>{</span></div></div><div><div><div>49</div></div><div><span>            </span><span>background-color:</span><span> </span><span>#f8f9fa;</span></div></div><div><div><div>50</div></div><div><span>            </span><span>border:</span><span> </span><span>1px</span><span> </span><span>solid</span><span> </span><span>#e9ecef;</span></div></div><div><div><div>51</div></div><div><span>            </span><span>border-radius:</span><span> </span><span>4px</span><span>;</span></div></div><div><div><div>52</div></div><div><span>            </span><span>padding:</span><span> </span><span>15px</span><span>;</span></div></div><div><div><div>53</div></div><div><span>            </span><span>margin-top:</span><span> </span><span>20px</span><span>;</span></div></div><div><div><div>54</div></div><div><span>            </span><span>text-align:</span><span> </span><span>left</span><span>;</span></div></div><div><div><div>55</div></div><div><span>            </span><span>font-size:</span><span> </span><span>0.9em</span><span>;</span></div></div><div><div><div>56</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>57</div></div><div><span>        </span><span>.info-box</span><span> </span><span>strong</span><span> </span><span>{</span></div></div><div><div><div>58</div></div><div><span>            </span><span>color:</span><span> </span><span>#333;</span></div></div><div><div><div>59</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>60</div></div><div><span>        </span><span>code</span><span> </span><span>{</span></div></div><div><div><div>61</div></div><div><span>            </span><span>background-color:</span><span> </span><span>#eee;</span></div></div><div><div><div>62</div></div><div><span>            </span><span>padding:</span><span> </span><span>2px</span><span> </span><span>5px</span><span>;</span></div></div><div><div><div>63</div></div><div><span>            </span><span>border-radius:</span><span> </span><span>3px</span><span>;</span></div></div><div><div><div>64</div></div><div><span>            </span><span>font-family:</span><span> </span><span>monospace</span><span>;</span></div></div><div><div><div>65</div></div><div><span>            </span><span>color:</span><span> </span><span>#d63384;</span></div></div><div><div><div>66</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>67</div></div><div><span>    </span><span>&lt;/style&gt;</span></div></div><div><div><div>68</div></div><div><span>&lt;/head&gt;</span></div></div><div><div><div>69</div></div><div><span>&lt;body&gt;</span></div></div><div><div><div>70</div></div><div><span>    </span><span>&lt;div</span><span> </span><span>class="container"&gt;</span></div></div><div><div><div>71</div></div><div><span>        </span><span>&lt;!--</span><span> </span><span>状态徽章</span><span> </span><span>--&gt;</span></div></div><div><div><div>72</div></div><div><span>        </span><span>&lt;div</span><span> </span><span>class="status-badge"&gt;✅</span><span> </span><span>部署成功&lt;/div&gt;</span></div></div><div><div><div>73</div></div><div>
</div></div><div><div><div>74</div></div><div><span>        </span><span>&lt;h1&gt;欢迎使用自定义</span><span> </span><span>Nginx&lt;/h1&gt;</span></div></div><div><div><div>75</div></div><div>
</div></div><div><div><div>76</div></div><div><span>        </span><span>&lt;p&gt;恭喜！您已成功通过自制的</span><span> </span><span>DEB</span><span> </span><span>包安装并启动了</span><span> </span><span>Nginx</span><span> </span><span>服务。&lt;/p&gt;</span></div></div><div><div><div>77</div></div><div>
</div></div><div><div><div>78</div></div><div><span>        </span><span>&lt;div</span><span> </span><span>class="info-box"&gt;</span></div></div><div><div><div>79</div></div><div><span>            </span><span>&lt;p&gt;&lt;strong&gt;📦</span><span> </span><span>构建信息：&lt;/strong&gt;&lt;/p&gt;</span></div></div><div><div><div>80</div></div><div><span>            </span><span>&lt;ul</span><span> </span><span>style="list-style-type: none; padding-left: 0;"&gt;</span></div></div><div><div><div>81</div></div><div><span>                </span><span>&lt;li&gt;•</span><span> </span><span>&lt;strong&gt;包来源：&lt;/strong&gt;</span><span> </span><span>本地编译</span><span> (Custom </span><span>Build</span><span>)&lt;/li&gt;</span></div></div><div><div><div>82</div></div><div><span>                </span><span>&lt;li&gt;•</span><span> </span><span>&lt;strong&gt;维护者：&lt;/strong&gt;</span><span> </span><span>Zhang</span><span> </span><span>San</span><span> &amp;</span><span>lt</span><span>;</span><span>zhangsan@example.com</span><span>&amp;</span><span>gt</span><span>;</span><span>&lt;/li&gt;</span></div></div><div><div><div>83</div></div><div><span>                </span><span>&lt;li&gt;•</span><span> </span><span>&lt;strong&gt;版本标识：&lt;/strong&gt;</span><span> </span><span>nginx-custom</span><span> </span><span>/</span><span> </span><span>1.20.2&lt;/li&gt;</span></div></div><div><div><div>84</div></div><div><span>                </span><span>&lt;li&gt;•</span><span> </span><span>&lt;strong&gt;根目录：&lt;/strong&gt;</span><span> </span><span>&lt;code&gt;/etc/nginx/html&lt;/code&gt;&lt;/li&gt;</span></div></div><div><div><div>85</div></div><div><span>            </span><span>&lt;/ul&gt;</span></div></div><div><div><div>86</div></div><div><span>        </span><span>&lt;/div&gt;</span></div></div><div><div><div>87</div></div><div>
</div></div><div><div><div>88</div></div><div><span>        </span><span>&lt;p</span><span> </span><span>style="margin-top: 20px; font-size: 0.8em; color: #999;"&gt;</span></div></div><div><div><div>89</div></div><div><span>            </span><span>如果看到此页面，说明</span><span> </span><span>Nginx</span><span> </span><span>配置文件与文件系统权限均已正确设置。</span></div></div><div><div><div>90</div></div><div><span>        </span><span>&lt;/p&gt;</span></div></div><div><div><div>91</div></div><div><span>    </span><span>&lt;/div&gt;</span></div></div><div><div><div>92</div></div><div><span>&lt;/body&gt;</span></div></div><div><div><div>93</div></div><div><span>&lt;/html&gt;</span></div></div><div><div><div>94</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>1.5.11 构建deb包<a href="#1511-构建deb包"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 设置执行权限</span></div></div><div><div><div>2</div></div><div><span>cd</span><span> </span><span>debian</span></div></div><div><div><div>3</div></div><div><span>chmod</span><span> </span><span>+x</span><span> </span><span>changelog</span><span>  </span><span>control</span><span>  </span><span>postinst</span><span>  </span><span>prerm</span><span> </span><span>rules</span></div></div><div><div><div>4</div></div><div><span>#开始构建</span></div></div><div><div><div>5</div></div><div><span>cd</span><span> </span><span>..</span></div></div><div><div><div>6</div></div><div><span>dpkg-buildpackage</span><span> </span><span>-us</span><span> </span><span>-uc</span><span> </span><span>-b</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>构建完成后会在<code>工作目录的同级目录</code>出现打包好的deb包</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>test/</span></div></div><div><div><div>2</div></div><div><span>├──</span><span> </span><span>nginx/</span><span>         </span><span># nginx源码</span></div></div><div><div><div>3</div></div><div><span>│</span><span>   </span><span>└──</span><span> </span><span>debian</span><span>        </span><span># 创建的构建目录</span></div></div><div><div><div>4</div></div><div><span>├──</span><span>  </span><span>nginx.deb</span><span>      </span><span># 构建成功后出现的deb包</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.5.12 安装测试<a href="#1512-安装测试"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 安装</span></div></div><div><div><div>2</div></div><div><span>dpkg</span><span> </span><span>-i</span><span> </span><span>nginx-custom_1.20.2-1_amd64.deb</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 安装完成后，查看postinst是否执行创建nginx用户和用户组.同时也可查看对应目录权限</span></div></div><div><div><div>5</div></div><div><span>[root@localhost /test1]# id nginx</span></div></div><div><div><div>6</div></div><div><span>uid</span><span>=</span><span>105</span><span>(</span><span>nginx</span><span>) </span><span>gid</span><span>=</span><span>110</span><span>(</span><span>nginx</span><span>) </span><span>groups</span><span>=</span><span>110</span><span>(</span><span>nginx</span><span>)</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 查看nginx默认语法和运行状态</span></div></div><div><div><div>9</div></div><div><span>nginx</span><span> </span><span>-t</span></div></div><div><div><div>10</div></div><div><span>systemctl</span><span> </span><span>status</span><span> </span><span>nginx</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># 访问默认网页</span></div></div><div><div><div>13</div></div><div><span>http://ip</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span># 卸载包</span></div></div><div><div><div>16</div></div><div><span>dpkg</span><span> </span><span>-P</span><span> </span><span>nginx-custom</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section><section><h2>2.1 简单制作示例<a href="#21-简单制作示例"><span>#</span></a></h2><section><h3>2.1.1 创建打包工作目录与文件结构<a href="#211-创建打包工作目录与文件结构"><span>#</span></a></h3><p>创建一个工作目录，并模拟软件安装到系统后的目录结构。我们将脚本放在 <code>usr/bin/</code> 目录下：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 创建主工作目录</span></div></div><div><div><div>2</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>hello_1.0_all/usr/bin</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 进入工作目录</span></div></div><div><div><div>5</div></div><div><span>cd</span><span> </span><span>hello_1.0_all</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.1.2 准备软件文件<a href="#212-准备软件文件"><span>#</span></a></h3><p>在<code>usr/bin/</code>目录下创建一个简单的可执行脚本文件<code>hello</code></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 创建脚本文件并写入内容</span></div></div><div><div><div>2</div></div><div><span>echo</span><span> </span><span>-e</span><span> </span><span>'#!/bin/bash\necho "Hello, Debian Package!"'</span><span> &gt; </span><span>usr/bin/hello</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 赋予脚本可执行权限</span></div></div><div><div><div>5</div></div><div><span>chmod</span><span> </span><span>+x</span><span> </span><span>usr/bin/hello</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.1.3 创建 DEBIAN 目录及 control 文件<a href="#213-创建-debian-目录及-control-文件"><span>#</span></a></h3><p>在工作目录下创建 <code>DEBIAN</code> 子目录，并编写 <code>control</code> 元数据文件：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 创建 DEBIAN 目录</span></div></div><div><div><div>2</div></div><div><span>mkdir</span><span> </span><span>DEBIAN</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 创建并写入 control 文件</span></div></div><div><div><div>5</div></div><div><span>cat</span><span> &lt;&lt;</span><span>EOF</span><span> &gt; </span><span>DEBIAN/control</span></div></div><div><div><div>6</div></div><div><span>Package: hello</span></div></div><div><div><div>7</div></div><div><span>Version: 1.0</span></div></div><div><div><div>8</div></div><div><span>Architecture: all</span></div></div><div><div><div>9</div></div><div><span>Maintainer: Your Name &lt;your.email@example.com&gt;</span></div></div><div><div><div>10</div></div><div><span>Description: A simple hello world script</span></div></div><div><div><div>11</div></div><div><span><span> </span></span><span>This is a sample package to demonstrate how to create a deb package.</span></div></div><div><div><div>12</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><em>注意：<code>Architecture: all</code> 表示该包适用于所有硬件架构（因为是纯脚本）。<code>control</code> 文件的最后一行（Description 的长描述）前面必须有一个空格。</em></p><section><h4>2.1.4 构建 deb 包<a href="#214-构建-deb-包"><span>#</span></a></h4><p>退回到工作目录的上一级，使用 <code>dpkg-deb</code> 命令进行打包：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 返回上级目录</span></div></div><div><div><div>2</div></div><div><span>cd</span><span> </span><span>..</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 执行打包命令</span></div></div><div><div><div>5</div></div><div><span>dpkg-deb</span><span> </span><span>--build</span><span> </span><span>--root-owner-group</span><span> </span><span>hello_1.0_all</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>执行完毕后，当前目录下会生成一个名为 <code>hello_1.0_all.deb</code> 的软件包文件。</p></section></section><section><h3>2.1.5 测试与安装<a href="#215-测试与安装"><span>#</span></a></h3><p>使用 <code>dpkg</code> 命令来安装和测试这个软件包：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 安装 deb 包</span></div></div><div><div><div>2</div></div><div><span>sudo</span><span> </span><span>dpkg</span><span> </span><span>-i</span><span> </span><span>hello_1.0_all.deb</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 运行测试</span></div></div><div><div><div>5</div></div><div><span>hello</span></div></div><div><div><div>6</div></div><div><span># 预期输出: Hello, Debian Package!</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># （可选）卸载软件包</span></div></div><div><div><div>9</div></div><div><span>sudo</span><span> </span><span>dpkg</span><span> </span><span>-r</span><span> </span><span>hello</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/dnsmasq%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</id>
      <title type="text">dnsmasq使用</title>
      <published>2026-07-26T00:00:00.000Z</published>
      <updated>2026-07-26T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/dnsmasq%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/"/>
      <summary type="text">dnsmasq使用</summary>
      <content type="html"><![CDATA[<section><h1>一、dnsmasq介绍<a href="#一dnsmasq介绍"><span>#</span></a></h1><section><h2>1.1 简介<a href="#11-简介"><span>#</span></a></h2><p><code>dnsmasq</code> 是一个轻量级、功能强大的网络服务工具，常用于中小型网络或嵌入式系统（如路由器、虚拟化环境等）。它可以同时提供 DNS 缓存服务、DHCP 服务、TFTP 服务、PXE 启动支持等功能。</p></section><section><h2>1.2 基本概述<a href="#12-基本概述"><span>#</span></a></h2><p>dnsmasq 的主要目标是为本地网络提供简单易用的网络基础服务，通常用在：</p><ul>
<li>局域网 (LAN)</li>
<li>虚拟化平台（如 libvirt、KVM、OpenStack）</li>
<li>树莓派、OpenWRT、嵌入式设备</li>
<li>容器网络（如 Docker、Podman）</li>
</ul><p>它通过一个配置文件（通常是 <code>/etc/dnsmasq.conf</code>）集中管理网络服务。</p></section><section><h2>1.3 主要功能<a href="#13-主要功能"><span>#</span></a></h2><ul>
<li>
<p>**DNS 缓存服务器：**dnsmasq 可以作为上游 DNS 的代理服务器，对解析结果进行缓存，提升网络解析速度。</p>
<ul>
<li>
<p>加快域名解析速度；</p>
</li>
<li>
<p>减少外部 DNS 查询次数；</p>
</li>
<li>
<p>可配置静态域名映射（本地 DNS 记录）。</p>
</li>
</ul>
</li>
<li>
<p>**DHCP 服务：**dnsmasq 还可以充当 DHCP 服务器，为局域网设备动态分配 IP 地址。</p>
</li>
<li>
<p>**TFTP 服务：**dnsmasq 可以提供 TFTP 服务，用于无盘启动或网络刷机。</p>
</li>
<li>
<p>**PXE 网络启动：**结合 DHCP 与 TFTP，可以让设备通过网络加载启动镜像（常用于自动化安装系统、测试环境）。</p>
</li>
<li>
<p>**DNS 重定向 / 局域网劫持：**可以用来实现简单的广告屏蔽或内部域名解析。</p>
</li>
</ul></section></section>
<section><h1>二、安装配置<a href="#二安装配置"><span>#</span></a></h1><section><h2>2.1 yum安装<a href="#21-yum安装"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>yum</span><span> </span><span>install</span><span> </span><span>dnsmasq</span><span> </span><span>-y</span></div></div><div><div><div>2</div></div><div><span># 验证版本</span></div></div><div><div><div>3</div></div><div><span>dnsmasq</span><span> </span><span>-v</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>2.2 软件配置<a href="#22-软件配置"><span>#</span></a></h2><section><h3>2.2.1 配置路径<a href="#221-配置路径"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>/etc/dnsmasq.conf</span><span>       </span><span># 主配置文件（单文件模式）</span></div></div><div><div><div>2</div></div><div><span>/etc/dnsmasq.d/</span><span>         </span><span># 分模块配置目录</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong><code>/etc/dnsmasq.conf</code></strong>：</p><ul>
<li><code>/etc/dnsmasq.conf</code> 是 dnsmasq 的主配置文件，用于配置 dnsmasq 的全局选项和参数。</li>
<li>在这个文件中，你可以配置诸如监听地址、缓存大小、域名解析规则、DHCP设置等全局性的选项。</li>
<li>所有的配置都直接写入到这个文件中。</li>
</ul><p><strong><code>/etc/dnsmasq.d/</code> 目录</strong>：</p><ul>
<li><code>/etc/dnsmasq.d/</code> 目录是一个目录，用于存放 dnsmasq 的额外配置文件。</li>
<li>在这个目录中，你可以创建多个以 <code>.conf</code> 为后缀的配置文件，每个文件可以包含特定的配置选项。</li>
<li>这种组织结构使得配置更加灵活，可以<code>将不同功能或用途的配置分开放置在不同的文件中</code>，便于管理和维护。</li>
</ul><p><strong>启动时的加载顺序：</strong></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>1.</span><span> </span><span>读取</span><span> </span><span>/etc/dnsmasq.conf</span></div></div><div><div><div>2</div></div><div><span>2.</span><span> </span><span>解析</span><span> </span><span>conf-file</span><span> </span><span>/</span><span> </span><span>conf-dir</span><span> </span><span>指令</span></div></div><div><div><div>3</div></div><div><span>3.</span><span> </span><span>加载</span><span> </span><span>/etc/dnsmasq.d/</span><span>*</span><span>.conf</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.2.2 模块化配置<a href="#222-模块化配置"><span>#</span></a></h3><p>这里不将所有配置全都放到<code>dnsmasq.conf</code>中，而是将配置文件拆分多个模块，放在<code>dnsmasq.d</code>文件夹中，而主配置文件<code>dnsmasq.conf</code>只作为启动文件</p><section><h4>2.2.2.1 修改主配置文件<a href="#2221-修改主配置文件"><span>#</span></a></h4><p>编辑 <code>/etc/dnsmasq.conf</code>，<strong>只保留这一行</strong>（其他全部注释或删除）：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 加载 /etc/dnsmasq.d/ 下所有 .conf 配置</span></div></div><div><div><div>2</div></div><div><span>conf-dir</span><span>=</span><span>/etc/dnsmasq.d/,*.conf</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>2.2.2.2 在模块文件夹下创建配置文件<a href="#2222-在模块文件夹下创建配置文件"><span>#</span></a></h4><ol>
<li>模块 1：00-base.conf 基础核心配置</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 监听 DNS 端口（标准 53）</span></div></div><div><div><div>2</div></div><div><span>port</span><span>=</span><span>53</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 不解析不带域名的主机名（避免无效广播解析），拒绝解析类似 pc01 这种无域名的请求。</span></div></div><div><div><div>5</div></div><div><span>domain-needed</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 不返回内网私有地址的反向解析（防泄露、防污染），拒绝 10/172.16/192.168 等内网段的反向解析。</span></div></div><div><div><div>8</div></div><div><span>bogus-priv</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 自动给简单主机名补上域名（如 test → test.lan）</span></div></div><div><div><div>11</div></div><div><span>expand-hosts</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span># 定义本地域名（可选）</span></div></div><div><div><div>14</div></div><div><span>domain</span><span>=</span><span>lan</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>01-listen.conf 监听地址 / 网卡</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 监听本机所有 IP（内网 IP + 127.0.0.1）。明确 dnsmasq 在哪几个 IP 上提供 DNS</span></div></div><div><div><div>2</div></div><div><span>listen-address</span><span>=</span><span>127.0.0.1,192.168.1.10</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 只绑定指定网卡，不监听 0.0.0.0（更安全）强制只绑定上面列出的 IP，不监听全网卡。</span></div></div><div><div><div>5</div></div><div><span>bind-interfaces</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 只允许在 eth0 上提供服务（可选二选一）按网卡控制，适合多网卡机器。</span></div></div><div><div><div>8</div></div><div><span># interface=eth0</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 排除某个网卡（可选）</span></div></div><div><div><div>11</div></div><div><span># except-interface=docker0</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>模块 3：02-dns-cache.conf DNS 缓存配置</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 缓存条目数量（根据内存调整：512M → 10000；2G → 50000）</span></div></div><div><div><div>2</div></div><div><span>cache-size</span><span>=</span><span>10000</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 不缓存“解析失败”的结果（避免一直返回错误）</span></div></div><div><div><div>5</div></div><div><span>no-negcache</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 最小缓存 TTL（单位秒），防止上游 TTL 太短</span></div></div><div><div><div>8</div></div><div><span>min-cache-ttl</span><span>=</span><span>60</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 最大缓存 TTL</span></div></div><div><div><div>11</div></div><div><span>max-cache-ttl</span><span>=</span><span>86400</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p><strong>参数作用：</strong></p><ul>
<li><code>cache-size</code>：DNS 解析结果缓存条数，越大越吃内存。</li>
<li><code>no-negcache</code>：不缓存 NXDOMAIN（域名不存在）。</li>
<li><code>min/max-cache-ttl</code>：控制缓存时间，稳定内网解析。</li>
</ul></blockquote><ol>
<li>模块 4：03-upstream-dns.conf 上游公共 DNS</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 不使用系统 /etc/resolv.conf 作为上游</span></div></div><div><div><div>2</div></div><div><span>no-resolv</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 向上游 DNS 递归查询（阿里云 + 114 示例）</span></div></div><div><div><div>5</div></div><div><span>server</span><span>=</span><span>223.5.5.5</span></div></div><div><div><div>6</div></div><div><span>server</span><span>=</span><span>223.6.6.6</span></div></div><div><div><div>7</div></div><div><span>server</span><span>=</span><span>114.114.114.114</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 同时查询所有上游，取最快返回（可选）</span></div></div><div><div><div>10</div></div><div><span>all-servers</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p><strong>参数作用</strong>:</p><ul>
<li><code>no-resolv</code>：禁止读取系统自带 DNS，保证配置可控。</li>
<li><code>server=IP</code>：定义上游递归 DNS，可写多个。</li>
<li><code>all-servers</code>：并发查询所有上游，降低延迟。</li>
</ul></blockquote><ol>
<li>04-local-hosts.conf 本地自定义域名</li>
</ol><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 方式一：使用额外 hosts 文件（推荐）</span></div></div><div><div><div>2</div></div><div><span># 从自定义 hosts 读取本地域名</span></div></div><div><div><div>3</div></div><div><span>addn-hosts</span><span>=</span><span>/etc/dnsmasq.hosts</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>echo</span><span> &gt;&gt; </span><span>/etc/dnsmasq.hosts</span><span> &lt;&lt;</span><span>EOF</span></div></div><div><div><div>6</div></div><div><span>192.168.1.10  router.lan</span></div></div><div><div><div>7</div></div><div><span>192.168.1.20  nas.lan</span></div></div><div><div><div>8</div></div><div><span>192.168.1.30  pihole.lan</span></div></div><div><div><div>9</div></div><div><span>EOF</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span># 方式二：直接在 dnsmasq 配置写（简单）</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span># 静态域名解析</span></div></div><div><div><div>14</div></div><div><span>address</span><span>=</span><span>/router.lan/192.168.1.10</span></div></div><div><div><div>15</div></div><div><span>address</span><span>=</span><span>/nas.lan/192.168.1.20</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span># 泛解析（*.test.lan → 192.168.1.100）</span></div></div><div><div><div>18</div></div><div><span>address</span><span>=</span><span>/test.lan/192.168.1.100</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><p>**参数作用 : **</p><ul>
<li><code>addn-hosts</code>：加载额外 hosts，不污染系统 <code>/etc/hosts</code>。</li>
<li><code>address=/域名/IP</code>：强制指定域名解析结果，可做内网劫持、广告拦截。</li>
</ul></blockquote><ol>
<li>05-log.conf 日志配置</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 记录所有 DNS 查询请求</span></div></div><div><div><div>2</div></div><div><span>log-queries</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 日志输出到文件（也可以用 systemd 日志）</span></div></div><div><div><div>5</div></div><div><span>log-facility</span><span>=</span><span>/var/log/dnsmasq.log</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 异步日志，不阻塞 DNS 响应</span></div></div><div><div><div>8</div></div><div><span>log-async</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p><strong>参数作用</strong></p><ul>
<li><code>log-queries</code>：记录谁查了什么域名。</li>
<li><code>log-facility</code>：指定日志文件。</li>
<li><code>log-async</code>：异步写日志，提升性能。</li>
</ul></blockquote></section><section><h4>2.2.2.3 验证语法和测试<a href="#2223-验证语法和测试"><span>#</span></a></h4><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 验证语法，出现ok则代表没问题</span></div></div><div><div><div>2</div></div><div><span>dnsmasq</span><span> </span><span>--test</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 启动软件</span></div></div><div><div><div>5</div></div><div><span>systemctl</span><span> </span><span>start</span><span> </span><span>dnsmasq</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 测试</span></div></div><div><div><div>8</div></div><div><span>dig</span><span> </span><span>@127.0.0.1</span><span> </span><span>router.lan</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 结果如下</span></div></div><div><div><div>11</div></div><div><span>; </span><span>&lt;</span><span>&lt;&gt;&gt; </span><span>DiG</span><span> </span><span>9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.16</span><span> </span><span>&lt;</span><span>&lt;&gt;&gt; </span><span>@127.0.0.1</span><span> </span><span>router.lan</span></div></div><div><div><div>12</div></div><div><span>; (</span><span>1</span><span> </span><span>server</span><span> </span><span>found</span><span>)</span></div></div><div><div><div>13</div></div><div><span>;; </span><span>global</span><span> </span><span>options:</span><span> </span><span>+cmd</span></div></div><div><div><div>14</div></div><div><span>;; </span><span>Got</span><span> </span><span>answer:</span></div></div><div><div><div>15</div></div><div><span>;; </span><span>-</span><span>&gt;&gt;</span><span>HEADER</span><span>&lt;&lt;- </span><span>opcode:</span><span> </span><span>QUERY,</span><span> </span><span>status:</span><span> </span><span>NOERROR,</span><span> </span><span>id:</span><span> </span><span>7685</span></div></div><div><div><div>16</div></div><div><span>;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>;; OPT PSEUDOSECTION:</span></div></div><div><div><div>19</div></div><div><span>; EDNS: version: 0, flags:; udp: 4096</span></div></div><div><div><div>20</div></div><div><span>;; QUESTION SECTION:</span></div></div><div><div><div>21</div></div><div><span>;router.lan.      IN  A</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>;; ANSWER SECTION:</span></div></div><div><div><div>24</div></div><div><span>router.lan.    0  IN  A  192.168.1.10</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>;; Query time: 0 msec</span></div></div><div><div><div>27</div></div><div><span>;; SERVER: 127.0.0.1#53(127.0.0.1)</span></div></div><div><div><div>28</div></div><div><span>;; WHEN: Tue Feb 10 16:16:51 CST 2026</span></div></div><div><div><div>29</div></div><div><span>;; MSG SIZE  rcvd: 55</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section><section><h3>2.2.3 全局配置<a href="#223-全局配置"><span>#</span></a></h3><section><h4>2.2.3.1 全局参数<a href="#2231-全局参数"><span>#</span></a></h4>

<table><thead><tr><th>参数</th><th>说明</th></tr></thead><tbody><tr><td><code>resolv-file</code></td><td>定义dnsmasq从哪里获取上游DNS服务器的地址，默认从<code>/etc/resolv.conf</code>获取。</td></tr><tr><td><code>strict-order</code></td><td>表示严格按照<code>resolv-file</code>文件中的顺序从上到下进行DNS解析，直到第一个解析成功为止。</td></tr><tr><td><code>listen-address</code></td><td>定义dnsmasq监听的地址，默认是监控本机的所有网卡上。</td></tr><tr><td><code>address</code></td><td>启用泛域名解析，即自定义解析A记录。例如：<code>address=/long.com/192.168.115.10</code>，访问<code>long.com</code>时的所有域名都会被解析成<code>192.168.115.10</code>。</td></tr><tr><td><code>bogus-nxdomain</code></td><td>对于任何被解析到此IP的域名，将响应NXDOMAIN使其解析失效。可以多次指定，通常用于对于访问不存在的域名，禁止其跳转到运营商的广告站点。</td></tr><tr><td><code>server</code></td><td>指定使用哪个DNS服务器进行解析，对于不同的网站可以使用不同的域名对应解析。例如：<code>server=/google.com/8.8.8.8</code>表示对于<code>google.com</code>的服务，使用谷歌的DNS解析。</td></tr></tbody></table><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 在/dnsmasq.conf中创建如下内容</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>resolv-file</span><span>=</span><span>/etc/dnsmasq-resolv.conf</span><span>                  </span><span># 指定上游DNS服务器列表文件</span></div></div><div><div><div>4</div></div><div><span>strict-order</span><span>                                  </span><span># 按顺序查询上游DNS服务器</span></div></div><div><div><div>5</div></div><div><span>listen-address</span><span>=</span><span>127.0.0.1,192.168.106.33</span><span>                    </span><span># 监听自身服务器IP地址</span></div></div><div><div><div>6</div></div><div><span>addn-hosts</span><span>=</span><span>/etc/dnsmasq.hosts</span><span>            </span><span># 额外的hosts文件</span></div></div><div><div><div>7</div></div><div><span>cache-size</span><span>=</span><span>10000</span><span>                              </span><span># 设置DNS缓存大小</span></div></div><div><div><div>8</div></div><div><span>log-facility</span><span>=</span><span>/var/log/dnsmasq.log</span><span>  </span><span># 日志文件位置</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p><strong>参数说明：</strong></p><ul>
<li><code>resolv-file</code>：这个选项指定了 dnsmasq 应该使用的 resolv.conf 文件的位置。通常情况下，dnsmasq 会读取系统的 resolv.conf 文件来获取 DNS 服务器的配置，但是通过这个选项可以指定一个自定义的文件。</li>
<li><code>strict-order</code>：这个选项告诉 dnsmasq 在解析域名时是否应该严格按照 <code>/etc/resolv.conf</code> 中列出的 DNS 服务器顺序进行查询。如果设置为 <code>strict-order</code>，dnsmasq 将严格按照列表顺序进行查询；如果未设置或设置为 <code>no</code>, 则将按照最快响应的顺序进行查询。</li>
<li><code>listen-address</code>：这个选项指定了 dnsmasq 监听的 IP 地址。dnsmasq 只会在指定的 IP 地址上接收 DNS 查询请求，一般配置自身服务器的 IP 地址。</li>
<li><code>addn-hosts</code>：这个选项指定了 dnsmasq 应该读取的附加 hosts 文件的位置。dnsmasq 在解析域名时会优先查找这个文件，以便将域名解析到指定的 IP 地址。</li>
<li><code>cache-size</code>：这个选项设置了 dnsmasq 缓存的大小为 10000 条记录。它决定了 dnsmasq 可以缓存的 DNS 查询结果的数量。</li>
<li><code>log-facility</code>：这个选项指定了 dnsmasq 日志的位置。dnsmasq 将会把日志信息写入到指定的文件中。</li>
</ul></blockquote></section><section><h4>2.2.3.2 创建需要的文件<a href="#2232-创建需要的文件"><span>#</span></a></h4><ol>
<li>创建<code>/etc/dnsmasq-resovl.conf</code></li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 添加内容</span></div></div><div><div><div>2</div></div><div><span>server</span><span>=</span><span>223.5.5.5</span></div></div><div><div><div>3</div></div><div><span>server</span><span>=</span><span>223.6.6.6</span></div></div><div><div><div>4</div></div><div><span>server</span><span>=</span><span>114.114.114.114</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>创建<code>/etc/dnsmasq.hosts</code></li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 添加内容</span></div></div><div><div><div>2</div></div><div><span>echo</span><span> &gt;&gt; </span><span>/etc/dnsmasq.hosts</span><span> &lt;&lt;</span><span>EOF</span></div></div><div><div><div>3</div></div><div><span>192.168.1.10  router.lang</span></div></div><div><div><div>4</div></div><div><span>192.168.1.20  nas.lang</span></div></div><div><div><div>5</div></div><div><span>192.168.1.30  pihole.lang</span></div></div><div><div><div>6</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>2.2.3.3 验证语法和测试<a href="#2233-验证语法和测试"><span>#</span></a></h4><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 验证语法，出现ok则代表没问题</span></div></div><div><div><div>2</div></div><div><span>dnsmasq</span><span> </span><span>--test</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 启动软件</span></div></div><div><div><div>5</div></div><div><span>systemctl</span><span> </span><span>start</span><span> </span><span>dnsmasq</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 测试</span></div></div><div><div><div>8</div></div><div><span>dig</span><span> </span><span>@127.0.0.1</span><span> </span><span>router.lang</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 结果如下</span></div></div><div><div><div>11</div></div><div><span>; </span><span>&lt;</span><span>&lt;&gt;&gt; </span><span>DiG</span><span> </span><span>9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.16</span><span> </span><span>&lt;</span><span>&lt;&gt;&gt; </span><span>@127.0.0.1</span><span> </span><span>router.lang</span></div></div><div><div><div>12</div></div><div><span>; (</span><span>1</span><span> </span><span>server</span><span> </span><span>found</span><span>)</span></div></div><div><div><div>13</div></div><div><span>;; </span><span>global</span><span> </span><span>options:</span><span> </span><span>+cmd</span></div></div><div><div><div>14</div></div><div><span>;; </span><span>Got</span><span> </span><span>answer:</span></div></div><div><div><div>15</div></div><div><span>;; </span><span>-</span><span>&gt;&gt;</span><span>HEADER</span><span>&lt;&lt;- </span><span>opcode:</span><span> </span><span>QUERY,</span><span> </span><span>status:</span><span> </span><span>NOERROR,</span><span> </span><span>id:</span><span> </span><span>14737</span></div></div><div><div><div>16</div></div><div><span>;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>;; OPT PSEUDOSECTION:</span></div></div><div><div><div>19</div></div><div><span>; EDNS: version: 0, flags:; udp: 4096</span></div></div><div><div><div>20</div></div><div><span>;; QUESTION SECTION:</span></div></div><div><div><div>21</div></div><div><span>;router.lang.      IN  A</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>;; ANSWER SECTION:</span></div></div><div><div><div>24</div></div><div><span>router.lang.    0  IN  A  192.168.1.10</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>;; Query time: 0 msec</span></div></div><div><div><div>27</div></div><div><span>;; SERVER: 127.0.0.1#53(127.0.0.1)</span></div></div><div><div><div>28</div></div><div><span>;; WHEN: Tue Feb 10 16:36:44 CST 2026</span></div></div><div><div><div>29</div></div><div><span>;; MSG SIZE  rcvd: 56</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/dns%E6%9C%8D%E5%8A%A1/</id>
      <title type="text">DNS服务</title>
      <published>2026-07-24T00:00:00.000Z</published>
      <updated>2026-07-24T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/dns%E6%9C%8D%E5%8A%A1/"/>
      <summary type="text">DNS服务</summary>
      <content type="html"><![CDATA[<section><h1>1. 域名<a href="#1-域名"><span>#</span></a></h1><p>域名采用<strong>树形层级结构</strong>进行分级，由互联网名称与数字地址分配机构（ICANN）及各国域名管理机构统一管理，核心从<strong>根域名</strong>向下逐层划分，日常所说的<strong>一级、二级域名</strong>是对这个树形结构的通俗简化称呼（存在规范定义和口语称呼的小差异），三级及以下为子域名，层级可无限延伸</p><section><h2>1.1 根域名<a href="#11-根域名"><span>#</span></a></h2><p>所有域名的顶层，用<strong>一个点（.）</strong> 表示，是域名解析的最终根节点，用户不可见 / 不可注册</p><p>例子：  <code>.</code>（所有域名最后都隐含这个根，如<a href="https://baidu.com" target="_blank">baidu.com</a>实际是<a href="https://baidu.com" target="_blank">baidu.com</a>.）</p><p><code>管理机构：</code>ICANN（互联网根服务器管理机构）</p></section><section><h2>1.2 顶级域名<a href="#12-顶级域名"><span>#</span></a></h2><p>也叫<code>一级域名</code>，根域名下的第一层，是域名的 “后缀”，决定域名的类型 / 归属地，用户<strong>不可直接注册</strong>，仅能在其下注册下级域名</p><ul>
<li><code>例子：</code>.com、.org、.net（通用）；.cn、.us、.jp（国家 / 地区）；.xyz、.shop（新通用）</li>
<li><code>管理机构：</code>ICANN（通用顶级）/ 各国机构（如.cn 由中国互联网络信息中心 CNNIC 管理）</li>
</ul></section><section><h2>1.3 二级域名<a href="#13-二级域名"><span>#</span></a></h2><p>顶级域名下的第一层，<strong>用户可直接在域名服务商处注册的核心域名</strong>，具有全球 / 对应地区的唯一性</p><ul>
<li><code>例子：</code><a href="https://baidu.com" target="_blank">baidu.com</a>、<a href="https://qq.com" target="_blank">qq.com</a>、<a href="https://163.cn" target="_blank">163.cn</a>、taobao.xyz</li>
<li><code>管理机构：</code>域名服务商（如阿里云、腾讯云），注册后归用户所有</li>
</ul></section><section><h2>1.4 三级 / 四级域名（子域名）<a href="#14-三级--四级域名子域名"><span>#</span></a></h2><p>二级域名下的衍生域名，由<strong>域名所有者自行创建 / 解析</strong>，无需向服务商注册，可无限创建，无额外费用</p><ul>
<li><code>例子：</code><a href="http://www.baidu.com%E3%80%81map.baidu.com%E3%80%81news.163.cn%E3%80%81zhidao.zhihu.com" target="_blank">www.baidu.com、map.baidu.com、news.163.cn、zhidao.zhihu.com</a></li>
<li><code>管理机构：</code>二级域名的所有者（个人 / 企业）</li>
</ul></section></section>
<section><h1>二、域名解析<a href="#二域名解析"><span>#</span></a></h1><section><h2>2.1 使用dig +trace<a href="#21-使用dig-trace"><span>#</span></a></h2><p><code>dig +trace</code> 是 DNS 诊断工具 <code>dig</code> 的追踪模式，它会<strong>模拟完整的 DNS 递归解析过程</strong>：从根域名服务器（<code>.</code>）开始，依次查询顶级域（<code>com.</code>）、二级域（<code>baidu.com.</code>），最后到目标域名（<code>www.baidu.com</code>），并输出每一步的查询结果。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 执行命令</span></div></div><div><div><div>2</div></div><div><span>dig</span><span> </span><span>+trace</span><span> </span><span>www.baidu.com</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>2.2 结果解析<a href="#22-结果解析"><span>#</span></a></h2><section><h3>2.2.1 阶段1：查询根域名服务器（<code>.</code>）<a href="#221-阶段1查询根域名服务器"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>; </span><span>&lt;</span><span>&lt;&gt;&gt; </span><span>DiG</span><span> </span><span>9.10.6</span><span> </span><span>&lt;</span><span>&lt;&gt;&gt; </span><span>+trace</span><span> </span><span>www.baidu.com</span></div></div><div><div><div>2</div></div><div><span>;; </span><span>global</span><span> </span><span>options:</span><span> </span><span>+cmd</span></div></div><div><div><div>3</div></div><div><span>.</span><span>      </span><span>518400</span><span>  </span><span>IN</span><span>  </span><span>NS</span><span>  </span><span>a.root-servers.net.</span></div></div><div><div><div>4</div></div><div><span>.</span><span>      </span><span>518400</span><span>  </span><span>IN</span><span>  </span><span>NS</span><span>  </span><span>b.root-servers.net.</span></div></div><div><div><div>5</div></div><div><span>.</span><span>      </span><span>518400</span><span>  </span><span>IN</span><span>  </span><span>NS</span><span>  </span><span>c.root-servers.net.</span></div></div><div><div><div>6</div></div><div><span>...</span><span>（共13台根服务器的NS记录）</span></div></div><div><div><div>7</div></div><div><span>;; </span><span>Received</span><span> </span><span>239</span><span> </span><span>bytes</span><span> </span><span>from</span><span> </span><span>192.168.1.1#53</span><span>(</span><span>192.168.1.1</span><span>) </span><span>in</span><span> </span><span>5</span><span> </span><span>ms</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>核心含义</strong>：本地 DNS 先查询根域名服务器的地址，返回全球 13 台根服务器的 <code>NS</code>（域名服务器）记录。</p><p><strong>字段解读</strong>：</p><ul>
<li>第一列 <code>.</code>：查询的是根域名；</li>
<li>第二列 <code>518400</code>：TTL（生存时间），表示该记录可缓存 518400 秒（6 天）；</li>
<li>第三列 <code>IN</code>：表示 Internet 类 DNS 记录（通用）；</li>
<li>第四列 <code>NS</code>：记录类型为 “域名服务器”；</li>
<li>最后一行 <code>Received</code>：从本地网关（192.168.1.1）的 53 端口（DNS 默认端口）收到响应，耗时 5ms。</li>
</ul></section><section><h3>2.2.2 阶段 2：查询顶级域服务器（<code>com.</code>）<a href="#222-阶段-2查询顶级域服务器com"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>com.</span><span>      </span><span>172800</span><span>  </span><span>IN</span><span>  </span><span>NS</span><span>  </span><span>a.gtld-servers.net.</span></div></div><div><div><div>2</div></div><div><span>com.</span><span>      </span><span>172800</span><span>  </span><span>IN</span><span>  </span><span>NS</span><span>  </span><span>b.gtld-servers.net.</span></div></div><div><div><div>3</div></div><div><span>...</span><span>（共13台com顶级域服务器的NS记录）</span></div></div><div><div><div>4</div></div><div><span>;; </span><span>Received</span><span> </span><span>1176</span><span> </span><span>bytes</span><span> </span><span>from</span><span> </span><span>198.41.0.4#53</span><span>(</span><span>a.root-servers.net</span><span>) </span><span>in</span><span> </span><span>12</span><span> </span><span>ms</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>核心含义</strong>：向根服务器（如 <a href="https://a.root-servers.net" target="_blank">a.root-servers.net</a>，IP 198.41.0.4）查询 <code>com.</code> 域的权威服务器，返回 <code>com</code> 顶级域的 NS 记录。</p><p>关键：<code>Received</code> 行显示响应来自根服务器的 IP（198.41.0.4），而非本地网关，说明进入 “递归查询” 阶段。</p></section><section><h3>2.2.3 查询二级域服务器（<code>baidu.com.</code>）<a href="#223-查询二级域服务器baiducom"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>baidu.com.</span><span>    </span><span>172800</span><span>  </span><span>IN</span><span>  </span><span>NS</span><span>  </span><span>ns7.baidu.com.</span></div></div><div><div><div>2</div></div><div><span>baidu.com.</span><span>    </span><span>172800</span><span>  </span><span>IN</span><span>  </span><span>NS</span><span>  </span><span>ns4.baidu.com.</span></div></div><div><div><div>3</div></div><div><span>...</span><span>（百度域名的权威NS服务器）</span></div></div><div><div><div>4</div></div><div><span>;; </span><span>Received</span><span> </span><span>500</span><span> </span><span>bytes</span><span> </span><span>from</span><span> </span><span>192.5.6.30#53</span><span>(</span><span>a.gtld-servers.net</span><span>) </span><span>in</span><span> </span><span>8</span><span> </span><span>ms</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>核心含义</strong>：向 <code>com</code> 顶级域的权威服务器（<a href="https://a.gtld-servers.net" target="_blank">a.gtld-servers.net</a>，IP 192.5.6.30）查询 <code>baidu.com.</code> 的权威服务器，返回百度自己的 DNS 服务器（如 <a href="https://ns7.baidu.com" target="_blank">ns7.baidu.com</a>）。</p></section><section><h3>2.2.4 查询最终域名（<code>www.baidu.com</code>）<a href="#224-查询最终域名wwwbaiducom"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>www.baidu.com.</span><span>    </span><span>1200</span><span>  </span><span>IN</span><span>  </span><span>CNAME</span><span>  </span><span>www.a.shifen.com.</span></div></div><div><div><div>2</div></div><div><span>www.a.shifen.com.</span><span>  </span><span>1200</span><span>  </span><span>IN</span><span>  </span><span>A</span><span>  </span><span>180.101.50.242</span></div></div><div><div><div>3</div></div><div><span>www.a.shifen.com.</span><span>  </span><span>1200</span><span>  </span><span>IN</span><span>  </span><span>A</span><span>  </span><span>180.101.50.188</span></div></div><div><div><div>4</div></div><div><span>;; </span><span>Received</span><span> </span><span>83</span><span> </span><span>bytes</span><span> </span><span>from</span><span> </span><span>14.215.177.229#53</span><span>(</span><span>ns7.baidu.com</span><span>) </span><span>in</span><span> </span><span>6</span><span> </span><span>ms</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>核心含义</strong>：向百度的权威 DNS 服务器（<a href="https://ns7.baidu.com" target="_blank">ns7.baidu.com</a>，IP 14.215.177.229）查询 <code>www.baidu.com</code>，得到最终解析结果：</p><ul>
<li><code>CNAME</code>：<code>www.baidu.com</code> 是 <code>www.a.shifen.com</code> 的别名；</li>
<li><code>A</code>：<code>www.a.shifen.com</code> 对应的 IPv4 地址是 180.101.50.242/188（百度的服务器 IP）。</li>
</ul></section></section><section><h2>2.3 DNS 常用记录类型说明表<a href="#23-dns-常用记录类型说明表"><span>#</span></a></h2>

<table><thead><tr><th>记录类型</th><th>使用目的</th><th>核心特点 / 适用场景</th></tr></thead><tbody><tr><td>A 记录</td><td>将域名指向一个外网 IPv4 地址</td><td>最基础常用，域名直连服务器 IPv4</td></tr><tr><td>CNAME 记录</td><td>将域名指向另一个域名，由目标域名提供外网 IP 地址</td><td>域名别名，多域名指向同一服务器时适用</td></tr><tr><td>MX 记录</td><td>设置邮箱，使域名对应的邮箱能正常接收邮件</td><td>带优先级（数字越小优先级越高），邮箱必备</td></tr><tr><td>NS 记录</td><td>将子域名交给其他 DNS 服务商进行解析</td><td>授权子域名解析权限，主辅 DNS 分离时用</td></tr><tr><td>AAAA 记录</td><td>将域名指向一个外网 IPv6 地址</td><td>适配 IPv6 网络，与 A 记录互补</td></tr><tr><td>SRV 记录</td><td>标识某台服务器运行的特定服务</td><td>标注服务类型 / 端口 / 优先级，多用于微软 AD 等专业场景</td></tr><tr><td>TXT 记录</td><td>对域名进行标识和说明，绝大多数用于配置 SPF 反垃圾邮件记录</td><td>多功能型，也用于域名归属、DKIM/DMARC 验证</td></tr><tr><td>隐 / 显性 URL 记录</td><td>将一个域名指向另一已存在的站点</td><td>实现域名跳转；显性地址栏变化，隐形地址栏不变</td></tr></tbody></table></section></section>
<section><h1>三、DNS服务器搭建<a href="#三dns服务器搭建"><span>#</span></a></h1><section><h2>3.1 关闭NetworkManager + 防火墙 + SELinux<a href="#31-关闭networkmanager--防火墙--selinux"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 关闭NetworkManager并禁止开机自启</span></div></div><div><div><div>2</div></div><div><span>systemctl</span><span> </span><span>stop</span><span> </span><span>NetworkManager</span></div></div><div><div><div>3</div></div><div><span>systemctl</span><span> </span><span>disable</span><span> </span><span>NetworkManager</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 关闭firewalld并禁止开机自启（生产环境可开放53端口，下文有说明）</span></div></div><div><div><div>6</div></div><div><span>systemctl</span><span> </span><span>stop</span><span> </span><span>firewalld</span></div></div><div><div><div>7</div></div><div><span>systemctl</span><span> </span><span>disable</span><span> </span><span>firewalld</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 临时关闭SELinux（重启失效）</span></div></div><div><div><div>10</div></div><div><span>setenforce</span><span> </span><span>0</span></div></div><div><div><div>11</div></div><div><span># 永久关闭SELinux（需重启生效，修改后可先继续配置，最后重启）</span></div></div><div><div><div>12</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'s/^SELINUX=enforcing/SELINUX=disabled/'</span><span> </span><span>/etc/selinux/config</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>3.2 配置服务器静态 IP<a href="#32-配置服务器静态-ip"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vim</span><span> </span><span>/etc/sysconfig/network-scripts/ifcfg-ens33</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>TYPE</span><span>=</span><span>Ethernet</span></div></div><div><div><div>4</div></div><div><span>BOOTPROTO</span><span>=</span><span>static</span><span>  </span><span># 静态IP</span></div></div><div><div><div>5</div></div><div><span>IPADDR</span><span>=</span><span>192.168.1.100</span><span>  </span><span># DNS服务器IP</span></div></div><div><div><div>6</div></div><div><span>NETMASK</span><span>=</span><span>255.255.255.0</span><span>  </span><span># 子网掩码</span></div></div><div><div><div>7</div></div><div><span>GATEWAY</span><span>=</span><span>192.168.1.1</span><span>    </span><span># 网关</span></div></div><div><div><div>8</div></div><div><span>DNS1</span><span>=</span><span>127.0.0.1</span><span>         </span><span># 本机DNS指向自己</span></div></div><div><div><div>9</div></div><div><span>NAME</span><span>=</span><span>ens33</span></div></div><div><div><div>10</div></div><div><span>DEVICE</span><span>=</span><span>ens33</span></div></div><div><div><div>11</div></div><div><span>ONBOOT</span><span>=</span><span>yes</span><span>            </span><span># 开机启动网卡</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>3.3 安装相关软件包<a href="#33-安装相关软件包"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>yum</span><span> </span><span>install</span><span> </span><span>bind</span><span> </span><span>bind-utils</span><span> </span><span>bind-libs</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 验证版本</span></div></div><div><div><div>4</div></div><div><span>anmed</span><span> </span><span>-v</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>3.3.1 修改配置文件<a href="#331-修改配置文件"><span>#</span></a></h3><p>BIND 的配置分为<strong>主配置文件</strong>、<strong>区域配置文件</strong>、<strong>区域数据文件</strong>三层，按顺序修改，<strong>语法严格（分号 / 大括号不能错）</strong>，建议修改前备份原文件。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 备份配置文件</span></div></div><div><div><div>2</div></div><div><span>cp</span><span> </span><span>/etc/named.conf</span><span> </span><span>/etc/named.conf.bak</span></div></div><div><div><div>3</div></div><div><span>cp</span><span> </span><span>/etc/named.rfc1912.zones</span><span> </span><span>/etc/named.rfc1912.zones.bak</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h4>3.3.1.1 修改主配置文件<a href="#3311-修改主配置文件"><span>#</span></a></h4><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 主配置文件 /etc/named.conf</span></div></div><div><div><div>2</div></div><div><span># 该文件是 BIND 的核心配置，定义监听地址、允许查询网段、DNSSEC 等全局参数，仅修改需要调整的项，其余保持默认：</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>vim</span><span> </span><span>/etc/named.conf</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 修改监听地址，可选参数：ip列表；any（所有ip）</span></div></div><div><div><div>7</div></div><div><span>listen-on</span><span> </span><span>port</span><span> </span><span>53</span><span> </span><span>{</span><span> </span><span>127.0.0.1</span><span>; </span><span>192.168.1.100</span><span>;</span><span>any</span><span> </span><span>}</span><span>;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># ipv6监听,可选参数：ipv6列表；none（关闭ipv6监听）；any</span></div></div><div><div><div>10</div></div><div><span>listen-on-v6</span><span> </span><span>port</span><span> </span><span>53</span><span> </span><span>{</span><span> </span><span>::1</span><span>; };</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># 允许哪些主机查询 DNS 记录。可选参数：localhost；ip网段；any；none</span></div></div><div><div><div>13</div></div><div><span>allow-query</span><span>     </span><span>{</span><span> </span><span>localhost</span><span>; </span><span>192.168.1.0/24</span><span>; </span><span>any}</span><span>;</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span># 关闭DNSSEC验证（内网DNS无需开启，开启可能导致解析失败）</span></div></div><div><div><div>16</div></div><div><span>dnssec-validation</span><span> </span><span>no</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><p><strong>1. options {}其余可选配置：</strong></p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 转发器，本地无法解析的域名，转发到指定 DNS 服务器</span></div></div><div><div><div>2</div></div><div><span>forwarders</span><span> </span><span>{</span><span> </span><span>114.114.114.114</span><span>; </span><span>223.5.5.5</span><span>; };</span></div></div><div><div><div>3</div></div><div><span># 配合 forwarders 控制转发策略</span></div></div><div><div><div>4</div></div><div><span>forward</span><span> </span><span>only</span><span>;  </span><span># 可选参数：only：仅转发（转发失败则返回失败）；first：优先转发（转发失败则本地迭代解析）</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 控制哪些主机可使用 DNS 缓存（默认继承 allow-query），可选参数同allow-query</span></div></div><div><div><div>7</div></div><div><span>allow-query-cache</span><span> </span><span>{any</span><span>;};</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 控制哪些主机可触发递归解析，可选参数同allow-query</span></div></div><div><div><div>10</div></div><div><span>allow-recursion</span><span> </span><span>{any</span><span>;};</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># 是否开启 DNSSEC 验证（内网 DNS 建议设 no，避免解析失败）</span></div></div><div><div><div>13</div></div><div><span>dnssec-validation</span><span> </span><span>no</span><span>;</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span># 是否开启递归解析（内网 DNS 必须设 yes，否则无法解析外网域名）</span></div></div><div><div><div>16</div></div><div><span>recursion</span><span> </span><span>yes</span><span>;</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span># 全局 DNS 缓存的最大生存时间，超过则重新解析，时间（如 1D、12H、3600 秒）</span></div></div><div><div><div>19</div></div><div><span>max-cache-ttl</span><span> </span><span>1D</span><span>;</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span># BIND 的工作目录，区域数据文件默认存这里</span></div></div><div><div><div>22</div></div><div><span>directory</span><span>       </span><span>"/var/named"</span><span>;</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span># 缓存转储文件路径</span></div></div><div><div><div>25</div></div><div><span>dump-file</span><span>       </span><span>"/var/named/data/cache_dump.db"</span><span>;</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span># 统计信息文件路径</span></div></div><div><div><div>28</div></div><div><span>statistics-file</span><span> </span><span>"/var/named/data/named_stats.txt"</span><span>;</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span># PID 文件路径</span></div></div><div><div><div>31</div></div><div><span>pid-file</span><span>  </span><span>"/run/named/named.pid"</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span># 会话密钥文件路径</span></div></div><div><div><div>34</div></div><div><span>session-keyfile</span><span>  </span><span>"/run/named/session.key"</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span># 限制单个查询的最大客户端数，防止 DoS 攻击</span></div></div><div><div><div>37</div></div><div><span>max-clients-per-query</span><span> </span><span>100</span><span>;</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span># 限制每秒响应数，防攻击</span></div></div><div><div><div>40</div></div><div><span>rate-limit</span><span> </span><span>{</span><span> </span><span>responses-per-second</span><span> </span><span>10</span><span>; };</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><ol>
<li><strong>acl可选模块</strong></li>
</ol><p>自定义 ACL 可以简化权限配置（比如多次用到同一个网段时，只需写 ACL 名称）</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 定义名为 "lan" 的ACL，包含内网网段+本机</span></div></div><div><div><div>2</div></div><div><span>acl</span><span> </span><span>"lan"</span><span> </span><span>{</span></div></div><div><div><div>3</div></div><div><span>   </span><span>192.168.1.0/24</span><span>;</span></div></div><div><div><div>4</div></div><div><span>   </span><span>127.0.0.1</span><span>;</span></div></div><div><div><div>5</div></div><div><span>   </span><span>:</span><span>:1</span><span>;</span></div></div><div><div><div>6</div></div><div><span>};</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 在options中引用ACL</span></div></div><div><div><div>9</div></div><div><span>options</span><span> </span><span>{</span></div></div><div><div><div>10</div></div><div><span>   </span><span>allow-query</span><span> </span><span>{</span><span> </span><span>lan</span><span>; };  </span><span># 等价于写 192.168.1.0/24; 127.0.0.1; ::1;</span></div></div><div><div><div>11</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li><strong>logging可选模块</strong></li>
</ol><p>控制 DNS 日志的输出位置、级别</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>logging</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>   </span><span># 定义日志通道：输出到文件，级别debug</span></div></div><div><div><div>3</div></div><div><span>   </span><span>channel</span><span> </span><span>"dns_log"</span><span> </span><span>{</span></div></div><div><div><div>4</div></div><div><span>       </span><span>file</span><span> </span><span>"/var/log/named/named.log"</span><span> </span><span>versions</span><span> </span><span>3</span><span> </span><span>size</span><span> </span><span>100M</span><span>;  </span><span># 日志文件+保留3个版本+单文件100M</span></div></div><div><div><div>5</div></div><div><span>       </span><span>severity</span><span> </span><span>debug</span><span>;  </span><span># 日志级别：debug/info/warn/error/critical</span></div></div><div><div><div>6</div></div><div><span>       </span><span>print-time</span><span> </span><span>yes</span><span>;  </span><span># 打印时间</span></div></div><div><div><div>7</div></div><div><span>       </span><span>print-severity</span><span> </span><span>yes</span><span>;  </span><span># 打印级别</span></div></div><div><div><div>8</div></div><div><span>       </span><span>print-category</span><span> </span><span>yes</span><span>;  </span><span># 打印分类</span></div></div><div><div><div>9</div></div><div><span><span>   </span></span><span>};</span></div></div><div><div><div>10</div></div><div><span>   </span><span># 定义日志类别：将所有查询日志输出到dns_log通道</span></div></div><div><div><div>11</div></div><div><span>   </span><span>category</span><span> </span><span>queries</span><span> </span><span>{</span><span> </span><span>dns_log</span><span>; };</span></div></div><div><div><div>12</div></div><div><span>   </span><span># 定义日志类别：将所有错误日志输出到dns_log通道</span></div></div><div><div><div>13</div></div><div><span>   </span><span>category</span><span> </span><span>error</span><span> </span><span>{</span><span> </span><span>dns_log</span><span>; };</span></div></div><div><div><div>14</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li><strong>include可选模块</strong></li>
</ol><p>用于拆分配置（比如把区域配置放到 <code>named.rfc1912.zones</code>），<strong>路径可变</strong>，</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 引入区域配置文件（CentOS 7 默认配置）</span></div></div><div><div><div>2</div></div><div><span>include</span><span> </span><span>"/etc/named.rfc1912.zones"</span><span>;</span></div></div><div><div><div>3</div></div><div><span># 引入密钥文件（如DDNS密钥）</span></div></div><div><div><div>4</div></div><div><span>include</span><span> </span><span>"/etc/named.ddns.key"</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></blockquote></section><section><h4>3.3.1.2 修改区域配置文件<a href="#3312-修改区域配置文件"><span>#</span></a></h4><p>该文件用于<strong>定义正向解析区域和反向解析区域</strong>，告诉 BIND 需要管理哪些域名和 IP 段的解析，在文件末尾添加以下配置：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vim</span><span> </span><span>/etc/named.rfc1912.zones</span></div></div><div><div><div>2</div></div><div><span># 正向解析区域：域名→IP</span></div></div><div><div><div>3</div></div><div><span>zone</span><span> </span><span>"laixianshen.com"</span><span> </span><span>IN</span><span> </span><span>{</span></div></div><div><div><div>4</div></div><div><span>    </span><span>type</span><span> </span><span>master</span><span>;        </span><span># 类型为主服务器（内网核心DNS）</span></div></div><div><div><div>5</div></div><div><span>    </span><span>file</span><span> </span><span>"laixianshen.com.zone"</span><span>;  </span><span># 正向区域数据文件名称（自定义，需与后续创建的文件一致）</span></div></div><div><div><div>6</div></div><div><span>    </span><span>allow-update</span><span> </span><span>{</span><span> </span><span>none</span><span>; };  </span><span># 禁止动态更新（内网无需）</span></div></div><div><div><div>7</div></div><div><span>};</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 反向解析区域：IP→域名（区域名规则：IP段倒序.in-addr.arpa）</span></div></div><div><div><div>10</div></div><div><span># 192.168.1.0/24段的反向区域名：1.168.192.in-addr.arpa</span></div></div><div><div><div>11</div></div><div><span>zone</span><span> </span><span>"22.168.192.in-addr.arpa"</span><span> </span><span>IN</span><span> </span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>type</span><span> </span><span>master</span><span>;</span></div></div><div><div><div>13</div></div><div><span>    </span><span>file</span><span> </span><span>"192.168.22.zone"</span><span>;  </span><span># 反向区域数据文件名称（自定义）</span></div></div><div><div><div>14</div></div><div><span>    </span><span>allow-update</span><span> </span><span>{</span><span> </span><span>none</span><span>; };</span></div></div><div><div><div>15</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>

<table><thead><tr><th>示例参数</th><th>是否可变</th><th>核心说明</th></tr></thead><tbody><tr><td>“laixianshen.com”</td><td>是</td><td>区域名，正向解析填域名，反向解析填倒序 IP 段（如 1.168.192.in-addr.arpa）</td></tr><tr><td>IN</td><td>否</td><td>DNS 类标识，固定为<code>IN</code>（Internet 类），无需修改</td></tr><tr><td>type</td><td>是</td><td>区域类型，决定 DNS 服务器对该区域的角色</td></tr><tr><td>file</td><td>是</td><td>区域数据文件的名称 / 路径（默认存<code>/var/named/</code>，可填相对路径或绝对路径）</td></tr><tr><td>allow-update</td><td>是</td><td>控制哪些主机可动态更新该区域的解析记录（如 DDNS 场景）</td></tr></tbody></table><section><h5>zone 配置块的所有核心可变参数（含可选值 + 场景）<a href="#zone-配置块的所有核心可变参数含可选值--场景"><span>#</span></a></h5><p>除示例中的参数外，BIND 的 zone 块还支持大量可调参数，以下是内网 / 外网 DNS 最常用的参数，按使用频率排序：</p><section><h6>1. 核心必配参数<a href="#1-核心必配参数"><span>#</span></a></h6>

<table><thead><tr><th>参数名</th><th>可选值 / 格式</th><th>作用 &amp; 使用场景</th></tr></thead><tbody><tr><td><code>type</code></td><td>- <code>master</code>：主服务器（管理区域解析记录）<br />- <code>slave</code>：从服务器（同步主服务器记录）<br />- <code>forward</code>：转发区域（仅转发该区域的查询）<br />- <code>stub</code>：存根区域（仅同步主服务器的 NS 记录）</td><td>定义 DNS 服务器对该区域的角色，内网核心 DNS 必设为<code>master</code></td></tr><tr><td><code>file</code></td><td>字符串（如<code>test.com.zone</code>、<code>/var/named/test.com.zone</code>）</td><td>仅<code>type master/stub</code>需要，指定存储解析记录的区域数据文件路径；<code>type forward</code>无需该参数</td></tr><tr><td><code>masters</code></td><td>IP 地址列表（如<code>{ 192.168.1.100; }</code>）</td><td>仅<code>type slave/stub</code>需要，指定主服务器 IP，用于同步解析记录</td></tr><tr><td><code>forwarders</code></td><td>IP 地址列表（如<code>{ 114.114.114.114; 223.5.5.5; }</code>）</td><td>仅<code>type forward</code>需要，指定该区域查询的转发目标 DNS 服务器</td></tr><tr><td><code>forward</code></td><td>- <code>only</code>：仅转发（本地不解析，转发失败则返回失败）- <code>first</code>：优先转发（转发失败则本地迭代解析）</td><td>配合<code>forwarders</code>使用，控制转发策略</td></tr></tbody></table></section><section><h6>2. 权限控制参数（常用）<a href="#2-权限控制参数常用"><span>#</span></a></h6>

<table><thead><tr><th>参数名</th><th>可选值 / 格式</th><th>作用 &amp; 使用场景</th></tr></thead><tbody><tr><td><code>allow-query</code></td><td>- <code>none</code>：禁止所有查询<br />- <code>any</code>：允许所有查询<br />- 网段 / IP（如<code>{ 192.168.1.0/24; 127.0.0.1; }</code>）</td><td>控制哪些主机可查询该区域的解析记录，内网 DNS 建议限定内网网段</td></tr><tr><td><code>allow-update</code></td><td>- <code>none</code>：禁止动态更新（内网默认）<br />- <code>any</code>：允许所有主机更新（危险）<br />- 网段 / IP（如<code>{ 192.168.1.101; }</code>）<br />- 密钥认证（如<code>{ key "ddns-key"; }</code>）</td><td>控制动态更新权限（如 DDNS 场景），内网非必要则设为<code>none</code></td></tr><tr><td><code>allow-transfer</code></td><td>- <code>none</code>：禁止传输<br />- <code>any</code>：允许所有<br />- 从服务器 IP（如<code>{ 192.168.1.102; }</code>）</td><td>仅<code>master</code>类型需要，控制哪些从服务器可同步该区域的解析记录，建议仅允许从服务器 IP</td></tr><tr><td><code>notify</code></td><td><code>yes</code>/<code>no</code></td><td>仅<code>master</code>类型需要，修改记录后是否主动通知从服务器同步（主从架构建议设<code>yes</code>）</td></tr></tbody></table></section><section><h6>3. 其他实用参数<a href="#3-其他实用参数"><span>#</span></a></h6>

<table><thead><tr><th>参数名</th><th>可选值 / 格式</th><th>作用 &amp; 使用场景</th></tr></thead><tbody><tr><td><code>serial</code></td><td>数字（如 2026020901）</td><td>区域数据文件的序列号（主从同步依据），也可在 zone 块中定义（建议写在区域数据文件里）</td></tr><tr><td><code>refresh</code></td><td>时间（如 1D、1H、30M）</td><td>从服务器主动同步主服务器的间隔，主从架构用</td></tr><tr><td><code>expire</code></td><td>时间（如 1W、3D）</td><td>从服务器同步失败后，保留旧记录的最长时间，主从架构用</td></tr><tr><td><code>negative-cache-ttl</code></td><td>时间（如 3H、1H）</td><td>否定缓存时长（如查询不存在的域名时，缓存 “不存在” 结果的时间）</td></tr></tbody></table></section></section></section><section><h4>3.3.1.3 创建区域数据文件（正向 + 反向）<a href="#3313-创建区域数据文件正向--反向"><span>#</span></a></h4><p>区域数据文件是<strong>实际存储域名 - IP 映射关系</strong>的文件，存放在<code>/var/named/</code>，<strong>必须以<code>named</code>为属主</strong>（BIND 运行用户），建议基于系统默认模板<code>named.localhost</code>复制（模板已配置好权限和 SOA 记录格式）。</p><ol>
<li>创建正向解析数据文件：<code>/var/named/test.com.zone</code></li>
</ol><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 复制模板，保留原权限</span></div></div><div><div><div>2</div></div><div><span>cp</span><span> </span><span>-p</span><span> </span><span>/var/named/named.localhost</span><span> </span><span>/var/named/named.laixianshen.com.zone</span></div></div><div><div><div>3</div></div><div><span># 编辑文件</span></div></div><div><div><div>4</div></div><div><span>vim</span><span> </span><span>/var/named/named.laixianshen.com.zone</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>$TTL</span><span> 1D  ; </span><span>全局TTL，缓存时间1天,可选参数：D（天）、H（时）、M（分）、S（秒）</span></div></div><div><div><div>7</div></div><div><span>@</span><span>       </span><span>IN</span><span> </span><span>SOA</span><span>  </span><span>@</span><span>  </span><span>rename.invalid.</span><span> (</span></div></div><div><div><div>8</div></div><div><span>                                        </span><span>0</span><span>       ; </span><span>序列号（修改配置后需+1，否则从服务器不同步）</span></div></div><div><div><div>9</div></div><div><span>                                        </span><span>1D</span><span>      ; </span><span>刷新时间</span></div></div><div><div><div>10</div></div><div><span>                                        </span><span>1H</span><span>      ; </span><span>重试时间</span></div></div><div><div><div>11</div></div><div><span>                                        </span><span>1W</span><span>      ; </span><span>过期时间</span></div></div><div><div><div>12</div></div><div><span>                                        </span><span>3H</span><span> )    ; </span><span>否定缓存时间</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>        </span><span>NS</span><span>      </span><span>@</span></div></div><div><div><div>15</div></div><div><span>@</span><span>       </span><span>IN</span><span>  </span><span>A</span><span>   </span><span>192.168.77.11</span></div></div><div><div><div>16</div></div><div><span>dns</span><span>     </span><span>IN</span><span>  </span><span>A</span><span>   </span><span>192.168.33.22</span></div></div><div><div><div>17</div></div><div><span>test</span><span>    </span><span>IN</span><span>  </span><span>A</span><span>   </span><span>192.168.44.55</span></div></div><div><div><div>18</div></div><div><span>www</span><span>     </span><span>IN</span><span>  </span><span>A</span><span>   </span><span>192.168.33.55</span></div></div><div><div><div>19</div></div><div><span>www</span><span>     </span><span>IN</span><span>  </span><span>AAAA</span><span>        </span><span>::1</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><p><strong>关键参数说明：</strong></p><ol>
<li>
<p><strong>TTL作用</strong>：客户端 / 其他 DNS 服务器缓存这些解析记录的时间，超过后会重新查询获取最新记录，避免长期使用过期记录。</p>
</li>
<li>
<p><strong>@       IN SOA  @  rename.invalid.</strong>:</p>
</li>
</ol><ul>
<li>
<p><code>@</code>：DNS 区域文件的特殊符号，代表<strong>当前区域名</strong>（该文件对应的是<code>laixianshen.com</code>区域，则<code>@</code>等价于<code>laixianshen.com.</code>，末尾的<code>.</code>是 “绝对域名” 标识，不可省略）。</p>
</li>
<li>
<p><code>IN</code>：固定值，代表<code>Internet</code>类 DNS 记录（所有 DNS 记录默认用 IN 类，可省略）。</p>
</li>
<li>
<p><code>SOA</code>：Start of Authority（授权起始记录）的缩写，是每个区域文件<strong>必须包含的核心记录</strong>，标识该 DNS 区域的 “权威信息”，一个区域文件只能有 1 个 SOA 记录。</p>
</li>
<li>
<p><code>@</code>：指定该区域的<strong>主 DNS 服务器</strong>（Primary Nameserver），这里用<code>@</code>等价于当前区域名（<code>laixianshen.com.</code>），生产中建议写具体域名（如<code>ns.laixianshen.com.</code>）。</p>
</li>
<li>
<p><code>rename.invalid.</code>：该区域管理员的<strong>邮箱地址</strong>，DNS 中用<code>.</code>替代邮箱的<code>@</code>，所以<code>rename.invalid.</code>实际对应<code>rename@invalid</code>（这是系统默认占位符，生产中需改为真实邮箱，如<code>admin.test.com.</code>对应<code>admin@test.com</code>）；<strong>末尾的<code>.</code>必须加</strong>（代表绝对域名）。</p>
</li>
</ul><ol>
<li>
<p><strong><code>（ ）</code>：括号里面的为SOA参数</strong></p>
</li>
</ol><ul>
<li>
<p><code>serial</code>：序列号，SOA 的第一个核心参数，是区域文件的<strong>版本号</strong>（纯数字）。每次修改区域文件（新增 / 修改 / 删除记录）后，必须将序列号 + 1（如 8→9），否则从 DNS 服务器会认为文件未更新，不会同步新记录。</p>
</li>
<li>
<p><code>refresh</code>：刷新时间，SOA 的第二个参数，定义<strong>从 DNS 服务器</strong>主动向主 DNS 服务器查询 “是否有更新” 的间隔。设置一天，即从服务器每 24 小时主动检查一次主服务器的区域文件序列号，若序列号变大则同步新记录。</p>
</li>
<li>
<p><code>retry</code>：重试时间，若从服务器尝试 “刷新（refresh）” 失败（比如主服务器宕机），则等待该时间后重新尝试。设置一小时，即刷新失败后，每 1 小时重试一次。</p>
</li>
<li>
<p><code>expire</code>：过期时间，若从服务器持续无法与主服务器通信，超过该时间后，从服务器会<strong>放弃使用该区域的缓存记录</strong>，不再对外提供该区域的解析服务。设置1 周，即主从断连超过 7 天，从服务器就会失效该区域的所有记录。</p>
</li>
<li>
<p><code>minimum</code>：否定缓存时长（也叫 negative TTL），定义客户端查询 “不存在的域名” 时，缓存 “该域名不存在” 这个结果的时长。设置3 小时，比如查询<code>xxx.test.com</code>（无该记录），客户端会缓存 “<code>xxx.test.com</code>不存在” 的结果 3 小时，3 小时内再查不会发起新请求。</p>
</li>
</ul><ol>
<li>
<p><strong>NS      @</strong>：</p>
</li>
</ol><ul>
<li>
<p><code>NS</code>：Name Server（域名服务器记录），标识该区域的<strong>权威 DNS 服务器</strong>。</p>
</li>
<li>
<p>该行等价于<code>@ IN NS @</code>（省略了<code>IN</code>，默认生效），含义是：当前区域名（<code>laixianshen.com.</code>）的权威 DNS 服务器是它自己（<code>@</code>）。</p>
</li>
<li>
<p>注意：生产中 NS 记录建议写具体的 DNS 服务器域名（如<code>ns.laixianshen.com.</code>），且需配套 A/AAAA 记录，否则会解析失败。</p>
</li>
</ul><ol>
<li>
<p><strong>@       IN  A   192.168.77.11</strong>：</p>
</li>
</ol><ul>
<li>
<p><code>A</code>：IPv4 地址记录，核心作用是<strong>将域名映射到 IPv4 地址</strong>。</p>
</li>
<li>
<p>含义：当前区域名（<code>@</code>，<code>laixianshen.com.</code>）对应的 IPv4 地址是<code>192.168.77.11</code>，即访问<code>laixianshen.com</code>会解析到这个内网 IP。</p>
</li>
<li>
<p><code>IN</code>：显式指定 IN 类，可省略（默认生效）。</p>
</li>
<li>
<p>注意：该条与<code>NS  @</code>对应，将权威dns服务器映射到该ip地址，若权威dns服务器无IP地址映射则会报错</p>
</li>
</ul><ol>
<li>
<p><strong>dns     IN  A   192.168.33.22</strong>：</p>
</li>
</ol><ul>
<li>
<p>含义：子域名<code>dns.当前区域名</code>（<code>dns.laixianshen.com.</code>）对应的 IPv4 地址是<code>192.168.33.22</code>。</p>
</li>
<li>
<p>注意：子域名后省略了末尾的<code>.</code>，BIND 会自动拼接当前区域名，形成 “绝对域名”（<code>dns.laixianshen.com.</code>）。</p>
</li>
</ul><ol>
<li>
<p><strong>www     IN  AAAA        ::1</strong>:</p>
</li>
</ol><ul>
<li><code>AAAA</code>：IPv6 地址记录，核心作用是<strong>将域名映射到 IPv6 地址</strong>（与 A 记录对应，适配 IPv6 网络）。</li>
<li>含义：子域名<code>www.当前区域名</code>（<code>www.laixianshen.com.</code>）对应的 IPv6 地址是<code>::1</code>（本机回环地址，等价于 IPv4 的<code>127.0.0.1</code>）。</li>
<li>补充：同一域名可同时配置 A（IPv4）和 AAAA（IPv6）记录，实现 IPv4/IPv6 双栈解析。</li>
</ul></blockquote><ol>
<li>创建反向解析数据文件：<code>/var/named/192.168.1.zone</code></li>
</ol><p>反向解析数据文件，用于ip解析成为域名，和<strong>正向解析数据文件没有关联，可以相互独立出来</strong></p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 复制模板，保留原权限</span></div></div><div><div><div>2</div></div><div><span>cp</span><span> </span><span>-p</span><span> </span><span>/var/named/named.loopback</span><span> </span><span>/var/named/192.168.22.zone</span></div></div><div><div><div>3</div></div><div><span># 编辑文件</span></div></div><div><div><div>4</div></div><div><span>vim</span><span> </span><span>/var/named/192.168.22.zone</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>$TTL</span><span> 1D</span></div></div><div><div><div>7</div></div><div><span>@</span><span>       </span><span>IN</span><span> </span><span>SOA</span><span>  </span><span>helloworld.com.</span><span>  </span><span>admin.test.com.</span><span> (</span></div></div><div><div><div>8</div></div><div><span>                                        </span><span>0</span><span>       ; </span><span>序列号</span></div></div><div><div><div>9</div></div><div><span>                                        </span><span>1D</span><span>      ; </span><span>刷新</span></div></div><div><div><div>10</div></div><div><span>                                        </span><span>1H</span><span>      ; </span><span>重试</span></div></div><div><div><div>11</div></div><div><span>                                        </span><span>1W</span><span>      ; </span><span>过期</span></div></div><div><div><div>12</div></div><div><span>                                        </span><span>3H</span><span> )</span></div></div><div><div><div>13</div></div><div><span>        </span><span>NS</span><span>      </span><span>ns.helloworld.com.</span></div></div><div><div><div>14</div></div><div><span>100</span><span>     </span><span>IN</span><span> </span><span>PTR</span><span>  </span><span>ns.helloworld.com.</span></div></div><div><div><div>15</div></div><div><span>101</span><span>     </span><span>IN</span><span> </span><span>PTR</span><span>  </span><span>www.helloworld.com.</span></div></div><div><div><div>16</div></div><div><span>102</span><span>     </span><span>IN</span><span> </span><span>PTR</span><span>  </span><span>test.helloworld.com.</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><p><strong>关键参数说明：</strong></p><ol>
<li>
<p><strong>@       IN SOA  helloworld.com. rename.invalid.</strong>：</p>
</li>
</ol><ul>
<li>
<p><code>@</code>：DNS 区域文件的特殊符号，代表<strong>当前反向区域名</strong>（反向区域名规则：IP 段倒序 +.in-addr.arpa，比如 192.168.22.0/24 网段的反向区域名是<code>22.168.192.in-addr.arpa</code>，此时<code>@</code>就等价于这个反向区域名）。</p>
</li>
<li>
<p><code>helloworld.com.</code>：该反向区域的<strong>主 DNS 服务器域名</strong>，@则为<code>22.168.192.in-addr.arpa</code>（注意末尾的<code>.</code>是 “绝对域名” 标识，不可省略）；生产中建议写反向区域对应的权威 DNS 服务器（如<code>ns.helloworld.com.</code>）</p>
</li>
</ul><ol>
<li>
<p><strong>NS      ns.helloworld.com.</strong>:</p>
</li>
</ol><ul>
<li>
<p><code>NS</code>：Name Server（域名服务器记录），标识该反向区域的<strong>权威 DNS 服务器</strong></p>
</li>
<li>
<p>该行等价于<code>@ IN NS ns.helloworld.com.</code>（省略了<code>@</code>和<code>IN</code>，默认生效），含义是：当前反向区域名（<code>1.168.192.in-addr.arpa</code>）的权威 DNS 服务器是<code>ns.hellowrold.com.</code>（注意末尾的<code>.</code>不可省略）</p>
</li>
<li>
<p>关键：NS 记录指定的域名（<code>ns.hellorld.com.</code>）必须有对应的 A/AAAA 记录，否则反向解析会失败。</p>
</li>
</ul><ol>
<li>
<p><strong>100     IN PTR  ns.helloworld.com.</strong>:</p>
</li>
</ol><ul>
<li><code>PTR</code>：Pointer（指针记录），<strong>反向解析的核心记录</strong>，作用是「将 IP 地址映射到域名」（与正向解析的 A 记录相反）。</li>
<li>核心规则：反向区域文件中，<code>PTR</code>记录前的数字是 IP 的<strong>最后一段</strong>（需结合反向区域名确定完整 IP）。反向区域名是<code>22.168.192.in-addr.arpa</code>（对应 192.168.22.0/24），则<code>100</code>代表完整 IP 是<code>192.168.22.100</code>。</li>
<li>含义：IP 地址<code>192.168.22.100</code>反向解析到域名<code>ns.helloworld.com.</code></li>
<li>注意：<code>PTR</code>后的域名必须加末尾的<code>.</code>（绝对域名），否则 BIND 会自动拼接当前反向区域名，导致域名错误（如变成<code>ns.helloworld.com.22.168.192.in-addr.arpa.</code>）。</li>
</ul></blockquote></section><section><h4>3.3.1.4 修改区域数据文件权限<a href="#3314-修改区域数据文件权限"><span>#</span></a></h4><p><code>/var/named/</code>下的区域数据文件<strong>属主必须是 named</strong>，否则 BIND 启动失败</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>chown</span><span> </span><span>named:named</span><span> </span><span>/var/named/named.laixianshen.com.zone</span><span> </span><span>/var/named/192.168.22.zone</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>3.3.1.5 配置文件语法检查<a href="#3315-配置文件语法检查"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 检查主配置文件语法，无输出即表示语法无错误</span></div></div><div><div><div>2</div></div><div><span>named-checkconf</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 检查正向区域：正向区域名 + 区域数据文件</span></div></div><div><div><div>5</div></div><div><span>named-checkzone</span><span> </span><span>laixianshen.com</span><span> </span><span>/var/named/named.laixianhen.com.zone</span></div></div><div><div><div>6</div></div><div><span># 检查反向区域：反向区域名  + 区域数据文件</span></div></div><div><div><div>7</div></div><div><span>named-checkzone</span><span> </span><span>1.168.192.in-addr.arpa</span><span> </span><span>/var/named/192.168.1.zone</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 正常输出</span></div></div><div><div><div>10</div></div><div><span>zone</span><span> </span><span>test.com/IN:</span><span> </span><span>loaded</span><span> </span><span>serial</span><span> </span><span>0</span></div></div><div><div><div>11</div></div><div><span>OK</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section></section><section><h2>3.4 启动服务<a href="#34-启动服务"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 启动服务</span></div></div><div><div><div>2</div></div><div><span>systemctl</span><span> </span><span>start</span><span> </span><span>named</span></div></div><div><div><div>3</div></div><div><span># 设置开机自启</span></div></div><div><div><div>4</div></div><div><span>systemctl</span><span> </span><span>enable</span><span> </span><span>named</span></div></div><div><div><div>5</div></div><div><span># 查看状态</span></div></div><div><div><div>6</div></div><div><span>systemctl</span><span> </span><span>status</span><span> </span><span>named</span></div></div><div><div><div>7</div></div><div><span>systemctl</span><span> </span><span>is-enable</span><span> </span><span>named</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>3.5 测试<a href="#35-测试"><span>#</span></a></h2><section><h3>3.5.1 DNS本机测试<a href="#351-dns本机测试"><span>#</span></a></h3><p>将自身ip加入到<code> /etc/resolv.conf</code>中</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span> </span><span>vim</span><span> </span><span>/etc/resolv.conf</span></div></div><div><div><div>2</div></div><div><span>nameserver</span><span> </span><span>127.0.0.1</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h4>3.5.1.1 正向解析测试<a href="#3511-正向解析测试"><span>#</span></a></h4><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>nslookup</span><span> </span><span>www.laixianshen.com</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 出现如下结果，说明解析正常，与正向区域数据文件填入的ip地址一致</span></div></div><div><div><div>4</div></div><div><span>Server:</span><span>    </span><span>127.0.0.1</span></div></div><div><div><div>5</div></div><div><span>Address:</span><span>  </span><span>127.0.0.1#53</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>Name:</span><span>  </span><span>www.laixianshen.com</span></div></div><div><div><div>8</div></div><div><span>Address:</span><span> </span><span>192.168.33.55</span></div></div><div><div><div>9</div></div><div><span>Name:</span><span>  </span><span>www.laixianshen.com</span></div></div><div><div><div>10</div></div><div><span>Address:</span><span> </span><span>::1</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>dig</span><span> </span><span>@127.0.0.1</span><span> </span><span>laixianshen.com</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span># 出现如下结果</span></div></div><div><div><div>15</div></div><div><span>; </span><span>&lt;</span><span>&lt;&gt;&gt; </span><span>DiG</span><span> </span><span>9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.16</span><span> </span><span>&lt;</span><span>&lt;&gt;&gt; </span><span>@127.0.0.1</span><span> </span><span>laixianshen.com</span></div></div><div><div><div>16</div></div><div><span>; (</span><span>1</span><span> </span><span>server</span><span> </span><span>found</span><span>)</span></div></div><div><div><div>17</div></div><div><span>;; </span><span>global</span><span> </span><span>options:</span><span> </span><span>+cmd</span></div></div><div><div><div>18</div></div><div><span>;; </span><span>Got</span><span> </span><span>answer:</span></div></div><div><div><div>19</div></div><div><span>;; </span><span>-</span><span>&gt;&gt;</span><span>HEADER</span><span>&lt;&lt;- </span><span>opcode:</span><span> </span><span>QUERY,</span><span> </span><span>status:</span><span> </span><span>NOERROR,</span><span> </span><span>id:</span><span> </span><span>28448</span></div></div><div><div><div>20</div></div><div><span>;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>;; OPT PSEUDOSECTION:</span></div></div><div><div><div>23</div></div><div><span>; EDNS: version: 0, flags:; udp: 4096</span></div></div><div><div><div>24</div></div><div><span>;; QUESTION SECTION:</span></div></div><div><div><div>25</div></div><div><span>;laixianshen.com.    IN  A</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>;; ANSWER SECTION:</span></div></div><div><div><div>28</div></div><div><span>laixianshen.com.  86400  IN  A  192.168.77.11  #解析正常</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>;; AUTHORITY SECTION:</span></div></div><div><div><div>31</div></div><div><span>laixianshen.com.  86400  IN  NS  laixianshen.com.</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>;; Query time: 0 msec</span></div></div><div><div><div>34</div></div><div><span>;; SERVER: 127.0.0.1#53(127.0.0.1)</span></div></div><div><div><div>35</div></div><div><span>;; WHEN: Tue Feb 10 11:11:02 CST 2026</span></div></div><div><div><div>36</div></div><div><span>;; MSG SIZE  rcvd: 74</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h4>3.5.1.2 反向解析测试<a href="#3512-反向解析测试"><span>#</span></a></h4><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>nslookup</span><span> </span><span>192.168.22.100</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 出现如下结果，说明解析正常</span></div></div><div><div><div>4</div></div><div><span>100.22.168.192.in-addr.arpa</span><span>  </span><span>name</span><span> </span><span>=</span><span> </span><span>ns.helloworld.com.</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>dig</span><span> </span><span>@127.0.0.1</span><span> </span><span>-x</span><span> </span><span>192.168.22.101</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 出现如下结果说明解析正常</span></div></div><div><div><div>9</div></div><div><span>; </span><span>&lt;</span><span>&lt;&gt;&gt; </span><span>DiG</span><span> </span><span>9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.16</span><span> </span><span>&lt;</span><span>&lt;&gt;&gt; </span><span>@127.0.0.1</span><span> </span><span>-x</span><span> </span><span>192.168.22.101</span></div></div><div><div><div>10</div></div><div><span>; (</span><span>1</span><span> </span><span>server</span><span> </span><span>found</span><span>)</span></div></div><div><div><div>11</div></div><div><span>;; </span><span>global</span><span> </span><span>options:</span><span> </span><span>+cmd</span></div></div><div><div><div>12</div></div><div><span>;; </span><span>Got</span><span> </span><span>answer:</span></div></div><div><div><div>13</div></div><div><span>;; </span><span>-</span><span>&gt;&gt;</span><span>HEADER</span><span>&lt;&lt;- </span><span>opcode:</span><span> </span><span>QUERY,</span><span> </span><span>status:</span><span> </span><span>NOERROR,</span><span> </span><span>id:</span><span> </span><span>36551</span></div></div><div><div><div>14</div></div><div><span>;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>;; OPT PSEUDOSECTION:</span></div></div><div><div><div>17</div></div><div><span>; EDNS: version: 0, flags:; udp: 4096</span></div></div><div><div><div>18</div></div><div><span>;; QUESTION SECTION:</span></div></div><div><div><div>19</div></div><div><span>;101.22.168.192.in-addr.arpa.  IN  PTR</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>;; ANSWER SECTION:</span></div></div><div><div><div>22</div></div><div><span>101.22.168.192.in-addr.arpa. 86400 IN  PTR  www.helloworld.com.    # 解析正常</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>;; AUTHORITY SECTION:</span></div></div><div><div><div>25</div></div><div><span>22.168.192.in-addr.arpa. 86400  IN  NS  ns.helloworld.com.</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>;; Query time: 0 msec</span></div></div><div><div><div>28</div></div><div><span>;; SERVER: 127.0.0.1#53(127.0.0.1)</span></div></div><div><div><div>29</div></div><div><span>;; WHEN: Tue Feb 10 11:14:37 CST 2026</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section><section><h3>3.5.2 客户端测试<a href="#352-客户端测试"><span>#</span></a></h3><p>修改linux客户端或win客户端的dns服务器为该dns服务器（这里为<code>192.168.106.33</code>）</p><p>修改后，同样使用上述命令进行测试验证</p></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/drone%E4%BD%BF%E7%94%A8/</id>
      <title type="text">drone使用</title>
      <published>2026-07-19T00:00:00.000Z</published>
      <updated>2026-07-19T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/drone%E4%BD%BF%E7%94%A8/"/>
      <summary type="text">drone使用</summary>
      <content type="html"><![CDATA[<section><h1>一、drone使用<a href="#一drone使用"><span>#</span></a></h1><p>drone中文使用手册:<a href="https://drone.cool/" target="_blank">Drone 中文文档 | Drone CI 中文文档</a></p><section><h2>1.1 安装drone 服务端<a href="#11-安装drone-服务端"><span>#</span></a></h2><p>文档中给出了与各种代码平台进行集成，本篇使用<code>gitlab</code>进行集成</p><section><h3>1.1.1 代码平台创建应用<a href="#111-代码平台创建应用"><span>#</span></a></h3><p>各个代码平台创建应用的流程都大同小异，这里讲解<code>gitlab</code>的应用创建</p><p>步骤：用户设置-&gt;应用</p><ul>
<li><code>名称</code>：对应用设置一个名称，这里设置为<code>drone</code></li>
<li><code>redirect URL</code>：这里填写的是<code>drone服务端的网址</code>，这里为<code>http://10.22.51.91:8000/login</code>
<ul>
<li><code>URL格式：</code><strong>&lt;你的Drone服务地址&gt;/login</strong></li>
</ul>
</li>
<li><code>范围：</code>勾选<code>api</code>即可</li>
</ul><p></p><figure><img src="https://raw.giteeusercontent.com/lumiair/picture/raw/master/images/2026/07/17/drone/image-20260506163043362.png" alt="image-20260506163043362" /><figcaption>image-20260506163043362</figcaption></figure><p></p><p>应用创建成功后会生成如下页面，保存好对应的<code>程序id和密码</code></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/drone/image-20260506154112384.png" alt="image-20260506154112384" /><figcaption>image-20260506154112384</figcaption></figure><p></p><p><code>应用程序id</code>：<strong>b3a00532377c78e5cc4c3309783db99c0a041486440fee3c616b30fcd0eb7974</strong></p><p><code>密码</code>：<strong>353ac8ba81c10df27c7656bdf1f214b27b00dd53da85d646fdc51e34858688be</strong></p></section><section><h3>1.1.2 创建共享秘钥<a href="#112-创建共享秘钥"><span>#</span></a></h3><p>创建一个共享密钥来验证 <code>Runner</code> 和<code>Drone Server</code> 之间的通信。也可以自己填写，确保两端一直即可</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>[root@localhost /root/.ssh]# openssl rand -hex 16</span></div></div><div><div><div>2</div></div><div><span>3a9dcab8c7e72898b78455b24cd81225</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.1.3 下载drone server docker镜像<a href="#113-下载drone-server-docker镜像"><span>#</span></a></h3><p><code>Drone Server</code> 使用轻量的 Docker 镜像分发。镜像包含自身运行的所有程序，没有任何外部依赖。使用 <code>latest</code> 标签可以确保你使用的 Drone 始终是最新版本。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>pull</span><span> </span><span>drone/drone:latest</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.1.4 配置选项<a href="#114-配置选项"><span>#</span></a></h3><p>Drone Server 使用环境变量进行配置。本文引用了配置选项的子集，具体定义如下。有关配置选项的完整列表，请参阅 <a href="https://drone.cool/server/reference/" target="_blank">配置</a>。</p><ul>
<li>
<ul>
<li>
<p><strong>DRONE_GITLAB_CLIENT_ID</strong></p>
<p>必填项，提供你在上一步创建应用中生成的 <code>应用程序id</code>。</p>
</li>
</ul>
</li>
<li>
<ul>
<li>
<p><strong>DRONE_GITLAB_CLIENT_SECRET</strong></p>
<p>必填项，提供你在上一步中创建应用生成的 <code>密码</code>。</p>
</li>
</ul>
</li>
<li>
<ul>
<li>
<p><strong>DRONE_GITLAB_SERVER</strong></p>
<p>可选项，提供你的 GitLab 服务器 url。默认值为 <code>https://gitlab.com</code>，表示使用 gitlab.com 服务。</p>
</li>
</ul>
</li>
<li>
<ul>
<li>
<p><strong>DRONE_GIT_ALWAYS_AUTH</strong></p>
<p>可选项，配置值为布尔值，用于配置 Drone 在克隆公共存储库时是否进行身份验证。该选项仅应在使用启用私有模式的自托管 GitLab 时启用。</p>
</li>
</ul>
</li>
<li>
<ul>
<li>
<p><strong>DRONE_RPC_SECRET</strong></p>
<p>必填项，提供在上一步中生成的<code>共享密钥</code>。这用于验证 Server 和 Runner 之间的 rpc 连接。必须为 Server 和 Runner 提供相同的秘密值。</p>
</li>
</ul>
</li>
<li>
<ul>
<li>
<p><strong>DRONE_SERVER_HOST</strong></p>
<p>必填项，提供你的外部主机名或 IP 地址，例如 <code>drone.domain.com</code>。如果使用 IP 地址，你可以包括端口。</p>
<p><strong>注意：</strong><code>需要与redirect URL一致,但需要去掉login</code></p>
</li>
</ul>
</li>
<li>
<ul>
<li>
<p><strong>DRONE_SERVER_PROTO</strong></p>
<p>必填项，提供你的外部协议方案。此值应设置为 <code>http</code> 或 <code>https</code>。如果你配置 ssl 或 acme，此字段默认为 <code>https</code>。<em>如果你将 Drone 部署在负载均衡或带有禁止 SSL 的反向代理后面，则此值应设置为 <code>https</code>。</em></p>
</li>
</ul>
</li>
<li>
<ul>
<li>
<p><strong>DRONE_USER_FILTER</strong></p>
<p>可选项，GitLab 用户或组织列表，使用逗号分隔。注册仅限于此列表中的用户，或者是此列表中组织成员的用户。<em>如果未设置此值，注册将向公众开放。</em></p>
</li>
</ul>
</li>
</ul></section><section><h3>1.1.5 启动drone server docker 容器<a href="#115-启动drone-server-docker-容器"><span>#</span></a></h3><p>根据配置选项修改后，启动drone server docker容器</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>run</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>  </span><span>--volume=/var/lib/drone:/data</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>  </span><span>--env=DRONE_GITLAB_SERVER=http://10.22.51.72</span><span> </span><span>\</span></div></div><div><div><div>4</div></div><div><span>  </span><span>--env=DRONE_GITLAB_CLIENT_ID=b3a00532377c78e5cc4c3309783db99c0a041486440fee3c616b30fcd0eb7974</span><span> </span><span>\</span></div></div><div><div><div>5</div></div><div><span>  </span><span>--env=DRONE_GITLAB_CLIENT_SECRET=353ac8ba81c10df27c7656bdf1f214b27b00dd53da85d646fdc51e34858688be</span><span> </span><span>\</span></div></div><div><div><div>6</div></div><div><span>  </span><span>--env=DRONE_RPC_SECRET=3a9dcab8c7e72898b78455b24cd81225</span><span> </span><span>\</span></div></div><div><div><div>7</div></div><div><span>  </span><span>--env=DRONE_SERVER_HOST=10.22.51.91:8000</span><span> </span><span>\</span></div></div><div><div><div>8</div></div><div><span>  </span><span>--env=DRONE_SERVER_PROTO=http</span><span> </span><span>\</span></div></div><div><div><div>9</div></div><div><span>  </span><span>--publish=8000:80</span><span> </span><span>\</span></div></div><div><div><div>10</div></div><div><span>  </span><span>--restart=always</span><span> </span><span>\</span></div></div><div><div><div>11</div></div><div><span>  </span><span>--detach=true</span><span> </span><span>\</span></div></div><div><div><div>12</div></div><div><span>  </span><span>--name=drone</span><span> </span><span>\</span></div></div><div><div><div>13</div></div><div><span>  </span><span>drone/drone:latest</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h4>1.1.5.1 参数解释<a href="#1151-参数解释"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>run</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>  </span><span>--volume=/var/lib/drone:/data</span><span> </span><span>\ </span><span> </span><span># 数据持久化</span></div></div><div><div><div>3</div></div><div><span>  </span><span>--env</span><span>=</span><span>DRONE_GITLAB_SERVER</span><span>=</span><span>http://10.22.51.72</span><span> </span><span>\ </span><span> </span><span># GitLab 地址</span></div></div><div><div><div>4</div></div><div><span>  </span><span>--env</span><span>=</span><span>DRONE_GITLAB_CLIENT_ID</span><span>=</span><span>b3a00532377c78e5cc4c3309783db99c0a041486440fee3c616b30fcd0eb7974</span><span> </span><span>\ </span><span> </span><span># GitLab 应用ID</span></div></div><div><div><div>5</div></div><div><span>  </span><span>--env</span><span>=</span><span>DRONE_GITLAB_CLIENT_SECRET</span><span>=</span><span>353ac8ba81c10df27c7656bdf1f214b27b00dd53da85d646fdc51e34858688be</span><span> </span><span>\ </span><span> </span><span># GitLab 应用密码</span></div></div><div><div><div>6</div></div><div><span>  </span><span>--env</span><span>=</span><span>DRONE_RPC_SECRET</span><span>=</span><span>3a9dcab8c7e72898b78455b24cd81225</span><span> </span><span>\ </span><span> </span><span># Drone 内部通信密钥，可以生成或自己填写</span></div></div><div><div><div>7</div></div><div><span>  </span><span>--env</span><span>=</span><span>DRONE_SERVER_HOST</span><span>=</span><span>10.22.51.91:8000</span><span> </span><span>\ </span><span> </span><span># Drone 访问域名</span></div></div><div><div><div>8</div></div><div><span>  </span><span>--env</span><span>=</span><span>DRONE_SERVER_PROTO</span><span>=</span><span>http</span><span> </span><span>\ </span><span> </span><span># Drone 使用 http</span></div></div><div><div><div>9</div></div><div><span>  </span><span>--publish</span><span>=</span><span>8000:80</span><span> </span><span>\ </span><span> </span><span># 端口映射</span></div></div><div><div><div>10</div></div><div><span>  </span><span>--restart</span><span>=</span><span>always</span><span> </span><span>\ </span><span> </span><span># 开机/崩溃自动重启</span></div></div><div><div><div>11</div></div><div><span>  </span><span>--detach</span><span>=</span><span>true</span><span> </span><span>\ </span><span> </span><span># 后台运行</span></div></div><div><div><div>12</div></div><div><span>  </span><span>--name</span><span>=</span><span>drone</span><span> </span><span>\ </span><span> </span><span># 容器名字叫 drone</span></div></div><div><div><div>13</div></div><div><span>  </span><span>drone/drone:latest</span><span>  </span><span># 使用 drone 官方镜像最新版本</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>1.1.6 访问drone server 服务端<a href="#116-访问drone-server-服务端"><span>#</span></a></h3><p>访问<code>10.22.51.91:8000</code>，会来到drone的网页端，如果尚未通过身份验证，Drone 会将你重定向到 Gitlab 进行授权</p><p>授权后，将被重定向回你的 Drone Web 管理界面。<code>如果这是你第一次使用 Drone，你的 Web 管理界面将在几秒钟内为空，而 Drone 会将你的存储库列表与 Gitlab 同步。</code></p><p>授权成功后可以回到gitlab的应用界面，可以看到已经授权的应用</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/drone/image-20260506170644217.png" alt="image-20260506170644217" /><figcaption>image-20260506170644217</figcaption></figure><p></p></section></section><section><h2>1.2 安装drone runner<a href="#12-安装drone-runner"><span>#</span></a></h2><p><code>Drone Runner</code> 会主动轮询服务器以获取要执行的流水线任务。针对不同的用例和运行时环境，<code>Drone</code> 提供了不同类型的 <code>Runner</code>。你可以选择其中一种或多种不同类型的 <code>Runner</code> 进行组合，安装一个或多个 <code>Runner</code> 来运行你的流水线。</p><p>这里使用<code>docker runner</code></p><section><h3>1.2.1 拉取镜像<a href="#121-拉取镜像"><span>#</span></a></h3><p>安装 Docker 并拉取公共镜像：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>pull</span><span> </span><span>drone/drone-runner-docker:1</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.2.2 配置<a href="#122-配置"><span>#</span></a></h3><p><code>Docker Runner</code> 是使用环境变量配置的。本文引用了以下配置选项。有关配置选项的完整列表，请参阅 <a href="https://drone.cool/runner/docker/configuration/reference/" target="_blank">配置</a>。</p><ul>
<li>
<ul>
<li>
<p><strong>DRONE_RPC_HOST</strong></p>
<p>提供 <code>Drone Server</code> 的主机名（和可选端口）。Runner 连接到指定主机地址的 Server 以接收 Pipeline 以执行。</p>
</li>
</ul>
</li>
<li>
<ul>
<li>
<p><strong>DRONE_RPC_PROTO</strong></p>
<p>提供用于连接 <code>Drone Server</code> 的协议。该值必须是 <code>http</code> 或 <code>https</code>。</p>
</li>
</ul>
</li>
<li>
<p><strong>DRONE_RPC_SECRET</strong> ：提供用于向 <code>Drone Server</code> 进行身份验证的共享密钥。这必须与你的 Drone Server 配置中定义的 Secret 匹配。</p>
</li>
</ul></section><section><h3>1.2.3 安装启动容器<a href="#123-安装启动容器"><span>#</span></a></h3><p>修改配置后，进行安装启动</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>run</span><span> </span><span>--detach</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>  </span><span>--volume=/var/run/docker.sock:/var/run/docker.sock</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>  </span><span>--env=DRONE_RPC_PROTO=http</span><span> </span><span>\</span></div></div><div><div><div>4</div></div><div><span>  </span><span>--env=DRONE_RPC_HOST=10.22.51.91:8000</span><span> </span><span>\</span></div></div><div><div><div>5</div></div><div><span>  </span><span>--env=DRONE_RPC_SECRET=3a9dcab8c7e72898b78455b24cd81225</span><span> </span><span>\</span></div></div><div><div><div>6</div></div><div><span>  </span><span>--env=DRONE_RUNNER_CAPACITY=2</span><span> </span><span>\</span></div></div><div><div><div>7</div></div><div><span>  </span><span>--env=DRONE_RUNNER_NAME=local-runner</span><span> </span><span>\</span></div></div><div><div><div>8</div></div><div><span>  </span><span>--restart=always</span><span> </span><span>\</span></div></div><div><div><div>9</div></div><div><span>  </span><span>--name=drone-runner</span><span> </span><span>\</span></div></div><div><div><div>10</div></div><div><span>  </span><span>drone/drone-runner-docker:1</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h4>1.2.3.1 参数解释<a href="#1231-参数解释"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>run</span><span> </span><span>--detach</span><span> </span><span>\ </span><span> </span><span># 后台运行容器</span></div></div><div><div><div>2</div></div><div><span>  </span><span>--volume</span><span>=</span><span>/var/run/docker.sock:/var/run/docker.sock</span><span> </span><span>\ </span><span> </span><span># 让容器能调用宿主机Docker（必选）</span></div></div><div><div><div>3</div></div><div><span>  </span><span>--env</span><span>=</span><span>DRONE_RPC_PROTO</span><span>=</span><span>http</span><span> </span><span>\ </span><span> </span><span># 连接Drone Server用的协议</span></div></div><div><div><div>4</div></div><div><span>  </span><span>--env</span><span>=</span><span>DRONE_RPC_HOST</span><span>=</span><span>10.22.51.91:8000</span><span> </span><span>\ </span><span> </span><span># Drone Server的地址</span></div></div><div><div><div>5</div></div><div><span>  </span><span>--env</span><span>=</span><span>DRONE_RPC_SECRET</span><span>=</span><span>3a9dcab8c7e72898b78455b24cd81225</span><span> </span><span>\ </span><span>  </span><span># 通信密钥（必须和Server一致）</span></div></div><div><div><div>6</div></div><div><span>  </span><span>--env</span><span>=</span><span>DRONE_RUNNER_CAPACITY</span><span>=</span><span>2</span><span> </span><span>\ </span><span> </span><span># 同时跑几个构建任务</span></div></div><div><div><div>7</div></div><div><span>  </span><span>--env</span><span>=</span><span>DRONE_RUNNER_NAME</span><span>=</span><span>local-runner</span><span> </span><span>\ </span><span> </span><span>#  Runner名称（随便写）</span></div></div><div><div><div>8</div></div><div><span>  </span><span>--restart</span><span>=</span><span>always</span><span> </span><span>\ </span><span>  </span><span># 开机/崩溃自动重启</span></div></div><div><div><div>9</div></div><div><span>  </span><span>--name</span><span>=</span><span>drone-runner</span><span> </span><span>\ </span><span>  </span><span># 容器名字</span></div></div><div><div><div>10</div></div><div><span>  </span><span>drone/drone-runner-docker:1</span><span>   </span><span># Docker类型Runner镜像</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>1.2.4 验证安装结果<a href="#124-验证安装结果"><span>#</span></a></h3><p>使用 <code>docker logs</code> 命令查看日志并验证 Runner 是否成功与 Drone Server 建立连接。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>[root@localhost /root]# docker logs drone-runner</span></div></div><div><div><div>2</div></div><div><span>time</span><span>=</span><span>"2026-05-06T08:10:41Z"</span><span> </span><span>level</span><span>=</span><span>info</span><span> </span><span>msg</span><span>=</span><span>"starting the server"</span><span> </span><span>addr</span><span>=</span><span>":3000"</span></div></div><div><div><div>3</div></div><div><span>time</span><span>=</span><span>"2026-05-06T08:10:41Z"</span><span> </span><span>level</span><span>=</span><span>info</span><span> </span><span>msg</span><span>=</span><span>"successfully pinged the remote server"</span></div></div><div><div><div>4</div></div><div><span>time</span><span>=</span><span>"2026-05-06T08:10:41Z"</span><span> </span><span>level</span><span>=</span><span>info</span><span> </span><span>msg</span><span>=</span><span>"polling the remote server"</span><span> </span><span>arch</span><span>=</span><span>amd64</span><span> </span><span>capacity</span><span>=</span><span>2</span><span> </span><span>endpoint</span><span>=</span><span>"http://10.22.51.91:8000"</span><span> </span><span>kind</span><span>=</span><span>pipeline</span><span> </span><span>os</span><span>=</span><span>linux</span><span> </span><span>type</span><span>=</span><span>docker</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>1.3 快速使用<a href="#13-快速使用"><span>#</span></a></h2><p>Drone 支持针对不同运行时环境的不同类型的流水线，这里使用<code>docker流水线</code></p><p>之前访问服务端时已经认证过来，那么现在就不用认证了</p><p>现在，找到项目进入后</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/drone/image-20260506170524871.png" alt="image-20260506170524871" /><figcaption>image-20260506170524871</figcaption></figure><p></p><p>单击<code>激活</code>按钮会在你的存储库中添加一个<code> Webhook</code>，以便在你每次推送代码时通知 Drone。</p><p><strong>请注意，你必须拥有存储库的管理员权限才能启用。</strong></p><p>回到<code>gitlab</code>项目的webhook界面，可看到自动添加了一个<code>webhook</code></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/drone/image-20260506170947744.png" alt="image-20260506170947744" /><figcaption>image-20260506170947744</figcaption></figure><p></p><section><h3>1.3.1 配置流水线<a href="#131-配置流水线"><span>#</span></a></h3><p>通过在 git 存储库的根目录中创建一个 <code>.drone.yml</code> 文件来配置流水线。在这个文件中，定义了每次收到 webhook 时执行的一系列步骤</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>kind:</span><span> </span><span>pipeline</span></div></div><div><div><div>2</div></div><div><span>type</span><span>:</span><span> </span><span>docker</span></div></div><div><div><div>3</div></div><div><span>name:</span><span> </span><span>default</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>steps:</span></div></div><div><div><div>6</div></div><div><span>-</span><span> </span><span>name:</span><span> </span><span>greeting</span></div></div><div><div><div>7</div></div><div><span>  </span><span>image:</span><span> </span><span>alpine</span></div></div><div><div><div>8</div></div><div><span>  </span><span>commands:</span></div></div><div><div><div>9</div></div><div><span>  </span><span>-</span><span> </span><span>echo</span><span> </span><span>hello</span></div></div><div><div><div>10</div></div><div><span>  </span><span>-</span><span> </span><span>echo</span><span> </span><span>world</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>以下是此示例中使用变量的概览：</p><ul>
<li>
<p><code>kind</code></p>
<p>kind 属性定义了对象的种类。此示例定义了一个流水线对象。其他类型的对象是 <a href="https://drone.cool/secret/" target="_blank">secret</a> 和 <a href="https://drone.cool/signature/" target="_blank">signature</a> 对象。</p>
</li>
<li>
<p><code>type</code></p>
<p>type 属性定义流水线的类型。此示例定义了一个 Docker 流水线，其中每个流水线步骤都在 Docker 容器内执行。Drone 支持 <a href="https://drone.cool/pipeline/overview/" target="_blank">不同类型</a> 的流水线执行环境。</p>
</li>
<li>
<p><code>name</code></p>
<p>name 属性定义了流水线的名称。你可以为你的项目定义一个或多个流水线。</p>
</li>
<li>
<p><code>steps</code>：Step 部分定义了一系列串行执行的流水线步骤。如果流水线中的任何步骤失败，流水线将立即退出。</p>
<ul>
<li>
<p><code>name</code></p>
<p>name 属性定义流水线步骤的名称。</p>
</li>
<li>
<p><code>image</code></p>
<p>image 属性定义了一个容器镜像，shell 命令在其中执行。你可以使用来自任何容器注册表（Registry，包括私有容器注册表）的流水线中的任何镜像。</p>
</li>
<li>
<p><code>commands</code></p>
<p>commands 属性将在容器内执行的 shell 命令列表定义为入口点。如果任何命令返回非零退出代码，则流水线步骤将失败。</p>
</li>
</ul>
</li>
</ul><p>更多流水线文档：<a href="https://drone.cool/pipeline/kubernetes/overview/" target="_blank">Overview | Drone CI 中文文档</a></p></section><section><h3>1.3.2 具体示例<a href="#132-具体示例"><span>#</span></a></h3><p>在gitlab中创建<code>.drone.yml</code>，添加如下内容</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>kind:</span><span> </span><span>pipeline</span></div></div><div><div><div>2</div></div><div><span>type</span><span>:</span><span> </span><span>docker</span></div></div><div><div><div>3</div></div><div><span>name:</span><span> </span><span>greeting</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>steps:</span></div></div><div><div><div>6</div></div><div><span>-</span><span> </span><span>name:</span><span> </span><span>en</span></div></div><div><div><div>7</div></div><div><span>  </span><span>image:</span><span> </span><span>alpine</span></div></div><div><div><div>8</div></div><div><span>  </span><span>commands:</span></div></div><div><div><div>9</div></div><div><span>  </span><span>-</span><span> </span><span>echo</span><span> </span><span>hello</span><span> </span><span>world</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>-</span><span> </span><span>name:</span><span> </span><span>fr</span></div></div><div><div><div>12</div></div><div><span>  </span><span>image:</span><span> </span><span>alpine</span></div></div><div><div><div>13</div></div><div><span>  </span><span>commands:</span></div></div><div><div><div>14</div></div><div><span>  </span><span>-</span><span> </span><span>echo</span><span> </span><span>bonjour</span><span> </span><span>monde</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>提交后将自动触发构建</p><p>回到drone界面，可以看到构建已经触发</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/drone/image-20260506171838672.png" alt="image-20260506171838672" /><figcaption>image-20260506171838672</figcaption></figure><p></p><p>点击<code>franches</code>，可以看到具体的构建流程</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/drone/image-20260506171944504.png" alt="image-20260506171944504" /><figcaption>image-20260506171944504</figcaption></figure><p></p></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/github_action%E4%BD%BF%E7%94%A8/</id>
      <title type="text">github action使用</title>
      <published>2026-07-17T00:00:00.000Z</published>
      <updated>2026-07-17T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/github_action%E4%BD%BF%E7%94%A8/"/>
      <summary type="text">github action使用</summary>
      <content type="html"><![CDATA[<section><h1>一、github actions 使用<a href="#一github-actions-使用"><span>#</span></a></h1><p>官方文档：<a href="https://docs.github.com/zh/actions" target="_blank">GitHub Actions 文档 - GitHub 文档</a></p><p>官方文档里面将各个功能介绍的很详细，因此这里只讲述基础用法</p><section><h2>1.1 基础功能使用<a href="#11-基础功能使用"><span>#</span></a></h2><section><h3>1.1.1 流水线管理<a href="#111-流水线管理"><span>#</span></a></h3><p>在项目中的<code>action</code>中，可以看到所有的流水线</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/github-action/image-20260509102521163.png" alt="image-20260509102521163" /><figcaption>image-20260509102521163</figcaption></figure><p></p><p>点击具体的流水线，可以进行管理</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/github-action/image-20260509102838286.png" alt="image-20260509102838286" /><figcaption>image-20260509102838286</figcaption></figure><p></p></section><section><h3>1.1.2 流水线手动触发<a href="#112-流水线手动触发"><span>#</span></a></h3><p>修改工作流文件，将 <code>on</code> 触发器改为 <code>workflow_dispatch</code>。启用后，工作流页面上会出现一个 <code>Run workflow</code> 按钮，点击即可手动触发</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>name:</span><span> </span><span>构建并上传到</span><span> </span><span>Docker</span><span> </span><span>Hub</span></div></div><div><div><div>2</div></div><div><span>run-name:</span><span> </span><span>${</span><span>{ </span><span>github</span><span>.</span><span>actor</span><span> </span><span>}</span><span>}</span><span> </span><span>正在打包上传镜像</span><span> </span><span>🚀</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>on:</span></div></div><div><div><div>5</div></div><div><span>  </span><span>workflow_dispatch:</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>jobs</span><span>:</span></div></div><div><div><div>8</div></div><div><span>  </span><span>build:</span></div></div><div><div><div>9</div></div><div><span>    </span><span>runs-on:</span><span> </span><span>ubuntu-latest</span></div></div><div><div><div>10</div></div><div><span>    </span><span>steps:</span></div></div><div><div><div>11</div></div><div><span>      </span><span>-</span><span> </span><span>name:</span><span> </span><span>检出代码</span></div></div><div><div><div>12</div></div><div><span>        </span><span>uses:</span><span> </span><span>actions/checkout@v6</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>      </span><span>-</span><span> </span><span>name:</span><span> </span><span>设置</span><span> </span><span>JDK</span><span> </span><span>21</span></div></div><div><div><div>15</div></div><div><span>        </span><span>uses:</span><span> </span><span>actions/setup-java@v4</span></div></div><div><div><div>16</div></div><div><span>        </span><span>with:</span></div></div><div><div><div>17</div></div><div><span>          </span><span>java-version:</span><span> </span><span>'21'</span></div></div><div><div><div>18</div></div><div><span>          </span><span>distribution:</span><span> </span><span>'temurin'</span></div></div><div><div><div>19</div></div><div><span>          </span><span>cache:</span><span> </span><span>maven</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>      </span><span>-</span><span> </span><span>name:</span><span> </span><span>Maven</span><span> </span><span>打包项目</span></div></div><div><div><div>22</div></div><div><span>        </span><span>run:</span><span> </span><span>mvn</span><span> </span><span>clean</span><span> </span><span>package</span><span> </span><span>-DskipTests</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>      </span><span>-</span><span> </span><span>name:</span><span> </span><span>登录</span><span> </span><span>Docker</span><span> </span><span>Hub</span></div></div><div><div><div>25</div></div><div><span>        </span><span>uses:</span><span> </span><span>docker/login-action@v3</span></div></div><div><div><div>26</div></div><div><span>        </span><span>with:</span></div></div><div><div><div>27</div></div><div><span>          </span><span>username:</span><span> </span><span>${</span><span>{ </span><span>secrets</span><span>.</span><span>DOCKER_HUB_USERNAME</span><span> </span><span>}</span><span>}</span></div></div><div><div><div>28</div></div><div><span>          </span><span>password:</span><span> </span><span>${</span><span>{ </span><span>secrets</span><span>.</span><span>DOCKER_HUB_TOKEN</span><span> </span><span>}</span><span>}</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span>      </span><span>-</span><span> </span><span>name:</span><span> </span><span>构建并推送</span><span> </span><span>Docker</span><span> </span><span>镜像</span></div></div><div><div><div>31</div></div><div><span>        </span><span>uses:</span><span> </span><span>docker/build-push-action@v6</span></div></div><div><div><div>32</div></div><div><span>        </span><span>with:</span></div></div><div><div><div>33</div></div><div><span>          </span><span>context:</span><span> </span><span>.</span></div></div><div><div><div>34</div></div><div><span>          </span><span>push:</span><span> </span><span>true</span></div></div><div><div><div>35</div></div><div><span>          </span><span>tags:</span><span> </span><span>${</span><span>{ </span><span>secrets</span><span>.</span><span>DOCKER_HUB_USERNAME</span><span> </span><span>}</span><span>}/java_test:latest</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>添加成功后，在<code>action</code>中会出现手动触发构建的选项</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/github-action/image-20260509110031544.png" alt="image-20260509110031544" /><figcaption>image-20260509110031544</figcaption></figure><p></p></section></section><section><h2>2.1 action项目示例<a href="#21-action项目示例"><span>#</span></a></h2><p>实现流程：</p><p>每次push代码到 main 分支，会自动：</p><ol>
<li>用 JDK 21 编译你的 SpringBoot 项目</li>
<li>生成 <code>target/demo-1.0.jar</code></li>
<li>根据你的 Dockerfile 构建镜像</li>
<li>推送到你的 Docker Hub</li>
<li>之后使用服务器只要拉取镜像运行</li>
</ol><section><h3>2.1.1 github创建项目<a href="#211-github创建项目"><span>#</span></a></h3><p>github中创建项目<code>java_test</code></p><section><h4>2.1.1.1 java源码<a href="#2111-java源码"><span>#</span></a></h4><p>src/main/java/com/example路径下创建文件<code>DemoApplication.java</code></p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>package</span><span><span> </span><span>com.example</span><span>;</span></span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>import</span><span> </span><span>org.springframework.boot.SpringApplication</span><span>;</span></div></div><div><div><div>4</div></div><div><span>import</span><span> </span><span>org.springframework.boot.autoconfigure.SpringBootApplication</span><span>;</span></div></div><div><div><div>5</div></div><div><span>import</span><span> </span><span>org.springframework.web.bind.annotation.GetMapping</span><span>;</span></div></div><div><div><div>6</div></div><div><span>import</span><span> </span><span>org.springframework.web.bind.annotation.RestController</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>@</span><span>SpringBootApplication</span></div></div><div><div><div>9</div></div><div><span>@</span><span>RestController</span></div></div><div><div><div>10</div></div><div><span>public</span><span> </span><span>class</span><span><span> </span><span>DemoApplication</span><span> </span></span><span>{</span></div></div><div><div><div>11</div></div><div><span>    </span><span>public</span><span> </span><span>static</span><span> </span><span>void</span><span> </span><span>main</span><span>(</span><span>String</span><span><span>[] </span><span>args</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>12</div></div><div><span>        </span><span>SpringApplication</span><span>.</span><span>run</span><span>(</span><span>DemoApplication</span><span>.</span><span>class</span><span>, args);</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>@</span><span>GetMapping</span><span>(</span><span>value</span><span><span> </span><span>=</span><span> </span></span><span>"/"</span><span><span>,</span><span> </span></span><span>produces</span><span><span> </span><span>=</span><span> </span></span><span>"text/html"</span><span>)</span></div></div><div><div><div>16</div></div><div><span>public</span><span> </span><span>String</span><span> </span><span>hello</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>17</div></div><div><span>    </span><span>return</span><span> </span><span>"""</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>&lt;!DOCTYPE html&gt;</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>&lt;html&gt;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>&lt;head&gt;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>&lt;title&gt;Spring Boot Demo&lt;/title&gt;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>&lt;style&gt;</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>body { font-family: Arial, sans-serif; margin: 40px; }</span></div></div><div><div><div>24</div></div><div><span><span>                </span></span><span>h1 { color: #4CAF50; }</span></div></div><div><div><div>25</div></div><div><span><span>                </span></span><span>.info { background-color: #f0f0f0; padding: 20px; border-radius: 5px; }</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>&lt;/style&gt;</span></div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>&lt;/head&gt;</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>&lt;body&gt;</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>&lt;h1&gt;Hello from Jenkins CI/CD with JDK 21!&lt;/h1&gt;</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>&lt;p&gt;新绛之海&lt;/p&gt;</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>&lt;div class="info"&gt;</span></div></div><div><div><div>32</div></div><div><span><span>                </span></span><span>&lt;h2&gt;系统信息：&lt;/h2&gt;</span></div></div><div><div><div>33</div></div><div><span><span>                </span></span><span>&lt;ul&gt;</span></div></div><div><div><div>34</div></div><div><span><span>                    </span></span><span>&lt;li&gt;JDK版本：22&lt;/li&gt;</span></div></div><div><div><div>35</div></div><div><span><span>                    </span></span><span>&lt;li&gt;应用框架：Spring Boot&lt;/li&gt;</span></div></div><div><div><div>36</div></div><div><span><span>                    </span></span><span>&lt;li&gt;CI/CD：Jenkins&lt;/li&gt;</span></div></div><div><div><div>37</div></div><div><span><span>                    </span></span><span>&lt;li&gt;当前时间：%s&lt;/li&gt;</span></div></div><div><div><div>38</div></div><div><span><span>                </span></span><span>&lt;/ul&gt;</span></div></div><div><div><div>39</div></div><div><span><span>            </span></span><span>&lt;/div&gt;</span></div></div><div><div><div>40</div></div><div><span><span>        </span></span><span>&lt;/body&gt;</span></div></div><div><div><div>41</div></div><div><span><span>        </span></span><span>&lt;/html&gt;</span></div></div><div><div><div>42</div></div><div><span><span>        </span></span><span>"""</span><span>.</span><span>formatted</span><span>(</span><span>java</span><span>.</span><span>time</span><span>.</span><span>LocalDateTime</span><span>.</span><span>now</span><span>());</span></div></div><div><div><div>43</div></div><div><span>}</span></div></div><div><div><div>44</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h4>2.1.1.2 Dockerfile<a href="#2112-dockerfile"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># 使用 JDK 21 的运行时镜像</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> eclipse-temurin:21-jre-alpine</span></div></div><div><div><div>3</div></div><div><span>WORKDIR</span><span> /app</span></div></div><div><div><div>4</div></div><div><span># 复制 maven 打包好的 jar</span></div></div><div><div><div>5</div></div><div><span>COPY</span><span> target/demo-1.0.jar app.jar</span></div></div><div><div><div>6</div></div><div><span>ENTRYPOINT</span><span> [</span><span>"java"</span><span>, </span><span>"-jar"</span><span>, </span><span>"app.jar"</span><span>]</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>2.1.1.3 pom.xml<a href="#2113-pomxml"><span>#</span></a></h4><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;?</span><span>xml</span><span> version</span><span>=</span><span>"1.0"</span><span> encoding</span><span>=</span><span>"UTF-8"</span><span>?&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>project</span><span> </span><span>xmlns</span><span>=</span><span>"http://maven.apache.org/POM/4.0.0"</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>&lt;</span><span>modelVersion</span><span>&gt;4.0.0&lt;/</span><span>modelVersion</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>&lt;</span><span>groupId</span><span>&gt;com.example&lt;/</span><span>groupId</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>&lt;</span><span>artifactId</span><span>&gt;demo&lt;/</span><span>artifactId</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>&lt;</span><span>version</span><span>&gt;1.0&lt;/</span><span>version</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>&lt;</span><span>packaging</span><span>&gt;jar&lt;/</span><span>packaging</span><span>&gt;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>&lt;</span><span>parent</span><span>&gt;</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>&lt;</span><span>groupId</span><span>&gt;org.springframework.boot&lt;/</span><span>groupId</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>&lt;</span><span>artifactId</span><span>&gt;spring-boot-starter-parent&lt;/</span><span>artifactId</span><span>&gt;</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>&lt;</span><span>version</span><span>&gt;3.2.0&lt;/</span><span>version</span><span>&gt;</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>&lt;/</span><span>parent</span><span>&gt;</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>&lt;</span><span>properties</span><span>&gt;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>&lt;</span><span>java.version</span><span>&gt;21&lt;/</span><span>java.version</span><span>&gt; </span><span>&lt;!-- 明确指定 21 --&gt;</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>&lt;/</span><span>properties</span><span>&gt;</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>&lt;</span><span>dependencies</span><span>&gt;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>&lt;</span><span>dependency</span><span>&gt;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>&lt;</span><span>groupId</span><span>&gt;org.springframework.boot&lt;/</span><span>groupId</span><span>&gt;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>&lt;</span><span>artifactId</span><span>&gt;spring-boot-starter-web&lt;/</span><span>artifactId</span><span>&gt;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>&lt;/</span><span>dependency</span><span>&gt;</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>&lt;</span><span>dependency</span><span>&gt;</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>&lt;</span><span>groupId</span><span>&gt;org.springframework.boot&lt;/</span><span>groupId</span><span>&gt;</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>&lt;</span><span>artifactId</span><span>&gt;spring-boot-starter-test&lt;/</span><span>artifactId</span><span>&gt;</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>&lt;</span><span>scope</span><span>&gt;test&lt;/</span><span>scope</span><span>&gt;</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>&lt;/</span><span>dependency</span><span>&gt;</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>&lt;/</span><span>dependencies</span><span>&gt;</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>&lt;</span><span>build</span><span>&gt;</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>&lt;</span><span>plugins</span><span>&gt;</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>&lt;</span><span>plugin</span><span>&gt;</span></div></div><div><div><div>34</div></div><div><span><span>                </span></span><span>&lt;</span><span>groupId</span><span>&gt;org.springframework.boot&lt;/</span><span>groupId</span><span>&gt;</span></div></div><div><div><div>35</div></div><div><span><span>                </span></span><span>&lt;</span><span>artifactId</span><span>&gt;spring-boot-maven-plugin&lt;/</span><span>artifactId</span><span>&gt;</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>&lt;/</span><span>plugin</span><span>&gt;</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>&lt;/</span><span>plugins</span><span>&gt;</span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>&lt;/</span><span>build</span><span>&gt;</span></div></div><div><div><div>39</div></div><div><span>&lt;/</span><span>project</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section><section><h3>2.1.2 创建流水线文件<a href="#212-创建流水线文件"><span>#</span></a></h3><p>创建文件夹<code>.github/workflows</code>,然后在文件夹中创建使用 <code>.yml</code> 或 <code>.yaml</code> 作为文件扩展名的<code>流水线</code>文件，github即可自动扫描该文件触发流水线</p><p>这里创建为<code>github-actions-demo.yml</code></p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>name</span><span>: </span><span>构建并上传到 Docker Hub</span></div></div><div><div><div>2</div></div><div><span>run-name</span><span>: </span><span>${{ github.actor }} 正在打包上传镜像</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>on</span><span>:</span></div></div><div><div><div>5</div></div><div><span>  </span><span>push</span><span>:</span></div></div><div><div><div>6</div></div><div><span>    </span><span>branches</span><span>: [ </span><span>main</span><span> ]</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>jobs</span><span>:</span></div></div><div><div><div>9</div></div><div><span>  </span><span>build</span><span>:</span></div></div><div><div><div>10</div></div><div><span>    </span><span>runs-on</span><span>: </span><span>ubuntu-latest</span></div></div><div><div><div>11</div></div><div><span>    </span><span>steps</span><span>:</span></div></div><div><div><div>12</div></div><div><span><span>      </span></span><span>- </span><span>name</span><span>: </span><span>检出代码</span></div></div><div><div><div>13</div></div><div><span>        </span><span>uses</span><span>: </span><span>actions/checkout@v6</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span><span>      </span></span><span>- </span><span>name</span><span>: </span><span>设置 JDK 21</span></div></div><div><div><div>16</div></div><div><span>        </span><span>uses</span><span>: </span><span>actions/setup-java@v4</span></div></div><div><div><div>17</div></div><div><span>        </span><span>with</span><span>:</span></div></div><div><div><div>18</div></div><div><span>          </span><span>java-version</span><span>: </span><span>'21'</span></div></div><div><div><div>19</div></div><div><span>          </span><span>distribution</span><span>: </span><span>'temurin'</span></div></div><div><div><div>20</div></div><div><span>          </span><span>cache</span><span>: </span><span>maven</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span><span>      </span></span><span>- </span><span>name</span><span>: </span><span>Maven 打包项目</span></div></div><div><div><div>23</div></div><div><span>        </span><span>run</span><span>: </span><span>mvn clean package -DskipTests</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span><span>      </span></span><span>- </span><span>name</span><span>: </span><span>登录 Docker Hub</span></div></div><div><div><div>26</div></div><div><span>        </span><span>uses</span><span>: </span><span>docker/login-action@v3</span></div></div><div><div><div>27</div></div><div><span>        </span><span>with</span><span>:</span></div></div><div><div><div>28</div></div><div><span>          </span><span>username</span><span>: </span><span>${{ secrets.DOCKER_HUB_USERNAME }}</span></div></div><div><div><div>29</div></div><div><span>          </span><span>password</span><span>: </span><span>${{ secrets.DOCKER_HUB_TOKEN }}</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span><span>      </span></span><span>- </span><span>name</span><span>: </span><span>构建并推送 Docker 镜像</span></div></div><div><div><div>32</div></div><div><span>        </span><span>uses</span><span>: </span><span>docker/build-push-action@v6</span></div></div><div><div><div>33</div></div><div><span>        </span><span>with</span><span>:</span></div></div><div><div><div>34</div></div><div><span>          </span><span>context</span><span>: </span><span>.</span></div></div><div><div><div>35</div></div><div><span>          </span><span>push</span><span>: </span><span>true</span></div></div><div><div><div>36</div></div><div><span>          </span><span>tags</span><span>: </span><span>${{ secrets.DOCKER_HUB_USERNAME }}/java_test:latest</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>提交后即可自动触发流水线，但还缺少一些变量，因此会构建失败</p></section><section><h3>2.1.3 添加秘钥<a href="#213-添加秘钥"><span>#</span></a></h3><p>路径：项目 → <strong>Settings</strong> → <strong>Secrets and variables</strong> → <strong>Actions</strong> → <strong>New repository secret</strong></p><p>添加以下两个秘钥</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>DOCKER_HUB_USERNAME</span></div></div><div><div><div>2</div></div><div><span>DOCKER_HUB_TOKEN</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/github-action/image-20260508161808994.png" alt="image-20260508161808994" /><figcaption>image-20260508161808994</figcaption></figure><p></p><p>秘钥的值在<code>docker hub</code>中创建</p><p>登录<code>docker hub-&gt; Account settings -&gt; settings -&gt; personal access tokens -&gt; Generate new token</code></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/github-action/image-20260508162330124.png" alt="image-20260508162330124" /><figcaption>image-20260508162330124</figcaption></figure><p></p><p>创建成功后将生成的token填入github的<code>DOCKER_HUB_TOKEN</code>，<code>DOCKER_HUB_USERNAME</code>填入用户名</p></section><section><h3>2.1.4 流水线构建<a href="#214-流水线构建"><span>#</span></a></h3><p>提交代码，再次触发构建</p><p>提交后回到<code>action</code>界面</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/github-action/image-20260508165012520.png" alt="image-20260508165012520" /><figcaption>image-20260508165012520</figcaption></figure><p></p><p>可以看到构建成功</p></section><section><h3>2.1.5 使用docker拉取构建镜像<a href="#215-使用docker拉取构建镜像"><span>#</span></a></h3><p>查看构建的镜像</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/github-action/image-20260508173901571.png" alt="image-20260508173901571" /><figcaption>image-20260508173901571</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/github-action/image-20260508173935911.png" alt="image-20260508173935911" /><figcaption>image-20260508173935911</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/github-action/image-20260508173957204.png" alt="image-20260508173957204" /><figcaption>image-20260508173957204</figcaption></figure><p></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>pull</span><span> </span><span>laixianshen/java_test:latest</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>docker</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>-p</span><span> </span><span>8899:8080</span><span> </span><span>laixianshen/java_test:latest</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/github-action/image-20260509095504230.png" alt="image-20260509095504230" /><figcaption>image-20260509095504230</figcaption></figure><p></p></section></section><section><h2>3.1 action项目示例二<a href="#31-action项目示例二"><span>#</span></a></h2><p>实现效果：当在 GitHub 上创建一个「发布版本（Release）」时，自动用 maven 打包 Java 项目，并把构建好的 jar 包发布到 GitHub Packages 仓库。</p><section><h3>3.1.1 创建修改文件<a href="#311-创建修改文件"><span>#</span></a></h3><p>还是使用<code>java_test</code>项目，再创建一个新的流水线文件<code>publish.yml</code>，并填入如下内容</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>name</span><span>: </span><span>Maven 发布到 GitHub Packages</span></div></div><div><div><div>2</div></div><div><span>run-name</span><span>: </span><span>${{ github.actor }} 正在发布 Maven 包到 GitHub Packages</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>on</span><span>:</span></div></div><div><div><div>5</div></div><div><span>  </span><span>release</span><span>:</span></div></div><div><div><div>6</div></div><div><span>    </span><span>types</span><span>: [</span><span>created</span><span>]</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>jobs</span><span>:</span></div></div><div><div><div>9</div></div><div><span>  </span><span>publish</span><span>:</span></div></div><div><div><div>10</div></div><div><span>    </span><span>runs-on</span><span>: </span><span>ubuntu-latest</span></div></div><div><div><div>11</div></div><div><span>    </span><span>permissions</span><span>:</span></div></div><div><div><div>12</div></div><div><span>      </span><span>contents</span><span>: </span><span>read</span></div></div><div><div><div>13</div></div><div><span>      </span><span>packages</span><span>: </span><span>write</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>    </span><span>steps</span><span>:</span></div></div><div><div><div>16</div></div><div><span><span>      </span></span><span>- </span><span>name</span><span>: </span><span>检出代码</span></div></div><div><div><div>17</div></div><div><span>        </span><span>uses</span><span>: </span><span>actions/checkout@v4</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span><span>      </span></span><span>- </span><span>name</span><span>: </span><span>设置 JDK 21</span></div></div><div><div><div>20</div></div><div><span>        </span><span>uses</span><span>: </span><span>actions/setup-java@v4</span></div></div><div><div><div>21</div></div><div><span>        </span><span>with</span><span>:</span></div></div><div><div><div>22</div></div><div><span>          </span><span>java-version</span><span>: </span><span>'21'</span></div></div><div><div><div>23</div></div><div><span>          </span><span>distribution</span><span>: </span><span>'temurin'</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span><span>      </span></span><span>- </span><span>name</span><span>: </span><span>创建 Maven settings.xml 认证文件</span></div></div><div><div><div>26</div></div><div><span>        </span><span>run</span><span>: </span><span>|</span></div></div><div><div><div>27</div></div><div><span><span>          </span></span><span>cat &gt; ~/.m2/settings.xml &lt;&lt; EOF</span></div></div><div><div><div>28</div></div><div><span><span>          </span></span><span>&lt;settings&gt;</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>&lt;servers&gt;</span></div></div><div><div><div>30</div></div><div><span><span>              </span></span><span>&lt;server&gt;</span></div></div><div><div><div>31</div></div><div><span><span>                </span></span><span>&lt;id&gt;github&lt;/id&gt;</span></div></div><div><div><div>32</div></div><div><span><span>                </span></span><span>&lt;username&gt;${{ github.actor }}&lt;/username&gt;</span></div></div><div><div><div>33</div></div><div><span><span>                </span></span><span>&lt;password&gt;${{ secrets.GITHUB_TOKEN }}&lt;/password&gt;</span></div></div><div><div><div>34</div></div><div><span><span>              </span></span><span>&lt;/server&gt;</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>&lt;/servers&gt;</span></div></div><div><div><div>36</div></div><div><span><span>          </span></span><span>&lt;/settings&gt;</span></div></div><div><div><div>37</div></div><div><span><span>          </span></span><span>EOF</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span><span>      </span></span><span>- </span><span>name</span><span>: </span><span>Maven 打包项目</span></div></div><div><div><div>40</div></div><div><span>        </span><span>run</span><span>: </span><span>mvn clean package -DskipTests</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span><span>      </span></span><span>- </span><span>name</span><span>: </span><span>发布到 GitHub Packages</span></div></div><div><div><div>43</div></div><div><span>        </span><span>run</span><span>: </span><span>mvn deploy</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>修改<code>pom.xml</code>文件，加上 GitHub Packages 的配置
<strong>这个仓库不用创建</strong>，触发流水线时会自动创建</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>distributionManagement</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>&lt;</span><span>repository</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>&lt;</span><span>id</span><span>&gt;github&lt;/</span><span>id</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>&lt;</span><span>url</span><span>&gt;https://maven.pkg.github.com/你的用户名/你的仓库名&lt;/</span><span>url</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>&lt;/</span><span>repository</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span>&lt;/</span><span>distributionManagement</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>整体文件内容：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;?</span><span>xml</span><span> version</span><span>=</span><span>"1.0"</span><span> encoding</span><span>=</span><span>"UTF-8"</span><span>?&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>project</span><span> </span><span>xmlns</span><span>=</span><span>"http://maven.apache.org/POM/4.0.0"</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>&lt;</span><span>modelVersion</span><span>&gt;4.0.0&lt;/</span><span>modelVersion</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>&lt;</span><span>groupId</span><span>&gt;com.example&lt;/</span><span>groupId</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>&lt;</span><span>artifactId</span><span>&gt;demo&lt;/</span><span>artifactId</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>&lt;</span><span>version</span><span>&gt;1.0&lt;/</span><span>version</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>&lt;</span><span>packaging</span><span>&gt;jar&lt;/</span><span>packaging</span><span>&gt;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>&lt;</span><span>parent</span><span>&gt;</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>&lt;</span><span>groupId</span><span>&gt;org.springframework.boot&lt;/</span><span>groupId</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>&lt;</span><span>artifactId</span><span>&gt;spring-boot-starter-parent&lt;/</span><span>artifactId</span><span>&gt;</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>&lt;</span><span>version</span><span>&gt;3.2.0&lt;/</span><span>version</span><span>&gt;</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>&lt;/</span><span>parent</span><span>&gt;</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>&lt;</span><span>properties</span><span>&gt;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>&lt;</span><span>java.version</span><span>&gt;21&lt;/</span><span>java.version</span><span>&gt;</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>&lt;/</span><span>properties</span><span>&gt;</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>&lt;</span><span>dependencies</span><span>&gt;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>&lt;</span><span>dependency</span><span>&gt;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>&lt;</span><span>groupId</span><span>&gt;org.springframework.boot&lt;/</span><span>groupId</span><span>&gt;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>&lt;</span><span>artifactId</span><span>&gt;spring-boot-starter-web&lt;/</span><span>artifactId</span><span>&gt;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>&lt;/</span><span>dependency</span><span>&gt;</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>&lt;/</span><span>dependencies</span><span>&gt;</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>    </span><span>&lt;!-- 关键：配置 GitHub Packages 仓库地址 --&gt;</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>&lt;</span><span>distributionManagement</span><span>&gt;</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>&lt;</span><span>repository</span><span>&gt;</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>&lt;</span><span>id</span><span>&gt;github&lt;/</span><span>id</span><span>&gt;</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>&lt;</span><span>url</span><span>&gt;https://maven.pkg.github.com/laixianshenboss/java_test&lt;/</span><span>url</span><span>&gt;</span></div></div><div><div><div>31</div></div><div><span><span>        </span></span><span>&lt;/</span><span>repository</span><span>&gt;</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>&lt;/</span><span>distributionManagement</span><span>&gt;</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>&lt;</span><span>build</span><span>&gt;</span></div></div><div><div><div>35</div></div><div><span><span>        </span></span><span>&lt;</span><span>plugins</span><span>&gt;</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>&lt;</span><span>plugin</span><span>&gt;</span></div></div><div><div><div>37</div></div><div><span><span>                </span></span><span>&lt;</span><span>groupId</span><span>&gt;org.springframework.boot&lt;/</span><span>groupId</span><span>&gt;</span></div></div><div><div><div>38</div></div><div><span><span>                </span></span><span>&lt;</span><span>artifactId</span><span>&gt;spring-boot-maven-plugin&lt;/</span><span>artifactId</span><span>&gt;</span></div></div><div><div><div>39</div></div><div><span><span>            </span></span><span>&lt;/</span><span>plugin</span><span>&gt;</span></div></div><div><div><div>40</div></div><div><span><span>        </span></span><span>&lt;/</span><span>plugins</span><span>&gt;</span></div></div><div><div><div>41</div></div><div><span><span>    </span></span><span>&lt;/</span><span>build</span><span>&gt;</span></div></div><div><div><div>42</div></div><div><span>&lt;/</span><span>project</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>3.1.2 触发构建<a href="#312-触发构建"><span>#</span></a></h3><p>再此创建版本，触发构建</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/github-action/image-20260509110512085.png" alt="image-20260509110512085" /><figcaption>image-20260509110512085</figcaption></figure><p></p><p>选择<code>标签</code>，填写<code>版本标题</code>后提交</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/github-action/image-20260509132432193.png" alt="image-20260509132432193" /><figcaption>image-20260509132432193</figcaption></figure><p></p><p>最后回到<code>action</code>界面，查看构建结果</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/github-action/image-20260509132551367.png" alt="image-20260509132551367" /><figcaption>image-20260509132551367</figcaption></figure><p></p><blockquote><p>**注意：**如果构建失败，修改文件后再次创建版本构建时，需要选择新的<code>tag</code>，否则构建时使用的文件还是旧版本的</p></blockquote></section><section><h3>3.1.3 查看构建产物<a href="#313-查看构建产物"><span>#</span></a></h3><p>回到账号首页，选择<code>packages</code></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/github-action/image-20260509132933087.png" alt="image-20260509132933087" /><figcaption>image-20260509132933087</figcaption></figure><p></p><p>或者项目的<code>packages</code></p><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/github-action/image-20260509134648764.png" alt="image-20260509134648764" /><p>可以看到构建的<code>jar包</code>，点击即可下载使用</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/github-action/image-20260509132951960.png" alt="image-20260509132951960" /><figcaption>image-20260509132951960</figcaption></figure><p></p></section><section><h3>3.1.4 下载产物部署<a href="#314-下载产物部署"><span>#</span></a></h3><p>将生成的产物下载后，上传到<code>安装了java环境</code>的机器中运行</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 后台运行在4433端口，并将日志写入文件</span></div></div><div><div><div>2</div></div><div><span>nohup</span><span> </span><span>java</span><span> </span><span>-jar</span><span> </span><span>demo-1.0.jar</span><span> </span><span>--server.port=4433</span><span> &gt; </span><span>app.log</span><span> 2&gt;&amp;1 &amp;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/github-action/image-20260509134538983.png" alt="image-20260509134538983" /><figcaption>image-20260509134538983</figcaption></figure><p></p></section></section><section><h2>4.1 自建runner<a href="#41-自建runner"><span>#</span></a></h2><p>使用自建的runner运行器的配置方式与其余cicd工具配置相似</p><p>前往：<code>项目设置-&gt;actons-&gt;runner-&gt;new self-hosted runner</code>，进入后选择好对应的系统</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/github-action/image-20260509160034661.png" alt="image-20260509160034661" /><figcaption>image-20260509160034661</figcaption></figure><p></p><p>之后根据提供的配置进行安装配置</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/github-action/image-20260509160216707.png" alt="image-20260509160216707" /><figcaption>image-20260509160216707</figcaption></figure><p></p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/gitlab_cicd%E4%BD%BF%E7%94%A8/</id>
      <title type="text">gitlab_cicd使用</title>
      <published>2026-07-13T00:00:00.000Z</published>
      <updated>2026-07-13T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/gitlab_cicd%E4%BD%BF%E7%94%A8/"/>
      <summary type="text">gitlab_cicd使用</summary>
      <content type="html"><![CDATA[<section><h1>一、gitlab_cicd使用<a href="#一gitlab_cicd使用"><span>#</span></a></h1><section><h2>1.1 环境准备<a href="#11-环境准备"><span>#</span></a></h2><ul>
<li>gitlab平台</li>
<li>gitlab-runner服务端</li>
<li>流水线部署服务器（<code>也可以为gitlab-runner服务器</code>）</li>
</ul></section><section><h2>1.2 gitlab-runner安装<a href="#12-gitlab-runner安装"><span>#</span></a></h2><p>如果需要使用Gitlab来进行自动化部署，则你需要安装最少一个Gitlab Runner</p><section><h3>1.2.1 下载安装<a href="#121-下载安装"><span>#</span></a></h3><p>使用国内镜像源进行下载</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 清华大学镜像站点，选择对应的服务器架构进行安装</span></div></div><div><div><div>2</div></div><div><span>https://mirrors.tuna.tsinghua.edu.cn/gitlab-runner/</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 安装依赖，Gitlab Runner的依赖只有一个那就是git</span></div></div><div><div><div>5</div></div><div><span>apt</span><span> </span><span>install</span><span> </span><span>git</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 下载完成后进行安装</span></div></div><div><div><div>8</div></div><div><span>dpkg</span><span> </span><span>-i</span><span> </span><span>gitlab-runner_15.10.0_amd64.deb</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>安装完成后如下图所示</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab_cicd/image-20260423172753004.png" alt="image-20260423172753004" /><figcaption>image-20260423172753004</figcaption></figure><p></p></section><section><h3>1.2.2 修改gitlab runner 运行用户<a href="#122-修改gitlab-runner-运行用户"><span>#</span></a></h3><p>为了避免<code>gitlab-runner</code>使用<strong>命令或其他目录的权限问题</strong>，需要将运行gitlab-runner的用户设置为root</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 查看当前gitlab-runner的执行用户</span></div></div><div><div><div>2</div></div><div><span>ps</span><span> </span><span>aux</span><span> | </span><span>grep</span><span> </span><span>gitlab-runner</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 卸载掉gitlab-runner的默认用户</span></div></div><div><div><div>5</div></div><div><span>gitlab-runner</span><span> </span><span>uninstall</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 将gitlab-runner的用户设置为root</span></div></div><div><div><div>8</div></div><div><span>gitlab-runner</span><span> </span><span>install</span><span> </span><span>--working-directory</span><span> </span><span>/home/gitlab-runner</span><span> </span><span>--user</span><span> </span><span>root</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 重启gitlab-runner</span></div></div><div><div><div>11</div></div><div><span>systemctl</span><span> </span><span>restart</span><span> </span><span>gitlab-runner</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab_cicd/image-20260423173340232.png" alt="image-20260423173340232" /><figcaption>image-20260423173340232</figcaption></figure><p></p></section></section><section><h2>1.3 注册gitlab runner<a href="#13-注册gitlab-runner"><span>#</span></a></h2><p>gitlab cicd的注册方式分为<code>项目runner</code>和<code>共享runner</code></p><ul>
<li><code>项目runner</code>：给具体项目使用的runner</li>
<li><code>共享runner</code>：在群组中进行设置，给群组中的项目使用</li>
</ul><section><h3>1.3.1 注册项目gitlab runner<a href="#131-注册项目gitlab-runner"><span>#</span></a></h3><section><h4>1.3.1.1 获取地址和令牌<a href="#1311-获取地址和令牌"><span>#</span></a></h4><p>进入项目，然后选择项目设置中的cicd</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab_cicd/image-20260424101347683.png" alt="image-20260424101347683" /><figcaption>image-20260424101347683</figcaption></figure><p></p><p>找到项目runner的<code>注册地址和注册令牌</code></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab_cicd/image-20260424101742736.png" alt="image-20260424101742736" /><figcaption>image-20260424101742736</figcaption></figure><p></p></section><section><h4>1.3.1.2 runner服务器注册<a href="#1312-runner服务器注册"><span>#</span></a></h4><p>在runner服务器执行注册命令，然后按照提示填写对应的内容</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>gitlab-runner</span><span> </span><span>register</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>填写好<code>注册地址、注册token、runner描述、runner标签、runner执行器</code></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab_cicd/image-20260424111936337.png" alt="image-20260424111936337" /><figcaption>image-20260424111936337</figcaption></figure><p></p><p>注册成功后的信息保存在<code>/etc/gitlab-runner/config.toml</code></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 查看已注册的runner</span></div></div><div><div><div>2</div></div><div><span>gitlab-runner</span><span> </span><span>list</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 指定配置文件注册</span></div></div><div><div><div>5</div></div><div><span>gitlab-runner</span><span> </span><span>register</span><span> </span><span>--config</span><span> </span><span>/custom/path/config.toml</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>注册完成后回到<code>gitlab</code>页面可以看到已经绑定成功</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab_cicd/image-20260424112331055.png" alt="image-20260424112331055" /><figcaption>image-20260424112331055</figcaption></figure><p></p><p>可对注册的runner进行<code>编辑、暂停、移除</code>等操作</p><blockquote><p>编辑时也可以将<code>项目runner</code>接触锁定，给到其他项目</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab_cicd/image-20260424114450218.png" alt="image-20260424114450218" /><figcaption>image-20260424114450218</figcaption></figure><p></p></blockquote></section></section><section><h3>1.3.2 注册群组共享gitlab runner<a href="#132-注册群组共享gitlab-runner"><span>#</span></a></h3><p>前提条件：用户要是该群组的<code>所有者</code>才能进行注册操作</p><p>进入群组，然后选择cicd</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab_cicd/image-20260424112751707.png" alt="image-20260424112751707" /><figcaption>image-20260424112751707</figcaption></figure><p></p><p>这里可以看到之前添加的<code>项目runner</code>，以为该项目在该群组下</p><p>现在注册一个<code>群组runner</code>，还是使用同一台runner服务器</p><p>步骤与之前一样，获取到注册令牌后即可</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab_cicd/image-20260424112829654.png" alt="image-20260424112829654" /><figcaption>image-20260424112829654</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab_cicd/image-20260424113501135.png" alt="image-20260424113501135" /><figcaption>image-20260424113501135</figcaption></figure><p></p><p>创建成功后回到<code>gitlab</code>平台，可以看到已经创建成功了一个群组平台</p><blockquote><p>**注意：**群组中的项目使用<code>群组runner</code>时，需要在编辑流水线文件时，携带上<code>群组runner</code>的<code>标签</code></p><p>如果流水线文件不带标签，那么也可以编辑<code>runner</code>，勾选<code>运行未标记的作业</code>即可</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab_cicd/image-20260424114841193.png" alt="image-20260424114841193" /><figcaption>image-20260424114841193</figcaption></figure><p></p></blockquote><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab_cicd/image-20260424113606039.png" alt="image-20260424113606039" /><figcaption>image-20260424113606039</figcaption></figure><p></p></section></section><section><h2>1.4 编写流水线文件<a href="#14-编写流水线文件"><span>#</span></a></h2><p>编辑<code>.gitlab-ci.yml</code> 文件用来调用已注册的 Runner</p><p>假设注册 Runner 时设置的标签是 <code>group-runner</code>，对应的配置文件模板应如下所示：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># .gitlab-ci.yml 文件示例</span></div></div><div><div><div>2</div></div><div><span>stages</span><span>:</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>- </span><span>build</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>- </span><span>test</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 定义一个构建任务</span></div></div><div><div><div>7</div></div><div><span>build_job</span><span>:</span></div></div><div><div><div>8</div></div><div><span>  </span><span>stage</span><span>: </span><span>build</span></div></div><div><div><div>9</div></div><div><span>  </span><span>tags</span><span>:</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>- </span><span>group-runner</span><span>  </span><span># 指定使用带有 'group-runner' 标签的 Runner</span></div></div><div><div><div>11</div></div><div><span>  </span><span>script</span><span>:</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>- </span><span>echo "正在使用群组共享的 Runner 进行构建..."</span></div></div><div><div><div>13</div></div><div><span>    </span><span># 这里放置你的构建命令，例如 mvn clean package</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span># 定义一个测试任务</span></div></div><div><div><div>16</div></div><div><span>test_job</span><span>:</span></div></div><div><div><div>17</div></div><div><span>  </span><span>stage</span><span>: </span><span>test</span></div></div><div><div><div>18</div></div><div><span>  </span><span>tags</span><span>:</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>- </span><span>group-runner</span><span>  </span><span># 同样指定使用该 Runner</span></div></div><div><div><div>20</div></div><div><span>  </span><span>script</span><span>:</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>- </span><span>echo "正在使用群组共享的 Runner 进行测试..."</span></div></div><div><div><div>22</div></div><div><span>    </span><span># 这里放置你的测试命令，例如 npm test</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><section><h3>1.4.1 具体示例<a href="#141-具体示例"><span>#</span></a></h3><p>环境：项目中存在一个网页文件<code>index.html</code></p><p>实现效果：当仓库发生提交修改时，触发流水线，使用docker拉取nginx镜像并将index.html部署到nginx中</p><section><h4>1.4.1.1 编辑流水线<a href="#1411-编辑流水线"><span>#</span></a></h4><p>进入项目，然后选择cicd中的编辑器</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab_cicd/image-20260424134536785.png" alt="image-20260424134536785" /><figcaption>image-20260424134536785</figcaption></figure><p></p><p><code>.gitlab-ci.yml</code>文件：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># 流水线阶段</span></div></div><div><div><div>2</div></div><div><span>stages</span><span>:</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>- </span><span>deploy</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 自动部署静态网页到 Docker</span></div></div><div><div><div>6</div></div><div><span>deploy_static_web</span><span>:</span></div></div><div><div><div>7</div></div><div><span>  </span><span>stage</span><span>: </span><span>deploy</span></div></div><div><div><div>8</div></div><div><span>  </span><span># --------------------------</span></div></div><div><div><div>9</div></div><div><span>  </span><span># 关键：匹配你的共享Runner标签</span></div></div><div><div><div>10</div></div><div><span>  </span><span># --------------------------</span></div></div><div><div><div>11</div></div><div><span>  </span><span>tags</span><span>:</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>- </span><span>xiaodouban_tags</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>  </span><span>script</span><span>:</span></div></div><div><div><div>15</div></div><div><span>    </span><span># 显示当前目录（排查用）</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>- </span><span>pwd</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>- </span><span>ls</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span># 停止旧容器（不报错）</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>- </span><span>docker stop my-web-server || true</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>- </span><span>docker rm my-web-server || true</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span># 启动新容器，挂载当前仓库的 index.html</span></div></div><div><div><div>24</div></div><div><span>    </span><span># 直接用宿主机 docker 运行</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>- </span><span>docker run -d --name my-web-server --net=host -v $PWD/index.html:/usr/share/nginx/html/index.html --restart always nginx:alpine</span></div></div><div><div><div>26</div></div><div><span><span>    </span></span><span>- </span><span>echo "=================================================="</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>- </span><span>echo "✅ 自动部署成功！"</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>- </span><span>echo "🌍 访问地址：http://10.22.51.91"</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>- </span><span>echo "=================================================="</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>  </span><span># 只在 main 分支自动触发</span></div></div><div><div><div>32</div></div><div><span>  </span><span>only</span><span>:</span></div></div><div><div><div>33</div></div><div><span><span>    </span></span><span>- </span><span>main</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>然后<code>提交更改</code>,会自动触发流水线一次</p></section><section><h4>1.4.1.2 查看流水线<a href="#1412-查看流水线"><span>#</span></a></h4><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab_cicd/image-20260424140326755.png" alt="image-20260424140326755" /><figcaption>image-20260424140326755</figcaption></figure><p></p><p>因为文件只有一个阶段<code>deploy</code>叫<code>deploy_static_web</code>，因此流水线只有一个</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab_cicd/image-20260424140419054.png" alt="image-20260424140419054" /><figcaption>image-20260424140419054</figcaption></figure><p></p><p>点击进去可以查看具体的运行流程</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab_cicd/image-20260424140644019.png" alt="image-20260424140644019" /><figcaption>image-20260424140644019</figcaption></figure><p></p></section><section><h4>1.4.1.3 在本地仓库提交触发<a href="#1413-在本地仓库提交触发"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>[root@localhost /root/web_test]# vim index.html</span></div></div><div><div><div>2</div></div><div><span>[root@localhost /root/web_test]# git add </span><span>.</span></div></div><div><div><div>3</div></div><div><span>[root@localhost /root/web_test]# git commit -m </span><span>"第三次更新网页文件"</span></div></div><div><div><div>4</div></div><div><span>[main c9975d6] 第三次更新网页文件</span></div></div><div><div><div>5</div></div><div><span> </span><span>1</span><span> </span><span>file</span><span> </span><span>changed,</span><span> </span><span>1</span><span> </span><span>insertion</span><span>(</span><span>+</span><span>)</span></div></div><div><div><div>6</div></div><div><span>[root@localhost /root/web_test]# git push</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>可以看到已经触发构建成功了</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab_cicd/image-20260424142148229.png" alt="image-20260424142148229" /><figcaption>image-20260424142148229</figcaption></figure><p></p><p>访问该网页</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab_cicd/image-20260424142243537.png" alt="image-20260424142243537" /><figcaption>image-20260424142243537</figcaption></figure><p></p></section></section><section><h3>1.4.2 计划<a href="#142-计划"><span>#</span></a></h3><p>类似于<code>定时任务</code>，可自定义时间段触发流水线</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab_cicd/image-20260428130959393.png" alt="image-20260428130959393" /><figcaption>image-20260428130959393</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab_cicd/image-20260428131043078.png" alt="image-20260428131043078" /><figcaption>image-20260428131043078</figcaption></figure><p></p></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/gitlab%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/</id>
      <title type="text">gitlab安装使用</title>
      <published>2026-07-06T00:00:00.000Z</published>
      <updated>2026-07-06T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/gitlab%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/"/>
      <summary type="text">gitlab使用</summary>
      <content type="html"><![CDATA[<section><h1>一、gitlab安装使用<a href="#一gitlab安装使用"><span>#</span></a></h1><section><h2>1.1 下载软件包<a href="#11-下载软件包"><span>#</span></a></h2><p>这里使用国内源进行下载</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 确认机器当前架构</span></div></div><div><div><div>2</div></div><div><span>lsb_release</span><span> </span><span>-a</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 下载对应的软件包</span></div></div><div><div><div>5</div></div><div><span>wget</span><span> </span><span>https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu/jammy/pool/main/g/gitlab-ce/gitlab-ce_15.10.0-ce.0_amd64.deb</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>1.2 生成英文环境<a href="#12-生成英文环境"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 安装并生成英文 UTF-8 语言环境</span></div></div><div><div><div>2</div></div><div><span>apt</span><span> </span><span>update</span><span> &amp;&amp; </span><span>apt</span><span> </span><span>install</span><span> </span><span>-y</span><span> </span><span>locales</span></div></div><div><div><div>3</div></div><div><span>locale-gen</span><span> </span><span>en_US.UTF-8</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 配置系统默认使用 en_US.UTF-8</span></div></div><div><div><div>6</div></div><div><span>echo</span><span> </span><span>"LANG=en_US.UTF-8"</span><span> &gt; </span><span>/etc/default/locale</span></div></div><div><div><div>7</div></div><div><span>echo</span><span> </span><span>"LC_ALL=en_US.UTF-8"</span><span> &gt;&gt; </span><span>/etc/default/locale</span></div></div><div><div><div>8</div></div><div><span>export</span><span> </span><span>LANG</span><span>=</span><span>en_US</span><span>.</span><span>UTF-8</span></div></div><div><div><div>9</div></div><div><span>export</span><span> </span><span>LC_ALL</span><span>=</span><span>en_US</span><span>.</span><span>UTF-8</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>执行完后，退出当前 Shell 再重新登录，让 Locale 生效</p></section><section><h2>1.3 进行安装<a href="#13-进行安装"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>dpkg</span><span> </span><span>-i</span><span> </span><span>gitlab-ce_15.10.0-ce.0_amd64.deb</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 如果安装失败执行命令将残留卸载干净</span></div></div><div><div><div>4</div></div><div><span>sudo</span><span> </span><span>dpkg</span><span> </span><span>--purge</span><span> </span><span>--force-all</span><span> </span><span>gitlab-ce</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 查看卸载完成后的状态</span></div></div><div><div><div>7</div></div><div><span>dpkg</span><span> </span><span>-l</span><span> | </span><span>grep</span><span> </span><span>gitlab</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>1.4 修改配置文件<a href="#14-修改配置文件"><span>#</span></a></h2><p>配置gitlab服务，修改<code>域名和邮箱</code></p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt;&gt; </span><span>/etc/gitlab/gitlab.rb</span><span> &lt;&lt; </span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>external_url 'http://10.0.0.99'</span></div></div><div><div><div>3</div></div><div><span>gitlab_rails['gitlab_email_enabled'] = true</span></div></div><div><div><div>4</div></div><div><span>gitlab_rails['gitlab_email_from'] = '1111@qq.com'</span></div></div><div><div><div>5</div></div><div><span>gitlab_rails['gitlab_email_display_name'] = '发件人姓名'</span></div></div><div><div><div>6</div></div><div><span>gitlab_rails['smtp_enable'] = true</span></div></div><div><div><div>7</div></div><div><span>gitlab_rails['smtp_address'] = "smtp.qq.com"</span></div></div><div><div><div>8</div></div><div><span>gitlab_rails['smtp_port'] = 465</span></div></div><div><div><div>9</div></div><div><span>gitlab_rails['smtp_user_name'] = "877348180@qq.com"</span></div></div><div><div><div>10</div></div><div><span>gitlab_rails['smtp_password'] = "pvthquniqpjvbbch"</span></div></div><div><div><div>11</div></div><div><span>gitlab_rails['smtp_domain'] = "smtp.qq.com"</span></div></div><div><div><div>12</div></div><div><span>gitlab_rails['smtp_authentication'] = "login"</span></div></div><div><div><div>13</div></div><div><span>gitlab_rails['smtp_enable_starttls_auto'] = true</span></div></div><div><div><div>14</div></div><div><span>gitlab_rails['smtp_tls'] = true</span></div></div><div><div><div>15</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 重新加载配置</span></div></div><div><div><div>2</div></div><div><span>gitlab-ctl</span><span> </span><span>reconfigure</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 进入控制台</span></div></div><div><div><div>5</div></div><div><span>gitlab-rails</span><span> </span><span>console</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 测试邮件是否能够正确发送</span></div></div><div><div><div>8</div></div><div><span>Notify.test_email(</span><span>'收件人邮箱'</span><span>,</span><span>'这是主题'</span><span>,</span><span>'这是正文'</span><span>).deliver_now</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>1.5 gitlab命令行管理<a href="#15-gitlab命令行管理"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>gitlab-ctl</span><span> </span><span>start</span><span> </span><span># 启动所有服务</span></div></div><div><div><div>2</div></div><div><span>gitlab-ctl</span><span> </span><span>stop</span><span>  </span><span># 停止</span></div></div><div><div><div>3</div></div><div><span>gitlab-ctl</span><span> </span><span>stop</span><span> </span><span>postgresql</span><span>  </span><span># 停止某个服务</span></div></div><div><div><div>4</div></div><div><span>gitlab-ctl</span><span> </span><span>restart</span></div></div><div><div><div>5</div></div><div><span>gitlab-ctl</span><span> </span><span>status</span></div></div><div><div><div>6</div></div><div><span>gitlab-ctl</span><span> </span><span>reconfigure</span><span>   </span><span># 重新读取gitlab配置</span></div></div><div><div><div>7</div></div><div><span>gitlab-ctl</span><span> </span><span>tail</span><span>  </span><span># 查看gitlab的运行状态，所有服务状态</span></div></div><div><div><div>8</div></div><div><span>gitlab-ctl</span><span> </span><span>tail</span><span> </span><span>redis</span><span> </span><span># 只看某个服务的状态</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span># 检测gitlab的nginx状态</span></div></div><div><div><div>12</div></div><div><span>netstat</span><span> </span><span>-tunlp</span><span>|</span><span>grep</span><span> </span><span>nginx</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>gitlab-ctl</span><span> </span><span>tail</span><span> </span><span>nginx</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>1.6 登录gitlab网页<a href="#16-登录gitlab网页"><span>#</span></a></h2><p>默认账号：<code>root</code></p><p>默认密码：查看文件<code>/etc/gitlab/initial_root_password</code></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>[root@localhost /root]# cat /etc/gitlab/initial_root_password</span></div></div><div><div><div>2</div></div><div><span># WARNING: This value is valid only in the following conditions</span></div></div><div><div><div>3</div></div><div><span>#          1. If provided manually (either via `GITLAB_ROOT_PASSWORD` environment variable or via `gitlab_rails['initial_root_password']` setting in `gitlab.rb`, it was provided before database was seeded for the first time (usually, the first reconfigure run).</span></div></div><div><div><div>4</div></div><div><span>#          2. Password hasn't been changed manually, either via UI or via command line.</span></div></div><div><div><div>5</div></div><div><span>#</span></div></div><div><div><div>6</div></div><div><span>#          If the password shown here doesn't work, you must reset the admin password following https://docs.gitlab.com/ee/security/reset_user_password.html#reset-your-root-password.</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>Password:</span><span> </span><span>a8PFZ+s/zBs2AyochZJXgBMY6T68R1jVCQIUFzYsg/g=</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># NOTE: This file will be automatically deleted in the first reconfigure run after 24 hours.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>输出的内容里，<code>Password:</code> 后面的字符串就是你的初始密码</p><p>**注意：**这个初始密码文件只会保留 <strong>24 小时</strong>，超过时间会被 GitLab 自动删除，所以安装后要尽快登录修改密码</p><section><h3>1.6.1 重置密码<a href="#161-重置密码"><span>#</span></a></h3><p>如果文件已经被删除，说明你安装已经超过 24 小时，需要通过 <code>gitlab-rails console</code> 重置密码：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 进入控制台</span></div></div><div><div><div>2</div></div><div><span>gitlab-rails</span><span> </span><span>console</span><span> </span><span>-e</span><span> </span><span>production</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 重置root密码</span></div></div><div><div><div>5</div></div><div><span>user</span><span> </span><span>=</span><span> </span><span>User.where</span><span>(</span><span>id:</span><span> </span><span>1</span><span>)</span><span>.first</span></div></div><div><div><div>6</div></div><div><span>user.password</span><span> </span><span>=</span><span> </span><span>'你的新密码'</span></div></div><div><div><div>7</div></div><div><span>user.password_confirmation</span><span> </span><span>=</span><span> </span><span>'你的新密码'</span></div></div><div><div><div>8</div></div><div><span>user.save!</span></div></div><div><div><div>9</div></div><div><span>exit</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>1.7 设置中文、关闭网页注册功能<a href="#17-设置中文关闭网页注册功能"><span>#</span></a></h2><section><h3>1.7.1 设置中文<a href="#171-设置中文"><span>#</span></a></h3><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab/image-20260420170029022.png" alt="image-20260420170029022" /><figcaption>image-20260420170029022</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab/image-20260420170053664.png" alt="image-20260420170053664" /><figcaption>image-20260420170053664</figcaption></figure><p></p></section><section><h3>1.7.2 关闭网页注册功能<a href="#172-关闭网页注册功能"><span>#</span></a></h3><p>所有设置都在<code>管理员</code>界面中进行配置与管理</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab/image-20260420170210700.png" alt="image-20260420170210700" /><figcaption>image-20260420170210700</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab/image-20260420170250047.png" alt="image-20260420170250047" /><figcaption>image-20260420170250047</figcaption></figure><p></p></section></section><section><h2>1.8 创建项目、用户、群组<a href="#18-创建项目用户群组"><span>#</span></a></h2><section><h3>1.8.1 创建用户<a href="#181-创建用户"><span>#</span></a></h3><p>创建用户主要关注<code>访问类型</code></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab/image-20260420171408436.png" alt="image-20260420171408436" /><figcaption>image-20260420171408436</figcaption></figure><p></p></section><section><h3>1.8.2 创建群组<a href="#182-创建群组"><span>#</span></a></h3><p>创建群组主要关注<code>可见性级别、权限和群组功能</code></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab/image-20260420171602464.png" alt="image-20260420171602464" /><figcaption>image-20260420171602464</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab/image-20260420171613390.png" alt="image-20260420171613390" /><figcaption>image-20260420171613390</figcaption></figure><p></p></section><section><h3>1.8.3 新建项目<a href="#183-新建项目"><span>#</span></a></h3><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab/image-20260420171954333.png" alt="image-20260420171954333" /><figcaption>image-20260420171954333</figcaption></figure><p></p><section><h4>1.8.3.1 空白项目<a href="#1831-空白项目"><span>#</span></a></h4><p>填写：<code>项目名称、项目URL的群组、可见性级别</code></p><p><strong>可见性级别的选择还会跟<code>群组</code>的可见性级别相互关联</strong></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab/image-20260420172154010.png" alt="image-20260420172154010" /><figcaption>image-20260420172154010</figcaption></figure><p></p><p>创建项目后可以<code>邀请成员或群组</code>共同编辑管理</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab/image-20260420172704918.png" alt="image-20260420172704918" /><figcaption>image-20260420172704918</figcaption></figure><p></p></section><section><h4>1.8.3.2 模版创建<a href="#1832-模版创建"><span>#</span></a></h4><p>多个模板选择，其余选项与空白项目创建一致</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab/image-20260420173123169.png" alt="image-20260420173123169" /><figcaption>image-20260420173123169</figcaption></figure><p></p></section><section><h4>1.8.3.3 导入项目<a href="#1833-导入项目"><span>#</span></a></h4><p>选择<code>项目的平台</code></p><p>之后填写好<code>平台地址</code>，及<code>个人访问凭证</code>进行导入</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab/image-20260420173313837.png" alt="image-20260420173313837" /><figcaption>image-20260420173313837</figcaption></figure><p></p></section></section></section><section><h2>1.9 配置个人访问令牌<a href="#19-配置个人访问令牌"><span>#</span></a></h2><section><h3>1.9.1 创建个人访问令牌<a href="#191-创建个人访问令牌"><span>#</span></a></h3><p>使用http方式来<code>克隆、拉取、推送</code>文件代码</p><blockquote><p>不配置个人令牌也可以使用<code>gitlab的账号密码</code>来进行<code>克隆、拉取、推送</code>，只是使用访问令牌是使用密文，更加安全</p></blockquote><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab/image-20260421115115250.png" alt="image-20260421115115250" /><figcaption>image-20260421115115250</figcaption></figure><p></p><p><strong>令牌只会显示一次，刷新永久失效</strong></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab/image-20260421115155324.png" alt="image-20260421115155324" /><figcaption>image-20260421115155324</figcaption></figure><p></p></section><section><h3>1.9.2 尝试克隆<a href="#192-尝试克隆"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 开启 Git 凭证存储</span></div></div><div><div><div>2</div></div><div><span>git</span><span> </span><span>config</span><span> </span><span>--global</span><span> </span><span>credential.helper</span><span> </span><span>store</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 执行克隆操作</span></div></div><div><div><div>5</div></div><div><span>git</span><span> </span><span>clone</span><span> </span><span>http://10.22.51.72/hututu/konglong_xindong.git</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 之后会提示输入账户和gitlab访问令牌，之后再执行后续的推送、拉取都无需输入</span></div></div><div><div><div>8</div></div><div><span>#凭证文件存放路径</span></div></div><div><div><div>9</div></div><div><span>~/.git-credentials</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>1.10 配置ssh秘钥<a href="#110-配置ssh秘钥"><span>#</span></a></h2><section><h3>1.10.1 创建秘钥<a href="#1101-创建秘钥"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ssh-keygen</span><span> </span><span>-t</span><span> </span><span>ed25519</span><span> </span><span>-C</span><span> </span><span>"你的GitLab邮箱"</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 之后一路回车</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 查看公钥并复制</span></div></div><div><div><div>6</div></div><div><span>cat</span><span> </span><span>~/.ssh/id_ed25519.pub</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.10.2 将秘钥上传到gitlab<a href="#1102-将秘钥上传到gitlab"><span>#</span></a></h3><p>粘贴到此处后确实即可</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab/image-20260421143843454.png" alt="image-20260421143843454" /><figcaption>image-20260421143843454</figcaption></figure><p></p></section><section><h3>1.10.3 尝试是否可以使用<a href="#1103-尝试是否可以使用"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 使用ssh的方式进行克隆代码</span></div></div><div><div><div>2</div></div><div><span>git</span><span> </span><span>clone</span><span> </span><span>git@10.22.51.72:hututu/konglong_xindong.git</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>1.11 保护main分支<a href="#111-保护main分支"><span>#</span></a></h2><p>路径：找到仓库信息-&gt;设置-&gt;仓库</p><p>填写好需要保护的<code>分支以及对应操作的权限</code></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab/image-20260421152957954.png" alt="image-20260421152957954" /><figcaption>image-20260421152957954</figcaption></figure><p></p></section><section><h2>1.12 管理多账号<a href="#112-管理多账号"><span>#</span></a></h2><p>方法：多套 SSH 秘钥 → 对应多个 GitLab 账号</p><section><h3>1.12.1 生成多套秘钥<a href="#1121-生成多套秘钥"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ssh-keygen</span><span> </span><span>-t</span><span> </span><span>ed25519</span><span> </span><span>-C</span><span> </span><span>"hututu@xxx.com"</span><span> </span><span>-f</span><span> </span><span>~/.ssh/id_ed25519_gitlab1</span></div></div><div><div><div>2</div></div><div><span>ssh-keygen</span><span> </span><span>-t</span><span> </span><span>ed25519</span><span> </span><span>-C</span><span> </span><span>"suazi@xxx.com"</span><span> </span><span>-f</span><span> </span><span>~/.ssh/id_ed25519_gitlab2</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.12.2 配置ssh文件<a href="#1122-配置ssh文件"><span>#</span></a></h3><p>配置 <code>~/.ssh/config</code></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># host中的gitlab1和gitlab2用于后续匹配别名</span></div></div><div><div><div>2</div></div><div><span>Host</span><span> </span><span>gitlab1</span></div></div><div><div><div>3</div></div><div><span>    </span><span>HostName</span><span> </span><span>10.22.51.72</span></div></div><div><div><div>4</div></div><div><span>    </span><span>User</span><span> </span><span>hututu</span></div></div><div><div><div>5</div></div><div><span>    </span><span>IdentityFile</span><span> </span><span>~/.ssh/id_ed25519_gitlab1</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>Host</span><span> </span><span>gitlab2</span></div></div><div><div><div>8</div></div><div><span>    </span><span>HostName</span><span> </span><span>10.22.51.72</span></div></div><div><div><div>9</div></div><div><span>    </span><span>User</span><span> </span><span>suazi</span></div></div><div><div><div>10</div></div><div><span>    </span><span>IdentityFile</span><span> </span><span>~/.ssh/id_ed25519_gitlab2</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.12.3 不同项目使用不同的host<a href="#1123-不同项目使用不同的host"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 先将原项目的远程仓库进行解绑</span></div></div><div><div><div>2</div></div><div><span>git</span><span> </span><span>remote</span><span> </span><span>remove</span><span> </span><span>origin</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 绑定各自项目</span></div></div><div><div><div>5</div></div><div><span>git</span><span> </span><span>clone</span><span> </span><span>git@gitlab1:hututu/project.git</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>git</span><span> </span><span>clone</span><span> </span><span>git@gitlab2:user01/project.git</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>1.13 分支管理<a href="#113-分支管理"><span>#</span></a></h2><section><h3>1.13.1 新建分支<a href="#1131-新建分支"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 查看当前分支</span></div></div><div><div><div>2</div></div><div><span>git</span><span> </span><span>brach</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>#创建分支并切换</span></div></div><div><div><div>5</div></div><div><span>git</span><span> </span><span>switch</span><span> </span><span>-c</span><span> </span><span>fenzhi</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 在分支中创建修改文件</span></div></div><div><div><div>8</div></div><div><span>touch</span><span> </span><span>fenzhi.txt</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 提交本地分支</span></div></div><div><div><div>11</div></div><div><span>git</span><span> </span><span>commit</span><span> </span><span>-m</span><span> </span><span>"创建修改了分支文件"</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span># 推送分支到远程仓库</span></div></div><div><div><div>14</div></div><div><span>git</span><span> </span><span>push</span><span> </span><span>--set-upstream</span><span> </span><span>origin</span><span> </span><span>fenzhi</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>推送后会给出一个合并分支请求url：<code>http://10.22.51.72/hututu/konglong_xindong/-/merge_requests/new?</code></p><p>访问该url构建<code>合并请求</code>，也可以登录网页端<code>创建合并请求</code></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>[root@localhost /root/konglong_xindong]# git push --set-upstream origin fenzhi</span></div></div><div><div><div>2</div></div><div><span>Enumerating</span><span> </span><span>objects:</span><span> </span><span>4,</span><span> </span><span>done.</span></div></div><div><div><div>3</div></div><div><span>Counting</span><span> </span><span>objects:</span><span> </span><span>100%</span><span> (4/4), done.</span></div></div><div><div><div>4</div></div><div><span>Delta</span><span> </span><span>compression</span><span> </span><span>using</span><span> </span><span>up</span><span> </span><span>to</span><span> </span><span>4</span><span> </span><span>threads</span></div></div><div><div><div>5</div></div><div><span>Compressing</span><span> </span><span>objects:</span><span> </span><span>100%</span><span> (2/2), done.</span></div></div><div><div><div>6</div></div><div><span>Writing</span><span> </span><span>objects:</span><span> </span><span>100%</span><span> (3/3), 368 bytes | </span><span>184.00</span><span> </span><span>KiB/s,</span><span> </span><span>done.</span></div></div><div><div><div>7</div></div><div><span>Total</span><span> </span><span>3</span><span> (delta </span><span>0</span><span>), reused 0 (</span><span>delta</span><span> </span><span>0</span><span>), pack-reused 0</span></div></div><div><div><div>8</div></div><div><span>remote:</span></div></div><div><div><div>9</div></div><div><span>remote:</span><span> </span><span>To</span><span> </span><span>create</span><span> </span><span>a</span><span> </span><span>merge</span><span> </span><span>request</span><span> </span><span>for</span><span> </span><span>fenzhi,</span><span> </span><span>visit:</span></div></div><div><div><div>10</div></div><div><span>remote:</span><span>   </span><span>http://10.22.51.72/hututu/konglong_xindong/-/merge_requests/new?merge_request%5Bsource_branch%5D=fenzhi</span></div></div><div><div><div>11</div></div><div><span>remote:</span></div></div><div><div><div>12</div></div><div><span>To</span><span> </span><span>gitlab1:hututu/konglong_xindong.git</span></div></div><div><div><div>13</div></div><div><span>   </span><span>a9a1d6b..9aa2351</span><span>  </span><span>fenzhi</span><span> -&gt; </span><span>fenzhi</span></div></div><div><div><div>14</div></div><div><span>branch</span><span> </span><span>'fenzhi'</span><span> </span><span>set</span><span> </span><span>up</span><span> </span><span>to</span><span> </span><span>track</span><span> </span><span>'origin/fenzhi'.</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.13.2 批准合并分支<a href="#1132-批准合并分支"><span>#</span></a></h3><p>申请合并请求后，指派人会收到合并请求，指派人对该请求进行<code>审核、批准、合并</code>等操作</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/gitlab/image-20260422105823248.png" alt="image-20260422105823248" /><figcaption>image-20260422105823248</figcaption></figure><p></p></section><section><h3>1.13.3 本地拉取合并后的分支<a href="#1133-本地拉取合并后的分支"><span>#</span></a></h3><p>远程仓库将分支合并后，本地仓库还是保存着以前分支，因此需要同步最新的主干，然后删除合并的分支</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 查看当前分支</span></div></div><div><div><div>2</div></div><div><span>git</span><span> </span><span>branch</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 拉取远程最新状态</span></div></div><div><div><div>5</div></div><div><span>git</span><span> </span><span>fetch</span><span> </span><span>origin</span><span> </span><span>--prune</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 切换到主干分支，拉取最新代码</span></div></div><div><div><div>8</div></div><div><span>git</span><span> </span><span>switch</span><span> </span><span>main</span></div></div><div><div><div>9</div></div><div><span>git</span><span> </span><span>pull</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span># 可以看到切换的时候git还会提示分支已经合并到了主干分支</span></div></div><div><div><div>12</div></div><div><span>[root@localhost /root/konglong_xindong]# git switch main</span></div></div><div><div><div>13</div></div><div><span>Switched</span><span> </span><span>to</span><span> </span><span>branch</span><span> </span><span>'main'</span></div></div><div><div><div>14</div></div><div><span>Your</span><span> </span><span>branch</span><span> </span><span>is</span><span> </span><span>up</span><span> </span><span>to</span><span> </span><span>date</span><span> </span><span>with</span><span> </span><span>'origin/main'.</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span># 清理多余分支</span></div></div><div><div><div>18</div></div><div><span>git</span><span> </span><span>branch</span><span> </span><span>-D</span><span> </span><span>fenzhi</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section><section><h2>1.14 gitlab备份配置<a href="#114-gitlab备份配置"><span>#</span></a></h2><section><h3>1.14.1 修改gitlab配置<a href="#1141-修改gitlab配置"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt;&gt; </span><span>/etc/gitlab/gitlab.rb</span><span> &lt;&lt; </span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>gitlab_rails['backup_path'] = "/gitlab_backup/"</span></div></div><div><div><div>3</div></div><div><span>gitlab_rails['backup_keep_time'] = 604800</span></div></div><div><div><div>4</div></div><div><span>EOF</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 重新加载gitlab配置</span></div></div><div><div><div>7</div></div><div><span>gitlab-ctl</span><span> </span><span>reconfigure</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 准备备份数据的目录，和配置一致</span></div></div><div><div><div>10</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/gitlab_backup/</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.14.2 执行备份命令<a href="#1142-执行备份命令"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>gitlab-rake</span><span> </span><span>gitlab:backup:create</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 查看备份数据</span></div></div><div><div><div>4</div></div><div><span>[root@localhost /gitlab_backup]# ll -h</span></div></div><div><div><div>5</div></div><div><span>total</span><span> </span><span>71M</span></div></div><div><div><div>6</div></div><div><span>drwx------</span><span>  </span><span>2</span><span> </span><span>git</span><span>  </span><span>root</span><span> </span><span>4.0K</span><span> </span><span>Apr</span><span> </span><span>22</span><span> </span><span>13:26</span><span> </span><span>./</span></div></div><div><div><div>7</div></div><div><span>drwxr-xr-x</span><span> </span><span>23</span><span> </span><span>root</span><span> </span><span>root</span><span> </span><span>4.0K</span><span> </span><span>Apr</span><span> </span><span>22</span><span> </span><span>13:16</span><span> </span><span>../</span></div></div><div><div><div>8</div></div><div><span>-rw-------</span><span>  </span><span>1</span><span> </span><span>git</span><span>  </span><span>git</span><span>   </span><span>71M</span><span> </span><span>Apr</span><span> </span><span>22</span><span> </span><span>13:26</span><span> </span><span>1776835597_2026_04_22_15.10.0_gitlab_backup.tar</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.14.3 执行数据恢复命令<a href="#1143-执行数据恢复命令"><span>#</span></a></h3><p>Gitlab的恢复<code>只能恢复到与原本备份文件相同的gitlab版本中</code>，恢复时，需要停止数据库的写入操作，但是保持gitlab是运行的。</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 停止如下三个服务</span></div></div><div><div><div>2</div></div><div><span>gitlab-ctl</span><span> </span><span>stop</span><span> </span><span>unicorn</span></div></div><div><div><div>3</div></div><div><span>gitlab-ctl</span><span> </span><span>stop</span><span> </span><span>sidekiq</span></div></div><div><div><div>4</div></div><div><span>gitlab-ctl</span><span> </span><span>stop</span><span> </span><span>nginx</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 进入备份文件夹</span></div></div><div><div><div>7</div></div><div><span>cd</span><span> </span><span>/gitlab_backup</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 查看备份文件</span></div></div><div><div><div>10</div></div><div><span>[root@localhost /gitlab_backup]# ll</span></div></div><div><div><div>11</div></div><div><span>total</span><span> </span><span>71872</span></div></div><div><div><div>12</div></div><div><span>drwx------</span><span>  </span><span>2</span><span> </span><span>git</span><span>  </span><span>root</span><span>     </span><span>4096</span><span> </span><span>Apr</span><span> </span><span>22</span><span> </span><span>13:41</span><span> </span><span>./</span></div></div><div><div><div>13</div></div><div><span>drwxr-xr-x</span><span> </span><span>23</span><span> </span><span>root</span><span> </span><span>root</span><span>     </span><span>4096</span><span> </span><span>Apr</span><span> </span><span>22</span><span> </span><span>13:16</span><span> </span><span>../</span></div></div><div><div><div>14</div></div><div><span>-rw-------</span><span>  </span><span>1</span><span> </span><span>git</span><span>  </span><span>git</span><span>  </span><span>73584640</span><span> </span><span>Apr</span><span> </span><span>22</span><span> </span><span>13:26</span><span> </span><span>1776835597_2026_04_22_15.10.0_gitlab_backup.tar</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span># 执行恢复命令，填入文件的名字就好，不要后缀</span></div></div><div><div><div>18</div></div><div><span>gitlab-rake</span><span> </span><span>gitlab:backup:restore</span><span> </span><span>BACKUP=1776835597_2026_04_22_15.10.0</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><p>**注意：**恢复操作，就是删除 所有原有数据，然后恢复该最新的数据</p><p>看到如下结果就是正确的
Restore task is done.</p></blockquote><p>之后重新读取配置，重启gitlab即可</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 重载配置</span></div></div><div><div><div>2</div></div><div><span>gitlab-ctl</span><span> </span><span>reconfigure</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 重启gitlab服务</span></div></div><div><div><div>5</div></div><div><span>gitlab-ctl</span><span> </span><span>restart</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 查看启动的服务</span></div></div><div><div><div>8</div></div><div><span>gitlab-ctl</span><span> </span><span>status</span><span> | </span><span>grep</span><span> </span><span>run</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>1.15 gitlab的https访问<a href="#115-gitlab的https访问"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 修改配置,修改为https访问，如果是域名这需要配置好dns解析</span></div></div><div><div><div>2</div></div><div><span>vim</span><span> </span><span>/etc/gitlab/gitlab.rb</span></div></div><div><div><div>3</div></div><div><span>external_url</span><span> </span><span>'https://10.0.0.99'</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 将准备好的证书放入自定义路径</span></div></div><div><div><div>6</div></div><div><span>cd</span><span> </span><span>/etc/gitlab/ssl</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 修改该目录权限</span></div></div><div><div><div>9</div></div><div><span>chmod</span><span> </span><span>-R</span><span> </span><span>755</span><span> </span><span>/etc/gitlab/ssl</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>1.15.1 修改配置文件<a href="#1151-修改配置文件"><span>#</span></a></h3><p>再次修改<code>/etc/gitlab/gitlab.rb</code>中nginx的片段</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>letsencrypt[</span><span>'enable'</span><span>]</span><span> </span><span>=</span><span> </span><span>false</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>nginx[</span><span>'enable'</span><span>]</span><span> </span><span>=</span><span> </span><span>true</span></div></div><div><div><div>4</div></div><div><span>nginx[</span><span>'redirect_http_to_https'</span><span>]</span><span> </span><span>=</span><span> </span><span>true</span></div></div><div><div><div>5</div></div><div><span>nginx[</span><span>'ssl_certificate'</span><span>]</span><span> </span><span>=</span><span> </span><span>"/etc/gitlab/ssl/domain.pem"</span></div></div><div><div><div>6</div></div><div><span>nginx[</span><span>'ssl_certificate_key'</span><span>]</span><span> </span><span>=</span><span> </span><span>"/etc/gitlab/ssl/domain.key"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>之后重新加载配置即可生效</p></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/KVM%E8%99%9A%E6%8B%9F%E5%8C%96%E6%8A%80%E6%9C%AF/</id>
      <title type="text">KVM虚拟化技术</title>
      <published>2026-07-06T00:00:00.000Z</published>
      <updated>2026-07-06T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/KVM%E8%99%9A%E6%8B%9F%E5%8C%96%E6%8A%80%E6%9C%AF/"/>
      <summary type="text">KVM虚拟化技术</summary>
      <content type="html"><![CDATA[<section><h1>KVM 虚拟化技术入门与实战指南<a href="#kvm-虚拟化技术入门与实战指南"><span>#</span></a></h1><section><h2>一、 KVM 理论知识<a href="#一-kvm-理论知识"><span>#</span></a></h2><section><h3>1.1 什么是 KVM<a href="#11-什么是-kvm"><span>#</span></a></h3><p>KVM（Kernel-based Virtual Machine，基于内核的虚拟机）是 Linux 内核的一个开源虚拟化模块。它可以将任何 Linux 设备转变为裸机虚拟机监控器（Type-1 Hypervisor），允许在单台物理服务器上运行多个相互隔离的虚拟机（Guest OS）。</p></section><section><h3>1.2 工作原理<a href="#12-工作原理"><span>#</span></a></h3><p>KVM 的核心在于利用 CPU 的硬件虚拟化扩展（如 Intel VT-x 或 AMD-V）。其工作机制如下：</p><ul>
<li><strong>内核模块</strong>：KVM 作为 Linux 内核模块加载，使主机操作系统能够直接管理虚拟机的资源。</li>
<li><strong>QEMU 仿真器</strong>：KVM 结合 QEMU 用户空间组件，为虚拟机提供虚拟硬件（如网卡、磁盘、显卡等）。</li>
<li><strong>独立进程</strong>：每个虚拟机在宿主机上作为一个独立的 Linux 进程运行，由标准的 Linux 调度器进行 CPU 调度，并由内核直接管理内存。</li>
</ul></section><section><h3>1.3 KVM 的核心优势<a href="#13-kvm-的核心优势"><span>#</span></a></h3><ul>
<li><strong>高性能</strong>：虚拟机直接继承 Linux 内核的高性能特性，并在尽可能接近硬件的位置执行虚拟化，大幅缩短进程延迟。</li>
<li><strong>高安全性</strong>：支持 SELinux 等 Linux 原生安全功能，确保虚拟环境严格遵守安全边界，强化数据隐私。</li>
<li><strong>高稳定性</strong>：作为成熟的开源项目，KVM 拥有庞大的社区支持，为企业级应用提供稳定基础。</li>
<li><strong>成本效益</strong>：完全免费开源，企业无需支付额外的商业许可费用。</li>
<li><strong>灵活性</strong>：兼容多种硬件配置，支持动态分配 CPU、内存和存储，并支持资源的精简预置（Thin Provisioning）。</li>
</ul></section><section><h3>1.4 KVM 与 VMware 的区别<a href="#14-kvm-与-vmware-的区别"><span>#</span></a></h3>

<table><thead><tr><th>对比维度</th><th>KVM</th><th>VMware (ESXi)</th></tr></thead><tbody><tr><td><strong>开源与授权</strong></td><td>免费开源，无许可费用</td><td>商业软件，需购买商业许可证</td></tr><tr><td><strong>架构定位</strong></td><td>集成在 Linux 内核中的模块</td><td>独立的 Type-1 裸机虚拟化平台</td></tr><tr><td><strong>适用场景</strong></td><td>云计算、Web 服务、开发测试</td><td>传统企业级复杂应用、大型数据中心</td></tr><tr><td><strong>生态与管理</strong></td><td>依赖 libvirt、OpenStack 等开源生态</td><td>拥有完善的 vCenter 商业管理套件</td></tr></tbody></table></section></section><section><h2>二、 KVM 核心组件与常用命令<a href="#二-kvm-核心组件与常用命令"><span>#</span></a></h2><ul>
<li><strong>qemu-kvm</strong>：KVM 的核心模块与用户空间仿真器，用户空间进程，负责 I/O 模拟、设备模型及 VM 生命周期控制。</li>
<li><strong>libvirtd</strong>：守护进程，管理虚拟机配置、资源分配及快照。</li>
<li><strong>libvirt</strong>：虚拟化管理工具集，提供统一的 API 和命令行接口。</li>
<li><strong>virt-install</strong>：用于通过命令行创建和安装虚拟机的工具。</li>
<li><strong>virt-manager</strong>：基于图形界面（GUI）的虚拟机管理程序。</li>
<li><strong>cockpit-machines</strong>：基于 Web 的轻量级管理插件，适合现代 Linux 服务器管理。</li>
</ul><hr /></section><section><h2>三、 KVM部署<a href="#三-kvm部署"><span>#</span></a></h2><section><h3>3.1 环境准备与检查<a href="#31-环境准备与检查"><span>#</span></a></h3><p>在部署前，需确认 CPU 支持虚拟化且内核模块已加载：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 检查 CPU 是否支持硬件虚拟化（Intel 为 vmx，AMD 为 svm）,有数字说明支持</span></div></div><div><div><div>2</div></div><div><span>egrep</span><span> </span><span>-c</span><span> </span><span>'(vmx|svm)'</span><span> </span><span>/proc/cpuinfo</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 检查 KVM 模块是否已加载</span></div></div><div><div><div>5</div></div><div><span>lsmod</span><span> | </span><span>grep</span><span> </span><span>kvm</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>3.2 安装核心组件<a href="#32-安装核心组件"><span>#</span></a></h3><p>安装 QEMU、Libvirt 及相关管理工具：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># CentOS/RHEL 系</span></div></div><div><div><div>2</div></div><div><span>yum</span><span> </span><span>install</span><span> </span><span>-y</span><span> </span><span>qemu-kvm</span><span> </span><span>qemu-img</span><span> </span><span>libvirt</span><span> </span><span>libvirt-client</span><span> </span><span>virt-install</span><span> </span><span>virt-manager</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># Ubuntu/Debian 系</span></div></div><div><div><div>5</div></div><div><span>apt</span><span> </span><span>install</span><span> </span><span>-y</span><span> </span><span>qemu-kvm</span><span> </span><span>libvirt-clients</span><span> </span><span>libvirt-daemon-system</span><span> </span><span>virtinst</span><span> </span><span>bridge-utils</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>3.3 配置并启动Libvirt服务<a href="#33-配置并启动libvirt服务"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 修改libvirtd.conf主配置文件</span></div></div><div><div><div>2</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'s/#unix_sock_group = "libvirt"/unix_sock_group = "libvirtd"/g'</span><span> </span><span>/etc/libvirt/libvirtd.conf</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 创建libvirtd用户组，添加root用户到libvirtd用户组</span></div></div><div><div><div>5</div></div><div><span>groupadd</span><span> </span><span>libvirtd</span></div></div><div><div><div>6</div></div><div><span>usermod</span><span> </span><span>-aG</span><span> </span><span>libvirtd</span><span> </span><span>root</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 修改qemu.conf配置文件</span></div></div><div><div><div>9</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'s/#user = "root"/user = "root"/g'</span><span> </span><span>/etc/libvirt/qemu.conf</span></div></div><div><div><div>10</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'s/#group = "root"/group = "root"/g'</span><span> </span><span>/etc/libvirt/qemu.conf</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># 启动服务并设置开机自启</span></div></div><div><div><div>13</div></div><div><span>systemctl</span><span> </span><span>enable</span><span> </span><span>--now</span><span> </span><span>libvirtd</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span># 验证服务状态</span></div></div><div><div><div>16</div></div><div><span>systemctl</span><span> </span><span>status</span><span> </span><span>libvirtd</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>3.4 配置网络桥接<a href="#34-配置网络桥接"><span>#</span></a></h3><section><h4>3.4.1 NAT模式<a href="#341-nat模式"><span>#</span></a></h4><section><h5>1.核心特点<a href="#1核心特点"><span>#</span></a></h5><ul>
<li>虚拟机通过宿主机的NAT网关访问外网，<strong>无需额外配置物理网卡</strong>。</li>
<li>外部网络<strong>无法直接访问虚拟机</strong>（需配置端口转发才能暴露服务）。</li>
<li><strong>默认已启用</strong>：安装KVM后自动创建名为<code>default</code>的NAT网络。</li>
</ul></section><section><h5>2.配置步骤<a href="#2配置步骤"><span>#</span></a></h5><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 验证默认nat网络</span></div></div><div><div><div>2</div></div><div><span>virsh</span><span> </span><span>net-list</span><span> </span><span>--all</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 查看NAT网络详情</span></div></div><div><div><div>5</div></div><div><span>virsh</span><span> </span><span>net-dumpxml</span><span> </span><span>default</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><code>关键参数：</code></p><ul>
<li><strong>网桥名称</strong>：<code>virbr0</code>（虚拟网桥）。</li>
<li><strong>IP范围</strong>：<code>192.168.122.0/24</code>（DHCP分配范围：<code>192.168.122.2</code>–<code>192.168.122.254</code>）。</li>
<li><strong>网关地址</strong>：<code>192.168.122.1</code>（宿主机在NAT网络中的IP）。</li>
</ul></section><section><h5>3.创建虚拟机时指定NAT网卡<a href="#3创建虚拟机时指定nat网卡"><span>#</span></a></h5><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virt-install</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>  </span><span>--name</span><span> </span><span>nat-vm</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>  </span><span>--network</span><span> </span><span>network=default</span><span> </span><span>\ </span><span> </span><span># 明确使用default NAT网络</span></div></div><div><div><div>4</div></div><div><span>  </span><span>--cdrom</span><span> </span><span>/path/to/os.iso</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>  </span><span># 或编辑虚拟机XML配置</span></div></div><div><div><div>7</div></div><div><span>  </span><span>&lt;interface</span><span> </span><span>type='network'&gt;</span></div></div><div><div><div>8</div></div><div><span>  </span><span>&lt;source</span><span> </span><span>network='default'/&gt;</span></div></div><div><div><div>9</div></div><div><span>&lt;/interface&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h5>4.端口转发（若需外部访问虚拟机）<a href="#4端口转发若需外部访问虚拟机"><span>#</span></a></h5><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 编辑NAT网络配置</span></div></div><div><div><div>2</div></div><div><span>virsh</span><span> </span><span>net-edit</span><span> </span><span>default</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 在&lt;forward&gt;段内添加端口映射（例如将宿主机8080端口转发到虚拟机80端口）：</span></div></div><div><div><div>5</div></div><div><span>&lt;forward</span><span> </span><span>mode='nat'&gt;</span></div></div><div><div><div>6</div></div><div><span>  </span><span>&lt;nat&gt;</span></div></div><div><div><div>7</div></div><div><span>    </span><span>&lt;port</span><span> </span><span>start='8080'</span><span> </span><span>end='8080'/&gt;</span></div></div><div><div><div>8</div></div><div><span>  </span><span>&lt;/nat&gt;</span></div></div><div><div><div>9</div></div><div><span>&lt;/forward&gt;</span></div></div><div><div><div>10</div></div><div><span>&lt;portforward</span><span> </span><span>proto='tcp'</span><span> </span><span>range='8080'&gt;</span></div></div><div><div><div>11</div></div><div><span>  </span><span>&lt;address</span><span> </span><span>proto='tcp'</span><span> </span><span>addr='192.168.122.100'</span><span> </span><span>port='80'/&gt;</span></div></div><div><div><div>12</div></div><div><span>&lt;/portforward&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h4>3.4.2 桥接模式（Bridge）<a href="#342-桥接模式bridge"><span>#</span></a></h4><section><h5>1.核心特点<a href="#1核心特点-1"><span>#</span></a></h5><ul>
<li>虚拟机<strong>直接连接物理网络</strong>，获取与宿主机同网段的独立IP。</li>
<li>宿主机、局域网设备、虚拟机<strong>可互相直接通信</strong>。</li>
<li><strong>需手动配置网桥</strong>（将物理网卡“桥接”到虚拟网桥）。</li>
</ul></section><section><h5>2.<code>配置方式一</code>：使用nmcli(推荐)<a href="#2配置方式一使用nmcli推荐"><span>#</span></a></h5><section><h6>2.1 创建网桥并绑定物理网卡<a href="#21-创建网桥并绑定物理网卡"><span>#</span></a></h6><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 创建桥接接口 br0，(物理网卡为eth0)</span></div></div><div><div><div>2</div></div><div><span>nmcli</span><span> </span><span>connection</span><span> </span><span>add</span><span> </span><span>type</span><span> </span><span>bridge</span><span> </span><span>autoconnect</span><span> </span><span>yes</span><span> </span><span>con-name</span><span> </span><span>br0</span><span> </span><span>ifname</span><span> </span><span>br0</span></div></div><div><div><div>3</div></div><div><span>nmcli</span><span> </span><span>connection</span><span> </span><span>modify</span><span> </span><span>br0</span><span> </span><span>ipv4.addresses</span><span> </span><span>192.168.1.10/24</span><span>  </span><span># 宿主机ip</span></div></div><div><div><div>4</div></div><div><span>nmcli</span><span> </span><span>connection</span><span> </span><span>modify</span><span> </span><span>br0</span><span> </span><span>ipv4.gateway</span><span> </span><span>192.168.1.1</span><span>  </span><span># 网关</span></div></div><div><div><div>5</div></div><div><span>nmcli</span><span> </span><span>connection</span><span> </span><span>modify</span><span> </span><span>br0</span><span> </span><span>ipv4.dns</span><span> </span><span>"8.8.8.8 114.114.114.114"</span><span>  </span><span># DNS</span></div></div><div><div><div>6</div></div><div><span>nmcli</span><span> </span><span>connection</span><span> </span><span>modify</span><span> </span><span>br0</span><span> </span><span>ipv4.method</span><span> </span><span>manual</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 将物理网卡加入创建的网桥</span></div></div><div><div><div>9</div></div><div><span>nmcli</span><span> </span><span>connection</span><span> </span><span>add</span><span> </span><span>type</span><span> </span><span>bridge-slave</span><span> </span><span>autoconnect</span><span> </span><span>yes</span><span> </span><span>con-name</span><span> </span><span>eth0-br0</span><span> </span><span>ifname</span><span> </span><span>eth0</span><span> </span><span>master</span><span> </span><span>br0</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span> </span><span># 禁用物理网卡IP</span></div></div><div><div><div>12</div></div><div><span>nmcli</span><span> </span><span>connection</span><span> </span><span>modify</span><span> </span><span>eth0-br0</span><span> </span><span>ipv4.method</span><span> </span><span>disabled</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h6>2.2 激活网桥并验证<a href="#22-激活网桥并验证"><span>#</span></a></h6><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>nmcli</span><span> </span><span>connection</span><span> </span><span>up</span><span> </span><span>eth0-br0</span></div></div><div><div><div>2</div></div><div><span>nmcli</span><span> </span><span>connection</span><span> </span><span>up</span><span> </span><span>br0</span></div></div><div><div><div>3</div></div><div><span>ip</span><span> </span><span>addr</span><span> </span><span>show</span><span> </span><span>br0</span><span>    </span><span># 确认br0持有IP</span></div></div><div><div><div>4</div></div><div><span>brctl</span><span> </span><span>show</span><span>          </span><span># 验证eth0已加入br0</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h6>2.3 创建虚拟机时指定桥接<a href="#23-创建虚拟机时指定桥接"><span>#</span></a></h6><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virt-install</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>  </span><span>--name</span><span> </span><span>bridge-vm</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>  </span><span>--network</span><span> </span><span>bridge=br0</span><span> </span><span>\ </span><span> </span><span># 关键：指定桥接网桥</span></div></div><div><div><div>4</div></div><div><span>  </span><span>--cdrom</span><span> </span><span>/path/to/os.iso</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 或编辑虚拟机XML</span></div></div><div><div><div>7</div></div><div><span>&lt;interface</span><span> </span><span>type='bridge'&gt;</span></div></div><div><div><div>8</div></div><div><span>  </span><span>&lt;source</span><span> </span><span>bridge='br0'/&gt;</span></div></div><div><div><div>9</div></div><div><span>&lt;/interface&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h5>3. <code>配置方式二</code>：使用 virsh 定义默认网络<a href="#3-配置方式二使用-virsh-定义默认网络"><span>#</span></a></h5><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virsh</span><span> </span><span>net-start</span><span> </span><span>default</span></div></div><div><div><div>2</div></div><div><span>virsh</span><span> </span><span>net-autostart</span><span> </span><span>default</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h4>3.4.3 仅主机模式（Host-Only）<a href="#343-仅主机模式host-only"><span>#</span></a></h4><section><h5>1.核心特点<a href="#1核心特点-2"><span>#</span></a></h5><ul>
<li>虚拟机<strong>仅能与宿主机通信</strong>，<strong>无法访问外网</strong>。</li>
<li>KVM默认<strong>不提供</strong>此模式，需<strong>手动创建隔离网络</strong>（无NAT转发）。</li>
<li>适用于<strong>完全隔离的测试环境</strong>（如安全实验、内部集群）。</li>
</ul></section><section><h5>2.配置步骤<a href="#2配置步骤-1"><span>#</span></a></h5><section><h6>2.1 创建隔离网络配置文件<a href="#21-创建隔离网络配置文件"><span>#</span></a></h6><p>新建<code>/etc/libvirt/qemu/networks/host-only.xml</code>：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>network</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>&lt;</span><span>name</span><span>&gt;host-only&lt;/</span><span>name</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>&lt;</span><span>bridge</span><span> </span><span>name</span><span>=</span><span>'virbr1'</span><span>/&gt;  </span><span>&lt;!-- 自定义网桥名 --&gt;</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>&lt;</span><span>ip</span><span> </span><span>address</span><span>=</span><span>'192.168.100.1'</span><span> </span><span>netmask</span><span>=</span><span>'255.255.255.0'</span><span>&gt;  </span><span>&lt;!-- 宿主机IP --&gt;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>&lt;</span><span>dhcp</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>      </span></span><span>&lt;</span><span>range</span><span> </span><span>start</span><span>=</span><span>'192.168.100.2'</span><span> </span><span>end</span><span>=</span><span>'192.168.100.254'</span><span>/&gt;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>&lt;/</span><span>dhcp</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>&lt;/</span><span>ip</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span>&lt;/</span><span>network</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h6>2.2 定义并启动隔离网络<a href="#22-定义并启动隔离网络"><span>#</span></a></h6><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virsh</span><span> </span><span>net-define</span><span> </span><span>/etc/libvirt/qemu/networks/host-only.xml</span></div></div><div><div><div>2</div></div><div><span>virsh</span><span> </span><span>net-start</span><span> </span><span>host-only</span></div></div><div><div><div>3</div></div><div><span>virsh</span><span> </span><span>net-autostart</span><span> </span><span>host-only</span><span>  </span><span># 设置开机自启</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h6>2.3 验证隔离网络<a href="#23-验证隔离网络"><span>#</span></a></h6><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virsh</span><span> </span><span>net-dumpxml</span><span> </span><span>host-only</span><span>  </span><span># 检查配置</span></div></div><div><div><div>2</div></div><div><span>ip</span><span> </span><span>addr</span><span> </span><span>show</span><span> </span><span>virbr1</span><span>          </span><span># 确认网桥IP为192.168.100.1</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h6>2.4 创建虚拟机时指定隔离网络<a href="#24-创建虚拟机时指定隔离网络"><span>#</span></a></h6><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virt-install</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>  </span><span>--name</span><span> </span><span>hostonly-vm</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>  </span><span>--network</span><span> </span><span>network=host-only</span><span> </span><span>\ </span><span> </span><span># 使用自定义隔离网络</span></div></div><div><div><div>4</div></div><div><span>  </span><span>--cdrom</span><span> </span><span>/path/to/os.iso</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section></section></section></section></section><section><h2>三、 虚拟机管理<a href="#三-虚拟机管理"><span>#</span></a></h2><section><h3>3.1 创建并安装虚拟机<a href="#31-创建并安装虚拟机"><span>#</span></a></h3><section><h4>3.1.1 创建存放目录、镜像<a href="#311-创建存放目录镜像"><span>#</span></a></h4><p>创建 <code>kvm虚拟机</code>的存放 目录，同时创建<code>存放虚拟机磁盘和镜像文件</code>的目录</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/kvm/{vm,iso}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>将需要安装的操作系统镜像文件存放在<code>iso</code>目录中</p></section><section><h4>3.1.2 使用virt-install创建虚拟机<a href="#312-使用virt-install创建虚拟机"><span>#</span></a></h4><section><h5>3.1.2.1 <code>安装示例参数</code><a href="#3121-安装示例参数"><span>#</span></a></h5><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># ===== 核心标识与资源分配（必填项）=====</span></div></div><div><div><div>2</div></div><div><span>virt-install</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>  </span><span>--name=prod-centos7</span><span> </span><span>\ </span><span>         </span><span># 【必填】虚拟机唯一名称（仅支持字母/数字/_-.:+），命名冲突将直接失败</span></div></div><div><div><div>4</div></div><div><span>  </span><span>--memory</span><span>=</span><span>8192</span><span> </span><span>\ </span><span>               </span><span># 【必填】内存大小（单位MB），此处分配8GB；必须 ≤ 宿主机剩余物理内存</span></div></div><div><div><div>5</div></div><div><span>  </span><span>--vcpus</span><span>=</span><span>4,</span><span>sockets</span><span>=</span><span>2,</span><span>cores</span><span>=</span><span>2,</span><span>threads</span><span>=</span><span>1</span><span> </span><span>\ </span><span> </span><span># 虚拟CPU拓扑（4核=2路×2核×1线程），影响NUMA性能；简单写法`--vcpus=4`会损失30%+性能</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># ===== CPU深度优化（生产环境推荐）=====</span></div></div><div><div><div>8</div></div><div><span>  </span><span>--cpu</span><span>=</span><span>host-passthrough,cache.</span><span>mode</span><span>=</span><span>passthrough</span><span> </span><span>\ </span><span> </span><span># 【性能关键】CPU特性透传：host-passthrough最大化性能（跨主机迁移受限）；cache.mode=passthrough透传CPU缓存特性</span></div></div><div><div><div>9</div></div><div><span>  </span><span>--os-type</span><span>=</span><span>linux</span><span> </span><span>\ </span><span>             </span><span># 系统大类（linux/windows/unix），辅助自动优化；若已指定--os-variant可省略</span></div></div><div><div><div>10</div></div><div><span>  </span><span>--os-variant</span><span>=</span><span>centos7.0</span><span> </span><span>\ </span><span>      </span><span># 【必须精确匹配】通过`osinfo-query os`确认（如centos7.0/win10），错误设置导致性能下降50%+</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># ===== 存储配置（必填项）=====</span></div></div><div><div><div>13</div></div><div><span>  </span><span>--disk</span><span> </span><span>path=/var/lib/libvirt/images/prod-centos7.qcow2,size=100,format=qcow2,bus=virtio,cache=none,discard=unmap</span><span> </span><span>\ </span><span> </span><span># 【必填】磁盘核心配置：</span></div></div><div><div><div>14</div></div><div><span>                                 </span><span>#   path=磁盘路径（自动创建）</span></div></div><div><div><div>15</div></div><div><span>                                 </span><span>#   size=100（单位GB，新建磁盘时必填）</span></div></div><div><div><div>16</div></div><div><span>                                 </span><span>#   format=qcow2（推荐格式，支持快照/稀疏分配）</span></div></div><div><div><div>17</div></div><div><span>                                 </span><span>#   bus=virtio（必选高性能总线，比IDE快30%+）</span></div></div><div><div><div>18</div></div><div><span>                                 </span><span>#   cache=none（SSD直通模式，避免双重缓存）</span></div></div><div><div><div>19</div></div><div><span>                                 </span><span>#   discard=unmap（启用TRIM，SSD寿命优化）</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span># ===== 网络与安全（生产环境关键）=====</span></div></div><div><div><div>22</div></div><div><span>  </span><span>--network</span><span> </span><span>bridge=br0,model=virtio,mac=52:54:00:12:34:56</span><span> </span><span>\ </span><span> </span><span># 网络配置：</span></div></div><div><div><div>23</div></div><div><span>                                 </span><span>#   bridge=br0（需提前用brctl创建网桥）</span></div></div><div><div><div>24</div></div><div><span>                                 </span><span>#   model=virtio（必选高性能网卡，比e1000快50%+）</span></div></div><div><div><div>25</div></div><div><span>                                 </span><span>#   mac=...（固定MAC地址，避免DHCP冲突）</span></div></div><div><div><div>26</div></div><div><span>  </span><span>--graphics</span><span> </span><span>none</span><span> </span><span>\ </span><span>             </span><span># 【文本安装必备】禁用图形界面（VNC/SPICE），否则需配合--console</span></div></div><div><div><div>27</div></div><div><span>  </span><span>--console</span><span> </span><span>pty,target_type=serial</span><span> </span><span>\ </span><span> </span><span># 【必须与--graphics none联动】启用串口控制台，否则安装过程无输出</span></div></div><div><div><div>28</div></div><div><span>  </span><span>--extra-args</span><span>=</span><span>"console=ttyS0,115200n8 net.ifnames=0 biosdevname=0"</span><span> </span><span>\ </span><span> </span><span># 内核启动参数：</span></div></div><div><div><div>29</div></div><div><span>                                 </span><span>#   console=ttyS0（指定串口终端，文本安装核心）</span></div></div><div><div><div>30</div></div><div><span>                                 </span><span>#   net.ifnames=0 biosdevname=0（禁用新式网卡命名，兼容旧脚本）</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span># ===== 安装源与自动化（必填项）=====</span></div></div><div><div><div>33</div></div><div><span>  </span><span>--location</span><span>=</span><span>http://mirror.centos.org/centos/7/os/x86_64/</span><span> </span><span>\ </span><span> </span><span># 【必填二选一】网络安装源（HTTP/FTP/NFS），ISO路径用--cdrom替代</span></div></div><div><div><div>34</div></div><div><span>  </span><span>--initrd-inject</span><span>=</span><span>/root/ks.cfg</span><span> </span><span>\ </span><span># 注入Kickstart文件（实现无人值守安装），路径必须存在且可读</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span># ===== 高级控制与可靠性（生产环境推荐）=====</span></div></div><div><div><div>37</div></div><div><span>  </span><span>--autostart</span><span> </span><span>\ </span><span>                 </span><span># 开机自启虚拟机（等效virsh autostart）</span></div></div><div><div><div>38</div></div><div><span>  </span><span>--noautoconsole</span><span> </span><span>\ </span><span>             </span><span># 创建后不自动连接控制台（避免阻塞脚本）</span></div></div><div><div><div>39</div></div><div><span>  </span><span>--check</span><span> </span><span>path_in_use=off</span><span> </span><span>\ </span><span>     </span><span># 禁用路径占用检查（当磁盘路径存在但未被使用时绕过报错）</span></div></div><div><div><div>40</div></div><div><span>  </span><span>--boot</span><span> </span><span>menu=on,useserial=on</span><span> </span><span>\ </span><span> </span><span># 启动菜单配置：menu=on（显示启动菜单），useserial=on（串口作为主控制台）</span></div></div><div><div><div>41</div></div><div><span>  </span><span>--memtune</span><span> </span><span>hard_limit=8704000,soft_limit=</span><span>8388608</span><span> </span><span>\ </span><span> </span><span># 内存管控（单位KB）：</span></div></div><div><div><div>42</div></div><div><span>                                 </span><span>#   hard_limit=8704000（绝对上限，超限触发OOM Kill）</span></div></div><div><div><div>43</div></div><div><span>                                 </span><span>#   soft_limit=8388608（弹性上限，超限时触发内存回收）</span></div></div><div><div><div>44</div></div><div><span>  </span><span>--launchSecurity</span><span> </span><span>sev,policy=</span><span>0x07</span><span> </span><span>\ </span><span> </span><span># 【硬件加密】AMD SEV-ES加密（仅限EPYC Rome+）：</span></div></div><div><div><div>45</div></div><div><span>                                 </span><span>#   policy=0x07（策略位：调试禁用+密钥隔离+平台绑定）</span></div></div><div><div><div>46</div></div><div><span>                                 </span><span>#   ⚠️ 需禁用安全引导(--boot secureBoot=off)且不支持PCI直通</span></div></div><div><div><div>47</div></div><div><span>  </span><span>--metadata</span><span> </span><span>title="Production VM",description="CentOS 7 Web Server"</span><span>  </span><span># 虚拟机元数据（便于管理识别）</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><hr /></section><section><h5>3.1.2.2 安装centos 7虚拟机<a href="#3122-安装centos-7虚拟机"><span>#</span></a></h5><p>使用 virt-install 命令行工具创建一台 CentOS 7 虚拟机：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virt-install</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>  </span><span>--name=centos7</span><span> </span><span>\ </span><span>         </span><span># 【必填】虚拟机唯一名称（避免与现有VM冲突）</span></div></div><div><div><div>3</div></div><div><span>  </span><span>--memory</span><span>=</span><span>2048</span><span> </span><span>\ </span><span>              </span><span># 分配2048MB内存（CentOS 7图形化安装最低要求）</span></div></div><div><div><div>4</div></div><div><span>  </span><span>--vcpus</span><span>=</span><span>2</span><span> </span><span>\ </span><span>                  </span><span># 分配2个虚拟CPU核心</span></div></div><div><div><div>5</div></div><div><span>  </span><span>--os-type</span><span>=</span><span>linux</span><span> </span><span>\ </span><span>            </span><span># 系统类型（辅助自动优化驱动）</span></div></div><div><div><div>6</div></div><div><span>  </span><span>--os-variant</span><span>=</span><span>centos7.0</span><span> </span><span>\ </span><span>     </span><span># 【关键】必须精确匹配（通过`osinfo-query os`确认）</span></div></div><div><div><div>7</div></div><div><span>  </span><span>--disk</span><span> </span><span>path=/kvm/vm/centos7.qcow2,size=20,format=qcow2,bus=virtio</span><span> </span><span>\ </span><span> </span><span># 【核心】磁盘配置：路径=/kvm/vm/（按您要求）、20GB空间、qcow2格式、virtio高性能总线</span></div></div><div><div><div>8</div></div><div><span>  </span><span>--cdrom</span><span>=</span><span>/kvm/iso/CentOS-7-x86_64-Minimal-2009.iso</span><span> </span><span>\ </span><span> </span><span># 【核心】ISO路径=/kvm/iso/（请确认文件名与实际一致）</span></div></div><div><div><div>9</div></div><div><span>  </span><span>--network</span><span> </span><span>network=default</span><span> </span><span>\ </span><span>  </span><span># 【核心】使用libvirt默认NAT网络（自动分配192.168.122.0/24网段IP）</span></div></div><div><div><div>10</div></div><div><span>  </span><span>--graphics</span><span> </span><span>vnc,listen=0.0.0.0,port=5901,password=sunline</span><span> </span><span>\ </span><span> </span><span># 【核心】VNC配置：开放所有IP访问(0.0.0.0)、固定端口5901（用于远程连接）、密码sunline</span></div></div><div><div><div>11</div></div><div><span>  </span><span>--noautoconsole</span><span> </span><span>\ </span><span>            </span><span># 创建后不自动连接控制台（适合后台执行）</span></div></div><div><div><div>12</div></div><div><span>  </span><span>--autostart</span><span>                   </span><span># 开机自启虚拟机（等效virsh autostart）</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /><p>通过<code>网络安装（HTTP/NFS/FTP）</code></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virt-install</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>  </span><span>--name=centos7-netinstall</span><span> </span><span>\ </span><span>         </span><span># 虚拟机名称</span></div></div><div><div><div>3</div></div><div><span>  </span><span>--memory</span><span>=</span><span>2048</span><span> </span><span>\ </span><span>                    </span><span># 2048MB内存</span></div></div><div><div><div>4</div></div><div><span>  </span><span>--vcpus</span><span>=</span><span>2</span><span> </span><span>\ </span><span>                        </span><span># 2个虚拟CPU</span></div></div><div><div><div>5</div></div><div><span>  </span><span>--os-type</span><span>=</span><span>linux</span><span> </span><span>\</span></div></div><div><div><div>6</div></div><div><span>  </span><span>--os-variant=centos7.0</span><span> </span><span>\</span></div></div><div><div><div>7</div></div><div><span>  </span><span>--disk</span><span> </span><span>path=/kvm/vm/centos7-net.qcow2,size=20,format=qcow2,bus=virtio</span><span> </span><span>\ </span><span> </span><span># 磁盘存入/kvm/vm/</span></div></div><div><div><div>8</div></div><div><span>  </span><span>--network</span><span> </span><span>network=default</span><span> </span><span>\ </span><span>        </span><span># 默认NAT网络</span></div></div><div><div><div>9</div></div><div><span>  </span><span>--graphics</span><span> </span><span>vnc,listen=0.0.0.0,port=</span><span>-1</span><span> </span><span>\ </span><span> </span><span># 自动选择一个可用的端口（默认 VNC 端口为 5900 + 显示号）</span></div></div><div><div><div>10</div></div><div><span>  </span><span>--location</span><span>=</span><span>http://mirror.centos.org/centos/7/os/x86_64/</span><span> </span><span>\ </span><span> </span><span># 【核心】网络安装源（HTTP示例）</span></div></div><div><div><div>11</div></div><div><span>  </span><span># nfs:192.168.1.100:/centos7。需提前在NFS服务器导出目录（/etc/exports）</span></div></div><div><div><div>12</div></div><div><span>  </span><span># ftp://192.168.1.100/centos7。需验证FTP匿名可读（anon_root配置）</span></div></div><div><div><div>13</div></div><div><span>  </span><span>--extra-args</span><span>=</span><span>"ip=dhcp ks=http://192.168.1.100/kickstart/centos7.cfg"</span><span> </span><span>\ </span><span> </span><span># 【核心】内核参数：DHCP获取IP + 指定Kickstart文件</span></div></div><div><div><div>14</div></div><div><span>  </span><span>--noautoconsole</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /><p>通过<code>导入现有磁盘镜像（跳过安装）</code></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virt-install</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>  </span><span>--name=centos7-imported</span><span> </span><span>\ </span><span>          </span><span># 虚拟机名称</span></div></div><div><div><div>3</div></div><div><span>  </span><span>--memory</span><span>=</span><span>2048</span><span> </span><span>\</span></div></div><div><div><div>4</div></div><div><span>  </span><span>--vcpus=2</span><span> </span><span>\</span></div></div><div><div><div>5</div></div><div><span>  </span><span>--os-type=linux</span><span> </span><span>\</span></div></div><div><div><div>6</div></div><div><span>  </span><span>--os-variant=centos7.0</span><span> </span><span>\</span></div></div><div><div><div>7</div></div><div><span>  </span><span>--import</span><span> </span><span>\ </span><span>                         </span><span># 【核心】跳过安装，直接导入磁盘</span></div></div><div><div><div>8</div></div><div><span>  </span><span>--disk</span><span> </span><span>path=/kvm/vm/existing_disk.qcow2,format=qcow2,bus=virtio</span><span> </span><span>\ </span><span> </span><span># 【核心】指定已有磁盘路径</span></div></div><div><div><div>9</div></div><div><span>  </span><span>--network</span><span> </span><span>network=default</span><span> </span><span>\ </span><span>        </span><span># 默认NAT网络</span></div></div><div><div><div>10</div></div><div><span>  </span><span>--graphics</span><span> </span><span>vnc,listen=0.0.0.0,port=</span><span>5903</span><span> </span><span>\ </span><span> </span><span># VNC端口5903</span></div></div><div><div><div>11</div></div><div><span>  </span><span>--noautoconsole</span><span> </span><span>\</span></div></div><div><div><div>12</div></div><div><span>  </span><span>--autostart</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>磁盘文件要求**</p><ul>
<li><strong>必须提前存在</strong>于 <code>/kvm/vm/</code> 目录（示例中为 <code>existing_disk.qcow2</code>）。</li>
<li>格式必须匹配：
<ul>
<li><code>format=qcow2</code>（推荐）：需是<strong>完整系统镜像</strong>（含<code>/boot</code>分区）。</li>
<li>若为原始磁盘（如<code>/dev/sdb</code>）：<code>format=raw</code>。</li>
</ul>
</li>
<li><strong>禁止使用安装介质</strong>：移除 <code>--cdrom</code> 和 <code>--location</code> 参数。</li>
</ul><hr /></section></section><section><h4>3.1.3 虚拟机信息查看<a href="#313-虚拟机信息查看"><span>#</span></a></h4><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 查看正在运行中的kvm虚拟机列表</span></div></div><div><div><div>2</div></div><div><span>virsh</span><span> </span><span>list</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 查看所有的虚拟机列表，包含挂掉的</span></div></div><div><div><div>5</div></div><div><span>virsh</span><span> </span><span>list</span><span> </span><span>--all</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 查看虚拟机网卡信息</span></div></div><div><div><div>8</div></div><div><span>virsh</span><span> </span><span>domifaddr</span><span> </span><span>centos7</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 查看虚拟机VNC远程桌面连接地址/端口，:0 代表 VNC 端口偏移：</span></div></div><div><div><div>11</div></div><div><span># VNC 基础端口是 5900，:0 → 实际端口 5900；:1=5901；:5=5905</span></div></div><div><div><div>12</div></div><div><span>virsh</span><span> </span><span>vncdisplay</span><span> </span><span>centos7</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span># 查看虚拟机完整硬件配置</span></div></div><div><div><div>15</div></div><div><span>virsh</span><span> </span><span>dumpxml</span><span> </span><span>centos7</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span># 修改虚拟机xml配置</span></div></div><div><div><div>18</div></div><div><span>virsh</span><span> </span><span>edit</span><span> </span><span>centos7</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><section><h5>3.1.3.1 virsh常用命令<a href="#3131-virsh常用命令"><span>#</span></a></h5><p>virsh 是 libvirt 提供的核心命令行管理工具：</p>

<table><thead><tr><th>命令</th><th>功能简述</th><th>操作示例</th></tr></thead><tbody><tr><td><code>autostart</code></td><td>设置虚拟机随宿主机开机自动启动</td><td><code>virsh autostart &lt;虚拟机名称&gt;</code></td></tr><tr><td><code>autostart --disable</code></td><td>取消虚拟机随宿主机开机自动启动</td><td><code>virsh autostart --disable &lt;虚拟机名称&gt;</code></td></tr><tr><td><code>connect</code></td><td>重新连接到 Hypervisor（虚拟机管理器）</td><td><code>virsh connect &lt;连接URI&gt;</code></td></tr><tr><td><code>console</code></td><td>连接到虚拟机的串口控制台会话</td><td><code>virsh console &lt;虚拟机名称&gt;</code></td></tr><tr><td><code>create</code></td><td>从 XML 文件创建并立即启动虚拟机</td><td><code>virsh create &lt;XML文件路径&gt;</code></td></tr><tr><td><code>start</code></td><td>启动一个已定义但处于非活跃状态的虚拟机</td><td><code>virsh start &lt;虚拟机名称&gt;</code></td></tr><tr><td><code>destroy</code></td><td>强制停止（销毁）一个虚拟机</td><td><code>virsh destroy &lt;虚拟机名称&gt;</code></td></tr><tr><td><code>define</code></td><td>从 XML 文件定义一个虚拟机（不启动）</td><td><code>virsh define &lt;XML文件路径&gt;</code></td></tr><tr><td><code>domid</code></td><td>将虚拟机名称或 UUID 转换为内部 ID</td><td><code>virsh domid &lt;虚拟机名称或UUID&gt;</code></td></tr><tr><td><code>domuuid</code></td><td>将虚拟机名称或 ID 转换为 UUID</td><td><code>virsh domuuid &lt;虚拟机名称或ID&gt;</code></td></tr><tr><td><code>dominfo</code></td><td>查看虚拟机的详细运行信息</td><td><code>virsh dominfo &lt;虚拟机名称&gt;</code></td></tr><tr><td><code>domstate</code></td><td>查看虚拟机当前的运行状态</td><td><code>virsh domstate &lt;虚拟机名称&gt;</code></td></tr><tr><td><code>domblkstat</code></td><td>获取虚拟机磁盘块设备的统计状态</td><td><code>virsh domblkstat &lt;虚拟机名称&gt; &lt;磁盘设备&gt;</code></td></tr><tr><td><code>domifstat</code></td><td>获取虚拟机网络接口的统计状态</td><td><code>virsh domifstat &lt;虚拟机名称&gt; &lt;网卡设备&gt;</code></td></tr><tr><td><code>domrename</code></td><td>修改虚拟机的名称</td><td><code>virsh domrename &lt;原虚拟机名称&gt; &lt;新虚拟机名称&gt;</code></td></tr><tr><td><code>dumpxml</code></td><td>输出虚拟机的 XML 配置信息</td><td><code>virsh dumpxml &lt;虚拟机名称&gt;</code></td></tr><tr><td><code>edit</code></td><td>编辑虚拟机的 XML 配置文件</td><td><code>virsh edit &lt;虚拟机名称&gt;</code></td></tr><tr><td><code>list</code></td><td>列出当前所有的虚拟机</td><td><code>virsh list --all</code></td></tr><tr><td><code>migrate</code></td><td>将虚拟机在线迁移到另一台主机</td><td><code>virsh migrate &lt;虚拟机名称&gt; &lt;目标主机URI&gt;</code></td></tr><tr><td><code>quit</code></td><td>退出 virsh 非交互式终端</td><td><code>quit</code></td></tr><tr><td><code>reboot</code></td><td>重新启动指定的虚拟机</td><td><code>virsh reboot &lt;虚拟机名称&gt;</code></td></tr><tr><td><code>resume</code></td><td>恢复被挂起（suspend）的虚拟机</td><td><code>virsh resume &lt;虚拟机名称&gt;</code></td></tr><tr><td><code>save</code></td><td>保存虚拟机当前状态到文件并关闭它</td><td><code>virsh save &lt;虚拟机名称&gt; &lt;保存文件路径&gt;</code></td></tr><tr><td><code>dump</code></td><td>将虚拟机的内核状态转储到文件以便分析</td><td><code>virsh dump &lt;虚拟机名称&gt; &lt;转储文件路径&gt;</code></td></tr><tr><td><code>shutdown</code></td><td>优雅地关闭虚拟机（发送关机信号）</td><td><code>virsh shutdown &lt;虚拟机名称&gt;</code></td></tr><tr><td><code>setmem</code></td><td>动态改变虚拟机的内存分配大小</td><td><code>virsh setmem &lt;虚拟机名称&gt; &lt;内存大小&gt;</code></td></tr><tr><td><code>setmaxmem</code></td><td>改变虚拟机允许使用的最大内存限制</td><td><code>virsh setmaxmem &lt;虚拟机名称&gt; &lt;内存大小&gt;</code></td></tr><tr><td><code>suspend</code></td><td>挂起（暂停）虚拟机的运行</td><td><code>virsh suspend &lt;虚拟机名称&gt;</code></td></tr><tr><td><code>undefine</code></td><td>删除虚拟机配置（不删除磁盘数据）</td><td><code>virsh undefine &lt;虚拟机名称&gt;</code></td></tr><tr><td><code>vcpuinfo</code></td><td>查看虚拟机的 vCPU 运行信息</td><td><code>virsh vcpuinfo &lt;虚拟机名称&gt;</code></td></tr><tr><td><code>version</code></td><td>显示 virsh 工具的版本号</td><td><code>virsh version</code></td></tr></tbody></table><hr /></section></section><section><h4>3.1.4 连接虚拟机<a href="#314-连接虚拟机"><span>#</span></a></h4><p>在日常的 KVM 运维中，通常的优先级是：<strong>SSH &gt; virsh console &gt; VNC</strong>。</p><ul>
<li>只要虚拟机网络正常，首选 SSH（最安全、最流畅）。</li>
<li>如果网络断了或者系统起不来，用 <code>virsh console</code> 救急。</li>
<li>只有当你真的需要操作图形桌面时，才去配置和使用 VNC。</li>
</ul><section><h5>3.1.4.1 终端连接<a href="#3141-终端连接"><span>#</span></a></h5><p>也就是ssh连接，走ssh连接</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ssh</span><span> </span><span>root@192.168.122.34</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section><section><h5>3.1.4.2 控制台连接<a href="#3142-控制台连接"><span>#</span></a></h5><p>是一种通过虚拟串行端口（Serial Console）进行命令行管理的方式</p><p>要通过 <code>virsh console</code> 连接 KVM 虚拟机，<strong>必须预先在虚拟机内部配置串口控制台支持</strong>。默认情况下，新创建的虚拟机无法直接使用 <code>virsh console</code> 连接（会卡在空白界面或无响应）。核心步骤分为 <strong>虚拟机内部配置</strong> 和 <strong>宿主机连接操作</strong> 两部分，<strong>重点在于虚拟机需启用串口终端服务并修改内核参数</strong>。</p><section><h6>1.虚拟机内部配置<a href="#1虚拟机内部配置"><span>#</span></a></h6><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># redhat类</span></div></div><div><div><div>2</div></div><div><span># 添加串口控制台参数（关键！）</span></div></div><div><div><div>3</div></div><div><span># console=ttyS0,115200n8 表示 将系统日志和登录提示输出到串口 ttyS0，波特率 115200，8 位数据位，无校验位</span></div></div><div><div><div>4</div></div><div><span>grubby</span><span> </span><span>--update-kernel=ALL</span><span> </span><span>--args=</span><span>"console=ttyS0,115200n8"</span></div></div><div><div><div>5</div></div><div><span># 重启生效</span></div></div><div><div><div>6</div></div><div><span>reboot</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># debian类</span></div></div><div><div><div>9</div></div><div><span># 编辑 GRUB 配置</span></div></div><div><div><div>10</div></div><div><span>sudo</span><span> </span><span>nano</span><span> </span><span>/etc/default/grub</span></div></div><div><div><div>11</div></div><div><span># 修改以下两行（取消注释并添加参数）</span></div></div><div><div><div>12</div></div><div><span>GRUB_CMDLINE_LINUX_DEFAULT</span><span>=</span><span>"console=ttyS0,115200n8"</span></div></div><div><div><div>13</div></div><div><span># GRUB_TERMINAL=serial 强制 GRUB 引导菜单也通过串口输出，避免卡在启动阶段</span></div></div><div><div><div>14</div></div><div><span>GRUB_TERMINAL</span><span>=</span><span>"serial"</span></div></div><div><div><div>15</div></div><div><span>GRUB_SERIAL_COMMAND</span><span>=</span><span>"serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"</span></div></div><div><div><div>16</div></div><div><span># 更新 GRUB 并重启</span></div></div><div><div><div>17</div></div><div><span>sudo</span><span> </span><span>update-grub</span></div></div><div><div><div>18</div></div><div><span>sudo</span><span> </span><span>reboot</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h6>2.启用串口登录服务<a href="#2启用串口登录服务"><span>#</span></a></h6><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># redhat类</span></div></div><div><div><div>2</div></div><div><span># 启用串口 getty 服务（自动创建配置）</span></div></div><div><div><div>3</div></div><div><span>sudo</span><span> </span><span>systemctl</span><span> </span><span>enable</span><span> </span><span>serial-getty@ttyS0.service</span></div></div><div><div><div>4</div></div><div><span>sudo</span><span> </span><span>systemctl</span><span> </span><span>start</span><span> </span><span>serial-getty@ttyS0.service</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># debian类</span></div></div><div><div><div>7</div></div><div><span># 创建 systemd 覆盖配置</span></div></div><div><div><div>8</div></div><div><span>sudo</span><span> </span><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/etc/systemd/system/serial-getty@ttyS0.service.d/</span></div></div><div><div><div>9</div></div><div><span>sudo</span><span> </span><span>nano</span><span> </span><span>/etc/systemd/system/serial-getty@ttyS0.service.d/override.conf</span></div></div><div><div><div>10</div></div><div><span># 添加以下内容</span></div></div><div><div><div>11</div></div><div><span>[Service]</span></div></div><div><div><div>12</div></div><div><span>ExecStart</span><span>=</span></div></div><div><div><div>13</div></div><div><span>ExecStart</span><span>=</span><span>-/sbin/agetty</span><span> </span><span>--keep-baud</span><span> </span><span>115200,38400,9600</span><span> </span><span>%I</span><span> </span><span>$TERM</span></div></div><div><div><div>14</div></div><div><span># 启用服务</span></div></div><div><div><div>15</div></div><div><span>sudo</span><span> </span><span>systemctl</span><span> </span><span>enable</span><span> </span><span>serial-getty@ttyS0.service</span></div></div><div><div><div>16</div></div><div><span>sudo</span><span> </span><span>systemctl</span><span> </span><span>start</span><span> </span><span>serial-getty@ttyS0.service</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h6>3.宿主机连接操作<a href="#3宿主机连接操作"><span>#</span></a></h6><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 验证虚拟机 XML 配置</span></div></div><div><div><div>2</div></div><div><span>virsh</span><span> </span><span>dumpxml</span><span> </span><span>&lt;虚拟机名称&gt;</span><span> | </span><span>grep</span><span> </span><span>-A5</span><span> </span><span>"console\|serial"</span></div></div><div><div><div>3</div></div><div><span># 必须包含以下内容</span></div></div><div><div><div>4</div></div><div><span>&lt;serial</span><span> </span><span>type='pty'&gt;</span></div></div><div><div><div>5</div></div><div><span>  </span><span>&lt;target</span><span> </span><span>port='0'/&gt;</span></div></div><div><div><div>6</div></div><div><span>&lt;/serial&gt;</span></div></div><div><div><div>7</div></div><div><span>&lt;console</span><span> </span><span>type='pty'&gt;</span></div></div><div><div><div>8</div></div><div><span>  </span><span>&lt;target</span><span> </span><span>type='serial'</span><span> </span><span>port='0'/&gt;</span></div></div><div><div><div>9</div></div><div><span>&lt;/console&gt;</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span># 连接</span></div></div><div><div><div>12</div></div><div><span>virsh</span><span> </span><span>console</span><span> </span><span>&lt;虚拟机名称&gt;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span># 退出</span></div></div><div><div><div>15</div></div><div><span>按</span><span> </span><span>Ctrl</span><span> </span><span>+</span><span> </span><span>]</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><hr /></section></section><section><h5>3.1.4.3 VNC连接<a href="#3143-vnc连接"><span>#</span></a></h5><section><h6>1.配置VNC<a href="#1配置vnc"><span>#</span></a></h6><p>在创建 KVM 虚拟机时，需要指定使用 VNC 作为图形显示方式，并允许外部访问。使用 <code>virt-install</code> 命令时，可以添加如下参数：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 监听所有网络，设置密码，不指定端口系统默认从5900开始自动分配</span></div></div><div><div><div>2</div></div><div><span>--graphics</span><span> </span><span>vnc,listen=0.0.0.0,password=mypassword</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h6>2.获取虚拟机VNC端口<a href="#2获取虚拟机vnc端口"><span>#</span></a></h6><p>虚拟机启动后，需要确认其实际监听的 VNC 端口号。可以使用以下命令查看：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virsh</span><span> </span><span>vncdisplay</span><span> </span><span>&lt;虚拟机名称&gt;</span></div></div><div><div><div>2</div></div><div><span># 或</span></div></div><div><div><div>3</div></div><div><span>virsh</span><span> </span><span>domdisplay</span><span> </span><span>&lt;虚拟机名称&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>如果输出为 <code>:0</code>，则实际端口为 <code>5900</code>。</li>
<li>如果输出为 <code>:13</code>，则实际端口为 <code>5913</code>（即 5900 + 13）</li>
</ul></section><section><h6>3.VNC客户端连接<a href="#3vnc客户端连接"><span>#</span></a></h6><p>在本地电脑（如 Windows 或 Mac）上安装 VNC 客户端软件（如 TigerVNC、RealVNC Viewer 或 TightVNC），然后输入连接地址：
<strong><code>宿主机IP地址:VNC端口</code></strong> （例如：<code>192.168.0.160:5913</code>）。
输入正确的地址和端口后，即可看到虚拟机的图形安装界面或操作桌面。</p></section><section><h6>4.通过浏览器访问 (noVNC)<a href="#4通过浏览器访问-novnc"><span>#</span></a></h6><p>如果不想安装本地 VNC 客户端，可以通过浏览器直接访问。这需要在宿主机上使用 <code>websockify</code> 将 VNC 端口映射到 HTTP 端口：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>websockify</span><span> </span><span>-D</span><span> </span><span>--web=/usr/share/novnc/</span><span> </span><span>6080</span><span> </span><span>0.0.0.0:&lt;VNC端口&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>映射完成后，在浏览器中输入 <code>http://宿主机IP:6080/vnc.html</code> 即可直接登录并操作 KVM 虚拟机界面。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 安装noVNC及依赖</span></div></div><div><div><div>2</div></div><div><span># 安装 git 和 python3</span></div></div><div><div><div>3</div></div><div><span>apt</span><span> </span><span>install</span><span> </span><span>-y</span><span> </span><span>git</span><span> </span><span>python3</span><span> </span><span>python3-websockify</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 下载 noVNC 源码</span></div></div><div><div><div>6</div></div><div><span>cd</span><span> </span><span>/opt</span></div></div><div><div><div>7</div></div><div><span>git</span><span> </span><span>clone</span><span> </span><span>https://github.com/novnc/noVNC.git</span></div></div><div><div><div>8</div></div><div><span>cd</span><span> </span><span>noVNC</span></div></div><div><div><div>9</div></div><div><span>git</span><span> </span><span>clone</span><span> </span><span>https://github.com/novnc/websockify.git</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section></section></section><section><h3>3.2 迁移虚拟机磁盘<a href="#32-迁移虚拟机磁盘"><span>#</span></a></h3><p><code>场景</code>：现存在一个kvm虚拟机centos7，他的磁盘文件存放在<code>/kvm/vm/</code>中，但现在宿主机的vda磁盘空间不够，现添加一块磁盘，需要将kvm虚拟机迁移到这块新的磁盘中</p><section><h4>3.2.1 关闭虚拟机<a href="#321-关闭虚拟机"><span>#</span></a></h4><p>在迁移磁盘之前，必须确保虚拟机已完全关机，防止数据丢失</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 发送关机信号</span></div></div><div><div><div>2</div></div><div><span>virsh</span><span> </span><span>shutdown</span><span> </span><span>centos7</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 确认虚拟机状态为 "shut off"</span></div></div><div><div><div>5</div></div><div><span>virsh</span><span> </span><span>list</span><span> </span><span>--all</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>3.2.2 格式化并挂载磁盘<a href="#322-格式化并挂载磁盘"><span>#</span></a></h4><p>新加的磁盘在系统中被识别为 <code>/dev/sdb</code>（使用 <code>lsblk</code> 或 <code>fdisk -l</code> 确认实际设备名）</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 1.格式化新磁盘（以 XFS 文件系统为例）</span></div></div><div><div><div>2</div></div><div><span>mkfs.xfs</span><span> </span><span>/dev/sdb</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 2.创建挂载点并挂载</span></div></div><div><div><div>5</div></div><div><span># 创建新的KVM存储目录</span></div></div><div><div><div>6</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/new_kvm_storage</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 将新磁盘挂载到该目录</span></div></div><div><div><div>9</div></div><div><span>mount</span><span> </span><span>-t</span><span> </span><span>xfs</span><span> </span><span>/dev/sdb</span><span> </span><span>/new_kvm_storage/</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span># 3.配置开机自动挂载</span></div></div><div><div><div>12</div></div><div><span># 获取新磁盘的UUID</span></div></div><div><div><div>13</div></div><div><span>blkid</span><span> </span><span>/dev/sdb</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span># 编辑 fstab 文件，将类似 UUID="xxxx-xxxx" /new_kvm_storage xfs defaults 0 0 追加到末尾</span></div></div><div><div><div>16</div></div><div><span>vi</span><span> </span><span>/etc/fstab</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h4>3.2.3 迁移虚拟机磁盘文件<a href="#323-迁移虚拟机磁盘文件"><span>#</span></a></h4><p>将原磁盘文件移动到新挂载的目录中</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 将 /kvm/vm/ 下的所有文件移动到 /new_kvm_storage/</span></div></div><div><div><div>2</div></div><div><span>mv</span><span> </span><span>/kvm/vm/</span><span>*</span><span> </span><span>/new_kvm_storage/</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 验证文件是否成功移动</span></div></div><div><div><div>5</div></div><div><span>ls</span><span> </span><span>-lh</span><span> </span><span>/new_kvm_storage/</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>3.2.4 修改虚拟机配置并启动<a href="#324-修改虚拟机配置并启动"><span>#</span></a></h4><p>由于磁盘的物理路径发生了变化，需要更新 KVM 的 XML 配置文件，让虚拟机知道去哪里找新的磁盘。</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 1. 修改配置文件</span></div></div><div><div><div>2</div></div><div><span>virsh</span><span> </span><span>edit</span><span> </span><span>chentos7</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 在打开的 XML 文件中，找到 &lt;disk&gt; 标签下的 &lt;source file='...'/&gt; 行，将旧路径修改为新路径。</span></div></div><div><div><div>5</div></div><div><span>&lt;!--</span><span> </span><span>修改前</span><span> </span><span>--&gt;</span></div></div><div><div><div>6</div></div><div><span>&lt;source</span><span> </span><span>file='/kvm/vm/centos7.qcow2'/&gt;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>&lt;!--</span><span> </span><span>修改后</span><span> </span><span>--&gt;</span></div></div><div><div><div>9</div></div><div><span>&lt;source</span><span> </span><span>file='/new_kvm_storage/centos7.qcow2'/&gt;</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span># 2.启动虚拟机</span></div></div><div><div><div>12</div></div><div><span>virsh</span><span> </span><span>start</span><span> </span><span>centos7</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span># 3. 验证虚拟机</span></div></div><div><div><div>15</div></div><div><span># 确认虚拟机正常运行</span></div></div><div><div><div>16</div></div><div><span>virsh</span><span> </span><span>list</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span># 验证新磁盘路径是否生效</span></div></div><div><div><div>19</div></div><div><span>virsh</span><span> </span><span>domblklist</span><span> </span><span>centos7</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><hr /></section></section><section><h3>3.3 磁盘管理<a href="#33-磁盘管理"><span>#</span></a></h3><section><h4>3.3.1 磁盘格式<a href="#331-磁盘格式"><span>#</span></a></h4><section><h5>3.3.1.1 raw 格式<a href="#3311-raw-格式"><span>#</span></a></h5><p>raw 是 KVM 默认的虚拟磁盘格式，本质上是一个简单的原始二进制数据流文件。</p><ul>
<li><strong>性能极高</strong>：由于数据块与物理存储直接映射，没有额外的元数据处理层或转换开销，其 I/O 性能最好，几乎接近物理磁盘。</li>
<li><strong>空间占用固定</strong>：创建时会立即预分配全部指定的磁盘空间。例如，创建一个 50G 的 raw 镜像，会直接占用宿主机 50G 的物理空间，即使虚拟机内只使用了 1G。</li>
<li><strong>功能受限</strong>：不支持虚拟机的快照功能，也不支持数据压缩和加密。</li>
<li><strong>适用场景</strong>：适用于对磁盘 I/O 性能要求极高、不需要频繁做快照的生产环境。</li>
</ul></section><section><h5>3.3.1.2 qcow2 格式<a href="#3312-qcow2-格式"><span>#</span></a></h5><p>qcow2 是目前 KVM 环境中最主流、最推荐的磁盘格式，其核心设计理念是“写时复制”（Copy-On-Write）。</p><ul>
<li><strong>空间利用率高（动态扩容）</strong>：采用稀疏存储机制，初始创建时仅占用极小的物理空间（约 MB 级），随着虚拟机实际写入的数据量逐渐动态增长，支持磁盘空间超配。</li>
<li><strong>功能丰富</strong>：原生支持多级快照（Snapshot），方便进行系统备份和回滚；支持 zlib 磁盘压缩以节约存储空间；支持 AES 加密以保障数据安全。</li>
<li><strong>性能表现</strong>：由于存在元数据寻址等开销，其性能略逊于 raw 格式（通常有约 5% 的性能损耗），但在经过 virtio 优化后，两者差异已经非常小，完全能够满足绝大多数业务需求。</li>
<li><strong>适用场景</strong>：推荐作为首选格式，广泛适用于测试环境、需要频繁快照备份的场景以及云计算系统。</li>
</ul></section></section><section><h4>3.3.2 磁盘信息查看<a href="#332-磁盘信息查看"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 查看默认格式的磁盘文件</span></div></div><div><div><div>2</div></div><div><span>[root@kvm-150 ~] $ du -h /kvm/vm/centos7.raw</span></div></div><div><div><div>3</div></div><div><span>1.4G</span><span>    </span><span>/kvm/vm/centos7.raw</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 查看磁盘文件信息</span></div></div><div><div><div>6</div></div><div><span>[root@kvm-150 ~]#qemu-img info /kvm/vm/centos7.raw</span></div></div><div><div><div>7</div></div><div><span>image:</span><span> </span><span>/kvm/vm/centos7.raw</span></div></div><div><div><div>8</div></div><div><span>file</span><span> </span><span>format:</span><span> </span><span>raw</span></div></div><div><div><div>9</div></div><div><span>virtual</span><span> </span><span>size:</span><span> </span><span>10G</span><span> (10737418240 </span><span>bytes</span><span>)</span></div></div><div><div><div>10</div></div><div><span>disk</span><span> </span><span>size:</span><span> </span><span>1.9G</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>3.3.3 创建磁盘文件<a href="#333-创建磁盘文件"><span>#</span></a></h4><p>使用<code>qemu-img create -f &lt;格式&gt; &lt;文件名&gt; &lt;大小&gt;</code>新建一个虚拟磁盘文件</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 创建一个 30G 的 qcow2 格式磁盘</span></div></div><div><div><div>2</div></div><div><span>qemu-img</span><span> </span><span>create</span><span> </span><span>-f</span><span> </span><span>qcow2</span><span> </span><span>/kvm/vm/openeuler.qcow2</span><span> </span><span>30G</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>3.3.4 转换/压缩磁盘文件<a href="#334-转换压缩磁盘文件"><span>#</span></a></h4><p><code>convert</code>用于在不同磁盘格式之间进行转换，或者对镜像进行压缩和稀疏化处理。</p><ul>
<li>
<p><strong>基本语法</strong>：<code>qemu-img convert -f &lt;源格式&gt; -O &lt;目标格式&gt; &lt;源文件&gt; &lt;目标文件&gt;</code></p>
</li>
<li>
<p><strong>示例</strong>：将 raw 格式转换为 qcow2 格式并启用压缩（<code>-c</code> 参数）：</p>
<ul>
<li>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>qemu-img</span><span> </span><span>convert</span><span> </span><span>-f</span><span> </span><span>raw</span><span> </span><span>-O</span><span> </span><span>qcow2</span><span> </span><span>-c</span><span> </span><span>old.raw</span><span> </span><span>new.qcow2</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
<li>
<p><strong>示例</strong>：将 VMware 的 vmdk 格式转换为 qcow2，并显示进度条（<code>-p</code> 参数）：</p>
<ul>
<li>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>qemu-img</span><span> </span><span>convert</span><span> </span><span>-p</span><span> </span><span>-f</span><span> </span><span>vmdk</span><span> </span><span>-O</span><span> </span><span>qcow2</span><span> </span><span>centos.vmdk</span><span> </span><span>centos.qcow2</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
</ul></section><section><h4>3.3.5 磁盘文件容量调整<a href="#335-磁盘文件容量调整"><span>#</span></a></h4><p><code>resize</code>用于扩大或缩小虚拟磁盘的容量</p><ul>
<li>
<p><strong>基本语法</strong>：<code>qemu-img resize &lt;文件名&gt; &lt;+/-大小&gt;</code></p>
</li>
<li>
<p><strong>示例</strong>：将磁盘容量增加 5G：</p>
<ul>
<li>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>qemu-img</span><span> </span><span>resize</span><span> </span><span>disk.qcow2</span><span> </span><span>+5G</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
</ul></section><section><h4>3.3.6 磁盘文件完整性检查<a href="#336-磁盘文件完整性检查"><span>#</span></a></h4><p><code>check</code>用于检查镜像文件的内部一致性和完整性，常用于排查镜像损坏问题</p><ul>
<li><strong>基本语法</strong>：<code>qemu-img check -f &lt;格式&gt; &lt;文件名&gt;</code></li>
</ul><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>qemu-img</span><span> </span><span>check</span><span> </span><span>-f</span><span> </span><span>qcow2</span><span> </span><span>disk.qcow2</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>3.3.3.7 修改后端磁盘文件*<a href="#3337-修改后端磁盘文件"><span>#</span></a></h4><p><code>rebase</code>用于修改差异磁盘（Backing File）的依赖关系</p><ul>
<li>
<p><strong>基本语法</strong>：<code>qemu-img rebase -f &lt;格式&gt; -b &lt;新后端文件&gt; &lt;差异镜像&gt;</code></p>
</li>
<li>
<p><strong>示例</strong>：</p>
<ul>
<li>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>qemu-img</span><span> </span><span>rebase</span><span> </span><span>-f</span><span> </span><span>qcow2</span><span> </span><span>-b</span><span> </span><span>new_base.qcow2</span><span> </span><span>diff.qcow2</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
</ul><ul>
<li>
<blockquote><h3>后端镜像<a href="#后端镜像"><span>#</span></a></h3><p>在 KVM 中，你可以基于一个基础镜像（例如一个装好操作系统的母盘）创建一个差异镜像。这个差异镜像只记录相对于母盘的“修改部分”，从而极大地节省了存储空间。而 <code>rebase</code> 命令的核心作用，就是<strong>更改这个差异镜像所依赖的“母盘”</strong>。</p><h4>1.<strong>修复移动或重命名后的母盘</strong><a href="#1修复移动或重命名后的母盘"><span>#</span></a></h4><p>如果你的母盘文件被移动到了其他目录，或者更改了文件名，依赖它的差异镜像就会因为找不到母盘而无法启动。此时可以使用 <code>rebase</code> 的不安全模式（<code>-u</code> 参数）来直接更新母盘的路径，而无需进行耗时的数据合并。</p><p><strong>示例</strong>：母盘从 <code>/old/path/base.qcow2</code> 移动到了 <code>/new/path/base.qcow2</code></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>qemu-img</span><span> </span><span>rebase</span><span> </span><span>-u</span><span> </span><span>-b</span><span> </span><span>/new/path/base.qcow2</span><span> </span><span>diff.qcow2</span></div></div></code></pre><div><div></div><div></div></div></figure></div><h4>2.<strong>合并基础镜像更新</strong><a href="#2合并基础镜像更新"><span>#</span></a></h4><p>假设你有一个包含操作系统的基础母盘，并基于它创建了多个虚拟机的差异镜像。后来你更新了基础母盘（比如安装了最新的安全补丁）。你可以使用 <code>rebase</code> 的安全模式（默认模式），将差异镜像的依赖切换到这个更新后的新母盘上。</p><ul>
<li>
<p>示例：</p>
</li>
<li>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># -f 指定源镜像（diff.qcow2）的格式，-b new_base.qcow2：指定新的母盘（后端镜像）</span></div></div><div><div><div>2</div></div><div><span># diff.qcow2：需要被修改依赖关系的差异镜像</span></div></div><div><div><div>3</div></div><div><span>qemu-img</span><span> </span><span>rebase</span><span> </span><span>-f</span><span> </span><span>qcow2</span><span> </span><span>-b</span><span> </span><span>new_base.qcow2</span><span> </span><span>diff.qcow2</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul><ul>
<li><strong>原理</strong>：在安全模式下，<code>qemu-img</code> 会执行一个非常严谨的数据对比过程
<ul>
<li>
<ol>
<li>它会将 <code>diff.qcow2</code> 中的每一个数据块，与<strong>旧母盘</strong>进行对比，找出那些 <code>diff.qcow2</code> 中<strong>没有修改过</strong>的数据块</li>
<li>将这些未修改的数据块，从旧母盘中读取出来，然后与<strong>新母盘 (<code>new_base.qcow2</code>)</strong> 中的对应位置进行对比</li>
<li>如果新旧母盘在这个位置的内容<strong>不同</strong>，<code>qemu-img</code> 就会把旧母盘的这个数据块<strong>写入（合并）到 <code>diff.qcow2</code> 中</strong></li>
<li>最后，将 <code>diff.qcow2</code> 的母盘指针安全地指向 <code>new_base.qcow2</code></li>
</ol>
</li>
</ul>
</li>
</ul><h4>3.重构镜像链<a href="#3重构镜像链"><span>#</span></a></h4><p>在复杂的虚拟化环境中，有时需要调整镜像的依赖层级。例如，原本 A 依赖于 B，B 依赖于 C，现在你想让 A 直接依赖于 C，或者将 A 的母盘替换为完全不同的 D 镜像。<code>rebase</code> 可以安全地完成这种底层数据结构的重组。</p></blockquote>
</li>
</ul><hr /></section></section><section><h3>3.4 克隆虚拟机<a href="#34-克隆虚拟机"><span>#</span></a></h3><section><h4>3.4.1 完整克隆<a href="#341-完整克隆"><span>#</span></a></h4><p>完整克隆是对源虚拟机的配置文件和虚拟磁盘文件进行深度的、物理上的完整复制。克隆后的虚拟机是一个完全独立的副本，与源虚拟机之间没有任何数据共享。</p><ul>
<li><strong>优点</strong>：独立性极强。克隆体与源虚拟机互不影响，即使删除了源虚拟机，克隆出的虚拟机依然可以正常运行。此外，它的性能隔离性更好，不存在资源争用问题。</li>
<li><strong>缺点</strong>：创建速度较慢，且需要占用与源虚拟机同等大小的存储空间。</li>
</ul><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virt-clone</span><span> </span><span>--auto-clone</span><span> </span><span>-o</span><span> </span><span>&lt;源虚拟机名称&gt;</span><span> </span><span>-n</span><span> </span><span>&lt;新虚拟机名称&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li><code>-o</code>：指定原始虚拟机（Original）。</li>
<li><code>-n</code>：指定克隆后的新虚拟机名称（Name）。</li>
<li><code>--auto-clone</code>：自动克隆选项。系统会自动生成新的磁盘文件路径，并自动为新虚拟机分配新的 UUID 和 MAC 地址，避免与原虚拟机冲突。</li>
</ul></section><section><h4>3.4.2 链接克隆<a href="#342-链接克隆"><span>#</span></a></h4><p>链接克隆并不会完整拷贝源虚拟机的磁盘文件，而是创建一个较小的“差异磁盘文件”。新克隆的虚拟机与源虚拟机共享大部分基础磁盘数据，仅将自身运行过程中产生的新数据或修改记录保存在差异磁盘中。</p><ul>
<li>
<p><strong>优点</strong>：创建速度极快，且占用的物理存储空间非常小，非常适合存储资源有限的环境或需要快速批量扩容的场景。</p>
</li>
<li>
<p><strong>缺点</strong>：强依赖性。链接克隆的虚拟机必须依赖源虚拟机的磁盘文件才能运行。如果源虚拟机被删除或其磁盘文件损坏，所有基于它的链接克隆虚拟机都将无法启动</p>
</li>
<li>
<p><strong>操作步骤：</strong></p>
<ul>
<li>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 1.使用 qemu-img 命令基于源磁盘创建差异磁盘文件，-b：指定基础镜像（Backing file）的路径</span></div></div><div><div><div>2</div></div><div><span>qemu-img</span><span> </span><span>create</span><span> </span><span>-f</span><span> </span><span>qcow2</span><span> </span><span>-b</span><span> </span><span>/path/to/source_disk.qcow2</span><span> </span><span>/path/to/new_disk.qcow2</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 2.生成并修改配置文件，即导出源虚拟机的 XML 配置文件，并进行关键修改：</span></div></div><div><div><div>5</div></div><div><span># 导出XML配置</span></div></div><div><div><div>6</div></div><div><span>virsh</span><span> </span><span>dumpxml</span><span> </span><span>&lt;源虚拟机名称&gt;</span><span> &gt; </span><span>/path/to/new_vm.xml</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 编辑配置文件（必须修改以下四项以避免冲突）</span></div></div><div><div><div>9</div></div><div><span>vim</span><span> </span><span>/path/to/new_vm.xml</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 在 XML 文件中，你需要进行以下修改：</span></div></div><div><div><div>2</div></div><div><span># 1.修改虚拟机名称：更改 &lt;name&gt; 标签内的名称，确保全局唯一。</span></div></div><div><div><div>3</div></div><div><span># 2.删除 UUID：直接删除 &lt;uuid&gt;...&lt;/uuid&gt; 标签，启动时系统会自动生成新的 UUID。</span></div></div><div><div><div>4</div></div><div><span># 3.删除 MAC 地址：删除 &lt;mac address='...'/&gt; 标签，防止局域网内 MAC 地址冲突导致无法联网。</span></div></div><div><div><div>5</div></div><div><span># 4.修改磁盘路径：将 &lt;source file='...'/&gt; 的路径修改为第一步中创建的差异磁盘路径。</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 导入并启动虚拟机</span></div></div><div><div><div>2</div></div><div><span>virsh</span><span> </span><span>define</span><span> </span><span>/path/to/new_vm.xml</span></div></div><div><div><div>3</div></div><div><span>virsh</span><span> </span><span>start</span><span> </span><span>&lt;新虚拟机名称&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
</ul><hr /></section></section><section><h3>3.5 快照管理<a href="#35-快照管理"><span>#</span></a></h3><p>快照管理主要包含创建、查看、恢复和删除四个核心操作，快照用于保存虚拟机在特定时间点的状态，便于回滚和测试</p><p>在执行快照操作前，必须确保虚拟机的虚拟磁盘格式为 <strong>qcow2</strong>。最基础的 raw 格式不支持快照功能。如果当前是 raw 格式，需要先使用 <code>qemu-img convert</code> 命令将其转换为 qcow2 格式。</p><section><h4>3.5.1 命令行管理<a href="#351-命令行管理"><span>#</span></a></h4><p>使用 <code>virsh</code> 工具可以高效地进行快照管理</p><section><h5>3.5.1.1 查看快照<a href="#3511-查看快照"><span>#</span></a></h5><p>查看某个虚拟机下已创建的所有快照：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virsh</span><span> </span><span>snapshot-list</span><span> </span><span>&lt;虚拟机名称&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h5>3.5.1.2 创建快照<a href="#3512-创建快照"><span>#</span></a></h5><p>使用 <code>snapshot-create-as</code> 命令为指定虚拟机创建快照，并可以添加描述信息以便日后识别</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virsh</span><span> </span><span>snapshot-create-as</span><span> </span><span>--domain</span><span> </span><span>&lt;虚拟机名称&gt;</span><span> </span><span>--name</span><span> </span><span>&lt;快照名称&gt;</span><span> </span><span>--description</span><span> </span><span>"快照描述"</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h5>3.5.1.3 恢复快照<a href="#3513-恢复快照"><span>#</span></a></h5><p>将虚拟机回滚到指定的快照状态。<strong>注意</strong>：为了保证数据一致性，执行此操作前通常需要先关闭虚拟机：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virsh</span><span> </span><span>snapshot-revert</span><span> </span><span>&lt;虚拟机名称&gt;</span><span> </span><span>&lt;快照名称&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h5>3.5.1.4 删除快照<a href="#3514-删除快照"><span>#</span></a></h5><p>当确认不再需要某个快照时，可以将其删除以释放存储空间：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virsh</span><span> </span><span>snapshot-delete</span><span> </span><span>&lt;虚拟机名称&gt;</span><span> </span><span>&lt;快照名称&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h4>3.5.2 图形界面管理<a href="#352-图形界面管理"><span>#</span></a></h4><p>使用 <code>virt-manager</code>进行图形界面管理快照</p><ol>
<li>打开 virt-manager 并选中目标虚拟机。</li>
<li>在界面上方点击“快照”图标（通常是两个重叠的方块或类似图标）。</li>
<li>在弹出的快照管理器中，你可以直观地点击“创建新快照”，或者对已有的快照进行“恢复”和“删除”操作。</li>
</ol></section><section><h4>3.5.3 常用快照管理命令<a href="#353-常用快照管理命令"><span>#</span></a></h4>

<table><thead><tr><th>命令</th><th>功能简述</th><th>操作示例</th></tr></thead><tbody><tr><td><code>snapshot-create</code></td><td>通过读取 XML 文件创建快照</td><td><code>virsh snapshot-create &lt;虚拟机名称&gt; &lt;XML文件路径&gt;</code></td></tr><tr><td><code>snapshot-create-as</code></td><td>通过命令行参数快速创建快照</td><td><code>virsh snapshot-create-as &lt;虚拟机名称&gt; &lt;快照名称&gt; "&lt;快照描述&gt;"</code></td></tr><tr><td><code>snapshot-current</code></td><td>获取或设置当前活动的快照</td><td><code>virsh snapshot-current &lt;虚拟机名称&gt;</code></td></tr><tr><td><code>snapshot-delete</code></td><td>删除指定的虚拟机快照</td><td><code>virsh snapshot-delete &lt;虚拟机名称&gt; &lt;快照名称&gt;</code></td></tr><tr><td><code>snapshot-dumpxml</code></td><td>输出快照的 XML 配置详情</td><td><code>virsh snapshot-dumpxml &lt;虚拟机名称&gt; &lt;快照名称&gt;</code></td></tr><tr><td><code>snapshot-edit</code></td><td>编辑快照的 XML 配置</td><td><code>virsh snapshot-edit &lt;虚拟机名称&gt; &lt;快照名称&gt;</code></td></tr><tr><td><code>snapshot-info</code></td><td>查看快照的元数据信息</td><td><code>virsh snapshot-info &lt;虚拟机名称&gt; &lt;快照名称&gt;</code></td></tr><tr><td><code>snapshot-list</code></td><td>列出虚拟机的所有快照</td><td><code>virsh snapshot-list &lt;虚拟机名称&gt;</code></td></tr><tr><td><code>snapshot-parent</code></td><td>查看指定快照的父级快照</td><td><code>virsh snapshot-parent &lt;虚拟机名称&gt; &lt;快照名称&gt;</code></td></tr><tr><td><code>snapshot-revert</code></td><td>将虚拟机回滚恢复到指定快照</td><td><code>virsh snapshot-revert &lt;虚拟机名称&gt; &lt;快照名称&gt;</code></td></tr></tbody></table><hr /></section></section><section><h3>3.6 热添加技术<a href="#36-热添加技术"><span>#</span></a></h3><p>KVM虚拟机的热添加（Hot Plugging）技术允许在虚拟机保持运行（不关机）的状态下，动态为其添加或移除虚拟硬件资源。这极大地提高了服务器的灵活性和可扩展性。目前，KVM主要支持对CPU、内存、硬盘和网卡进行热添加操作。</p><section><h4>3.6.1 CPU热添加<a href="#361-cpu热添加"><span>#</span></a></h4><p>CPU热添加只能<strong>增加</strong>核心数，<strong>不支持</strong>热删除（减少）。</p><ul>
<li>
<p><strong>前提条件</strong>：必须预先设置虚拟机允许的最大CPU数量（maxvcpus）。如果创建时未设置，需要先关机修改配置文件（例如 <code>&lt;vcpu placement='auto' current='1'&gt;4&lt;/vcpu&gt;</code>），然后重启虚拟机。</p>
</li>
<li>
<p><strong>临时生效（重启失效）</strong>：</p>
<ul>
<li>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virsh</span><span> </span><span>setvcpus</span><span> </span><span>&lt;虚拟机名称&gt;</span><span> </span><span>&lt;目标CPU数量&gt;</span><span> </span><span>--live</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
<li>
<p><strong>永久生效</strong>：</p>
<ul>
<li>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virsh</span><span> </span><span>setvcpus</span><span> </span><span>&lt;虚拟机名称&gt;</span><span> </span><span>&lt;目标CPU数量&gt;</span><span> </span><span>--config</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
</ul><ul>
<li>对于部分Linux系统，热添加后可能需要在虚拟机内部手动激活新CPU（例如执行 <code>echo 1 &gt; /sys/devices/system/cpu/cpuX/online</code></li>
</ul></section><section><h4>3.6.2 内存热添加<a href="#362-内存热添加"><span>#</span></a></h4><p>内存热添加支持动态扩容和缩容（内存气球机制），但调整后的内存总量不能超过预先设置的最大内存上限。</p><ul>
<li>
<p><strong>前提条件</strong>：需提前设置最大内存（maxmemory）。若需提升上限，必须关机修改配置（例如 <code>&lt;memory unit='KiB'&gt;4048576&lt;/memory&gt;</code>）后重启。</p>
</li>
<li>
<p><strong>临时调整内存大小</strong>：</p>
<ul>
<li>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 扩容或缩容内存</span></div></div><div><div><div>2</div></div><div><span>virsh</span><span> </span><span>setmem</span><span> </span><span>&lt;虚拟机名称&gt;</span><span> </span><span>&lt;目标内存大小&gt;</span><span> </span><span>--live</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
<li>
<p><strong>永久调整内存大小</strong>：</p>
<ul>
<li>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virsh</span><span> </span><span>setmem</span><span> </span><span>&lt;虚拟机名称&gt;</span><span> </span><span>&lt;目标内存大小&gt;</span><span> </span><span>--config</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
</ul><ul>
<li>
<p><strong>修改最大内存上限</strong>（需在关机状态下执行）：</p>
<ul>
<li>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virsh</span><span> </span><span>setmaxmem</span><span> </span><span>&lt;虚拟机名称&gt;</span><span> </span><span>&lt;新最大内存&gt;</span><span> </span><span>--config</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
</ul></section><section><h4>3.6.3 硬盘热添加<a href="#363-硬盘热添加"><span>#</span></a></h4><p>支持在虚拟机运行时动态挂载新的虚拟磁盘。</p><ul>
<li>
<p><strong>创建新磁盘文件</strong>：</p>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>qemu-img</span><span> </span><span>create</span><span> </span><span>-f</span><span> </span><span>qcow2</span><span> </span><span>/path/to/new_disk.qcow2</span><span> </span><span>5G</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p><strong>临时挂载新磁盘</strong>（vdb为虚拟机内的目标设备名）：</p>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virsh</span><span> </span><span>attach-disk</span><span> </span><span>&lt;虚拟机名称&gt;</span><span> </span><span>/path/to/new_disk.qcow2</span><span> </span><span>vdb</span><span> </span><span>--subdriver</span><span> </span><span>qcow2</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p><strong>永久挂载新磁盘</strong>（写入配置文件并立即生效）：</p>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virsh</span><span> </span><span>attach-disk</span><span> </span><span>&lt;虚拟机名称&gt;</span><span> </span><span>/path/to/new_disk.qcow2</span><span> </span><span>vdb</span><span> </span><span>--subdriver</span><span> </span><span>qcow2</span><span> </span><span>--config</span><span> </span><span>--live</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p><strong>后续操作</strong>：添加完成后，需进入虚拟机内部对新磁盘进行格式化（如 <code>mkfs.ext4 /dev/vdb</code>）并挂载。</p>
</li>
<li>
<p><strong>卸载磁盘</strong>：</p>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virsh</span><span> </span><span>detach-disk</span><span> </span><span>&lt;虚拟机名称&gt;</span><span> </span><span>vdb</span><span> </span><span>--live</span><span> </span><span>--config</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul></section><section><h4>3.6.4 网卡热添加<a href="#364-网卡热添加"><span>#</span></a></h4><p>支持动态为虚拟机添加新的虚拟网卡。</p><ul>
<li>
<p><strong>临时添加桥接网卡</strong>：</p>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virsh</span><span> </span><span>attach-interface</span><span> </span><span>&lt;虚拟机名称&gt;</span><span> </span><span>--type</span><span> </span><span>bridge</span><span> </span><span>--source</span><span> </span><span>br0</span><span> </span><span>--model</span><span> </span><span>virtio</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p><strong>永久添加桥接网卡</strong>：</p>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virsh</span><span> </span><span>attach-interface</span><span> </span><span>&lt;虚拟机名称&gt;</span><span> </span><span>--type</span><span> </span><span>bridge</span><span> </span><span>--source</span><span> </span><span>br0</span><span> </span><span>--model</span><span> </span><span>virtio</span><span> </span><span>--config</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p><strong>移除网卡</strong>（需指定要移除网卡的MAC地址）：</p>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>virsh</span><span> </span><span>detach-interface</span><span> </span><span>&lt;虚拟机名称&gt;</span><span> </span><span>--type</span><span> </span><span>bridge</span><span> </span><span>--mac</span><span> </span><span>&lt;MAC地址&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p><strong>后续操作</strong>：进入虚拟机后，新网卡通常会被识别为新的网络接口（如eth1），需配置IP地址并启用。</p>
</li>
</ul></section></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/jenkins%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/</id>
      <title type="text">jenkins安装使用</title>
      <published>2026-07-05T00:00:00.000Z</published>
      <updated>2026-07-05T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/jenkins%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/"/>
      <summary type="text">jenkins安装使用</summary>
      <content type="html"><![CDATA[<section><h1>一、 Jenkins安装使用<a href="#一-jenkins安装使用"><span>#</span></a></h1><section><h2>1.1 Jenkins 安装<a href="#11-jenkins-安装"><span>#</span></a></h2><section><h3>1.1.1 下载所需安装包<a href="#111-下载所需安装包"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 使用清华源下载对应版本的包</span></div></div><div><div><div>2</div></div><div><span>https://mirrors.tuna.tsinghua.edu.cn/jenkins</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 配置java环境，下载jdk，前往jdk官网下载对应的jdk版本</span></div></div><div><div><div>5</div></div><div><span>https://www.oracle.com/cn/java/technologies/downloads/</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.1.2 安装配置java<a href="#112-安装配置java"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 安装jdk</span></div></div><div><div><div>2</div></div><div><span>dpkg</span><span> </span><span>-i</span><span> </span><span>jdk-21_linux-x64_bin.deb</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>配置<code>java环境</code>，deb安装的路径在“/usr/lib/jvm`</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 在当前位置创建软链接</span></div></div><div><div><div>2</div></div><div><span>ln</span><span> </span><span>-s</span><span> </span><span>jdk-21.0.11-oracle-x64/</span><span> </span><span>./jdk21</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 配置环境变量</span></div></div><div><div><div>5</div></div><div><span>cat</span><span> &gt; </span><span>/etc/profile.d/jdk21.sh</span><span> &lt;&lt; </span><span>'EOF'</span></div></div><div><div><div>6</div></div><div><span># JAVA21</span></div></div><div><div><div>7</div></div><div><span>export JAVA_HOME=/usr/lib/jvm/jdk21</span></div></div><div><div><div>8</div></div><div><span>export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar</span></div></div><div><div><div>9</div></div><div><span>export PATH=$PATH:$JAVA_HOME/bin</span></div></div><div><div><div>10</div></div><div><span>EOF</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># 验证版本</span></div></div><div><div><div>13</div></div><div><span>java</span><span> </span><span>-version</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.1.3 安装jenkins<a href="#113-安装jenkins"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>dpkg</span><span> </span><span>-i</span><span> </span><span>jenkins_2.555.1_all.deb</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 查看Jenkins服务状态</span></div></div><div><div><div>4</div></div><div><span>systemctl</span><span> </span><span>status</span><span> </span><span>jenkins</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 查看Jenkins服务启动的端口</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>netstat</span><span> </span><span>-tunlp</span><span> | </span><span>grep</span><span> </span><span>8080</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>1.2 配置jenkins<a href="#12-配置jenkins"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 查看jenkins产生的文件</span></div></div><div><div><div>2</div></div><div><span>dpkg</span><span> </span><span>-i</span><span> </span><span>jenkins</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 服务启动配置文件路径</span></div></div><div><div><div>5</div></div><div><span>/lib/systemd/system/jenkins.service</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># jenkins主目录，所有数据、任务、插件都在这里</span></div></div><div><div><div>8</div></div><div><span># plugins文件夹存放插件</span></div></div><div><div><div>9</div></div><div><span># jobs文件夹存放各种任务</span></div></div><div><div><div>10</div></div><div><span>/var/lib/jenkins/</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># 日志文件位置</span></div></div><div><div><div>13</div></div><div><span>/var/log/jenkins/jenkins.log</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>1.2.1 主配置文件<a href="#121-主配置文件"><span>#</span></a></h3><p><code>/etc/default/jenkins</code>，可以修改，HTTP 端口、JVM 参数、运行用户、日志路径</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 查看配置,按需修改对应参数</span></div></div><div><div><div>2</div></div><div><span>grep</span><span> </span><span>-E</span><span> </span><span>'^[a-Z]'</span><span> </span><span>/etc/default/jenkins</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.2.2 修改插件下载源（可选）<a href="#122-修改插件下载源可选"><span>#</span></a></h3><p>如果你的网络无法下载插件，那么可以修改国内的jenkins插件源</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 编辑文件</span></div></div><div><div><div>2</div></div><div><span>vim</span><span> </span><span>/var/lib/jenkins/hudson.model.UpdateCenter.xml</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>将里面的的插件源进行替换</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;?</span><span>xml</span><span> version</span><span>=</span><span>'1.1'</span><span> encoding</span><span>=</span><span>'UTF-8'</span><span>?&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>sites</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>&lt;</span><span>site</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>&lt;</span><span>id</span><span>&gt;default&lt;/</span><span>id</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>&lt;</span><span>url</span><span>&gt;https://mirrors.huaweicloud.com/jenkins/update-center.json&lt;/</span><span>url</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>&lt;/</span><span>site</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span>&lt;/</span><span>sites</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>修改插件下载缓存</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 进入缓存目录</span></div></div><div><div><div>2</div></div><div><span>cd</span><span> </span><span>/var/lib/jenkins/updates/</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 先备份一下源文件，以防万一</span></div></div><div><div><div>5</div></div><div><span>cp</span><span> </span><span>default.json</span><span> </span><span>default.json.bak</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 执行替换命令，将国外地址换成华为源</span></div></div><div><div><div>8</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'s#https://updates.jenkins.io/download#https://mirrors.huaweicloud.com/jenkins/#g'</span><span> </span><span>default.json</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 顺便处理一下谷歌验证的问题（非必须，但建议执行）</span></div></div><div><div><div>11</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'s#www.google.com#www.baidu.com#g'</span><span> </span><span>default.json</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>之后重启</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>systemctl</span><span> </span><span>restart</span><span> </span><span>jenkins</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>重启后登录 Jenkins，按以下步骤检查：</p><ol>
<li>进入 <strong>Manage Jenkins</strong> -&gt; <strong>Plugins</strong> -&gt; <strong>Advanced Settings</strong> (高级设置)。</li>
<li>找到 <strong>Update Site</strong> (更新站点) 一栏。</li>
<li>确认 URL 已经是 <code>https://mirrors.huaweicloud.com/jenkins/update-center.json</code>。如果不是，请手动替换并提交。</li>
</ol></section></section><section><h2>1.3 访问jenkins<a href="#13-访问jenkins"><span>#</span></a></h2><p>浏览器访问<code>ip+端口</code></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 获取初始密码</span></div></div><div><div><div>2</div></div><div><span>cat</span><span> </span><span>/var/lib/jenkins/secrets/initialAdminPassword</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260428152542374.png" alt="image-20260428152542374" /><figcaption>image-20260428152542374</figcaption></figure><p></p><section><h3>1.3.1 插件安装<a href="#131-插件安装"><span>#</span></a></h3><p>选择<code>安装推荐的插件</code></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260428164445351.png" alt="image-20260428164445351" /><figcaption>image-20260428164445351</figcaption></figure><p></p><p>如果网络不好，可以直接擦掉，因为访问的国外的插件源，之后再进行安装</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260428152800898.png" alt="image-20260428152800898" /><figcaption>image-20260428152800898</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260428152835348.png" alt="image-20260428152835348" /><figcaption>image-20260428152835348</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260428152904387.png" alt="image-20260428152904387" /><figcaption>image-20260428152904387</figcaption></figure><p></p></section><section><h3>1.3.2 创建管理员用户<a href="#132-创建管理员用户"><span>#</span></a></h3><p>如果插件安装完成，就会来到这个界面，创建第一个管理员用户</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260428164938810.png" alt="image-20260428164938810" /><figcaption>image-20260428164938810</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260428165000084.png" alt="image-20260428165000084" /><figcaption>image-20260428165000084</figcaption></figure><p></p></section><section><h3>1.3.3 重置密码<a href="#133-重置密码"><span>#</span></a></h3><p>如果忘记了登录密码，需要修改配置文件来进行修改</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>  </span><span># 修改配置文件</span></div></div><div><div><div>2</div></div><div><span>  </span><span>vim</span><span> </span><span>/var/lib/jenkins/config.xml</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>  </span><span># 将文件中的以下内容删除，这些内容定义了jenkins的用户认证机制</span></div></div><div><div><div>5</div></div><div><span>  </span><span>&lt;useSecurity&gt;true&lt;/useSecurity&gt;</span></div></div><div><div><div>6</div></div><div><span>  </span><span>&lt;authorizationStrategy</span><span> </span><span>class="hudson.security.FullControlOnceLoggedInAuthorizationStrategy"&gt;</span></div></div><div><div><div>7</div></div><div><span>    </span><span>&lt;denyAnonymousReadAccess&gt;true&lt;/denyAnonymousReadAccess&gt;</span></div></div><div><div><div>8</div></div><div><span>  </span><span>&lt;/authorizationStrategy&gt;</span></div></div><div><div><div>9</div></div><div><span>  </span><span>&lt;securityRealm</span><span> </span><span>class="hudson.security.HudsonPrivateSecurityRealm"&gt;</span></div></div><div><div><div>10</div></div><div><span>    </span><span>&lt;disableSignup&gt;true&lt;/disableSignup&gt;</span></div></div><div><div><div>11</div></div><div><span>    </span><span>&lt;enableCaptcha&gt;false&lt;/enableCaptcha&gt;</span></div></div><div><div><div>12</div></div><div><span>  </span><span>&lt;/securityRealm&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>删除后，保存退出。之后重启jenkins，之后再访问jenkins就是免密登录了，最后在平台中重置用户认证的功能，设置密码</p></section></section><section><h2>1.4 使用jenkins<a href="#14-使用jenkins"><span>#</span></a></h2><section><h3>1.4.1 下载中文插件<a href="#141-下载中文插件"><span>#</span></a></h3><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260428160738375.png" alt="image-20260428160738375" /><figcaption>image-20260428160738375</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260428160756394.png" alt="image-20260428160756394" /><figcaption>image-20260428160756394</figcaption></figure><p></p><p>下载图中的两个插件</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260428160839776.png" alt="image-20260428160839776" /><figcaption>image-20260428160839776</figcaption></figure><p></p><p>重启jenkins，然后继续回到设置</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260428160926846.png" alt="image-20260428160926846" /><figcaption>image-20260428160926846</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260428160946445.png" alt="image-20260428160946445" /><figcaption>image-20260428160946445</figcaption></figure><p></p></section><section><h3>1.4.2 修改用户密码<a href="#142-修改用户密码"><span>#</span></a></h3><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260428161145850.png" alt="image-20260428161145850" /><figcaption>image-20260428161145850</figcaption></figure><p></p></section><section><h3>1.4.3 任务创建<a href="#143-任务创建"><span>#</span></a></h3><section><h4>1.4.3.1 创建任务<a href="#1431-创建任务"><span>#</span></a></h4><p>点击<code>“新建任务”</code>，输入名称（建议避免空格，防止路径解析问题），这里选择<code>“自由风格项目”</code>。</p><ul>
<li><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260429092507454.png" alt="image-20260429092507454" /><figcaption>image-20260429092507454</figcaption></figure></li>
</ul><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260429092723687.png" alt="image-20260429092723687" /><figcaption>image-20260429092723687</figcaption></figure><p></p></section><section><h4>1.4.3.2 通用设置<a href="#1432-通用设置"><span>#</span></a></h4><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260429095505278.png" alt="image-20260429095505278" /><figcaption>image-20260429095505278</figcaption></figure><p></p></section><section><h4>1.4.3.3 源码管理<a href="#1433-源码管理"><span>#</span></a></h4><p>如果使用git来管理源码，那么可以选择git，然后填写相应参数</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260429100212126.png" alt="image-20260429100212126" /><figcaption>image-20260429100212126</figcaption></figure><p></p></section><section><h4>1.4.3.4 构建触发器<a href="#1434-构建触发器"><span>#</span></a></h4><ul>
<li><code>触发远程构建：</code>允许通过外部请求来触发构建，通常是通过一个带有认证令牌（Token）的特定 URL。这在需要从其他系统（如脚本、其他 CI/CD 工具或 Git 钩子）调用 Jenkins 任务时非常有用。例如：当github代码仓库有新的提交后会主动发送一个http请求到jenkins服务器指定的URL地址，然后触发构建</li>
<li><code>其他工程构建后触发：</code>用于实现项目间的依赖关系。当在列表中指定的其他 Jenkins 任务（工程）成功（或失败、不稳定等）构建完成后，会自动触发当前这个任务的构建。</li>
<li><code>定时构建：</code>自定义时间点进行触发构建</li>
<li><code>GitHub hook trigger for GITScm polling:</code>用于和 GitHub 进行集成。当你在 GitHub 上配置了 Webhook 后，一旦代码仓库发生推送（Push）等事件，GitHub 会主动通知 Jenkins，从而立即触发构建。这是一种<strong>事件驱动</strong>的即时触发方式，比轮询更高效</li>
<li><code>轮询 SCM:</code>Jenkins 会按照设定的时间表，定期检查代码仓库是否有新的提交。如果检测到代码有变化，就触发一次构建；如果没有变化，则不执行任何操作。这是一种<strong>被动检查</strong>的触发方式。</li>
</ul><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260429100721334.png" alt="image-20260429100721334" /><figcaption>image-20260429100721334</figcaption></figure><p></p></section><section><h4>1.4.3.5 环境<a href="#1435-环境"><span>#</span></a></h4><ul>
<li>**Delete workspace before build starts：**在每次构建开始前，自动删除工作空间中的所有文件。这能确保构建在一个干净、无干扰的环境中进行，避免因上一次构建残留的文件（如旧的编译产物、缓存等）导致本次构建失败或结果不一致。</li>
<li>**Use secret text(s) or file(s)：**用于安全地注入敏感信息，如密码、API密钥、证书文件等。通过此功能，可以将凭据从 Jenkins 的凭据存储中绑定到当前构建的环境变量或文件中，而无需在脚本或配置里明文写出，有效防止敏感信息泄露。</li>
<li>**Inspect build log for published build scans：**这个选项通常与特定的代码质量或安全扫描插件（如 SonarQube, Checkmarx 等）配合使用。它会检查构建日志，寻找由这些插件发布的扫描结果链接或摘要，并可能在 Jenkins 界面上提供更便捷的访问入口。</li>
<li><strong>Terminate a build if it’s stuck</strong>：为构建任务设置一个超时时间。如果构建运行时间超过了预设的时长，Jenkins 会自动强制终止该任务。这可以防止因网络问题、死锁或脚本错误导致构建无限期挂起，从而浪费系统资源。</li>
<li><strong>With Ant</strong>：如果你的项目使用 Apache Ant 作为构建工具，勾选此项可以为当前任务指定一个特定版本的 Ant。Jenkins 会自动配置好 Ant 的环境变量，确保构建脚本能在正确的 Ant 环境下执行。</li>
<li><strong>在构建日志中添加时间戳前缀</strong>：在构建日志的每一行输出前，自动添加一个时间戳。这对于分析构建过程、定位耗时较长的步骤以及排查问题非常有帮助，能让你清晰地知道每个操作发生的具体时间</li>
</ul><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260429102857974.png" alt="image-20260429102857974" /><figcaption>image-20260429102857974</figcaption></figure><p></p></section><section><h4>1.4.3.6 构建步骤<a href="#1436-构建步骤"><span>#</span></a></h4><ul>
<li>**invoke ant：**调用 Apache Ant 构建工具</li>
<li>**invoke gradle script：**调用 Gradle 构建工具</li>
<li>**run with timeout:**这是一个包装器步骤。可以将其他构建步骤放在这个步骤内部，并为其设置一个最长运行时间。如果内部的步骤在指定时间内没有完成，整个构建就会被强制中断。这可以防止某个任务因为意外情况（如死循环、网络卡死）而无限期地运行下去。</li>
<li>**Set build status to “pending” on GitHub commit：**这个步骤用于与 GitHub 集成。当构建开始时，它会向 GitHub 发送一个状态更新，将对应 Commit 的状态设置为“pending”（处理中）。这会让开发人员在 GitHub 的 Pull Request 或 Commit 页面上看到构建正在进行中，提供了即时反馈。通常与“GitHub Commit Status”插件配合使用。</li>
<li>**执行Windows批处理命令：**执行 <code>.bat</code> 或 <code>.cmd</code> 批处理脚本</li>
<li>**执行shell：**可以执行shell命令或shell脚本</li>
<li><strong>调用顶层 Maven 目标</strong>：调用 Maven 命令</li>
</ul><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260429103617178.png" alt="image-20260429103617178" /><figcaption>image-20260429103617178</figcaption></figure><p></p></section><section><h4>1.3.5.7 构建后操作<a href="#1357-构建后操作"><span>#</span></a></h4><ul>
<li><strong>Aggregate downstream test results</strong>：主要用于多模块或流水线项目。它会收集并汇总所有下游（即被当前任务触发的其他任务）的测试结果，让你在一个地方看到整个流程的测试报告。</li>
<li><strong>Publish JUnit test result report</strong>：专门用于发布 JUnit 格式的测试报告（通常是 XML 文件）。配置后，Jenkins 会解析这些文件，并在界面上展示详细的测试结果，如通过/失败数量、失败堆栈信息等。</li>
<li><strong>归档成品</strong>：将构建生成的关键文件（如 .jar, .war, .exe 等）保存到 Jenkins 服务器上。即使工作空间被清理，你依然可以在 Jenkins 的历史记录中下载这些文件。</li>
<li><strong>记录文件的指纹用于追踪</strong>：为指定文件生成唯一的指纹（如 MD5 校验码）。Jenkins 会记录哪个构建生成了该文件，以及哪个构建使用了它，非常适合追踪依赖关系和版本溯源。</li>
<li><strong>Delete workspace when build is done</strong>：构建结束后自动删除工作空间的所有文件。这能释放磁盘空间，确保下一次构建从一个干净的环境开始。</li>
<li><strong>构建其他工程</strong>：在当前任务成功后，自动触发一个或多个其他 Jenkins 任务的构建。这是实现任务链和复杂流水线的基础方式。</li>
<li><strong>Git Publisher</strong>：在构建成功后，将某些操作（如打 Tag、推送到特定分支）回写到 Git 仓库。</li>
<li><strong>E-mail Notification</strong>：通过 SMTP 发送标准的构建结果邮件（成功/失败）。通常需要配置收件人列表。</li>
<li><strong>Editable Email Notification</strong>：这是“E-mail Notification”的增强版。它允许你高度自定义邮件的主题、内容、收件人规则（例如：只在失败时发给开发者，成功时发给全员），并支持附件。</li>
<li><strong>Set GitHub commit status (universal)</strong>：向 GitHub 发送当前构建的最终状态（Success, Failure, Error）。这样在 GitHub 的 Commit 或 Pull Request 页面上，会显示一个绿色的对勾或红色的叉，直观地告诉开发人员代码是否通过了 CI。</li>
<li><strong>Set build status on GitHub commit [deprecated]</strong>：这是上述功能的旧版本，已不推荐使用，建议直接使用通用的版本。</li>
</ul><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260429111710457.png" alt="image-20260429111710457" /><figcaption>image-20260429111710457</figcaption></figure><p></p><ul>
<li>工作空间：任务配置保存在 <code>/var/jenkins_home/jobs/[TaskName]</code> 目录下，构建产物位于 <code>workspace</code> 子目录中。</li>
<li>构建步骤：</li>
<li>源码管理：配置 Git 仓库地址、凭据及分支。</li>
<li>构建触发器：支持定时构建、SCM 轮询或远程触发。</li>
<li>构建操作：支持 Shell 脚本、批处理命令、Maven/Gradle 构建等。</li>
<li>执行与查看：点击“立即构建”触发任务。在“控制台输出”中查看日志，在“工作空间”中查看生成的文件。</li>
</ul><blockquote><p>快速创建一个任务：</p><p>新建任务-&gt;构建自由风格的软件项目</p><p>通用设置、源码管理、构建触发器、构建环境这些<code>不填</code></p><p>构建步骤选择<code>sehll</code>，然后填入shell命令后保存 后，可以看到创建的任务</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260429112742125.png" alt="image-20260429112742125" /><figcaption>image-20260429112742125</figcaption></figure><p></p><p>点击进入任务后可以，点击立即构建，等一会可以看到构建历史</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260429112955388.png" alt="image-20260429112955388" /><figcaption>image-20260429112955388</figcaption></figure><p></p><p>查看构建控制台输出</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260429113024776.png" alt="image-20260429113024776" /><figcaption>image-20260429113024776</figcaption></figure><p></p><p>编辑编译信息可以修改描述</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260429113110757.png" alt="image-20260429113110757" /><figcaption>image-20260429113110757</figcaption></figure><p></p><p>修改后会在这里显示</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260429113156316.png" alt="image-20260429113156316" /><figcaption>image-20260429113156316</figcaption></figure><p></p></blockquote></section></section><section><h3>1.4.4 流水线创建<a href="#144-流水线创建"><span>#</span></a></h3><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260429131952332.png" alt="image-20260429131952332" /><figcaption>image-20260429131952332</figcaption></figure><p></p><p>进入后可以发现，<code>通用设置和构建触发器</code>和原先的自由风格的软件项目想吐，但<code>构建步骤和构建后操作</code>消失了，变成了<code>流水线和高级设置</code></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260429132402042.png" alt="image-20260429132402042" /><figcaption>image-20260429132402042</figcaption></figure><p></p><section><h4>1.4.4.1 流水线<a href="#1441-流水线"><span>#</span></a></h4><p>Pipeline 是 Jenkins 实现复杂构建逻辑的关键。</p><p>定义：流水线脚本（pipeline script）</p><ul>
<li>
<p>脚本类型：有各种常用的流水线语法，也可以使用下方的<code>流水线语法</code>查看语法示例结构</p>
<ul>
<li>
<p>声明式流水线（hello world）：语法简洁、结构化，适合大多数场景。</p>
</li>
<li>
<p>脚本式流水线（scripted pipeline）：语法灵活，适合复杂逻辑，但相对复杂。</p>
</li>
</ul>
</li>
</ul><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260429132348258.png" alt="image-20260429132348258" /><figcaption>image-20260429132348258</figcaption></figure><p></p><p>如果流水线文件在git仓库，则可以选择以下定义，然后填写相应的选项</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260429141736443.png" alt="image-20260429141736443" /><figcaption>image-20260429141736443</figcaption></figure><p></p></section><section><h4>1.4.4.2 快速构建流水线<a href="#1442-快速构建流水线"><span>#</span></a></h4><p>在流水线页面构建好后，然后保存</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260429152123348.png" alt="image-20260429152123348" /><figcaption>image-20260429152123348</figcaption></figure><p></p><p>之后进行构建</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260429152306542.png" alt="image-20260429152306542" /><figcaption>image-20260429152306542</figcaption></figure><p></p><p><code>stages</code>可以查看构建的各个阶段</p><p>构建完成后可以进行查看</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260429152435541.png" alt="image-20260429152435541" /><figcaption>image-20260429152435541</figcaption></figure><p></p></section><section><h4>1.4.4.3 jenkinsfile<a href="#1443-jenkinsfile"><span>#</span></a></h4><p>如果想把流水线文件也能够进行版本控制，那么就可以把流水线文件修改为<code>jenkinfile</code>然后跟随项目一同放入仓库</p><p>之后配置的时候流水线就是从仓库中拉取，然后配置仓库地址、仓库访问认证、构建分支、脚本路径等</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260429155556024.png" alt="image-20260429155556024" /><figcaption>image-20260429155556024</figcaption></figure><p></p></section></section><section><h3>1.4.5 具体示例<a href="#145-具体示例"><span>#</span></a></h3><p>使用 <strong>Jenkins + Docker + Maven</strong> 来构建一个简单的 Spring Boot 应用</p><p>完成一次完整的 CI/CD 闭环：</p><ol>
<li><strong>提交代码</strong> -&gt; 2. <strong>自动触发构建</strong> -&gt; 3. <strong>运行测试</strong> -&gt; 4. <strong>打包镜像</strong> -&gt; 5. <strong>自动运行容器</strong></li>
</ol><section><h4>1.4.5.1 关联docker<a href="#1451-关联docker"><span>#</span></a></h4><p>为了能在 Jenkins 里构建 Docker 镜像，需要把宿主机的 Docker 挂载进去</p><p>或者可以配置<code>云管理</code>中的docker（<strong>两者选择一个</strong>）</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>docker</span><span> </span><span>run</span><span> </span><span>-d</span><span> </span><span>--name</span><span> </span><span>jenkins</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>  </span><span>-p</span><span> </span><span>8080:8080</span><span> </span><span>-p</span><span> </span><span>50000:50000</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>  </span><span>-v</span><span> </span><span>jenkins_data:/var/jenkins_home</span><span> </span><span>\</span></div></div><div><div><div>4</div></div><div><span>  </span><span>-v</span><span> </span><span>/var/run/docker.sock:/var/run/docker.sock</span><span> </span><span>\</span></div></div><div><div><div>5</div></div><div><span>  </span><span>-v</span><span> </span><span>/usr/bin/docker:/usr/bin/docker</span><span> </span><span>\</span></div></div><div><div><div>6</div></div><div><span>  </span><span>jenkins/jenkins:lts-jdk17</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>赋予jenkins用户访问访问宿主机的 docker.sock权限</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>chmod</span><span> </span><span>666</span><span> </span><span>/var/run/docker.sock</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>1.4.5.2 安装插件<a href="#1452-安装插件"><span>#</span></a></h4><ul>
<li><strong>GitHub Integration Plugin</strong>（用于 Webhook 自动触发）</li>
<li><strong>Docker Pipeline</strong>（用于构建镜像）</li>
</ul></section><section><h4>1.4.5.3 配置全局工具<a href="#1453-配置全局工具"><span>#</span></a></h4><p>根据1.4.6 进行配置全局工具，配置jdk以及maven</p></section><section><h4>1.4.5.4 创建github仓库<a href="#1454-创建github仓库"><span>#</span></a></h4><p>创建公共仓库，然后创建文件</p><section><h5>1.<code>pom.xml</code><a href="#1pomxml"><span>#</span></a></h5><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;?</span><span>xml</span><span> version</span><span>=</span><span>"1.0"</span><span> encoding</span><span>=</span><span>"UTF-8"</span><span>?&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>project</span><span> </span><span>xmlns</span><span>=</span><span>"http://maven.apache.org/POM/4.0.0"</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>&lt;</span><span>modelVersion</span><span>&gt;4.0.0&lt;/</span><span>modelVersion</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>&lt;</span><span>groupId</span><span>&gt;com.example&lt;/</span><span>groupId</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>&lt;</span><span>artifactId</span><span>&gt;demo&lt;/</span><span>artifactId</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>&lt;</span><span>version</span><span>&gt;1.0&lt;/</span><span>version</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>&lt;</span><span>packaging</span><span>&gt;jar&lt;/</span><span>packaging</span><span>&gt;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>&lt;</span><span>parent</span><span>&gt;</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>&lt;</span><span>groupId</span><span>&gt;org.springframework.boot&lt;/</span><span>groupId</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>&lt;</span><span>artifactId</span><span>&gt;spring-boot-starter-parent&lt;/</span><span>artifactId</span><span>&gt;</span></div></div><div><div><div>12</div></div><div><span><span>        </span></span><span>&lt;</span><span>version</span><span>&gt;3.2.0&lt;/</span><span>version</span><span>&gt;</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>&lt;/</span><span>parent</span><span>&gt;</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>&lt;</span><span>properties</span><span>&gt;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>&lt;</span><span>java.version</span><span>&gt;21&lt;/</span><span>java.version</span><span>&gt; </span><span>&lt;!-- 明确指定 21 --&gt;</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>&lt;/</span><span>properties</span><span>&gt;</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>&lt;</span><span>dependencies</span><span>&gt;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>&lt;</span><span>dependency</span><span>&gt;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>&lt;</span><span>groupId</span><span>&gt;org.springframework.boot&lt;/</span><span>groupId</span><span>&gt;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>&lt;</span><span>artifactId</span><span>&gt;spring-boot-starter-web&lt;/</span><span>artifactId</span><span>&gt;</span></div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>&lt;/</span><span>dependency</span><span>&gt;</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>&lt;</span><span>dependency</span><span>&gt;</span></div></div><div><div><div>25</div></div><div><span><span>            </span></span><span>&lt;</span><span>groupId</span><span>&gt;org.springframework.boot&lt;/</span><span>groupId</span><span>&gt;</span></div></div><div><div><div>26</div></div><div><span><span>            </span></span><span>&lt;</span><span>artifactId</span><span>&gt;spring-boot-starter-test&lt;/</span><span>artifactId</span><span>&gt;</span></div></div><div><div><div>27</div></div><div><span><span>            </span></span><span>&lt;</span><span>scope</span><span>&gt;test&lt;/</span><span>scope</span><span>&gt;</span></div></div><div><div><div>28</div></div><div><span><span>        </span></span><span>&lt;/</span><span>dependency</span><span>&gt;</span></div></div><div><div><div>29</div></div><div><span><span>    </span></span><span>&lt;/</span><span>dependencies</span><span>&gt;</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>&lt;</span><span>build</span><span>&gt;</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>&lt;</span><span>plugins</span><span>&gt;</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>&lt;</span><span>plugin</span><span>&gt;</span></div></div><div><div><div>34</div></div><div><span><span>                </span></span><span>&lt;</span><span>groupId</span><span>&gt;org.springframework.boot&lt;/</span><span>groupId</span><span>&gt;</span></div></div><div><div><div>35</div></div><div><span><span>                </span></span><span>&lt;</span><span>artifactId</span><span>&gt;spring-boot-maven-plugin&lt;/</span><span>artifactId</span><span>&gt;</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>&lt;/</span><span>plugin</span><span>&gt;</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>&lt;/</span><span>plugins</span><span>&gt;</span></div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>&lt;/</span><span>build</span><span>&gt;</span></div></div><div><div><div>39</div></div><div><span>&lt;/</span><span>project</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h5>2. <code>Dockerfile</code><a href="#2-dockerfile"><span>#</span></a></h5><p><strong>用于打包运行</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># 使用 JDK 21 的运行时镜像</span></div></div><div><div><div>2</div></div><div><span>FROM</span><span> eclipse-temurin:21-jre-alpine</span></div></div><div><div><div>3</div></div><div><span>WORKDIR</span><span> /app</span></div></div><div><div><div>4</div></div><div><span># 复制 maven 打包好的 jar</span></div></div><div><div><div>5</div></div><div><span>COPY</span><span> target/demo-1.0.jar app.jar</span></div></div><div><div><div>6</div></div><div><span>ENTRYPOINT</span><span> [</span><span>"java"</span><span>, </span><span>"-jar"</span><span>, </span><span>"app.jar"</span><span>]</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h5>3. <code>src/main/java/com/example/DemoApplication.java</code><a href="#3-srcmainjavacomexampledemoapplicationjava"><span>#</span></a></h5><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>package</span><span><span> </span><span>com.example</span><span>;</span></span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>import</span><span> </span><span>org.springframework.boot.SpringApplication</span><span>;</span></div></div><div><div><div>4</div></div><div><span>import</span><span> </span><span>org.springframework.boot.autoconfigure.SpringBootApplication</span><span>;</span></div></div><div><div><div>5</div></div><div><span>import</span><span> </span><span>org.springframework.web.bind.annotation.GetMapping</span><span>;</span></div></div><div><div><div>6</div></div><div><span>import</span><span> </span><span>org.springframework.web.bind.annotation.RestController</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>@</span><span>SpringBootApplication</span></div></div><div><div><div>9</div></div><div><span>@</span><span>RestController</span></div></div><div><div><div>10</div></div><div><span>public</span><span> </span><span>class</span><span><span> </span><span>DemoApplication</span><span> </span></span><span>{</span></div></div><div><div><div>11</div></div><div><span>    </span><span>public</span><span> </span><span>static</span><span> </span><span>void</span><span> </span><span>main</span><span>(</span><span>String</span><span><span>[] </span><span>args</span><span>)</span><span> </span><span>{</span></span></div></div><div><div><div>12</div></div><div><span>        </span><span>SpringApplication</span><span>.</span><span>run</span><span>(</span><span>DemoApplication</span><span>.</span><span>class</span><span>, args);</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>@</span><span>GetMapping</span><span>(</span><span>"/"</span><span>)</span></div></div><div><div><div>16</div></div><div><span>    </span><span>public</span><span> </span><span>String</span><span> </span><span>hello</span><span><span>()</span><span> </span><span>{</span></span></div></div><div><div><div>17</div></div><div><span>        </span><span>return</span><span> </span><span>"Hello from Jenkins CI/CD with JDK 21!"</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h5>4. <code>Jenkinsfile</code><a href="#4-jenkinsfile"><span>#</span></a></h5><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>pipeline {</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>agent any</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>tools {</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>jdk </span><span>'jdk21'</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>maven </span><span>'maven-3.9.9'</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>environment {</span></div></div><div><div><div>10</div></div><div><span>        </span><span>IMAGE_NAME</span><span><span> </span><span>=</span><span> </span></span><span>"demo-app"</span></div></div><div><div><div>11</div></div><div><span>        </span><span>CONTAINER_NAME</span><span><span> </span><span>=</span><span> </span></span><span>"demo-container"</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>stages {</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>stage</span><span>(</span><span>'拉取代码'</span><span>) {</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>steps {</span></div></div><div><div><div>17</div></div><div><span><span>                </span></span><span>checkout scm</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>stage</span><span>(</span><span>'编译构建'</span><span>) {</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>steps {</span></div></div><div><div><div>23</div></div><div><span><span>                </span></span><span>sh </span><span>'mvn clean package -DskipTests'</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span><span>        </span></span><span>stage</span><span>(</span><span>'Docker 清理缓存（防构建失败）'</span><span>) {</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>steps {</span></div></div><div><div><div>29</div></div><div><span><span>                </span></span><span>script {</span></div></div><div><div><div>30</div></div><div><span>                    </span><span>// 安全清理 Docker 构建缓存，不影响运行中的容器</span></div></div><div><div><div>31</div></div><div><span><span>                    </span></span><span>sh </span><span>"docker builder prune -a -f"</span></div></div><div><div><div>32</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>34</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span><span>        </span></span><span>stage</span><span>(</span><span>'构建并运行 Docker'</span><span>) {</span></div></div><div><div><div>37</div></div><div><span><span>            </span></span><span>steps {</span></div></div><div><div><div>38</div></div><div><span><span>                </span></span><span>script {</span></div></div><div><div><div>39</div></div><div><span>                    </span><span>// 1. 构建镜像</span></div></div><div><div><div>40</div></div><div><span><span>                    </span></span><span>sh </span><span>"docker build -t </span><span>${</span><span>IMAGE_NAME</span><span>}</span><span> ."</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span>                    </span><span>// 2. 停止并删除旧容器</span></div></div><div><div><div>43</div></div><div><span><span>                    </span></span><span>sh </span><span>"""</span></div></div><div><div><div>44</div></div><div><span><span>                        </span></span><span>if [ </span><span>\$</span><span>(docker ps -aq --filter name=</span><span>\$</span><span>{CONTAINER_NAME}) ]; then</span></div></div><div><div><div>45</div></div><div><span><span>                            </span></span><span>docker stop </span><span>\$</span><span>{CONTAINER_NAME}</span></div></div><div><div><div>46</div></div><div><span><span>                            </span></span><span>docker rm </span><span>\$</span><span>{CONTAINER_NAME}</span></div></div><div><div><div>47</div></div><div><span><span>                        </span></span><span>fi</span></div></div><div><div><div>48</div></div><div><span><span>                    </span></span><span>"""</span></div></div><div><div><div>49</div></div><div>
</div></div><div><div><div>50</div></div><div><span>                    </span><span>// 3. 运行新容器</span></div></div><div><div><div>51</div></div><div><span><span>                    </span></span><span>sh </span><span>"docker run -d -p 8081:8080 --name </span><span>\$</span><span>{CONTAINER_NAME} </span><span>\$</span><span>{IMAGE_NAME}"</span></div></div><div><div><div>52</div></div><div><span><span>                </span></span><span>}</span></div></div><div><div><div>53</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>54</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>55</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>56</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section><section><h4>1.4.5.5 jenkins任务配置<a href="#1455-jenkins任务配置"><span>#</span></a></h4><ol>
<li>点击 <strong>New Item</strong>，输入任务名称，选择 <strong>Pipeline</strong>，点击 OK。</li>
<li><strong>General</strong> -&gt; 勾选 <strong>GitHub project</strong>，填入你的项目 URL (<code>https://github.com/你的用户名/jenkins-practice</code>)。</li>
</ol><p>​	</p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430171256987.png" alt="image-20260430171256987" /><figcaption>image-20260430171256987</figcaption></figure><p></p><ol>
<li>
<p><strong>Build Triggers</strong> -&gt; 勾选 <strong>GitHub hook trigger for GITScm polling</strong>。</p>
<p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430171320409.png" alt="image-20260430171320409" /><figcaption>image-20260430171320409</figcaption></figure><p></p>
</li>
<li>
<p>Pipeline -&gt; Definition 选择 <code>Pipeline script from SCM</code></p>
<ul>
<li>
<p>SCM 选择 <strong>Git</strong>。</p>
</li>
<li>
<p>Repository URL 填入你的 GitHub 仓库地址。</p>
</li>
<li>
<p>(如果需要) Credentials 填入你的 GitHub 账号密码/Token，这里是公共仓库，因此不用</p>
</li>
<li>
<p>Script Path 保持默认的 <code>Jenkinsfile</code>。</p>
</li>
<li>
<p>分支为<code>main</code></p>
</li>
</ul>
</li>
</ol><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430171449625.png" alt="image-20260430171449625" /><figcaption>image-20260430171449625</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430171552074.png" alt="image-20260430171552074" /><figcaption>image-20260430171552074</figcaption></figure><p></p><p>点击<code>save</code>保存</p></section><section><h4>1.4.5.6 使用jenkins构建<a href="#1456-使用jenkins构建"><span>#</span></a></h4><p>回到构建页面后，点击<code>立即构建</code>，可以看到在构建中</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430171744449.png" alt="image-20260430171744449" /><figcaption>image-20260430171744449</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430171816683.png" alt="image-20260430171816683" /><figcaption>image-20260430171816683</figcaption></figure><p></p></section><section><h4>1.4.5.7 访问网页<a href="#1457-访问网页"><span>#</span></a></h4><p>构建成功后，访问网页<code>ip:8081</code>，可以看到已经成功</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430171914338.png" alt="image-20260430171914338" /><figcaption>image-20260430171914338</figcaption></figure><p></p></section><section><h4>1.4.5.8 配置webhook<a href="#1458-配置webhook"><span>#</span></a></h4><p>实现github提交代码后主动发送http请求到jenkins服务器，触发构建</p><ol>
<li>
<p>进入你的 GitHub 仓库页面，点击 <strong>Settings</strong></p>
</li>
<li>
<p>左侧菜单点击 <strong>Webhooks</strong> -&gt; <strong>Add webhook</strong>。</p>
</li>
<li>
<p><strong>Payload URL</strong>: 填写 <code>http://你的服务器IP:8080/github-webhook/</code></p>
<ol>
<li><strong>注意</strong>：结尾的斜杠 <code>/</code> 不能少。</li>
<li><strong>重要</strong>：如果你的服务器没有公网 IP（比如是在家里局域网），GitHub 是访问不到你的 Jenkins 的。这种情况下你需要使用 <strong>ngrok</strong> 做内网穿透，或者暂时手动测试。</li>
</ol>
</li>
<li>
<p><strong>Content type</strong>: 选择 <code>application/json</code>。</p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260506111840232.png" alt="image-20260506111840232" /><figcaption>image-20260506111840232</figcaption></figure><p></p>
</li>
<li>
<p><strong>Which events?</strong>: 选择 <code>Just the push event</code>。
</p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260506111851584.png" alt="image-20260506111851584" /><figcaption>image-20260506111851584</figcaption></figure><p></p>
</li>
<li>
<p>点击 <strong>Add webhook</strong>。</p>
</li>
<li>
<p>之后修改代码触发构建</p>
</li>
</ol></section></section><section><h3>1.4.5 全局构建工具设置<a href="#145-全局构建工具设置"><span>#</span></a></h3><p>在“系统管理” -&gt; “全局工具配置”中预先安装并配置 JDK、Maven 等工具，供 Pipeline 脚本调用。</p><section><h4>1.4.5.1 maven配置<a href="#1451-maven配置"><span>#</span></a></h4><p>默认设置即可</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430103105017.png" alt="image-20260430103105017" /><figcaption>image-20260430103105017</figcaption></figure><p></p></section><section><h4>1.4.5.2 jdk安装<a href="#1452-jdk安装"><span>#</span></a></h4><p>填写<code>别名和路径</code></p><p>路径为具体的jdk安装目录，取消自动安装</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430103140134.png" alt="image-20260430103140134" /><figcaption>image-20260430103140134</figcaption></figure><p></p></section><section><h4>1.4.5.3 git安装<a href="#1453-git安装"><span>#</span></a></h4><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430103438238.png" alt="image-20260430103438238" /><figcaption>image-20260430103438238</figcaption></figure><p></p></section><section><h4>1.4.5.4 maven安装<a href="#1454-maven安装"><span>#</span></a></h4><p>如果<code>gradle、ant、docker</code>等工具如果需要，这可以进行配置，本文用不上，则不配置直接配置maven</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430103748982.png" alt="image-20260430103748982" /><figcaption>image-20260430103748982</figcaption></figure><p></p></section></section><section><h3>1.4.6 云管理<a href="#146-云管理"><span>#</span></a></h3><p>为了解决单机负载瓶颈，Jenkins 支持分布式构建架构。可以添加多个从节点。</p><ul>
<li>Master（主节点）：系统控制中心，负责任务调度与资源分配。</li>
<li>Agent（从节点）：实际执行构建任务的机器，可分担负载并运行不同环境（如不同操作系统、工具链）。</li>
</ul><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260429160348332.png" alt="image-20260429160348332" /><figcaption>image-20260429160348332</figcaption></figure><p></p><p><code>节点和云管理：</code>主要添加、删除管理一些静态的固定节点，比如<code>虚拟机或者物理机</code>。直接添加节点的IP地址和认证信息就能使用</p><p><code>clouds：</code>主要是用来配置一些动态的节点，比如<code>docker容器和k8s集群</code></p><section><h4>1.4.6.1 Docker Cloud（动态云节点）<a href="#1461-docker-cloud动态云节点"><span>#</span></a></h4><p>利用 Docker 容器实现动态 Agent 节点，是目前主流且高效的方案。</p><section><h5>1. 安装docker插件<a href="#1-安装docker插件"><span>#</span></a></h5><p>在<code>插件管理</code>中搜索<code>docker</code>然后安装，安装好以后重启jenkins</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430111508449.png" alt="image-20260430111508449" /><figcaption>image-20260430111508449</figcaption></figure><p></p></section><section><h5>2.配置云<a href="#2配置云"><span>#</span></a></h5><p>新建<code>云</code></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430111600113.png" alt="image-20260430111600113" /><figcaption>image-20260430111600113</figcaption></figure><p></p><p>因为安装docker插件，这里有了docker类型的选项</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430111624334.png" alt="image-20260430111624334" /><figcaption>image-20260430111624334</figcaption></figure><p></p></section><section><h5>3. 创建容器与云对接<a href="#3-创建容器与云对接"><span>#</span></a></h5><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 在服务器创建一个容器</span></div></div><div><div><div>2</div></div><div><span># 通过 socat 把宿主机的 Docker 守护进程（Unix Socket）暴露成一个 TCP 端口服务</span></div></div><div><div><div>3</div></div><div><span>docker</span><span> </span><span>run</span><span> </span><span>-itd</span><span> </span><span>\</span></div></div><div><div><div>4</div></div><div><span>  </span><span>--restart</span><span> </span><span>always</span><span> </span><span>\</span></div></div><div><div><div>5</div></div><div><span>  </span><span>--publish</span><span> </span><span>127.0.0.1:2376:2375</span><span> </span><span>\</span></div></div><div><div><div>6</div></div><div><span>  </span><span>--name</span><span> </span><span>alpine</span><span> </span><span>\</span></div></div><div><div><div>7</div></div><div><span>  </span><span>--volume</span><span> </span><span>/var/run/docker.sock:/var/run/docker.sock</span><span> </span><span>\</span></div></div><div><div><div>8</div></div><div><span>  </span><span>alpine/socat</span><span> </span><span>tcp-listen:2375,fork,reuseaddr</span><span> </span><span>unix-connect:/var/run/docker.sock</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>  </span><span># 查看容器的ip地址</span></div></div><div><div><div>11</div></div><div><span>  </span><span>docker</span><span> </span><span>inspect</span><span> </span><span>alpine</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>将IP地址填入Docker Host URI中</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430112319656.png" alt="image-20260430112319656" /><figcaption>image-20260430112319656</figcaption></figure><p></p><p>点击<code>测试连接</code>，如果可以显示docker的版本信息和api版本，那么就表示<code>jenkins可以成功链接到docker的守护进程</code></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430112848349.png" alt="image-20260430112848349" /><figcaption>image-20260430112848349</figcaption></figure><p></p><p>最后，勾选<code>enable</code>保存确认，完成配置</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430112925624.png" alt="image-20260430112925624" /><figcaption>image-20260430112925624</figcaption></figure><p></p></section><section><h5>4. 创建docker agent模板<a href="#4-创建docker-agent模板"><span>#</span></a></h5><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430113200134.png" alt="image-20260430113200134" /><figcaption>image-20260430113200134</figcaption></figure><p></p><p>添加节点的<code>标签</code>，用于后续流水线文件在哪里进行构建</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430113553547.png" alt="image-20260430113553547" /><figcaption>image-20260430113553547</figcaption></figure><p></p><p>勾选启动后，填写名称</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430113844325.png" alt="image-20260430113844325" /><figcaption>image-20260430113844325</figcaption></figure><p></p><p>填写构建时使用的镜像，这里使用官方提供的两个镜像，<code>jenkins/inbound-agent、jenkins/agent</code></p><p>如果不想使用官方的镜像，也可以使用<code>其他镜像或者自己构建镜像</code></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430114013780.png" alt="image-20260430114013780" /><figcaption>image-20260430114013780</figcaption></figure><p></p><p>设置实例并发量，这里设置成 2</p><p>表示该节点最大执行2个任务，如果有3个任务分配到该节点，那么就会等待前2个完成后再执行第3个任务</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430114337919.png" alt="image-20260430114337919" /><figcaption>image-20260430114337919</figcaption></figure><p></p><p>最后保存，完成模板配置</p></section><section><h5>5. 使用运行<a href="#5-使用运行"><span>#</span></a></h5><p>创建一个流水线脚本，里面的<code>agent</code>,指定为之前的agent标签，即<code>docker_agent1</code></p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>pipeline</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>agent</span><span> </span><span>{label</span><span> </span><span>'docker_agent1'}</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>    </span><span>stages</span><span> </span><span>{</span></div></div><div><div><div>5</div></div><div><span>        </span><span>stage(</span><span>'第一阶段'</span><span>) {</span></div></div><div><div><div>6</div></div><div><span>            </span><span>steps</span><span> </span><span>{</span></div></div><div><div><div>7</div></div><div><span>                </span><span>echo</span><span> </span><span>'第一阶段'</span></div></div><div><div><div>8</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>10</div></div><div><span>        </span><span>stage(</span><span>'第二阶段'</span><span>) {</span></div></div><div><div><div>11</div></div><div><span>            </span><span>steps</span><span> </span><span>{</span></div></div><div><div><div>12</div></div><div><span>                </span><span>echo</span><span> </span><span>'第二阶段'</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>15</div></div><div><span>        </span><span>stage(</span><span>'第三阶段'</span><span>) {</span></div></div><div><div><div>16</div></div><div><span>            </span><span>steps</span><span> </span><span>{</span></div></div><div><div><div>17</div></div><div><span>                </span><span>echo</span><span> </span><span>'第三阶段'</span></div></div><div><div><div>18</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>21</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>保存后点击<code>立即构建</code>，可以看到运行成功</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430131023542.png" alt="image-20260430131023542" /><figcaption>image-20260430131023542</figcaption></figure><p></p><p>进入<code>云管理页面</code>查看统计的构建次数</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430133713530.png" alt="image-20260430133713530" /><figcaption>image-20260430133713530</figcaption></figure><p></p><p>可以看到之前构建的一些历史记录</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/jenkins/image-20260430133859012.png" alt="image-20260430133859012" /><figcaption>image-20260430133859012</figcaption></figure><p></p></section></section></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/nginx%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%AE%9E%E8%B7%B5%E6%93%8D%E4%BD%9C/</id>
      <title type="text">nginx负载均衡实践操作</title>
      <published>2026-07-01T00:00:00.000Z</published>
      <updated>2026-07-01T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/nginx%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%AE%9E%E8%B7%B5%E6%93%8D%E4%BD%9C/"/>
      <summary type="text">nginx负载均衡实践操作文档</summary>
      <content type="html"><![CDATA[<section><h1>配置Nginx实现负载均衡<a href="#配置nginx实现负载均衡"><span>#</span></a></h1><section><h2>一、准备环境<a href="#一准备环境"><span>#</span></a></h2><p>至少三台如下机器：</p>

<table><thead><tr><th>服务器角色</th><th>IP 地址</th><th>核心服务</th></tr></thead><tbody><tr><td>负载均衡服务器</td><td>10.1.1.23</td><td>Nginx</td></tr><tr><td>Web 服务器 1</td><td>10.1.1.34</td><td>Nginx</td></tr><tr><td>Web 服务器 2</td><td>10.1.1.36</td><td>Nginx</td></tr></tbody></table><p>其中 <code>10.1.1.34</code> 和 <code>10.1.1.36</code> 需部署好静态站点，且单独访问能正常打开站点，配置示例如下：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 10.1.1.34</span></div></div><div><div><div>2</div></div><div><span>## 写入一个简单的 HTML</span></div></div><div><div><div>3</div></div><div><span>echo</span><span> </span><span>"&lt;h1&gt;Hello Nginx! 这是我的第一个示例页面。&lt;/h1&gt;"</span><span> &gt; </span><span>/usr/local/nginx/html/index.html</span></div></div><div><div><div>4</div></div><div><span>## 创建站点配置文件</span></div></div><div><div><div>5</div></div><div><span>cat</span><span> &gt; </span><span>/usr/local/nginx/conf/conf.d/site.conf</span><span> </span><span>&lt;</span><span>&lt;</span><span>'EOF'</span></div></div><div><div><div>6</div></div><div><span>server</span><span> </span><span>{</span></div></div><div><div><div>7</div></div><div><span>    </span><span>listen</span><span> </span><span>80</span><span>;</span></div></div><div><div><div>8</div></div><div><span>    </span><span>server_name</span><span> </span><span>localhost</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>    </span><span>root</span><span> </span><span>/usr/local/nginx/html</span><span>;</span></div></div><div><div><div>11</div></div><div><span>    </span><span>index</span><span> </span><span>index.html</span><span>;</span></div></div><div><div><div>12</div></div><div><span>    </span><span>charset</span><span> </span><span>utf-8</span><span>;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>    </span><span>location</span><span> </span><span>/</span><span> </span><span>{</span></div></div><div><div><div>15</div></div><div><span>        </span><span>try_files</span><span> </span><span>$uri</span><span> </span><span>$uri</span><span>/</span><span> </span><span>=</span><span>404</span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>    </span><span>error_page</span><span> </span><span>404</span><span> </span><span>/404.html</span><span>;</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div><div><div><div>20</div></div><div><span>EOF</span></div></div><div><div><div>21</div></div><div><span>## 重载 Nginx</span></div></div><div><div><div>22</div></div><div><span>nginx</span><span> </span><span>-t</span></div></div><div><div><div>23</div></div><div><span>nginx</span><span> </span><span>-s</span><span> </span><span>reload</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span># 10.1.1.36</span></div></div><div><div><div>26</div></div><div><span>## 写入一个简单的 HTML</span></div></div><div><div><div>27</div></div><div><span>echo</span><span> </span><span>"&lt;h1&gt;Hello Nginx! 这是我的第二个示例页面。&lt;/h1&gt;"</span><span> &gt; </span><span>/usr/local/nginx/html/index.html</span></div></div><div><div><div>28</div></div><div><span>## 创建站点配置文件</span></div></div><div><div><div>29</div></div><div><span>cat</span><span> &gt; </span><span>/usr/local/nginx/conf/conf.d/site.conf</span><span> &lt;&lt;</span><span>'EOF'</span></div></div><div><div><div>30</div></div><div><span>server {</span></div></div><div><div><div>31</div></div><div><span><span>    </span></span><span>listen 80;</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>server_name localhost;</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>root /usr/local/nginx/html;</span></div></div><div><div><div>35</div></div><div><span><span>    </span></span><span>index index.html;</span></div></div><div><div><div>36</div></div><div><span><span>    </span></span><span>charset utf-8;</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span><span>    </span></span><span>location / {</span></div></div><div><div><div>39</div></div><div><span><span>        </span></span><span>try_files $uri $uri/ =404;</span></div></div><div><div><div>40</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>error_page 404 /404.html;</span></div></div><div><div><div>43</div></div><div><span>}</span></div></div><div><div><div>44</div></div><div><span>EOF</span></div></div><div><div><div>45</div></div><div><span>## 重载 Nginx</span></div></div><div><div><div>46</div></div><div><span>nginx</span><span> </span><span>-t</span></div></div><div><div><div>47</div></div><div><span>nginx</span><span> </span><span>-s</span><span> </span><span>reload</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h2>二、配置Nginx负载均衡<a href="#二配置nginx负载均衡"><span>#</span></a></h2><section><h3>2.1 创建Nginx配置文件<a href="#21-创建nginx配置文件"><span>#</span></a></h3><p>在 <code>10.1.1.23</code> 负载均衡服务器中，在 Nginx 安装目录的 <code>conf/conf.d</code> 目录下，创建名为 <code>load_balance.conf</code> 的配置文件，并添加以下内容：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>/usr/local/nginx/conf/conf.d/load_balance.conf</span><span> &lt;&lt;</span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>upstream web_servers {</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>server 10.1.1.34:80 weight=1 max_fails=3 fail_timeout=30s;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>server 10.1.1.36:80 weight=1 max_fails=3 fail_timeout=30s;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>keepalive 32;</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>server {</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>listen 80;</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>server_name _;</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>location / {</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>proxy_pass http://web_servers;</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>proxy_set_header Host $host;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>proxy_set_header X-Real-IP $remote_addr;</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>proxy_connect_timeout 60s;</span></div></div><div><div><div>20</div></div><div><span><span>        </span></span><span>proxy_send_timeout 60s;</span></div></div><div><div><div>21</div></div><div><span><span>        </span></span><span>proxy_read_timeout 60s;</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span><span>        </span></span><span>proxy_http_version 1.1;</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>proxy_set_header Connection "";</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>}</span></div></div><div><div><div>27</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><p><strong>参数解释</strong>：</p><ul>
<li>
<p><code>upstream</code> 模块：定义“后端资源池”，这一块定义了具体有哪些服务器在干活。</p>
<ul>
<li><strong><code>upstream web_servers</code></strong>：给这组服务器起个名字叫 <code>web_servers</code>。</li>
<li><strong><code>server 10.1.1.34:80 ...</code></strong>：
<ul>
<li><strong><code>weight=1</code></strong>：加权轮询，表示权重，默认为 <code>1</code> ，数值越大分配请求越多。这里设置两台都为 <code>1</code> ，表示请求会按 <code>1:1</code> 的比例轮询分发。</li>
<li><strong><code>max_fails=3</code></strong>：如果在 <code>30</code> 秒内连接失败了 <code>3</code> 次，Nginx 会认为这台机器宕机了不可用。</li>
<li><strong><code>fail_timeout=30s</code></strong>：配合上面的参数，表示判定失效的时间周期。</li>
</ul>
</li>
<li><strong><code>keepalive 32</code></strong>：<strong>性能优化关键点</strong>。Nginx 会与后端服务器保持 32 个长连接，避免每次请求都重新进行 TCP 三次握手，大大降低延迟并节省 CPU。</li>
</ul>
</li>
<li>
<p><code>server</code> 模块：监听与入口。</p>
<ul>
<li><strong><code>listen 80;</code></strong>：Nginx 代理服务器本身监听 80 端口。</li>
<li><strong><code>server_name _;</code></strong>：这是一个泛域名写法，表示匹配所有指向这台服务器 IP 的请求。</li>
</ul>
</li>
<li>
<p><code>location /</code>：代理与转发逻辑，这里决定了请求如何被“加工”并送到后端。</p>
<ul>
<li>
<p><strong>转发核心</strong>：</p>
<ul>
<li><strong><code>proxy_pass http://web_servers;</code></strong>：核心指令。告诉 Nginx 把请求扔给刚才在 <code>upstream</code> 里定义的那个池子。</li>
</ul>
</li>
<li>
<p><strong>超时设置（稳定性保障）</strong>：</p>
<ul>
<li>
<p><strong><code>proxy_set_header Host $host;</code></strong>：把客户端请求的原始域名传给后端。</p>
</li>
<li>
<p><strong><code>proxy_set_header X-Real-IP $remote_addr;</code></strong>：把 客户端真实的 IP 传给后端。</p>
</li>
<li>
<p><strong><code>proxy_set_header X-Forwarded-For ...</code></strong>：记录完整的代理链路 IP。如果中间经过了多层代理，这个头会像接力棒一样记录所有 IP。</p>
</li>
</ul>
</li>
<li>
<p><strong>长连接优化</strong>：</p>
<ul>
<li>
<p><strong><code>proxy_connect_timeout 60s;</code></strong>：Nginx 连接后端服务器的最长等待时间。</p>
<p><strong><code>proxy_read_timeout 60s;</code></strong>：后端服务器处理完逻辑，把结果传回给 Nginx 的最长等待时间（如果后端业务很慢，这个值要调大）。</p>
</li>
<li>
<p><strong><code>proxy_http_version 1.1;</code></strong> 和 <strong><code>proxy_set_header Connection "";</code></strong>：这两行必须配合 <code>upstream</code> 里的 <code>keepalive</code> 使用。它们强制 Nginx 使用 HTTP/1.1 协议与后端通信，并清除默认的 <code>Close</code> 头部，从而真正开启长连接模式。</p>
</li>
</ul>
</li>
</ul>
</li>
</ul></blockquote></section><section><h3>2.2 重载Nginx<a href="#22-重载nginx"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>nginx</span><span> </span><span>-t</span></div></div><div><div><div>2</div></div><div><span>nginx</span><span> </span><span>-s</span><span> </span><span>reload</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.3 验证配置<a href="#23-验证配置"><span>#</span></a></h3><section><h4>2.3.1 快速验证<a href="#231-快速验证"><span>#</span></a></h4><p>这种方法通过让两台 Web 服务器返回<strong>不同的标识内容</strong>，直观看到请求被分发到不同服务器。</p><p><strong>步骤 1：在两台 Web 服务器添加标识文件</strong></p><p>分别登录 <code>10.1.1.34</code> 和 <code>10.1.1.36</code> 服务器，在静态站点根目录创建测试文件：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 10.1.1.34</span></div></div><div><div><div>2</div></div><div><span>echo</span><span> </span><span>"This is Web Server 10.1.1.34"</span><span> &gt; </span><span>/usr/local/nginx/html/test.txt</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 10.1.1.36</span></div></div><div><div><div>5</div></div><div><span>echo</span><span> </span><span>"This is Web Server 10.1.1.36"</span><span> &gt; </span><span>/usr/local/nginx/html/test.txt</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>步骤 2：客户端多次访问负载均衡服务器</strong></p><p>在任意能访问 <code>10.1.1.23</code> 服务器的机器上（本地电脑 / 服务器）执行多次 <code>curl</code> 命令：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>for</span><span> </span><span>i</span><span> </span><span>in</span><span> {</span><span>1..10}</span><span>; </span><span>do</span><span> </span><span>curl</span><span> </span><span>http://10.1.1.23/test.txt</span><span>; </span><span>echo</span><span>; </span><span>done</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>执行结果中，输出会交替出现 <code>This is Web Server 10.1.1.34</code> 和 <code>This is Web Server 10.1.1.36</code>，说明请求被均衡分发（权重均为 <code>1</code> 时，数量大致各占一半）：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>This</span><span> </span><span>is</span><span> </span><span>Web</span><span> </span><span>Server</span><span> </span><span>10.1.1.34</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>This</span><span> </span><span>is</span><span> </span><span>Web</span><span> </span><span>Server</span><span> </span><span>10.1.1.36</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>This</span><span> </span><span>is</span><span> </span><span>Web</span><span> </span><span>Server</span><span> </span><span>10.1.1.34</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>This</span><span> </span><span>is</span><span> </span><span>Web</span><span> </span><span>Server</span><span> </span><span>10.1.1.36</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>2.3.2 日志验证<a href="#232-日志验证"><span>#</span></a></h4><p>通过查看两台 Web 服务器的 Nginx 访问日志，统计请求数量，验证分发均衡性。</p><p><strong>步骤 1：查看 Nginx 访问日志</strong></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 10.1.1.34</span></div></div><div><div><div>2</div></div><div><span>## 实时查看新增请求</span></div></div><div><div><div>3</div></div><div><span>tail</span><span> </span><span>-f</span><span> </span><span>/usr/local/nginx/logs/access.log</span></div></div><div><div><div>4</div></div><div><span>## 或统计总请求数</span></div></div><div><div><div>5</div></div><div><span>grep</span><span> </span><span>"GET /"</span><span> </span><span>/usr/local/nginx/logs/access.log</span><span> | </span><span>wc</span><span> </span><span>-l</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 10.1.1.36</span></div></div><div><div><div>8</div></div><div><span>## 实时查看新增请求</span></div></div><div><div><div>9</div></div><div><span>tail</span><span> </span><span>-f</span><span> </span><span>/opt/nginx/logs/access.log</span></div></div><div><div><div>10</div></div><div><span>## 或统计总请求数</span></div></div><div><div><div>11</div></div><div><span>grep</span><span> </span><span>"GET /"</span><span> </span><span>/opt/nginx/logs/access.log</span><span> | </span><span>wc</span><span> </span><span>-l</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>关键日志信息解读</strong>：</p><p>日志中会显示 **负载均衡服务器 <code>10.1.1.23</code> **作为请求来源，例如：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>10.22.51.47</span><span> </span><span>-</span><span> </span><span>-</span><span> [07/Mar/2026:13:37:36 </span><span>+0800]</span><span> </span><span>"GET /test.txt HTTP/1.1"</span><span> </span><span>200</span><span> </span><span>31</span><span> </span><span>"-"</span><span> </span><span>"curl/7.29.0"</span><span> </span><span>"10.22.51.47"</span><span> </span><span>"10.1.1.23"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>多次访问后，<code>10.1.1.34</code> 和 <code>10.1.1.36</code> 服务器的日志中都会出现此类记录，且数量基本相等。</p><blockquote><p><strong>注</strong>：这里的日志格式配置为：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>    </span><span>log_format</span><span>  </span><span>main</span><span>  </span><span>'$remote_addr - $remote_user [$time_local] "$request" '</span></div></div><div><div><div>2</div></div><div><span>                      </span><span>'$status $body_bytes_sent "$http_referer" '</span></div></div><div><div><div>3</div></div><div><span>                      </span><span>'"$http_user_agent" "$http_x_forwarded_for" "$realip_remote_addr"'</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>一般情况下，对于后端服务器来说，直接和它“握手”建立连接的是负载均衡器，因此：</p><ul>
<li><strong><code>$remote_addr</code></strong>：默认获取的是直接连接者的 IP，即 <code>10.1.1.23</code> 。</li>
<li><strong><code>$http_x_forwarded_for</code></strong>：这是负载均衡器在转发时塞进 HTTP 头部的信息，里面才包含原始客户端的 IP <code>10.22.51.47</code> 。</li>
</ul><p>而这里因为配置了：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>    </span><span>set_real_ip_from</span><span> </span><span>10.1.1.23</span><span>;     </span><span># 设置负载均衡器的 IP 段（信任这个 IP 发来的头部信息）</span></div></div><div><div><div>2</div></div><div><span>    </span><span>real_ip_header</span><span> </span><span>X-Forwarded-For</span><span>;   </span><span># 指定从 X-Forwarded-For 头部获取真实的客户端 IP</span></div></div><div><div><div>3</div></div><div><span>    </span><span>real_ip_recursive</span><span> </span><span>on</span><span>;             </span><span># 递归排除掉信任的代理 IP</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>从而使Nginx 的变量行为会发生<strong>反转</strong>：</p>

<table><thead><tr><th><strong>变量名</strong></th><th><strong>配置前</strong></th><th><strong>配置后（开启 RealIP）</strong></th></tr></thead><tbody><tr><td><strong><code>$remote_addr</code></strong></td><td>10.1.1.23 (LB IP)</td><td><strong>10.22.51.47 (客户端 IP)</strong></td></tr><tr><td><strong><code>$realip_remote_addr</code></strong></td><td>10.1.1.23 (LB IP)</td><td><strong>10.1.1.23 (LB IP)</strong></td></tr></tbody></table></blockquote></section><section><h4>2.3.3 进阶验证<a href="#233-进阶验证"><span>#</span></a></h4><p>若想更直观看到负载均衡的状态（如后端服务器健康状态、请求数），可开启 Nginx 的 <code>stub_status</code> 状态模块。</p><p><strong>步骤 1：在Web服务器修改 Nginx 配置</strong></p><p>在 <code>server</code> 块中添加状态监控配置：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>/usr/local/nginx/conf/conf.d/site.conf</span><span> &lt;&lt;</span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>server {</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>listen 80;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>server_name localhost;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>root /usr/local/nginx/html;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>index index.html;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>charset utf-8;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>location / {</span></div></div><div><div><div>11</div></div><div><span><span>        </span></span><span>try_files $uri $uri/ =404;</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>location /nginx_status {</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>stub_status on;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>allow 127.0.0.1;        # 允许本机访问</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>allow 10.22.51.0/24;    # 允许内网段访问</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>deny all;               # 拒绝其他所有访问</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>error_page 404 /404.html;</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div><div><div><div>23</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p><strong>步骤 2：重载 Nginx</strong></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>nginx</span><span> </span><span>-t</span></div></div><div><div><div>2</div></div><div><span>nginx</span><span> </span><span>-s</span><span> </span><span>reload</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>步骤 3：在负载均衡服务器访问状态页</strong></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>curl</span><span> </span><span>http://127.0.0.1/nginx_status</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>状态页输出解读（关键信息）：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>Active</span><span> </span><span>connections:</span><span> </span><span>2</span></div></div><div><div><div>2</div></div><div><span>server</span><span> </span><span>accepts</span><span> </span><span>handled</span><span> </span><span>requests</span></div></div><div><div><div>3</div></div><div><span> </span><span>10</span><span> </span><span>10</span><span> </span><span>20</span></div></div><div><div><div>4</div></div><div><span>Reading:</span><span> </span><span>0</span><span> </span><span>Writing:</span><span> </span><span>1</span><span> </span><span>Waiting:</span><span> </span><span>1</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 结合 upstream 状态（需额外模块，可选）</span></div></div><div><div><div>7</div></div><div><span># 主流方式：通过上述日志/测试文件验证即可</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section></section><section><h2>三、七层代理与四层代理<a href="#三七层代理与四层代理"><span>#</span></a></h2><section><h3>3.1 七层代理（HTTP/HTTPS 层）<a href="#31-七层代理httphttps-层"><span>#</span></a></h3><p>完整七层代理配置：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>user</span><span>  </span><span>root</span><span>;</span></div></div><div><div><div>2</div></div><div><span>worker_processes</span><span>  </span><span>auto</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>error_log</span><span>  </span><span>logs/error.log</span><span>;</span></div></div><div><div><div>5</div></div><div><span>pid</span><span>        </span><span>logs/nginx.pid</span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>events</span><span> </span><span>{</span></div></div><div><div><div>8</div></div><div><span>    </span><span>worker_connections</span><span>  </span><span>1024</span><span>;</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>http</span><span> </span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>include</span><span>       </span><span>mime.types</span><span>;</span></div></div><div><div><div>13</div></div><div><span>    </span><span>include</span><span>       </span><span>conf.d/</span><span>*</span><span>.conf</span><span>;</span></div></div><div><div><div>14</div></div><div><span>    </span><span>default_type</span><span>  </span><span>application/octet-stream</span><span>;</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>    </span><span>log_format</span><span>  </span><span>main</span><span>  </span><span>'$remote_addr - $remote_user [$time_local] "$request" '</span></div></div><div><div><div>17</div></div><div><span>                      </span><span>'$status $body_bytes_sent "$http_referer" '</span></div></div><div><div><div>18</div></div><div><span>                      </span><span>'"$http_user_agent" "$http_x_forwarded_for"'</span><span>;</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>    </span><span>access_log</span><span>  </span><span>logs/access.log</span><span>  </span><span>main</span><span>;</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>    </span><span>sendfile</span><span>        </span><span>on</span><span>;</span></div></div><div><div><div>23</div></div><div><span>    </span><span>tcp_nopush</span><span>      </span><span>on</span><span>;</span></div></div><div><div><div>24</div></div><div><span>    </span><span>keepalive_timeout</span><span>  </span><span>65</span><span>;</span></div></div><div><div><div>25</div></div><div><span>    </span><span>gzip</span><span>  </span><span>on</span><span>;</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>    </span><span># 后端 Web 集群（核心配置，保留）</span></div></div><div><div><div>28</div></div><div><span>    </span><span>upstream</span><span> </span><span>web_servers</span><span> </span><span>{</span></div></div><div><div><div>29</div></div><div><span>        </span><span>server</span><span> </span><span>10.1.1.34:80</span><span> </span><span>weight=</span><span>1</span><span> </span><span>max_fails=</span><span>3</span><span> </span><span>fail_timeout=30s</span><span>;</span></div></div><div><div><div>30</div></div><div><span>        </span><span>server</span><span> </span><span>10.1.1.36:80</span><span> </span><span>weight=</span><span>1</span><span> </span><span>max_fails=</span><span>3</span><span> </span><span>fail_timeout=30s</span><span>;</span></div></div><div><div><div>31</div></div><div><span>        </span><span>keepalive</span><span> </span><span>32</span><span>;  </span><span># 复用与后端的长连接（需配合 proxy_http_version 1.1）</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>    </span><span># HTTP 七层代理（80端口）</span></div></div><div><div><div>35</div></div><div><span>    </span><span>server</span><span> </span><span>{</span></div></div><div><div><div>36</div></div><div><span>        </span><span>listen</span><span> </span><span>80</span><span>;</span></div></div><div><div><div>37</div></div><div><span>        </span><span>server_name</span><span> </span><span>_</span><span>;  </span><span># 匹配所有IP/域名访问</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>        </span><span>location</span><span> </span><span>/</span><span> </span><span>{</span></div></div><div><div><div>40</div></div><div><span>            </span><span>proxy_pass</span><span> </span><span>http://web_servers</span><span>;</span></div></div><div><div><div>41</div></div><div><span>            </span><span># 核心请求头传递（七层代理特有）</span></div></div><div><div><div>42</div></div><div><span>            </span><span>proxy_set_header</span><span> </span><span>Host</span><span> </span><span>$host</span><span>;</span></div></div><div><div><div>43</div></div><div><span>            </span><span>proxy_set_header</span><span> </span><span>X-Real-IP</span><span> </span><span>$remote_addr</span><span>;</span></div></div><div><div><div>44</div></div><div><span>            </span><span>proxy_set_header</span><span> </span><span>X-Forwarded-For</span><span> </span><span>$proxy_add_x_forwarded_for</span><span>;</span></div></div><div><div><div>45</div></div><div><span>            </span><span># 超时配置</span></div></div><div><div><div>46</div></div><div><span>            </span><span>proxy_connect_timeout</span><span> </span><span>60s</span><span>;</span></div></div><div><div><div>47</div></div><div><span>            </span><span>proxy_send_timeout</span><span> </span><span>60s</span><span>;</span></div></div><div><div><div>48</div></div><div><span>            </span><span>proxy_read_timeout</span><span> </span><span>60s</span><span>;</span></div></div><div><div><div>49</div></div><div><span>            </span><span># 启用 HTTP/1.1 支持长连接</span></div></div><div><div><div>50</div></div><div><span>            </span><span>proxy_http_version</span><span> </span><span>1.1</span><span>;</span></div></div><div><div><div>51</div></div><div><span>            </span><span>proxy_set_header</span><span> </span><span>Connection</span><span> </span><span>""</span><span>;</span></div></div><div><div><div>52</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>53</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>54</div></div><div>
</div></div><div><div><div>55</div></div><div><span>    </span><span># 可选：HTTPS 七层代理（若需配置证书）</span></div></div><div><div><div>56</div></div><div><span>    </span><span>server</span><span> </span><span>{</span></div></div><div><div><div>57</div></div><div><span>        </span><span>listen</span><span> </span><span>443</span><span> </span><span>ssl</span><span> </span><span>http2</span><span>;</span></div></div><div><div><div>58</div></div><div><span>        </span><span>server_name</span><span> </span><span>_</span><span>;  </span><span># 替换为你的域名，如 www.example.com</span></div></div><div><div><div>59</div></div><div>
</div></div><div><div><div>60</div></div><div><span>        </span><span># SSL 证书配置（证书放在负载均衡服务器 10.1.1.23 上）</span></div></div><div><div><div>61</div></div><div><span>        </span><span>ssl_certificate</span><span>      </span><span>/usr/local/nginx/ssl/server.crt</span><span>;  </span><span># 你的证书路径</span></div></div><div><div><div>62</div></div><div><span>        </span><span>ssl_certificate_key</span><span>  </span><span>/usr/local/nginx/ssl/server.key</span><span>;  </span><span># 你的私钥路径</span></div></div><div><div><div>63</div></div><div><span>        </span><span>ssl_protocols</span><span> </span><span>TLSv1.2</span><span> </span><span>TLSv1.3</span><span>;</span></div></div><div><div><div>64</div></div><div><span>        </span><span>ssl_ciphers</span><span> </span><span>ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512</span><span>;</span></div></div><div><div><div>65</div></div><div>
</div></div><div><div><div>66</div></div><div><span>        </span><span>location</span><span> </span><span>/</span><span> </span><span>{</span></div></div><div><div><div>67</div></div><div><span>            </span><span>proxy_pass</span><span> </span><span>http://web_servers</span><span>;</span></div></div><div><div><div>68</div></div><div><span>            </span><span>proxy_set_header</span><span> </span><span>Host</span><span> </span><span>$host</span><span>;</span></div></div><div><div><div>69</div></div><div><span>            </span><span>proxy_set_header</span><span> </span><span>X-Real-IP</span><span> </span><span>$remote_addr</span><span>;</span></div></div><div><div><div>70</div></div><div><span>            </span><span>proxy_set_header</span><span> </span><span>X-Forwarded-For</span><span> </span><span>$proxy_add_x_forwarded_for</span><span>;</span></div></div><div><div><div>71</div></div><div><span>            </span><span>proxy_set_header</span><span> </span><span>X-Forwarded-Proto</span><span> </span><span>$scheme</span><span>;  </span><span># 传递 HTTPS 标识</span></div></div><div><div><div>72</div></div><div><span>            </span><span>proxy_connect_timeout</span><span> </span><span>60s</span><span>;</span></div></div><div><div><div>73</div></div><div><span>            </span><span>proxy_send_timeout</span><span> </span><span>60s</span><span>;</span></div></div><div><div><div>74</div></div><div><span>            </span><span>proxy_read_timeout</span><span> </span><span>60s</span><span>;</span></div></div><div><div><div>75</div></div><div><span>            </span><span>proxy_http_version</span><span> </span><span>1.1</span><span>;</span></div></div><div><div><div>76</div></div><div><span>            </span><span>proxy_set_header</span><span> </span><span>Connection</span><span> </span><span>""</span><span>;</span></div></div><div><div><div>77</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>78</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>79</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>3.2  四层代理（TCP 层）<a href="#32--四层代理tcp-层"><span>#</span></a></h3><p>四层代理不解析 HTTP 内容，仅转发 TCP 流量，需在 <code>stream</code> 块中配置（与 <code>http</code> 块同级）。</p><p>完整四层配置：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>user</span><span>  </span><span>root</span><span>;</span></div></div><div><div><div>2</div></div><div><span>worker_processes</span><span>  </span><span>auto</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>error_log</span><span>  </span><span>logs/error.log</span><span>;</span></div></div><div><div><div>5</div></div><div><span>pid</span><span>        </span><span>logs/nginx.pid</span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>events</span><span> </span><span>{</span></div></div><div><div><div>8</div></div><div><span>    </span><span>worker_connections</span><span>  </span><span>1024</span><span>;</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span># 四层 TCP 代理核心配置（与 http 块同级，不能嵌套！）</span></div></div><div><div><div>12</div></div><div><span>stream</span><span> </span><span>{</span></div></div><div><div><div>13</div></div><div><span>    </span><span># 定义后端 TCP 集群（针对 80 端口）</span></div></div><div><div><div>14</div></div><div><span>    </span><span>upstream</span><span> </span><span>web_tcp_80</span><span> </span><span>{</span></div></div><div><div><div>15</div></div><div><span>        </span><span>server</span><span> </span><span>10.1.1.34:80</span><span> </span><span>weight=</span><span>1</span><span> </span><span>max_fails=</span><span>3</span><span> </span><span>fail_timeout=30s</span><span>;</span></div></div><div><div><div>16</div></div><div><span>        </span><span>server</span><span> </span><span>10.1.1.36:80</span><span> </span><span>weight=</span><span>1</span><span> </span><span>max_fails=</span><span>3</span><span> </span><span>fail_timeout=30s</span><span>;</span></div></div><div><div><div>17</div></div><div><span>        </span><span># 四层健康检查（Nginx 1.19+ 支持，低版本可省略）</span></div></div><div><div><div>18</div></div><div><span>        </span><span>health_check</span><span> </span><span>interval=3s</span><span> </span><span>timeout=1s</span><span> </span><span>passes=</span><span>2</span><span> </span><span>fails=</span><span>2</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>    </span><span># 监听 80 端口，转发 TCP 流量（四层核心）</span></div></div><div><div><div>22</div></div><div><span>    </span><span>server</span><span> </span><span>{</span></div></div><div><div><div>23</div></div><div><span>        </span><span>listen</span><span> </span><span>80</span><span>;  </span><span># 四层监听 TCP 80 端口（无 http/ssl 标识）</span></div></div><div><div><div>24</div></div><div><span>        </span><span>proxy_pass</span><span> </span><span>web_tcp_80</span><span>;</span></div></div><div><div><div>25</div></div><div><span>        </span><span># 四层超时配置</span></div></div><div><div><div>26</div></div><div><span>        </span><span>proxy_connect_timeout</span><span> </span><span>5s</span><span>;  </span><span># 连接后端超时</span></div></div><div><div><div>27</div></div><div><span>        </span><span>proxy_timeout</span><span> </span><span>300s</span><span>;        </span><span># 连接保持超时</span></div></div><div><div><div>28</div></div><div><span>        </span><span># 可选：传递客户端真实 IP（需后端支持 Proxy Protocol）</span></div></div><div><div><div>29</div></div><div><span>        </span><span># proxy_protocol on;</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>    </span><span># 可选：四层代理 HTTPS（443 端口，后端直接处理 SSL 证书）</span></div></div><div><div><div>33</div></div><div><span>    </span><span>upstream</span><span> </span><span>web_tcp_443</span><span> </span><span>{</span></div></div><div><div><div>34</div></div><div><span>        </span><span>server</span><span> </span><span>10.1.1.34:443</span><span> </span><span>weight=</span><span>1</span><span> </span><span>max_fails=</span><span>3</span><span> </span><span>fail_timeout=30s</span><span>;</span></div></div><div><div><div>35</div></div><div><span>        </span><span>server</span><span> </span><span>10.1.1.36:443</span><span> </span><span>weight=</span><span>1</span><span> </span><span>max_fails=</span><span>3</span><span> </span><span>fail_timeout=30s</span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>37</div></div><div><span>    </span><span>server</span><span> </span><span>{</span></div></div><div><div><div>38</div></div><div><span>        </span><span>listen</span><span> </span><span>443</span><span>;</span></div></div><div><div><div>39</div></div><div><span>        </span><span>proxy_pass</span><span> </span><span>web_tcp_443</span><span>;</span></div></div><div><div><div>40</div></div><div><span>        </span><span>proxy_connect_timeout</span><span> </span><span>5s</span><span>;</span></div></div><div><div><div>41</div></div><div><span>        </span><span>proxy_timeout</span><span> </span><span>300s</span><span>;</span></div></div><div><div><div>42</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>43</div></div><div><span>}</span></div></div><div><div><div>44</div></div><div>
</div></div><div><div><div>45</div></div><div><span># 原有 http 块可保留（若不需要七层代理，可注释/删除）</span></div></div><div><div><div>46</div></div><div><span>http</span><span> </span><span>{</span></div></div><div><div><div>47</div></div><div><span>    </span><span>include</span><span>       </span><span>mime.types</span><span>;</span></div></div><div><div><div>48</div></div><div><span>    </span><span>include</span><span>       </span><span>conf.d/</span><span>*</span><span>.conf</span><span>;</span></div></div><div><div><div>49</div></div><div><span>    </span><span>default_type</span><span>  </span><span>application/octet-stream</span><span>;</span></div></div><div><div><div>50</div></div><div>
</div></div><div><div><div>51</div></div><div><span>    </span><span>log_format</span><span>  </span><span>main</span><span>  </span><span>'$remote_addr - $remote_user [$time_local] "$request" '</span></div></div><div><div><div>52</div></div><div><span>                      </span><span>'$status $body_bytes_sent "$http_referer" '</span></div></div><div><div><div>53</div></div><div><span>                      </span><span>'"$http_user_agent" "$http_x_forwarded_for"'</span><span>;</span></div></div><div><div><div>54</div></div><div>
</div></div><div><div><div>55</div></div><div><span>    </span><span>access_log</span><span>  </span><span>logs/access.log</span><span>  </span><span>main</span><span>;</span></div></div><div><div><div>56</div></div><div>
</div></div><div><div><div>57</div></div><div><span>    </span><span>sendfile</span><span>        </span><span>on</span><span>;</span></div></div><div><div><div>58</div></div><div><span>    </span><span>tcp_nopush</span><span>      </span><span>on</span><span>;</span></div></div><div><div><div>59</div></div><div><span>    </span><span>keepalive_timeout</span><span>  </span><span>65</span><span>;</span></div></div><div><div><div>60</div></div><div><span>    </span><span>gzip</span><span>  </span><span>on</span><span>;</span></div></div><div><div><div>61</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>3.3 两种代理的核心差异<a href="#33-两种代理的核心差异"><span>#</span></a></h3>

<table><thead><tr><th>维度</th><th>七层代理</th><th>四层代理</th></tr></thead><tbody><tr><td>工作层级</td><td>HTTP/HTTPS（应用层）</td><td>TCP/UDP（传输层）</td></tr><tr><td>配置块</td><td><code>http</code> 块（<code>upstream</code>+<code>server</code>）</td><td><code>stream</code> 块（与 <code>http</code> 同级）</td></tr><tr><td>核心能力</td><td>1. 解析 URL / 请求头 / 域名<br />2. 传递 <code>X-Real-IP</code> 等 HTTP 头<br />3. 支持 SSL 终结（负载均衡端处理证书）<br />4. 可按 URL 路由（如 <code>/static</code> 定向到 34）</td><td>1. 仅转发端口流量，无内容解析<br />2. 无法修改 HTTP 头，传递 IP 需 <code>Proxy Protocol</code><br />3. SSL 透传（后端 34/36 处理证书）<br />4. 无 URL 路由能力</td></tr><tr><td>你的场景适配性</td><td>✅ 最优（静态站点负载均衡，可优化缓存 / IP 传递）</td><td>❗ 仅适合需透传 HTTPS / 不解析 HTTP 的场景</td></tr><tr><td>配置验证命令</td><td><code>nginx -t</code>（同常规）</td><td><code>nginx -t</code>（需确保 <code>stream</code> 模块存在）</td></tr></tbody></table></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/nginx%E4%BD%BF%E7%94%A8/</id>
      <title type="text">nginx使用</title>
      <published>2026-06-30T00:00:00.000Z</published>
      <updated>2026-06-30T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/nginx%E4%BD%BF%E7%94%A8/"/>
      <summary type="text">nginx基础使用文档</summary>
      <content type="html"><![CDATA[<blockquote><p><code>参考文档</code>：<a href="https://nginx.mosong.cc/" target="_blank">Nginx 教程</a>、CentOS7 源码安装Nginx</p></blockquote>
<section><h1>一、nginx使用<a href="#一nginx使用"><span>#</span></a></h1><p>nginx的源码编译安装参考可参考<code>CentOS7 源码安装Nginx</code></p><section><h2>1.1nginx配置文件目录<a href="#11nginx配置文件目录"><span>#</span></a></h2><p>Nginx 配置文件在 conf 目录下，其默认目录结构如下：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 以".default"为扩展名的文件是 Nginx 配置文件的配置样例文件</span></div></div><div><div><div>2</div></div><div><span>.</span></div></div><div><div><div>3</div></div><div><span>├──</span><span> </span><span>fastcgi.conf</span><span> </span><span># 为了规范配置指令 SCRIPT_FILENAME 的用法，引入 FastCGI 变量传递配置</span></div></div><div><div><div>4</div></div><div><span>├──</span><span> </span><span>fastcgi.conf.default</span></div></div><div><div><div>5</div></div><div><span>├──</span><span> </span><span>fastcgi_params</span><span> </span><span># Nginx 在配置 FastCGI 代理服务时会根据 fastcgi_params 文件的配置向 FastCGI 服务器传递变量，该配置文件现已由 fastcgi.conf 代替</span></div></div><div><div><div>6</div></div><div><span>├──</span><span> </span><span>fastcgi_params.default</span></div></div><div><div><div>7</div></div><div><span>├──</span><span> </span><span>koi-utf</span></div></div><div><div><div>8</div></div><div><span>├──</span><span> </span><span>koi-win</span></div></div><div><div><div>9</div></div><div><span>├──</span><span> </span><span>mime.types</span><span> </span><span># MIME 类型映射表，Nginx 会根据服务端文件后缀名在映射关系中获取所属文件类型，将文件类型添加到 HTTP 消息头字段"Content-Type"中</span></div></div><div><div><div>10</div></div><div><span>├──</span><span> </span><span>mime.types.default</span></div></div><div><div><div>11</div></div><div><span>├──</span><span> </span><span>nginx.conf</span><span> </span><span># 默认的配置入口文件</span></div></div><div><div><div>12</div></div><div><span>├──</span><span> </span><span>nginx.conf.default</span></div></div><div><div><div>13</div></div><div><span>├──</span><span> </span><span>scgi_params</span><span> </span><span># Nginx 在配置 SCGI 代理服务时会根据 scgi_params 文件的配置向 SCGI 服务器传递变量</span></div></div><div><div><div>14</div></div><div><span>├──</span><span> </span><span>scgi_params.default</span></div></div><div><div><div>15</div></div><div><span>├──</span><span> </span><span>uwsgi_params</span><span> </span><span># Nginx 在配置 uWSGI 代理服务时会根据 uwsgi_params 文件的配置向 uWSGI 服务器传递变量</span></div></div><div><div><div>16</div></div><div><span>├──</span><span> </span><span>uwsgi_params.default</span></div></div><div><div><div>17</div></div><div><span>└──</span><span> </span><span>win-utf</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span># koi-utf、koi-win、win-utf:这 3 个文件是 KOI8-R 编码转换的映射文件，因为 Nginx 的作者是俄罗斯人，在 Unicode 流行之前，KOI8-R 是使用最为广泛的俄语编码。</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h2>1.2 nginx.conf中的域<a href="#12-nginxconf中的域"><span>#</span></a></h2><p>配置文件 nginx.conf 中上层没有其他指令域的区域被称为配置全局域，简称全局域。</p><p>Nginx 的常见配置指令域如下表所示。</p>

<table><thead><tr><th>域名称</th><th>域类型</th><th>域说明</th></tr></thead><tbody><tr><td>main</td><td>全局域</td><td>Nginx 的根级别指令区域。该区域的配置指令是全局有效的，该指令名为隐性显示，nginx.conf 的整个文件内容都写在该指令域中</td></tr><tr><td>events</td><td>指令域</td><td>Nginx 事件驱动相关的配置指令域</td></tr><tr><td>http</td><td>指令域</td><td>Nginx HTTP 核心配置指令域，包含客户端完整 HTTP 请求过程中每个过程的处理方法的配置指令</td></tr><tr><td>upstream</td><td>指令域</td><td>用于定义被代理服务器组的指令区域，也称”上游服务器”</td></tr><tr><td>server</td><td>指令域</td><td>Nginx 用来定义服务 IP、绑定端口及服务相关的指令区域</td></tr><tr><td>location</td><td>指令域</td><td>对用户 URI 进行访问路由处理的指令区域</td></tr><tr><td>stream</td><td>指令域</td><td>Nginx 对 TCP 协议实现代理的配置指令域</td></tr><tr><td>types</td><td>指令域</td><td>定义被请求文件扩展名与 MIME 类型映射表的指令区域</td></tr><tr><td>if</td><td>指令域</td><td>按照选择条件判断为真时使用的配置指令域</td></tr></tbody></table><section><h3>1.2.1 默认nginx.conf配置<a href="#121-默认nginxconf配置"><span>#</span></a></h3><section><h4>1.2.1.1 全局默认配置域参数<a href="#1211-全局默认配置域参数"><span>#</span></a></h4><section><h5>1.指定 Nginx运行时的用户和用户组<a href="#1指定-nginx运行时的用户和用户组"><span>#</span></a></h5><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>#user  nobody;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>格式：user 用户名 用户组;，省略用户组时默认和用户名相同</p><p>若编译时指定了<code>--user=nginx --group=nginx</code>，生产环境需要<strong>取消注释并改为<code>user  nginx;</code></strong>，否则 Nginx 会用默认 nobody 运行。</p></section><section><h5>2.nginx工作进程数<a href="#2nginx工作进程数"><span>#</span></a></h5><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>worker_processes</span><span>  </span><span>1</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p>设置 Nginx 的<strong>工作进程数</strong>，是 Nginx 性能调优的核心参数之一。</p>
</li>
<li>
<p>默认值<code>1</code>：单进程处理所有请求，适合测试 / 低配服务器；</p>
</li>
<li>
<p>生产环境建议设置为<strong>服务器 CPU 核心数</strong>（比如 4 核设为 4），或<code>auto</code>（Nginx 自动识别 CPU 核心），充分利用服务器多核资源。</p>
</li>
</ul></section><section><h5>3. Nginx 的错误日志<a href="#3-nginx-的错误日志"><span>#</span></a></h5><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>error_log</span><span>  </span><span>logs/error.log</span><span>;</span></div></div><div><div><div>2</div></div><div><span>error_log</span><span>  </span><span>logs/error.log</span><span>  </span><span>notice</span><span>;</span></div></div><div><div><div>3</div></div><div><span>error_log</span><span>  </span><span>logs/error.log</span><span>  </span><span>info</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p>配置 Nginx 的<strong>错误日志</strong>，包含日志路径和日志级别，Nginx 默认会开启错误日志（路径一般为<code>logs/error.log</code>，级别默认<code>error</code>）。</p>
</li>
<li>
<p>日志级别（从低到高）：<code>debug</code>（调试）&lt;<code>info</code>（信息）&lt;<code>notice</code>（通知）&lt;<code>warn</code>（警告）&lt;<code>error</code>（错误）&lt;<code>crit</code>（严重）&lt;<code>alert</code>（告警）&lt;<code>emerg</code>（紧急）；</p>
</li>
<li>
<p>级别越低，日志越详细，生产环境一般用<code>error</code>/<code>warn</code>，避免日志文件过大。</p>
</li>
</ul></section><section><h5>4. Nginx的主进程号文件的路径<a href="#4-nginx的主进程号文件的路径"><span>#</span></a></h5><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>#pid        logs/nginx.pid;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>
<p>指定 Nginx<strong>主进程号文件的路径</strong>，<code>pid</code>文件记录 Nginx 主进程的 ID，用于后续管理（比如重启、停止 Nginx 时通过 pid 文件定位进程）。</p>
</li>
<li>
<p>取消注释后，Nginx 启动时会自动在<code>logs</code>目录生成<code>nginx.pid</code>文件。</p>
</li>
</ul></section></section><section><h4>1.2.1.2 events 事件域<a href="#1212-events-事件域"><span>#</span></a></h4><p><code>events{}</code> 块专门配置 Nginx 的<strong>网络连接相关参数</strong>，作用于 Nginx 的工作进程，影响连接的处理效率，<strong>仅能有一个 events 块</strong>。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>events</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>worker_connections</span><span>  </span><span>1024</span><span>;</span></div></div><div><div><div>3</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><code>worker_connections  1024;</code>：设置<strong>单个 Nginx 工作进程的最大并发连接数</strong>，默认 1024。</p><ul>
<li>
<p>该数值受服务器系统的<strong>文件描述符限制</strong>（Linux 默认单进程最大文件描述符为 1024），生产环境需先调大系统限制，再修改此参数；</p>
</li>
<li>
<p>Nginx<strong>理论最大并发连接数</strong> ≈ <code>worker_processes</code>（工作进程数） × <code>worker_connections</code>（单进程最大连接数）。</p>
</li>
</ul></section><section><h4>1.2.1.3 http 域<a href="#1213-http-域"><span>#</span></a></h4><p><code>http{}</code> 是 Nginx 配置的<strong>核心</strong>，所有和 HTTP/HTTPS 协议相关的配置都在这个块中，支持<strong>多个 Server 虚拟主机块</strong>，且内部配置会被所有子块（Server/Location）继承。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>http</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>include</span><span>       </span><span>mime.types</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>default_type</span><span>  </span><span>application/octet-stream</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '</span></div></div><div><div><div>5</div></div><div><span>    </span><span>#                  '$status $body_bytes_sent "$http_referer" '</span></div></div><div><div><div>6</div></div><div><span>    </span><span>#                  '"$http_user_agent" "$http_x_forwarded_for"';</span></div></div><div><div><div>7</div></div><div><span>    </span><span>#access_log  logs/access.log  main;</span></div></div><div><div><div>8</div></div><div><span>    </span><span>sendfile</span><span>        </span><span>on</span><span>;</span></div></div><div><div><div>9</div></div><div><span>    </span><span>#tcp_nopush     on;</span></div></div><div><div><div>10</div></div><div><span>    </span><span>#keepalive_timeout  0;</span></div></div><div><div><div>11</div></div><div><span>    </span><span>keepalive_timeout</span><span>  </span><span>65</span><span>;</span></div></div><div><div><div>12</div></div><div><span>    </span><span>#gzip  on;</span></div></div><div><div><div>13</div></div><div><span>    </span><span>...</span><span> </span><span># 后续Server块</span></div></div><div><div><div>14</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>逐行解释 HTTP 块内的基础指令：</p><ol>
<li>
<p><code>include       mime.types;</code></p>
<p>引入 Nginx 的<strong>MIME 类型映射文件</strong>，<code>mime.types</code>是 Nginx 自带的配置文件（和 nginx.conf 同目录），里面定义了上千种文件后缀和对应的 MIME 类型（比如<code>.html</code>对应<code>text/html</code>、<code>.jpg</code>对应<code>image/jpeg</code>）。</p>
<ul>
<li>作用：Nginx 向客户端返回文件时，会根据该文件的后缀匹配 MIME 类型，然后在 HTTP 响应头中设置<code>Content-Type</code>，让浏览器正确解析文件（比如识别 html 为网页、jpg 为图片）。</li>
</ul>
</li>
<li>
<p><code>default_type  application/octet-stream;</code></p>
<p>设置<strong>默认的 MIME 类型</strong>，当请求的文件后缀在<code>mime.types</code>中没有匹配项时，Nginx 会将该文件的 MIME 类型设为<code>application/octet-stream</code>（二进制流）。</p>
<ul>
<li>作用：浏览器遇到该类型会触发<strong>下载行为</strong>，比如未知后缀的<code>.abc</code>文件，浏览器会直接下载而不是尝试解析。</li>
</ul>
</li>
<li>
<p><code>#log_format  main  '...';</code> 【注释示例】</p>
<p>自定义<strong>访问日志的格式</strong>，并为该格式命名为<code>main</code>（可自定义名称，比如<code>nginx_log</code>），里面的<code>$xxx</code>是 Nginx 的<strong>内置变量</strong>，用于获取请求的相关信息，核心变量含义：</p>

<table><thead><tr><th>变量</th><th>含义</th></tr></thead><tbody><tr><td>$remote_addr</td><td>客户端的 IP 地址</td></tr><tr><td>$remote_user</td><td>客户端的认证用户名（无则为空）</td></tr><tr><td>$time_local</td><td>服务器的本地时间</td></tr><tr><td>$request</td><td>客户端的请求行（方法 + URL + 协议）</td></tr><tr><td>$status</td><td>HTTP 响应状态码（200/404/502 等）</td></tr><tr><td>$body_bytes_sent</td><td>向客户端发送的响应体大小（不含响应头）</td></tr><tr><td>$http_referer</td><td>来源页的 URL（防盗链常用）</td></tr><tr><td>$http_user_agent</td><td>客户端的用户代理（浏览器 / 爬虫标识）</td></tr><tr><td>$http_x_forwarded_for</td><td>客户端真实 IP（反向代理场景用）</td></tr></tbody></table>
<ul>
<li>作用：自定义日志格式，让访问日志包含你需要的信息，后续<code>access_log</code>可引用该格式。</li>
</ul>
</li>
<li>
<p><code>#access_log  logs/access.log  main;</code> 【注释示例】</p>
<p>开启 Nginx 的<strong>访问日志</strong>，指定日志文件路径为<code>logs/access.log</code>，并使用上面定义的<code>main</code>格式记录日志。</p>
<ul>
<li>访问日志会记录<strong>所有客户端的 HTTP 请求</strong>，是排查问题、统计访问量的核心依据；</li>
<li>可在 Server/Location 块中单独配置，实现<strong>不同虚拟主机 / 不同路径的独立访问日志</strong>。</li>
</ul>
</li>
<li>
<p><code>sendfile        on;</code></p>
<p>开启 Linux 的<strong>sendfile 零拷贝技术</strong>，默认开启，是 Nginx 高性能的核心特性之一。</p>
<ul>
<li>传统文件传输：Nginx 进程→读取磁盘文件→内核缓冲区→Nginx 缓冲区→网络缓冲区→客户端，多步拷贝；</li>
<li>零拷贝：内核直接将磁盘文件的内容发送到网络缓冲区，跳过 Nginx 用户态缓冲区，<strong>减少内存拷贝和 CPU 消耗</strong>，大幅提升静态文件（html/js/img）的传输性能。</li>
</ul>
</li>
<li>
<p><code>#tcp_nopush     on;</code> 【注释示例】</p>
<p>开启<strong>TCP_NOPUSH</strong>选项，需和<code>sendfile on;</code>配合使用。</p>
<ul>
<li>作用：让 Nginx 在<strong>发送响应时，先将数据缓冲区填满再一次性发送</strong>，减少 TCP 网络包的数量，提升大文件的传输效率（适合静态文件服务）。</li>
</ul>
</li>
<li>
<p><code>#keepalive_timeout  0;</code> 【注释示例】</p>
<p>设置 HTTP<strong>长连接的超时时间</strong>为 0，即<strong>关闭长连接</strong>。</p>
<ul>
<li>HTTP 长连接：客户端和服务器建立一次 TCP 连接后，可多次发送 HTTP 请求，无需重复建立连接，减少 TCP 握手的开销；</li>
<li>设为 0 时，每次请求都建立新的 TCP 连接，性能较低，一般不开启。</li>
</ul>
</li>
<li>
<p><code>keepalive_timeout  65;</code></p>
<p>开启 HTTP 长连接，设置超时时间为<strong>65 秒</strong>，是生产环境的常用值。</p>
<ul>
<li>含义：客户端和服务器建立 TCP 连接后，若 65 秒内没有新的 HTTP 请求，服务器会主动关闭该 TCP 连接；</li>
<li>调优建议：根据业务场景调整，比如静态资源服务可设为 30/60 秒，避免长连接占用过多服务器资源。</li>
</ul>
</li>
<li>
<p><code>#gzip  on;</code> 【注释示例】</p>
<p>开启 Nginx 的<strong>gzip 压缩功能</strong>，默认关闭。</p>
<ul>
<li>作用：Nginx 在向客户端返回响应体（html/js/css/json 等文本文件）前，先对其进行 gzip 压缩，<strong>减少传输的文件大小</strong>，提升网页加载速度（图片 / 视频已压缩，无需 gzip）；</li>
<li>生产环境建议开启，后续可配置压缩级别、压缩的文件类型等精细参数。</li>
</ul>
</li>
</ol></section><section><h4>1.2.1.4 server 虚拟主机域<a href="#1214-server-虚拟主机域"><span>#</span></a></h4><p><code>server{}</code> 块属于 HTTP 块的子块，用于配置<strong>虚拟主机</strong>，Nginx 通过多个 Server 块实现<strong>一台服务器运行多个网站</strong>（比如同时运行<code>www.aaa.com</code>和<code>www.bbb.com</code>），核心通过<code>listen</code>（端口）+<code>server_name</code>（域名 / IP）区分不同虚拟主机。</p><p>默认配置中只有一个 Server 块，监听 80 端口，对应<code>localhost</code>，逐行解释：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>server</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>listen</span><span>       </span><span>80</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>server_name</span><span>  </span><span>localhost</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span>#charset koi8-r;</span></div></div><div><div><div>5</div></div><div><span>    </span><span>#access_log  logs/host.access.log  main;</span></div></div><div><div><div>6</div></div><div><span>    </span><span>...</span><span> </span><span># 后续Location块</span></div></div><div><div><div>7</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>
<p><code>listen       80;</code></p>
<p>设置该虚拟主机<strong>监听的 TCP 端口</strong>，默认 80（HTTP 协议的默认端口），可指定 IP + 端口（比如<code>192.168.1.100:8080</code>），多个端口用空格分隔（比如<code>listen 80 8080;</code>）。</p>
</li>
<li>
<p><code>server_name  localhost;</code></p>
<p>设置该虚拟主机对应的<strong>域名 / 主机名</strong>，支持多个值（用空格分隔，比如<code>server_name  localhost www.test.com;</code>），也支持通配符（<code>*.test.com</code>）和正则表达式。</p>
<ul>
<li>Nginx 接收请求时，会根据请求头中的<code>Host</code>字段匹配<code>server_name</code>，找到对应的 Server 块处理请求；</li>
<li>若未匹配到任何 Server 块，会使用<strong>第一个匹配 listen 端口的 Server 块</strong>处理。</li>
</ul>
</li>
<li>
<p><code>#charset koi8-r;</code> 【注释示例】</p>
<p>设置该虚拟主机的<strong>默认字符集</strong>，<code>koi8-r</code>是俄语字符集，生产环境一般改为<code>utf-8</code>（<code>charset utf-8;</code>），让 Nginx 在响应头中设置<code>Content-Type: text/html; charset=utf-8</code>，避免网页中文乱码。</p>
</li>
<li>
<p><code>#access_log  logs/host.access.log  main;</code> 【注释示例】</p>
<p>为该虚拟主机配置<strong>独立的访问日志</strong>，和 HTTP 块的全局访问日志区分，适合多虚拟主机的场景，方便单独统计 / 排查某个网站的请求。</p>
</li>
</ol></section><section><h4>1.2.1.5 Location 路径匹配域<a href="#1215-location-路径匹配域"><span>#</span></a></h4><p><code>location{}</code> 块是 Server 块的子块，用于<strong>匹配客户端的请求 URL 路径</strong>，并为不同路径配置专属的处理规则（比如根目录、错误页面、PHP 解析等），是 Nginx 配置的核心灵活点。</p><p>默认配置中有 3 个 Location 块，还有 2 个注释的 PHP 相关示例块，逐一解释：</p><section><h5>1. 根路径匹配：location / {}<a href="#1-根路径匹配location--"><span>#</span></a></h5><p>匹配<strong>所有以<code>/</code>开头的请求 URL</strong>（即客户端的所有请求，是默认的路径匹配规则），处理网站的根路径请求：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>location</span><span> </span><span>/</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>root</span><span>   </span><span>html</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>index</span><span>  </span><span>index.html</span><span> </span><span>index.htm</span><span>;</span></div></div><div><div><div>4</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>
<p><code>root   html;</code></p>
<p>设置该路径对应的<strong>网站根目录</strong>，<code>html</code>是相对路径（相对于 Nginx 的安装目录，比如你编译的<code>/usr/local/nginx/html</code>），也可写绝对路径（比如<code>/data/nginx/html</code>）。</p>
<ul>
<li>含义：当客户端请求<code>http://localhost/index.html</code>时，Nginx 会在<code>html</code>目录下查找<code>index.html</code>文件并返回。</li>
</ul>
</li>
<li>
<p><code>index  index.html index.htm;</code></p>
<p>设置该路径的<strong>默认索引文件</strong>（首页文件），支持多个值，Nginx 会<strong>按顺序查找</strong>，找到第一个存在的文件并返回。</p>
<ul>
<li>含义：当客户端请求<code>http://localhost/</code>（仅域名，无具体 URL）时，Nginx 会在<code>root</code>指定的目录下依次查找<code>index.html</code>、<code>index.htm</code>，找到后返回。</li>
<li>生产环境可添加<code>index.php</code>（PHP 网站）、<code>index.jsp</code>（Java 网站）等。</li>
</ul>
</li>
</ol></section></section><section><h4>1.2.1.6 错误页面匹配<a href="#1216-错误页面匹配"><span>#</span></a></h4><p>这是<strong>错误页面的配套配置</strong>，处理服务器端的 5xx 错误（服务端内部错误）</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>#error_page  404              /404.html;</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 第一步：配置5xx错误码跳转到/50x.html页面</span></div></div><div><div><div>4</div></div><div><span>error_page</span><span>   </span><span>500</span><span> </span><span>502</span><span> </span><span>503</span><span> </span><span>504</span><span>  </span><span>/50x.html</span><span>;</span></div></div><div><div><div>5</div></div><div><span># 第二步：精确匹配/50x.html请求，指定页面的根目录</span></div></div><div><div><div>6</div></div><div><span>location</span><span> </span><span>=</span><span> </span><span>/50x.html</span><span> </span><span>{</span></div></div><div><div><div>7</div></div><div><span>    </span><span>root</span><span>   </span><span>html</span><span>;</span></div></div><div><div><div>8</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>
<p><code>error_page   500 502 503 504  /50x.html;</code></p>
<p>配置<strong>HTTP 错误码的跳转页面</strong>，当 Nginx 返回 500（内部服务器错误）、502（网关错误）、503（服务不可用）、504（网关超时）时，会向客户端返回<code>/50x.html</code>页面的内容。</p>
<ul>
<li>可扩展：支持 4xx 错误（比如<code>404 /404.html</code>），也可跳转到绝对 URL（比如<code>error_page 404 https://www.baidu.com;</code>）。</li>
</ul>
</li>
<li>
<p><code>location = /50x.html {}</code></p>
<p><strong>精确匹配</strong>URL 为<code>/50x.html</code>的请求（<code>=</code>是精确匹配符号，只匹配完全一致的 URL），<code>root html;</code>指定该页面的根目录和网站根目录一致，即<code>html/50x.html</code>（Nginx 默认自带该文件）。</p>
</li>
</ol></section><section><h4>1.2.1.7 注释的示例 Location 块（按需开启）<a href="#1217-注释的示例-location-块按需开启"><span>#</span></a></h4><p>默认配置中还有 3 个注释的 Location 块，是 Nginx 提供的<strong>常用业务示例</strong>，分别用于 <code>PHP 代理</code>、<code>PHP-FPM 解析</code>、<code>禁止访问隐藏文件</code>，逐行解释：</p><section><h5>1. 将 PHP 请求代理到 Apache 服务器<a href="#1-将-php-请求代理到-apache-服务器"><span>#</span></a></h5><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>#location ~ \.php$ {</span></div></div><div><div><div>2</div></div><div><span>#    proxy_pass   http://127.0.0.1;</span></div></div><div><div><div>3</div></div><div><span>#}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li><code>location ~ \.php$</code>：<strong>正则匹配</strong>所有以<code>.php</code>结尾的请求（<code>~</code>表示区分大小写的正则匹配）；</li>
<li><code>proxy_pass   http://127.0.0.1;</code>：开启<strong>反向代理</strong>，将所有 PHP 请求转发到本地的 Apache 服务器（监听 80 端口），由 Apache 处理 PHP 解析（适合 Nginx+Apache 的组合架构）。</li>
</ul></section><section><h5>2. 将 PHP 请求交给 FastCGI 服务器（PHP-FPM）解析<a href="#2-将-php-请求交给-fastcgi-服务器php-fpm解析"><span>#</span></a></h5><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>#location ~ \.php$ {</span></div></div><div><div><div>2</div></div><div><span>#    root           html;</span></div></div><div><div><div>3</div></div><div><span>#    fastcgi_pass   127.0.0.1:9000;</span></div></div><div><div><div>4</div></div><div><span>#    fastcgi_index  index.php;</span></div></div><div><div><div>5</div></div><div><span>#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;</span></div></div><div><div><div>6</div></div><div><span>#    include        fastcgi_params;</span></div></div><div><div><div>7</div></div><div><span>#}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这是<strong>Nginx+PHP-FPM</strong>的核心配置（PHP 网站必开），也是最常用的 PHP 解析方式，核心指令：</p><ul>
<li><code>fastcgi_pass   127.0.0.1:9000;</code>：将 PHP 请求转发到<strong>FastCGI 服务器（PHP-FPM）</strong> 的 9000 端口，由 PHP-FPM 解析 PHP 脚本；</li>
<li><code>fastcgi_index  index.php;</code>：设置 PHP 的默认索引文件，和<code>index</code>指令作用类似；</li>
<li><code>fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;</code>：设置 FastCGI 的核心参数，指定 PHP 脚本的绝对路径（<strong>生产环境需修改<code>/scripts</code>为实际的网站根目录</strong>，比如<code>$document_root</code>，<code>$document_root</code>是<code>root</code>指令指定的路径）；</li>
<li><code>include        fastcgi_params;</code>：引入 Nginx 自带的 FastCGI 参数配置文件，里面定义了 CGI 的标准参数（比如请求方法、协议版本）。</li>
</ul></section><section><h5>3. 禁止访问 Apache 的.htaccess 文件<a href="#3-禁止访问-apache-的htaccess-文件"><span>#</span></a></h5><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>#location ~ /\.ht {</span></div></div><div><div><div>2</div></div><div><span>#    deny  all;</span></div></div><div><div><div>3</div></div><div><span>#}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li><code>location ~ /\.ht</code>：正则匹配所有以<code>.ht</code>开头的文件 / 目录（比如 Apache 的配置文件<code>.htaccess</code>）；</li>
<li><code>deny  all;</code>：<strong>拒绝所有客户端的访问</strong>（返回 403 Forbidden）。</li>
<li>原因：Nginx<strong>不识别 Apache 的.htaccess 文件</strong>，该文件中可能包含网站的敏感配置，禁止访问可提升安全性。</li>
</ul></section></section><section><h4>1.2.1.8 其他注释的 Server 块示例<a href="#1218-其他注释的-server-块示例"><span>#</span></a></h4><p>默认配置的最后还有两个注释的 Server 块，是 Nginx 的<strong>虚拟主机高级示例</strong>，方便你后续扩展：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>    </span><span># another virtual host using mix of IP-, name-, and port-based configuration</span></div></div><div><div><div>2</div></div><div><span>    </span><span>#</span></div></div><div><div><div>3</div></div><div><span>    </span><span>#server {</span></div></div><div><div><div>4</div></div><div><span>    </span><span>#    listen       8000;</span></div></div><div><div><div>5</div></div><div><span>    </span><span>#    listen       somename:8080;</span></div></div><div><div><div>6</div></div><div><span>    </span><span>#    server_name  somename  alias  another.alias;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>    </span><span>#    location / {</span></div></div><div><div><div>9</div></div><div><span>    </span><span>#        root   html;</span></div></div><div><div><div>10</div></div><div><span>    </span><span>#        index  index.html index.htm;</span></div></div><div><div><div>11</div></div><div><span>    </span><span>#    }</span></div></div><div><div><div>12</div></div><div><span>    </span><span>#}</span></div></div><div><div><div>13</div></div><div><span>===================================================</span></div></div><div><div><div>14</div></div><div><span>    </span><span># HTTPS server</span></div></div><div><div><div>15</div></div><div><span>    </span><span>#</span></div></div><div><div><div>16</div></div><div><span>    </span><span>#server {</span></div></div><div><div><div>17</div></div><div><span>    </span><span>#    listen       443 ssl;</span></div></div><div><div><div>18</div></div><div><span>    </span><span>#    server_name  localhost;</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>    </span><span>#    ssl_certificate      cert.pem;</span></div></div><div><div><div>21</div></div><div><span>    </span><span>#    ssl_certificate_key  cert.key;</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>#    ssl_session_cache    shared:SSL:1m;</span></div></div><div><div><div>24</div></div><div><span>    </span><span>#    ssl_session_timeout  5m;</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>    </span><span>#    ssl_ciphers  HIGH:!aNULL:!MD5;</span></div></div><div><div><div>27</div></div><div><span>    </span><span>#    ssl_prefer_server_ciphers  on;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><ol>
<li>
<p><strong>多端口 / 多域名的虚拟主机</strong>：监听 8000 和 8080 端口，对应多个域名 / 别名，适合一台服务器运行多个网站；</p>
</li>
<li>
<p>HTTPS 虚拟主机</p>
<p>：监听 443 端口（HTTPS 默认端口），配置 SSL 证书 / 私钥，开启 HTTPS 加密，是 HTTPS 网站的基础配置，核心指令：</p>
<ul>
<li><code>ssl_certificate</code>/<code>ssl_certificate_key</code>：指定 SSL 证书（公钥）和私钥的路径；</li>
<li><code>ssl_session_cache</code>：开启 SSL 会话缓存，减少 SSL 握手开销；</li>
<li><code>ssl_ciphers</code>：指定 SSL 的加密套件，提升 HTTPS 的安全性。</li>
</ul>
</li>
</ol></section></section></section><section><h2>1.3 nginx.conf示例<a href="#13-nginxconf示例"><span>#</span></a></h2><p>若使用<code>CentOS7 源码安装Nginx</code>中的编译参数，则可使用如下“nginx.conf`配置</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>./configure</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>--prefix=/usr/local/nginx </span><span>\</span></div></div><div><div><div>3</div></div><div><span>--user=nginx </span><span>\</span></div></div><div><div><div>4</div></div><div><span>--group=nginx </span><span>\</span></div></div><div><div><div>5</div></div><div><span>--modules-path=/usr/local/nginx/modules </span><span>\</span></div></div><div><div><div>6</div></div><div><span>--with-compat </span><span>\</span></div></div><div><div><div>7</div></div><div><span>--with-file-aio </span><span>\</span></div></div><div><div><div>8</div></div><div><span>--with-threads </span><span>\</span></div></div><div><div><div>9</div></div><div><span>--with-http_addition_module </span><span>\</span></div></div><div><div><div>10</div></div><div><span>--with-http_auth_request_module </span><span>\</span></div></div><div><div><div>11</div></div><div><span>--with-http_dav_module </span><span>\</span></div></div><div><div><div>12</div></div><div><span>--with-http_flv_module </span><span>\</span></div></div><div><div><div>13</div></div><div><span>--with-http_gunzip_module </span><span>\</span></div></div><div><div><div>14</div></div><div><span>--with-http_gzip_static_module </span><span>\</span></div></div><div><div><div>15</div></div><div><span>--with-http_mp4_module </span><span>\</span></div></div><div><div><div>16</div></div><div><span>--with-http_random_index_module </span><span>\</span></div></div><div><div><div>17</div></div><div><span>--with-http_realip_module </span><span>\</span></div></div><div><div><div>18</div></div><div><span>--with-http_secure_link_module </span><span>\</span></div></div><div><div><div>19</div></div><div><span>--with-http_slice_module </span><span>\</span></div></div><div><div><div>20</div></div><div><span>--with-http_ssl_module </span><span>\</span></div></div><div><div><div>21</div></div><div><span>--with-http_stub_status_module </span><span>\</span></div></div><div><div><div>22</div></div><div><span>--with-http_sub_module </span><span>\</span></div></div><div><div><div>23</div></div><div><span>--with-http_v2_module </span><span>\</span></div></div><div><div><div>24</div></div><div><span>--with-stream </span><span>\</span></div></div><div><div><div>25</div></div><div><span>--with-stream_realip_module </span><span>\</span></div></div><div><div><div>26</div></div><div><span>--with-stream_ssl_module </span><span>\</span></div></div><div><div><div>27</div></div><div><span>--with-stream_ssl_preread_module </span><span>\</span></div></div><div><div><div>28</div></div><div><span>--with-cc-opt=</span><span>'-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC'</span><span> </span><span>\</span></div></div><div><div><div>29</div></div><div><span>--with-ld-opt=</span><span>'-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><p>使用此配置需要修改<code>单个工作进程的最大文件描述符限制</code></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vim</span><span> </span><span>/etc/security/limits.conf</span></div></div><div><div><div>2</div></div><div><span># 改为65536</span></div></div><div><div><div>3</div></div><div><span>* soft nofile 65536</span></div></div><div><div><div>4</div></div><div><span>* hard nofile 65536</span></div></div><div><div><div>5</div></div><div><span># 或针对特定用户</span></div></div><div><div><div>6</div></div><div><span>www-data</span><span> </span><span>soft</span><span> </span><span>nofile</span><span> </span><span>65536</span></div></div><div><div><div>7</div></div><div><span>www-data</span><span> </span><span>hard</span><span> </span><span>nofile</span><span> </span><span>65536</span></div></div></code></pre><div><div></div><div></div></div></figure></div></blockquote><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 全局配置块：对应编译--user=nginx --group=nginx，适配--with-threads/--with-file-aio</span></div></div><div><div><div>2</div></div><div><span>user</span><span>  </span><span>nginx</span><span> </span><span>nginx</span><span>;        </span><span># 匹配编译的运行用户/组，替代默认nobody，安全必备</span></div></div><div><div><div>3</div></div><div><span>worker_processes</span><span>  </span><span>auto</span><span>;   </span><span># 自动匹配CPU核心数，充分利用多核，配合线程池更高效</span></div></div><div><div><div>4</div></div><div><span>error_log</span><span>  </span><span>logs/error.log</span><span>  </span><span>warn</span><span>; </span><span># 错误日志，warn级别兼顾排查和日志量</span></div></div><div><div><div>5</div></div><div><span>pid</span><span>        </span><span>logs/nginx.pid</span><span>; </span><span># 开启PID文件，用于Nginx进程管理（重启/重载/停止）</span></div></div><div><div><div>6</div></div><div><span>worker_rlimit_nofile</span><span> </span><span>65535</span><span>; </span><span># 提升文件描述符限制，配合高并发连接数调优</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># Events事件块：网络连接配置，适配--with-threads/--with-file-aio编译参数</span></div></div><div><div><div>9</div></div><div><span>events</span><span> </span><span>{</span></div></div><div><div><div>10</div></div><div><span>    </span><span>use</span><span> </span><span>epoll</span><span>;            </span><span># Linux专属高并发事件模型，Nginx默认最优选择</span></div></div><div><div><div>11</div></div><div><span>    </span><span>worker_connections</span><span>  </span><span>10240</span><span>; </span><span># 单进程最大并发连接数，从默认1024调优</span></div></div><div><div><div>12</div></div><div><span>    </span><span>multi_accept</span><span> </span><span>on</span><span>;      </span><span># 一次性接收所有新连接，提升并发处理效率</span></div></div><div><div><div>13</div></div><div><span>    </span><span>accept_mutex</span><span> </span><span>on</span><span>;      </span><span># 开启互斥锁，防止多进程惊群效应，减少CPU消耗</span></div></div><div><div><div>14</div></div><div><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span># HTTP核心块：启用所有编译的HTTP模块，适配Nginx 1.28.2语法</span></div></div><div><div><div>17</div></div><div><span>http</span><span> </span><span>{</span></div></div><div><div><div>18</div></div><div><span>    </span><span>include</span><span>       </span><span>mime.types</span><span>;        </span><span># 引入MIME类型映射，让浏览器正确解析文件</span></div></div><div><div><div>19</div></div><div><span>    </span><span>default_type</span><span>  </span><span>application/octet-stream</span><span>; </span><span># 未知后缀文件默认以二进制流下载</span></div></div><div><div><div>20</div></div><div><span>    </span><span>charset</span><span> </span><span>utf-8</span><span>;                   </span><span># 全局默认UTF-8字符集，解决中文乱码，生产必备</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>    </span><span># 自定义访问日志格式：适配--with-http_realip_module，记录客户端真实IP</span></div></div><div><div><div>23</div></div><div><span>    </span><span>log_format</span><span>  </span><span>main</span><span>  </span><span>'$remote_addr - $remote_user [$time_local] "$request" '</span></div></div><div><div><div>24</div></div><div><span>                      </span><span>'$status $body_bytes_sent "$http_referer" '</span></div></div><div><div><div>25</div></div><div><span>                      </span><span>'"$http_user_agent" "$http_x_forwarded_for" "$realip_remote_addr"'</span><span>;</span></div></div><div><div><div>26</div></div><div><span>    </span><span>access_log</span><span>  </span><span>logs/access.log</span><span>  </span><span>main</span><span>; </span><span># 开启访问日志，使用上面的main格式</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>    </span><span># 高性能核心配置：适配--with-file-aio/--with-threads编译参数</span></div></div><div><div><div>29</div></div><div><span>    </span><span>sendfile</span><span>        </span><span>on</span><span>;   </span><span># 开启零拷贝技术，大幅提升静态文件传输性能（file-aio核心）</span></div></div><div><div><div>30</div></div><div><span>    </span><span>tcp_nopush</span><span>      </span><span>on</span><span>;   </span><span># 配合sendfile，填满缓冲区再发送，减少TCP包数量</span></div></div><div><div><div>31</div></div><div><span>    </span><span>tcp_nodelay</span><span>     </span><span>on</span><span>;   </span><span># 长连接关闭Nagle算法，提升动态请求实时性</span></div></div><div><div><div>32</div></div><div><span>    </span><span>keepalive_timeout</span><span>  </span><span>60</span><span>; </span><span># 长连接超时时间，比默认65更适中，减少连接占用</span></div></div><div><div><div>33</div></div><div><span>    </span><span>keepalive_requests</span><span> </span><span>100</span><span>; </span><span># 单个长连接最大处理请求数，从默认10调优，减少握手开销</span></div></div><div><div><div>34</div></div><div>
</div></div><div><div><div>35</div></div><div><span>    </span><span># 客户端请求限制：生产必备，防止大文件/大请求压垮服务</span></div></div><div><div><div>36</div></div><div><span>    </span><span>client_max_body_size</span><span> </span><span>100M</span><span>; </span><span># 客户端最大上传文件大小，可根据业务修改</span></div></div><div><div><div>37</div></div><div><span>    </span><span>client_header_buffer_size</span><span> </span><span>1k</span><span>; </span><span># 客户端请求头缓冲区大小</span></div></div><div><div><div>38</div></div><div><span>    </span><span>client_body_buffer_size</span><span> </span><span>16k</span><span>; </span><span># 客户端请求体缓冲区大小</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>    </span><span># 压缩配置：适配--with-http_gzip_static/--with-http_gunzip_module编译参数</span></div></div><div><div><div>41</div></div><div><span>    </span><span>gzip</span><span>  </span><span>on</span><span>;             </span><span># 开启实时gzip压缩，压缩文本类文件</span></div></div><div><div><div>42</div></div><div><span>    </span><span>gzip_static</span><span> </span><span>on</span><span>;       </span><span># 优先返回预压缩的.gz文件，比实时压缩更省CPU（核心）</span></div></div><div><div><div>43</div></div><div><span>    </span><span>gzip_min_length</span><span> </span><span>1k</span><span>;   </span><span># 小于1k的文件不压缩，无性能收益</span></div></div><div><div><div>44</div></div><div><span>    </span><span>gzip_buffers</span><span> </span><span>4</span><span> </span><span>16k</span><span>;   </span><span># 压缩缓冲区大小，按需分配内存</span></div></div><div><div><div>45</div></div><div><span>    </span><span>gzip_http_version</span><span> </span><span>1.1</span><span>;# 仅对HTTP1.1+开启压缩，兼容主流客户端</span></div></div><div><div><div>46</div></div><div><span>    </span><span># 需压缩的文件类型，仅压缩文本类，图片/视频已压缩无需处理</span></div></div><div><div><div>47</div></div><div><span>    </span><span>gzip_types</span><span> </span><span>text/plain</span><span> </span><span>text/css</span><span> </span><span>application/json</span><span> </span><span>application/javascript</span><span> </span><span>text/xml</span><span> </span><span>application/xml</span><span> </span><span>application/xml+rss</span><span> </span><span>text/javascript</span><span>;</span></div></div><div><div><div>48</div></div><div><span>    </span><span>gzip_vary</span><span> </span><span>on</span><span>;         </span><span># 带Vary头，兼容CDN/缓存服务器，避免缓存混乱</span></div></div><div><div><div>49</div></div><div>
</div></div><div><div><div>50</div></div><div><span>    </span><span># 真实IP配置：适配--with-http_realip_module编译参数（反向代理/CDN场景必备）</span></div></div><div><div><div>51</div></div><div><span>    </span><span>set_real_ip_from</span><span> </span><span>127.0.0.1</span><span>;     </span><span># 本地代理IP，测试环境留用</span></div></div><div><div><div>52</div></div><div><span>    </span><span>set_real_ip_from</span><span> </span><span>192.168.0.0/16</span><span>; </span><span># 内网代理/CDN IP段，按需添加/删除</span></div></div><div><div><div>53</div></div><div><span>    </span><span>set_real_ip_from</span><span> </span><span>10.0.0.0/8</span><span>;    </span><span># 内网IP段，按需添加/删除</span></div></div><div><div><div>54</div></div><div><span>    </span><span>real_ip_header</span><span> </span><span>X-Forwarded-For</span><span>; </span><span># 从X-Forwarded-For头解析真实IP</span></div></div><div><div><div>55</div></div><div><span>    </span><span>real_ip_recursive</span><span> </span><span>on</span><span>;            </span><span># 递归解析，跳过指定的代理IP段，获取真实客户端IP</span></div></div><div><div><div>56</div></div><div>
</div></div><div><div><div>57</div></div><div><span>    </span><span># 80端口主虚拟主机：适配Nginx 1.28.2 HTTP/2明文写法（h2c），无SSL纯HTTP</span></div></div><div><div><div>58</div></div><div><span>    </span><span>server</span><span> </span><span>{</span></div></div><div><div><div>59</div></div><div><span>        </span><span># Nginx 1.28.2明文HTTP/2写法：http2 cleartext（替代旧的http2），不想用HTTP/2可直接写listen 80;</span></div></div><div><div><div>60</div></div><div><span>        </span><span>listen</span><span>       </span><span>80</span><span> ;</span></div></div><div><div><div>61</div></div><div><span>        </span><span>server_name</span><span>  </span><span>localhost</span><span>; </span><span># 替换为你的服务器IP/域名，比如192.168.1.100/xxx.com</span></div></div><div><div><div>62</div></div><div>
</div></div><div><div><div>63</div></div><div><span>        </span><span># 网站根目录和默认索引文件，可根据自己的业务修改路径</span></div></div><div><div><div>64</div></div><div><span>        </span><span>root</span><span>   </span><span>html</span><span>;</span></div></div><div><div><div>65</div></div><div><span>        </span><span>index</span><span>  </span><span>index.html</span><span> </span><span>index.htm</span><span> </span><span>index.php</span><span>; </span><span># 增加PHP索引，兼容动态站点，无需可删除</span></div></div><div><div><div>66</div></div><div>
</div></div><div><div><div>67</div></div><div><span>        </span><span># Nginx状态监控：适配--with-http_stub_status_module编译参数（运维必备）</span></div></div><div><div><div>68</div></div><div><span>        </span><span>location</span><span> </span><span>/nginx_status</span><span> </span><span>{</span></div></div><div><div><div>69</div></div><div><span>            </span><span>stub_status</span><span> </span><span>on</span><span>;           </span><span># 开启监控接口，展示连接数/请求数等核心指标</span></div></div><div><div><div>70</div></div><div><span>            </span><span>allow</span><span> </span><span>127.0.0.1</span><span>;          </span><span># 仅允许本地访问，安全</span></div></div><div><div><div>71</div></div><div><span>            </span><span>allow</span><span> </span><span>192.168.0.0/16</span><span>;     </span><span># 允许内网IP段访问，按需添加/删除</span></div></div><div><div><div>72</div></div><div><span>            </span><span>deny</span><span> </span><span>all</span><span>;                 </span><span># 拒绝所有外网未授权访问</span></div></div><div><div><div>73</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>74</div></div><div>
</div></div><div><div><div>75</div></div><div><span>        </span><span># 根路径请求处理：适配前端单页应用（Vue/React），刷新页面不404</span></div></div><div><div><div>76</div></div><div><span>        </span><span>location</span><span> </span><span>/</span><span> </span><span>{</span></div></div><div><div><div>77</div></div><div><span>            </span><span>try_files</span><span> </span><span>$uri</span><span> </span><span>$uri</span><span>/</span><span> </span><span>/index.html</span><span>; </span><span># 先匹配文件/目录，无则返回index.html</span></div></div><div><div><div>78</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>79</div></div><div>
</div></div><div><div><div>80</div></div><div><span>        </span><span># 错误页面配置：扩展404/5xx，保留Nginx默认的错误页文件</span></div></div><div><div><div>81</div></div><div><span>        </span><span>error_page</span><span>   </span><span>404</span><span>  </span><span>/404.html</span><span>;</span></div></div><div><div><div>82</div></div><div><span>        </span><span>error_page</span><span>   </span><span>500</span><span> </span><span>502</span><span> </span><span>503</span><span> </span><span>504</span><span>  </span><span>/50x.html</span><span>;</span></div></div><div><div><div>83</div></div><div><span>        </span><span>location</span><span> </span><span>=</span><span> </span><span>/404.html</span><span> </span><span>{</span></div></div><div><div><div>84</div></div><div><span>            </span><span>root</span><span>   </span><span>html</span><span>;</span></div></div><div><div><div>85</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>86</div></div><div><span>        </span><span>location</span><span> </span><span>=</span><span> </span><span>/50x.html</span><span> </span><span>{</span></div></div><div><div><div>87</div></div><div><span>            </span><span>root</span><span>   </span><span>html</span><span>;</span></div></div><div><div><div>88</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>89</div></div><div>
</div></div><div><div><div>90</div></div><div><span>        </span><span># 安全配置：禁止访问隐藏文件（.htaccess/.env/.git等），防止敏感配置泄露</span></div></div><div><div><div>91</div></div><div><span>        </span><span>location</span><span> </span><span>~</span><span> </span><span>/</span><span>\.</span><span> </span><span>{</span></div></div><div><div><div>92</div></div><div><span>            </span><span>deny</span><span>  </span><span>all</span><span>;</span></div></div><div><div><div>93</div></div><div><span>            </span><span>access_log</span><span> </span><span>off</span><span>; </span><span># 不记录该类请求日志</span></div></div><div><div><div>94</div></div><div><span>            </span><span>log_not_found</span><span> </span><span>off</span><span>; </span><span># 不记录文件未找到日志</span></div></div><div><div><div>95</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>96</div></div><div>
</div></div><div><div><div>97</div></div><div><span>        </span><span># PHP解析配置：适配FastCGI（Nginx+PHP-FPM），按需开启（删除#即可）</span></div></div><div><div><div>98</div></div><div><span>        </span><span># location ~ \.php$ {</span></div></div><div><div><div>99</div></div><div><span>        </span><span>#     root           html;</span></div></div><div><div><div>100</div></div><div><span>        </span><span>#     fastcgi_pass   127.0.0.1:9000; # PHP-FPM默认监听端口</span></div></div><div><div><div>101</div></div><div><span>        </span><span>#     fastcgi_index  index.php;</span></div></div><div><div><div>102</div></div><div><span>        </span><span>#     # 正确的PHP脚本路径，替换默认的/scripts，生产必备</span></div></div><div><div><div>103</div></div><div><span>        </span><span>#     fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;</span></div></div><div><div><div>104</div></div><div><span>        </span><span>#     include        fastcgi_params; # 引入FastCGI默认参数</span></div></div><div><div><div>105</div></div><div><span>        </span><span># }</span></div></div><div><div><div>106</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>107</div></div><div>
</div></div><div><div><div>108</div></div><div><span>    </span><span># Stream四层代理配置：适配--with-stream/--with-stream_realip等编译参数</span></div></div><div><div><div>109</div></div><div><span>    </span><span># 无需代理MySQL/Redis/TCP服务则保持注释，需要时删除#并修改配置</span></div></div><div><div><div>110</div></div><div><span>    </span><span># stream {</span></div></div><div><div><div>111</div></div><div><span>    </span><span>#     # 四层代理真实IP配置，按需开启</span></div></div><div><div><div>112</div></div><div><span>    </span><span>#     # set_real_ip_from 192.168.0.0/16;</span></div></div><div><div><div>113</div></div><div><span>    </span><span>#     # real_ip_header X-Forwarded-For;</span></div></div><div><div><div>114</div></div><div><span>    </span><span>#</span></div></div><div><div><div>115</div></div><div><span>    </span><span>#     # 示例：代理MySQL 3306端口</span></div></div><div><div><div>116</div></div><div><span>    </span><span>#     # server {</span></div></div><div><div><div>117</div></div><div><span>    </span><span>#     #     listen 3306;</span></div></div><div><div><div>118</div></div><div><span>    </span><span>#     #     proxy_pass 192.168.1.100:3306; # 后端MySQL真实IP:端口</span></div></div><div><div><div>119</div></div><div><span>    </span><span>#     #     proxy_connect_timeout 5s;</span></div></div><div><div><div>120</div></div><div><span>    </span><span>#     #     proxy_timeout 30s;</span></div></div><div><div><div>121</div></div><div><span>    </span><span>#     # }</span></div></div><div><div><div>122</div></div><div><span>    </span><span>#</span></div></div><div><div><div>123</div></div><div><span>    </span><span>#     # 示例：代理Redis 6379端口</span></div></div><div><div><div>124</div></div><div><span>    </span><span>#     # server {</span></div></div><div><div><div>125</div></div><div><span>    </span><span>#     #     listen 6379;</span></div></div><div><div><div>126</div></div><div><span>    </span><span>#     #     proxy_pass 192.168.1.101:6379; # 后端Redis真实IP:端口</span></div></div><div><div><div>127</div></div><div><span>    </span><span>#     # }</span></div></div><div><div><div>128</div></div><div><span>    </span><span># }</span></div></div><div><div><div>129</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><section><h3>1.3.1 配置参数详细解释<a href="#131-配置参数详细解释"><span>#</span></a></h3><p>所有配置均<strong>一一对应你的编译参数</strong>，标注了<strong>编译参数关联项</strong>，同时解释生产环境调优的原因，方便你根据自身业务修改。</p><section><h4>1.3.1.1 全局配置块（关联编译<code>--user/--group</code>）<a href="#1311-全局配置块关联编译--user--group"><span>#</span></a></h4>

<table><thead><tr><th>参数</th><th>含义 &amp; 编译关联 &amp; 调优原因</th></tr></thead><tbody><tr><td><code>user nginx nginx;</code></td><td>【关联<code>--user=nginx --group=nginx</code>】指定 Nginx 运行的用户 / 组，替代默认<code>nobody</code>，避免 root 权限运行，生产安全必备</td></tr><tr><td><code>worker_processes auto;</code></td><td>替代默认<code>1</code>，自动匹配服务器 CPU 核心数，充分利用多核资源（编译开启<code>--with-threads</code>，线程池配合多核更高效）</td></tr><tr><td><code>error_log logs/error.log warn;</code></td><td>开启错误日志，级别设为<code>warn</code>（比<code>error</code>详细、比<code>info</code>精简），生产环境日志量适中，方便排查问题</td></tr><tr><td><code>pid logs/nginx.pid;</code></td><td>开启 PID 文件，记录 Nginx 主进程 ID，用于<code>nginx -s stop/reload</code>等进程管理操作</td></tr><tr><td><code>worker_rlimit_nofile 65535;</code></td><td>提升单个工作进程的最大文件描述符限制，解决<code>worker_connections</code>调大后因系统限制失效的问题，高并发必备</td></tr></tbody></table></section><section><h4>1.3.1.2 Events 事件块（关联编译<code>--with-threads/--with-file-aio</code>）<a href="#1312-events-事件块关联编译--with-threads--with-file-aio"><span>#</span></a></h4>

<table><thead><tr><th>参数</th><th>含义 &amp; 编译关联 &amp; 调优原因</th></tr></thead><tbody><tr><td><code>use epoll;</code></td><td>使用 Linux 专属的<code>epoll</code>事件模型（高并发性能远优于 select/poll），Nginx 默认自动识别，显式配置更稳妥</td></tr><tr><td><code>worker_connections 10240;</code></td><td>【关联<code>--with-threads</code>】单进程最大并发连接数，从默认 1024 调至 10240，配合多核实现万级并发（需系统内核调优）</td></tr><tr><td><code>multi_accept on;</code></td><td>工作进程一次性接收所有新建立的连接，避免多次唤醒进程，提升并发处理效率</td></tr><tr><td><code>accept_mutex on;</code></td><td>开启连接互斥锁，防止多进程同时争抢连接的<strong>惊群效应</strong>，减少 CPU 消耗</td></tr></tbody></table></section><section><h4>1.3.1.3 HTTP 核心块（关联所有 HTTP 相关编译模块）<a href="#1313-http-核心块关联所有-http-相关编译模块"><span>#</span></a></h4><section><h5>1. 基础协议配置<a href="#1-基础协议配置"><span>#</span></a></h5>

<table><thead><tr><th>参数</th><th>含义 &amp; 编译关联</th></tr></thead><tbody><tr><td><code>charset utf-8;</code></td><td>全局默认字符集，解决 HTML/JSON 等中文乱码，生产环境必备</td></tr><tr><td><code>log_format main '...$realip_remote_addr';</code></td><td>自定义访问日志格式，【关联<code>--with-http_realip_module</code>】增加<code>$realip_remote_addr</code>字段，记录客户端真实 IP</td></tr><tr><td><code>client_max_body_size 100M;</code></td><td>限制客户端最大上传文件大小，避免大文件请求导致 Nginx 报错，可根据业务修改（比如视频服务调至 1G）</td></tr></tbody></table></section><section><h5>2. 高性能配置（关联<code>--with-file-aio/--with-threads</code>）<a href="#2-高性能配置关联--with-file-aio--with-threads"><span>#</span></a></h5>

<table><thead><tr><th>参数</th><th>含义 &amp; 编译关联 &amp; 调优原因</th></tr></thead><tbody><tr><td><code>sendfile on;</code></td><td>【关联<code>--with-file-aio</code>】开启 Linux 零拷贝技术，跳过用户态缓冲区，直接内核态传输文件，大幅提升静态文件性能</td></tr><tr><td><code>tcp_nopush on;</code></td><td>配合<code>sendfile on</code>，让 Nginx 填满 TCP 缓冲区后再一次性发送数据，减少 TCP 网络包数量，提升大文件传输效率</td></tr><tr><td><code>tcp_nodelay on;</code></td><td>长连接下关闭 Nagle 算法，实时发送小数据包，提升动态请求（比如 API）的响应速度</td></tr><tr><td><code>keepalive_requests 100;</code></td><td>单个长连接最大处理 100 个请求，从默认 10 调优，减少长连接的建立 / 关闭开销，提升并发</td></tr></tbody></table></section><section><h5>3. 压缩配置（关联<code>--with-http_gzip_static/--with-http_gunzip_module</code>）<a href="#3-压缩配置关联--with-http_gzip_static--with-http_gunzip_module"><span>#</span></a></h5>

<table><thead><tr><th>参数</th><th>含义 &amp; 编译关联</th></tr></thead><tbody><tr><td><code>gzip on;</code></td><td>开启实时 gzip 压缩，压缩文本类文件（HTML/CSS/JS），减少传输体积</td></tr><tr><td><code>gzip_static on;</code></td><td>【关联<code>--with-http_gzip_static_module</code>】优先返回预压缩的<code>.gz</code>文件（比如<code>index.html.gz</code>），比实时压缩更省 CPU，编译开启后核心配置</td></tr><tr><td><code>gzip_vary on;</code></td><td>响应头添加<code>Vary: Accept-Encoding</code>，兼容 CDN / 缓存服务器，避免缓存压缩 / 未压缩的混乱</td></tr></tbody></table></section><section><h5>4. 真实 IP 配置（关联<code>--with-http_realip_module</code>）<a href="#4-真实-ip-配置关联--with-http_realip_module"><span>#</span></a></h5>

<table><thead><tr><th>参数</th><th>含义 &amp; 编译关联</th></tr></thead><tbody><tr><td><code>set_real_ip_from 127.0.0.1/192.168.0.0/16;</code></td><td>【关联<code>--with-http_realip_module</code>】指定<strong>反向代理 IP 段</strong>（Nginx 前置 CDN / 负载均衡时），仅从这些 IP 获取真实 IP</td></tr><tr><td><code>real_ip_header X-Forwarded-For;</code></td><td>从 HTTP 请求头<code>X-Forwarded-For</code>中解析客户端真实 IP，替代 Nginx 默认的<code>$remote_addr</code>（代理场景下<code>$remote_addr</code>是代理 IP）</td></tr><tr><td><code>real_ip_recursive on;</code></td><td>递归解析真实 IP，跳过<code>set_real_ip_from</code>指定的代理 IP 段，直接获取最外层客户端 IP</td></tr></tbody></table></section></section><section><h4>1.3.1.4 Server 虚拟主机块（核心，关联<code>http_ssl/http_v2/stub_status</code>）<a href="#1314-server-虚拟主机块核心关联http_sslhttp_v2stub_status"><span>#</span></a></h4><section><h5>1. 80 端口配置（HTTP）<a href="#1-80-端口配置http"><span>#</span></a></h5>

<table><thead><tr><th>参数</th><th>含义 &amp; 编译关联</th></tr></thead><tbody><tr><td><code>rewrite ^(.*)$ https://$host$1 permanent;</code></td><td>强制将所有 80 端口 HTTP 请求 301 重定向到 443 端口 HTTPS，【关联<code>--with-http_ssl_module</code>】，生产环境 HTTPS 必备</td></tr></tbody></table></section><section><h5>2. 443 端口配置（HTTPS+HTTP2，核心）<a href="#2-443-端口配置httpshttp2核心"><span>#</span></a></h5>

<table><thead><tr><th>参数</th><th>含义 &amp; 编译关联</th></tr></thead><tbody><tr><td><code>listen 443 ssl http2;</code></td><td>【关联<code>--with-http_ssl_module/--with-http_v2_module</code>】开启 443 端口，同时启用 SSL 加密和 HTTP2 协议，HTTP2 大幅提升 HTTPS 并发性能</td></tr><tr><td><code>ssl_protocols TLSv1.2 TLSv1.3;</code></td><td>仅开启安全的 TLS1.2/1.3 协议，禁用低版本的 SSL3.0/TLS1.0/1.1，提升 HTTPS 安全性</td></tr><tr><td><code>ssl_ciphers 加密套件;</code></td><td>配置高安全的加密套件，避免弱加密被破解，【关联<code>http_ssl_module</code>】</td></tr></tbody></table></section><section><h5>3. 监控配置（关联<code>--with-http_stub_status_module</code>）<a href="#3-监控配置关联--with-http_stub_status_module"><span>#</span></a></h5>

<table><thead><tr><th>参数</th><th>含义 &amp; 编译关联</th></tr></thead><tbody><tr><td><code>location /nginx_status { stub_status on; }</code></td><td>【关联<code>--with-http_stub_status_module</code>】开启 Nginx 状态监控，访问<code>https://域名/nginx_status</code>可查看连接数 / 请求数 / 活跃进程等核心指标</td></tr><tr><td><code>allow 127.0.0.1; deny all;</code></td><td>仅允许本地 / 内网访问监控接口，防止外网恶意访问，提升安全性</td></tr></tbody></table></section><section><h5>4. 安全配置<a href="#4-安全配置"><span>#</span></a></h5>

<table><thead><tr><th>参数</th><th>含义</th></tr></thead><tbody><tr><td><code>location ~ /\. { deny all; }</code></td><td>禁止访问所有以<code>.</code>开头的隐藏文件（比如<code>.htaccess</code>/<code>.env</code>/<code>.git</code>），避免敏感配置泄露</td></tr><tr><td><code>try_files $uri $uri/ /index.html;</code></td><td>适配 Vue/React 等前端单页应用路由，刷新页面时避免 404，前端项目必备</td></tr></tbody></table></section></section><section><h4>1.3.1.5 Stream 四层代理块（关联<code>--with-stream</code>系列编译参数）<a href="#1315-stream-四层代理块关联--with-stream系列编译参数"><span>#</span></a></h4><p>该模块是<strong>四层 TCP/UDP 代理</strong>，区别于 HTTP 七层代理，【关联<code>--with-stream/--with-stream_realip/--with-stream_ssl_module</code>】，默认注释，按需开启：</p><ul>
<li><code>stream { ... }</code>：四层代理核心块，开启后可代理 MySQL/Redis/SSH 等 TCP 协议服务，也可代理 UDP 协议（比如 DNS）；</li>
<li><code>set_real_ip_from</code>：【关联<code>--with-stream_realip_module</code>】四层代理场景下获取客户端真实 IP；</li>
<li><code>listen 3306; proxy_pass 后端IP:3306;</code>：示例为代理 MySQL 数据库，将 Nginx 的 3306 端口转发到后端 MySQL 服务器。</li>
</ul></section><section><h4>1.3.1.6 配置使用注意事项<a href="#1316-配置使用注意事项"><span>#</span></a></h4><ol>
<li><strong>证书替换</strong>：将<code>ssl_certificate/ssl_certificate_key</code>替换为自己的 SSL 证书路径（公钥 / 私钥），证书可从阿里云 / 腾讯云 / Let’s Encrypt 免费申请；</li>
<li><strong>域名修改</strong>：将<code>server_name localhost;</code>替换为自己的实际域名（比如<code>www.test.com test.com</code>）；</li>
<li><strong>根目录修改</strong>：将<code>root html;</code>替换为自己的网站根目录（比如<code>/data/nginx/html</code>）；</li>
<li><strong>PHP 解析</strong>：如果是 PHP 动态站点，取消 PHP 解析配置的注释，确保 PHP-FPM 正常运行（监听 9000 端口）；</li>
<li><strong>Stream 代理</strong>：如果需要代理 MySQL/Redis 等 TCP 服务，取消<code>stream</code>块的注释，根据实际业务修改代理地址；</li>
<li><strong>系统内核调优</strong>：<code>worker_connections</code>调至 10240 后，需修改 Linux 内核参数（<code>/etc/security/limits.conf</code>）提升文件描述符限制，否则配置失效。</li>
</ol></section></section><section><h3>1.3.2 配置文件模块化<a href="#132-配置文件模块化"><span>#</span></a></h3><p>在默认的全局配置文件中加入<code>include conf.d/*.conf;</code>,这条指令的核心作用是<strong>引入指定目录下的所有.conf 后缀配置文件</strong>，Nginx 启动 / 重载时会自动将这些子配置文件的内容<strong>合并到主配置中</strong>，和直接写在主配置里的效果完全一致。</p><p><strong><code>conf.d/\*.conf</code></strong>：是<strong>相对路径 + 通配符</strong>，表示加载 <strong>Nginx 主配置目录（和 nginx.conf 同目录）</strong> 下的<code>conf.d</code>文件夹中，<strong>所有以.conf 结尾的文件</strong>；</p><ul>
<li>绝对路径写法：比如你的 Nginx 安装在<code>/usr/local/nginx</code>，可写<code>include /usr/local/nginx/conf/conf.d/*.conf;</code>，效果一致；</li>
<li>通配符<code>*</code>：仅匹配<code>conf.d</code>目录下的.conf 文件，子目录的不会匹配（如需递归匹配用<code>**</code>，Nginx 1.19.10 + 支持）。</li>
</ul><section><h4>1.3.2.1 创建<code>conf.d</code>目录 + 目录内有<code>.conf</code>文件<a href="#1321-创建confd目录--目录内有conf文件"><span>#</span></a></h4><p>Nginx 会将这些<code>.conf</code>文件的内容<strong>合并到主配置的对应位置</strong>（<code>include</code>写在哪个层级，子配置就属于哪个层级），<strong>子配置和主配置融为一体</strong>。</p><blockquote><p>关键：子配置文件的语法要和<code>include</code>所在层级匹配（比如<code>include</code>写在<code>http{}</code>块内，子配置里直接写<code>server{}</code>块即可，无需再包<code>http{}</code>，否则会语法报错）。</p></blockquote></section><section><h4>1.3.2.2 适用条件<a href="#1322-适用条件"><span>#</span></a></h4><p>原有配置是<strong>单文件配置</strong>：所有<code>server</code>块、全局配置都写在<code>nginx.conf</code>里，当需要配置<strong>多个虚拟主机、多个业务站点</strong>时，主配置会变得无比臃肿，改一个站点的配置要翻几百行，极易出错。</p><p><code>include conf.d/*.conf;</code>就是为了解决这个问题，实现<strong>配置拆分 / 模块化管理</strong>：把<strong>不同站点、不同业务的配置</strong>拆分成独立的<code>.conf</code>文件，统一放在<code>conf.d</code>目录下，主配置只保留<strong>全局、Events、HTTP 核心配置</strong>，让整个配置体系更清晰。</p><section><h5>模块化配置的核心优势（生产环境必用）<a href="#模块化配置的核心优势生产环境必用"><span>#</span></a></h5><ol>
<li><strong>便于管理</strong>：每个站点 / 业务一个独立的.conf 文件（比如<code>blog.conf</code>、<code>admin.conf</code>、<code>api.conf</code>），各司其职，不会混乱；</li>
<li><strong>便于维护</strong>：修改某个站点的配置，只需编辑对应的.conf 文件，不用动主配置<code>nginx.conf</code>，减少误改核心配置的风险；</li>
<li><strong>快速启用 / 禁用</strong>：只需将.conf 文件重命名为<code>.bak</code>（比如<code>blog.conf.bak</code>），Nginx 就不会加载，无需注释大量配置，实现站点的快速启停；</li>
<li><strong>配置复用</strong>：不同环境（测试 / 生产）的子配置文件可直接复制，只需修改域名 / IP，无需重构整个配置；</li>
<li><strong>团队协作</strong>：多个开发 / 运维修改配置时，不会同时编辑主配置文件，避免冲突。</li>
</ol></section></section><section><h4>1.3.2.3 使用方法<a href="#1323-使用方法"><span>#</span></a></h4><section><h5>1. 指令的<strong>正确放置位置</strong><a href="#1-指令的正确放置位置"><span>#</span></a></h5><p><code>include conf.d/*.conf;</code><strong>必须写在<code>http{}</code>块内</strong>（推荐放在 http 块的<strong>末尾</strong>，原有 server 块之后），因为子配置文件的核心内容是<code>server{}</code>块，而<code>server{}</code>是<code>http{}</code>的子级，放错位置会直接语法报错。</p></section><section><h5>2. 必须手动创建<code>conf.d</code>目录<a href="#2-必须手动创建confd目录"><span>#</span></a></h5><p>Nginx 不会自动创建该目录，需要手动在<strong>nginx.conf 同目录</strong>下创建，命令如下（你的 Nginx 安装在<code>/usr/local/nginx</code>）：</p></section><section><h5>3. 子配置文件的<strong>语法规则</strong><a href="#3-子配置文件的语法规则"><span>#</span></a></h5><p>子配置文件中<strong>无需写<code>http{}</code>块</strong>，直接写<code>server{}</code>块即可（可包含多个 server 块），因为<code>include</code>是把内容合并到主配置的<code>http{}</code>块内，重复写<code>http{}</code>会导致语法错误。</p></section><section><h5>4. 配置优先级<a href="#4-配置优先级"><span>#</span></a></h5><p>如果子配置和主配置有<strong>重复的 HTTP 级配置</strong>（比如<code>gzip on;</code>、<code>keepalive_timeout</code>），<strong>子配置的内容会覆盖主配置</strong>（就近原则），因此建议<strong>核心 HTTP 配置只写在主配置</strong>，子配置只写站点相关的<code>server{}</code>块。</p></section></section></section></section><section><h2>1.4 启动调试<a href="#14-启动调试"><span>#</span></a></h2><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 进入安装目录nginx后</span></div></div><div><div><div>2</div></div><div><span>cd</span><span> </span><span>./sbin/</span></div></div><div><div><div>3</div></div><div><span>./nginx</span><span> </span><span>-t</span><span>  </span><span># 检查配置文件是否正确</span></div></div><div><div><div>4</div></div><div><span>./nginx</span><span>    </span><span># 启动nginx</span></div></div><div><div><div>5</div></div><div><span>./nginx</span><span> </span><span>-s</span><span> </span><span>quit</span><span>    </span><span># 正常关闭nginx</span></div></div><div><div><div>6</div></div><div><span>./nginx</span><span> </span><span>-s</span><span> </span><span>stop</span><span>    </span><span># 快速关闭nginx</span></div></div><div><div><div>7</div></div><div><span>./nginx</span><span> </span><span>-s</span><span> </span><span>reload</span><span>  </span><span># 重载nginx</span></div></div><div><div><div>8</div></div><div><span>./nginx</span><span> </span><span>-s</span><span> </span><span>reopen</span><span>  </span><span># 重新打开日志文件</span></div></div><div><div><div>9</div></div><div><span>./nginx</span><span> </span><span>-V</span><span>      </span><span>#查看版本信息及编译参数</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>nginx</span><span> </span><span>-p</span><span> </span><span>/usr/local/newnginx</span><span>            </span><span># 指定Nginx的执行目录，默认为 configure 时的安装目录</span></div></div><div><div><div>12</div></div><div><span>nginx</span><span> </span><span>-c</span><span> </span><span>/etc/nginx/nginx.conf</span><span>          </span><span># 指定nginx.conf文件的位置，默认为 conf/nginx.conf</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span># 启动后查看进程</span></div></div><div><div><div>15</div></div><div><span>ps</span><span> </span><span>-ef</span><span> | </span><span>grep</span><span> </span><span>nginx</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h2>1.5 nginx 系统优化<a href="#15-nginx-系统优化"><span>#</span></a></h2><section><h3>1.5.1 添加软连接<a href="#151-添加软连接"><span>#</span></a></h3><p>由于目前每次需要进入到软件目录的<code>sbin</code>目录下去执行<code>nginx</code>这个可执行文件，或使用绝对路径去执行，非常麻烦。因此可以添加软链接到<code>系统默认的PATH变量路径中</code>，来实现无论在哪个目录下都可以执行nginx命令</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 查看当前系统的PATH环境路径</span></div></div><div><div><div>2</div></div><div><span>echo</span><span> </span><span>$PATH</span></div></div><div><div><div>3</div></div><div><span># 结果如下</span></div></div><div><div><div>4</div></div><div><span>/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 只需将软链接添加到这些路径中即可</span></div></div><div><div><div>7</div></div><div><span>ln</span><span> </span><span>-s</span><span> </span><span>/usr/local/nginx/sbin/nginx</span><span> </span><span>/usr/sbin/nginx</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 也可以直接编辑PATH变量，将软件的执行命令路径添加到PATH中，但不推荐，一旦安装多了会导致PATH十分臃肿</span></div></div><div><div><div>10</div></div><div><span>vim</span><span> </span><span>/etc/profile</span></div></div><div><div><div>11</div></div><div><span># 添加如下内容</span></div></div><div><div><div>12</div></div><div><span>export</span><span> </span><span>PATH</span><span>=</span><span>"</span><span>$PATH</span><span>:/usr/local/nginx/sbin"</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span># 方法二（推荐）：在 /etc/profile.d/ 下创建独立脚本</span></div></div><div><div><div>15</div></div><div><span>vim</span><span> </span><span>/etc/profile.d/nginx.sh</span></div></div><div><div><div>16</div></div><div><span># 添加内容</span></div></div><div><div><div>17</div></div><div><span>export</span><span> </span><span>PATH</span><span>=</span><span>"</span><span>$PATH</span><span>:/opt/mytools"</span></div></div><div><div><div>18</div></div><div><span># 赋予读权限（无需执行权限）：</span></div></div><div><div><div>19</div></div><div><span> </span><span>chmod</span><span> </span><span>644</span><span> </span><span>/etc/profile.d/nginx.sh</span></div></div><div><div><div>20</div></div><div><span># 新终端会自动加载该脚本</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>1.5.2 添加到systemd服务管理中<a href="#152-添加到systemd服务管理中"><span>#</span></a></h3><p>创建一个名为 <code>nginx.service</code> 的 systemd 服务单元文件，用于管理 Nginx 服务，存放于<code>/usr/lib/systemd/system</code>目录下，以下内容：(<strong>以下内容为nginx 文档中的配置</strong>)</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>[Unit]         </span><span># 记录service文件的通用信息</span></div></div><div><div><div>2</div></div><div><span>Description</span><span>=</span><span>The</span><span> </span><span>Nginx</span><span> </span><span>HTTP</span><span> </span><span>and</span><span> </span><span>reverse</span><span> </span><span>proxy</span><span> </span><span>server</span><span>      </span><span># Nginx服务描述信息</span></div></div><div><div><div>3</div></div><div><span>After</span><span>=</span><span>network.target</span><span> </span><span>remote-fs.target</span><span> </span><span>nss-lookup.target</span><span>  </span><span># Nginx服务启动依赖，在指定服务之后启动</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>[Service]      </span><span># 记录service文件的service信息</span></div></div><div><div><div>6</div></div><div><span>Type</span><span>=</span><span>forking</span><span>     </span><span># 标准UNIX Daemon使用的启动方式</span></div></div><div><div><div>7</div></div><div><span>PIDFile</span><span>=</span><span>/usr/local/nginx/logs/nginx.pid</span><span>       </span><span># Nginx服务的pid文件位置</span></div></div><div><div><div>8</div></div><div><span>ExecStartPre</span><span>=</span><span>/usr/bin/rm</span><span> </span><span>-f</span><span> </span><span>/usr/local/nginx/logs/nginx.pid</span><span>    </span><span># Nginx服务启动前删除旧的pid文件</span></div></div><div><div><div>9</div></div><div><span>ExecStartPre</span><span>=</span><span>/usr/local/nginx/sbin/nginx</span><span> </span><span>-t</span><span> </span><span>-q</span><span>       </span><span># Nginx服务启动前执行配置文件检测</span></div></div><div><div><div>10</div></div><div><span>ExecStart</span><span>=</span><span>/usr/local/nginx/sbin/nginx</span><span> </span><span>-g</span><span> </span><span>"pid /usr/local/nginx/logs/nginx.pid;"</span><span>  </span><span># 启动Nginx服务</span></div></div><div><div><div>11</div></div><div><span>ExecReload</span><span>=</span><span>/usr/local/nginx/sbin/nginx</span><span> </span><span>-t</span><span> </span><span>-q</span><span>         </span><span># Nginx服务重启前执行配置文件检测</span></div></div><div><div><div>12</div></div><div><span>ExecReload</span><span>=</span><span>/usr/local/nginx/sbin/nginx</span><span> </span><span>-s</span><span> </span><span>reload</span><span> </span><span>-g</span><span> </span><span>"pid /usr/local/nginx/logs/nginx.pid;"</span><span>  </span><span># 重启Nginx服务</span></div></div><div><div><div>13</div></div><div><span>ExecStop</span><span>=</span><span>/bin/kill</span><span> </span><span>-s</span><span> </span><span>HUP</span><span> </span><span>$MAINPID</span><span>                            </span><span># 关闭Nginx服务</span></div></div><div><div><div>14</div></div><div><span>KillSignal</span><span>=</span><span>SIGQUIT</span><span>  </span><span># 当 systemd 需要强制终止服务（比如超时后），默认发送的信号。</span></div></div><div><div><div>15</div></div><div><span>TimeoutStopSec</span><span>=</span><span>5</span><span>  </span><span># systemd 等待服务正常停止的最长时间（秒）</span></div></div><div><div><div>16</div></div><div><span>KillMode</span><span>=</span><span>process</span><span>  </span><span># 可选配置：control-group(杀死整个 cgroup 中的所有进程)/process(只杀死主进程)/mixed(主进程发 KillSignal，子进程发 SIGKILL)</span></div></div><div><div><div>17</div></div><div><span>PrivateTmp</span><span>=</span><span>true</span><span>    </span><span># 为该服务创建一个隔离的 /tmp 目录</span></div></div><div><div><div>18</div></div><div><span>[Install]                          </span><span># 记录service文件的安装信息</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>WantedBy</span><span>=</span><span>multi-user.target</span><span>            </span><span># 多用户环境下启用</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>以下为简便的systemd文件</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>/usr/lib/systemd/system/nginx.service</span><span> &lt;&lt;</span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>[Unit]</span></div></div><div><div><div>3</div></div><div><span>Description=The nginx HTTP and reverse proxy server</span></div></div><div><div><div>4</div></div><div><span>After=network.target remote-fs.target nss-lookup.target</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>[Service]</span></div></div><div><div><div>7</div></div><div><span>Type=forking</span></div></div><div><div><div>8</div></div><div><span>ExecStart=/usr/sbin/nginx</span></div></div><div><div><div>9</div></div><div><span>ExecReload=/usr/sbin/nginx -s reload</span></div></div><div><div><div>10</div></div><div><span>ExecStop=/usr/sbin/nginx -s quit</span></div></div><div><div><div>11</div></div><div><span>PrivateTmp=true</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>[Install]</span></div></div><div><div><div>14</div></div><div><span>WantedBy=multi-user.target</span></div></div><div><div><div>15</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 加载配置</span></div></div><div><div><div>2</div></div><div><span>systemctl</span><span> </span><span>damon-reload</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>1.6 使用案例<a href="#16-使用案例"><span>#</span></a></h2><section><h3>1.6.1web服务器<a href="#161web服务器"><span>#</span></a></h3><p><strong>场景说明：</strong></p><p>部署纯静态网站（HTML/CSS/JS/ 图片 / 视频），利用<code>gzip_static</code>/<code>sendfile</code>等编译模块优化性能，适配大文件传输。</p><div><div><div><figure><figcaption><span>conf.d/static.conf</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>server</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>listen</span><span> </span><span>80</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>server_name</span><span> </span><span>static.yourdomain.com</span><span>; </span><span># 替换为你的域名/服务器IP</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>    </span><span># 网站根目录（替换为实际静态文件路径）</span></div></div><div><div><div>6</div></div><div><span>    </span><span>root</span><span> </span><span>/data/nginx/static</span><span>;</span></div></div><div><div><div>7</div></div><div><span>    </span><span>index</span><span> </span><span>index.html</span><span> </span><span>index.htm</span><span>;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>    </span><span># 静态文件优化：适配--with-file-aio/--with-http_gzip_static</span></div></div><div><div><div>10</div></div><div><span>    </span><span>sendfile</span><span> </span><span>on</span><span>;</span></div></div><div><div><div>11</div></div><div><span>    </span><span>tcp_nopush</span><span> </span><span>on</span><span>;</span></div></div><div><div><div>12</div></div><div><span>    </span><span>tcp_nodelay</span><span> </span><span>on</span><span>;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>    </span><span># 预压缩文件优先（.html.gz/.js.gz），省CPU</span></div></div><div><div><div>15</div></div><div><span>    </span><span>gzip_static</span><span> </span><span>on</span><span>;</span></div></div><div><div><div>16</div></div><div><span>    </span><span>gzip</span><span> </span><span>on</span><span>;</span></div></div><div><div><div>17</div></div><div><span>    </span><span>gzip_types</span><span> </span><span>text/plain</span><span> </span><span>text/css</span><span> </span><span>application/javascript</span><span> </span><span>image/svg+xml</span><span>;</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span># 大文件分块传输（适配--with-http_slice_module）</span></div></div><div><div><div>20</div></div><div><span>    </span><span>slice</span><span> </span><span>1m</span><span>;</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>    </span><span># 静态文件缓存控制（浏览器缓存，减少重复请求）</span></div></div><div><div><div>23</div></div><div><span>    </span><span>location</span><span> </span><span>~</span><span>*</span><span> </span><span>\.</span><span>(</span><span>jpg</span><span>|</span><span>jpeg</span><span>|</span><span>png</span><span>|</span><span>gif</span><span>|</span><span>ico</span><span>|</span><span>css</span><span>|</span><span>js</span><span>)$ </span><span>{</span></div></div><div><div><div>24</div></div><div><span>        </span><span>expires</span><span> </span><span>7d</span><span>; </span><span># 7天缓存</span></div></div><div><div><div>25</div></div><div><span>        </span><span>add_header</span><span> </span><span>Cache-Control</span><span> </span><span>"public, max-age=604800"</span><span>;</span></div></div><div><div><div>26</div></div><div><span>        </span><span>access_log</span><span> </span><span>off</span><span>; </span><span># 不记录静态文件访问日志</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>    </span><span># 视频文件优化（适配--with-http_mp4_module/--with-http_flv_module）</span></div></div><div><div><div>30</div></div><div><span>    </span><span>location</span><span> </span><span>~</span><span>*</span><span> </span><span>\.</span><span>(</span><span>mp4</span><span>|</span><span>flv</span><span>)$ </span><span>{</span></div></div><div><div><div>31</div></div><div><span>        </span><span>mp4</span><span>; </span><span># 开启MP4断点续传</span></div></div><div><div><div>32</div></div><div><span>        </span><span>flv</span><span>; </span><span># 开启FLV断点续传</span></div></div><div><div><div>33</div></div><div><span>        </span><span>expires</span><span> </span><span>30d</span><span>;</span></div></div><div><div><div>34</div></div><div><span>        </span><span>add_header</span><span> </span><span>Cache-Control</span><span> </span><span>"public, max-age=2592000"</span><span>;</span></div></div><div><div><div>35</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>    </span><span># 禁止访问隐藏文件</span></div></div><div><div><div>38</div></div><div><span>    </span><span>location</span><span> </span><span>~</span><span> </span><span>/</span><span>\.</span><span> </span><span>{</span></div></div><div><div><div>39</div></div><div><span>        </span><span>deny</span><span> </span><span>all</span><span>;</span></div></div><div><div><div>40</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>41</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><h3>关键配置解释<a href="#关键配置解释"><span>#</span></a></h3><ul>
<li><code>gzip_static on</code>：优先返回预压缩的<code>.gz</code>文件（需提前用<code>gzip</code>命令压缩静态文件），比实时压缩省 90% CPU；</li>
<li><code>slice 1m</code>：大文件分块传输，提升下载速度；</li>
<li><code>expires</code>：设置浏览器缓存，减少重复请求。</li>
</ul><h3>验证方法<a href="#验证方法"><span>#</span></a></h3><p>访问<code>http://static.yourdomain.com/xxx.jpg</code>/<code>http://static.yourdomain.com/xxx.mp4</code>，检查文件可正常访问且响应头包含<code>Cache-Control</code>。</p></blockquote></section><section><h3>1.6.2 反向代理服务器<a href="#162-反向代理服务器"><span>#</span></a></h3><p><strong>场景说明</strong>：</p><p>Nginx 作为前端反向代理，转发请求到后端服务（如 Java SpringBoot、Python Flask、PHP-FPM），适配<code>realip</code>模块传递真实 IP。</p><section><h4>1.6.2.1 代理后端 HTTP API（如 SpringBoot）<a href="#1621-代理后端-http-api如-springboot"><span>#</span></a></h4><div><div><div><figure><figcaption><span>conf.d/proxy-api.conf</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>server</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>listen</span><span> </span><span>80</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>server_name</span><span> </span><span>api.yourdomain.com</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>    </span><span># 适配--with-http_realip_module：传递客户端真实IP到后端</span></div></div><div><div><div>6</div></div><div><span>    </span><span>set_real_ip_from</span><span> </span><span>127.0.0.1</span><span>; </span><span># Nginx自身IP（反向代理场景必配）</span></div></div><div><div><div>7</div></div><div><span>    </span><span>real_ip_header</span><span> </span><span>X-Forwarded-For</span><span>;</span></div></div><div><div><div>8</div></div><div><span>    </span><span>real_ip_recursive</span><span> </span><span>on</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>    </span><span># 代理后端API（替换为实际后端地址）</span></div></div><div><div><div>11</div></div><div><span>    </span><span>location</span><span> </span><span>/</span><span> </span><span>{</span></div></div><div><div><div>12</div></div><div><span>        </span><span>proxy_pass</span><span> </span><span>http://127.0.0.1:8080</span><span>; </span><span># 后端SpringBoot服务地址</span></div></div><div><div><div>13</div></div><div><span>        </span><span>proxy_set_header</span><span> </span><span>Host</span><span> </span><span>$host</span><span>;</span></div></div><div><div><div>14</div></div><div><span>        </span><span>proxy_set_header</span><span> </span><span>X-Real-IP</span><span> </span><span>$remote_addr</span><span>; </span><span># 真实IP</span></div></div><div><div><div>15</div></div><div><span>        </span><span>proxy_set_header</span><span> </span><span>X-Forwarded-For</span><span> </span><span>$proxy_add_x_forwarded_for</span><span>;</span></div></div><div><div><div>16</div></div><div><span>        </span><span>proxy_connect_timeout</span><span> </span><span>5s</span><span>; </span><span># 连接超时</span></div></div><div><div><div>17</div></div><div><span>        </span><span>proxy_read_timeout</span><span> </span><span>30s</span><span>; </span><span># 读取超时</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h4>1.6.2.2 代理 PHP-FPM（Nginx+PHP 经典组合）<a href="#1622-代理-php-fpmnginxphp-经典组合"><span>#</span></a></h4><div><div><div><figure><figcaption><span>conf.d/proxy-php.conf</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>server</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>listen</span><span> </span><span>80</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>server_name</span><span> </span><span>php.yourdomain.com</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>    </span><span>root</span><span> </span><span>/data/nginx/php</span><span>; </span><span># PHP项目根目录</span></div></div><div><div><div>6</div></div><div><span>    </span><span>index</span><span> </span><span>index.php</span><span> </span><span>index.html</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>    </span><span># 适配--with-http_realip_module</span></div></div><div><div><div>9</div></div><div><span>    </span><span>set_real_ip_from</span><span> </span><span>127.0.0.1</span><span>;</span></div></div><div><div><div>10</div></div><div><span>    </span><span>real_ip_header</span><span> </span><span>X-Forwarded-For</span><span>;</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>    </span><span># PHP解析（适配FastCGI）</span></div></div><div><div><div>13</div></div><div><span>    </span><span>location</span><span> </span><span>~</span><span> </span><span>\.</span><span>php</span><span>$ </span><span>{</span></div></div><div><div><div>14</div></div><div><span>        </span><span>fastcgi_pass</span><span> </span><span>127.0.0.1:9000</span><span>; </span><span># PHP-FPM监听地址</span></div></div><div><div><div>15</div></div><div><span>        </span><span>fastcgi_index</span><span> </span><span>index.php</span><span>;</span></div></div><div><div><div>16</div></div><div><span>        </span><span>fastcgi_param</span><span> </span><span>SCRIPT_FILENAME</span><span> </span><span>$document_root$fastcgi_script_name</span><span>;</span></div></div><div><div><div>17</div></div><div><span>        </span><span>fastcgi_param</span><span> </span><span>REMOTE_ADDR</span><span> </span><span>$realip_remote_addr</span><span>; </span><span># 传递真实IP</span></div></div><div><div><div>18</div></div><div><span>        </span><span>include</span><span> </span><span>fastcgi_params</span><span>;</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>20</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><h3>验证方法<a href="#验证方法-1"><span>#</span></a></h3><ul>
<li>代理 API：访问<code>http://api.yourdomain.com/xxx</code>，后端日志可看到<code>X-Real-IP</code>为客户端真实 IP；</li>
<li>代理 PHP：在 PHP 项目中写<code>&lt;?php echo $_SERVER['REMOTE_ADDR']; ?&gt;</code>，访问后显示客户端真实 IP。</li>
</ul></blockquote></section><section><h4>1.6.2.3 四层 TCP 代理（Stream 模块，代理 MySQL/Redis）<a href="#1623-四层-tcp-代理stream-模块代理-mysqlredis"><span>#</span></a></h4><p>利用编译的<code>--with-stream</code>模块，实现四层 TCP 代理（区别于 HTTP 七层代理），代理 MySQL/Redis 等 TCP 服务。</p><section><h5>配置修改<a href="#配置修改"><span>#</span></a></h5><ol>
<li>编辑主配置<code>nginx.conf</code>，取消<code>stream</code>块的注释：</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>stream</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span># 适配--with-stream_realip_module：传递真实IP（可选）</span></div></div><div><div><div>3</div></div><div><span>    </span><span># set_real_ip_from 192.168.0.0/16;</span></div></div><div><div><div>4</div></div><div><span>    </span><span># real_ip_header X-Forwarded-For;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span># 引入stream子配置（模块化）</span></div></div><div><div><div>7</div></div><div><span>    </span><span>include</span><span> </span><span>conf.d/stream/</span><span>*</span><span>.conf</span><span>;</span></div></div><div><div><div>8</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>创建<code>stream</code>子配置目录：</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/usr/local/nginx/conf/conf.d/stream</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>代理 MySQL 配置（<code>conf.d/stream/mysql-proxy.conf</code>）：</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>server</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>listen</span><span> </span><span>3306</span><span>; </span><span># Nginx监听的端口</span></div></div><div><div><div>3</div></div><div><span>    </span><span>proxy_pass</span><span> </span><span>192.168.1.100:3306</span><span>; </span><span># 后端MySQL真实地址</span></div></div><div><div><div>4</div></div><div><span>    </span><span>proxy_connect_timeout</span><span> </span><span>5s</span><span>; </span><span># 连接超时</span></div></div><div><div><div>5</div></div><div><span>    </span><span>proxy_timeout</span><span> </span><span>300s</span><span>; </span><span># 超时时间（MySQL长连接需调大）</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>代理 Redis 配置（<code>conf.d/stream/redis-proxy.conf</code>）：</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>server</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>listen</span><span> </span><span>6379</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>proxy_pass</span><span> </span><span>192.168.1.101:6379</span><span>; </span><span># 后端Redis真实地址</span></div></div><div><div><div>4</div></div><div><span>    </span><span>proxy_connect_timeout</span><span> </span><span>2s</span><span>;</span></div></div><div><div><div>5</div></div><div><span>    </span><span>proxy_timeout</span><span> </span><span>60s</span><span>;</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h5>验证方法<a href="#验证方法-2"><span>#</span></a></h5><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 连接Nginx代理的MySQL</span></div></div><div><div><div>2</div></div><div><span>mysql</span><span> </span><span>-h</span><span> </span><span>你的Nginx服务器IP</span><span> </span><span>-P</span><span> </span><span>3306</span><span> </span><span>-u</span><span> </span><span>root</span><span> </span><span>-p</span></div></div><div><div><div>3</div></div><div><span># 连接Nginx代理的Redis</span></div></div><div><div><div>4</div></div><div><span>redis-cli</span><span> </span><span>-h</span><span> </span><span>你的Nginx服务器IP</span><span> </span><span>-p</span><span> </span><span>6379</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section></section><section><h3>1.6.3 虚拟主机<a href="#163-虚拟主机"><span>#</span></a></h3><p><strong>场景说明</strong></p><p>一台服务器部署多个站点（如<code>site1.com</code>、<code>site2.com</code>），利用<code>conf.d</code>目录拆分配置，互不干扰，便于管理。</p><section><h4>1.6.3.1 多网卡（即多ip，多域名）的虚拟主机<a href="#1631-多网卡即多ip多域名的虚拟主机"><span>#</span></a></h4><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>server</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>listen</span><span> </span><span>80</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>server_name</span><span> </span><span>site1.com</span><span> </span><span>www.site1.com</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span># 可为ip</span></div></div><div><div><div>5</div></div><div><span>  </span><span># server_name 192.168.1.1;</span></div></div><div><div><div>6</div></div><div><span>    </span><span>root</span><span> </span><span>/data/nginx/site1</span><span>;</span></div></div><div><div><div>7</div></div><div><span>    </span><span>index</span><span> </span><span>index.html</span><span>;</span></div></div><div><div><div>8</div></div><div><span>    </span><span>access_log</span><span> </span><span>logs/site1_access.log</span><span> </span><span>main</span><span>; </span><span># 独立日志</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>server</span><span> </span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>listen</span><span> </span><span>80</span><span>;</span></div></div><div><div><div>13</div></div><div><span>    </span><span>server_name</span><span> </span><span>site2.com</span><span> </span><span>www.site2.com</span><span>;</span></div></div><div><div><div>14</div></div><div><span>    </span><span># 可为ip</span></div></div><div><div><div>15</div></div><div><span>  </span><span># server_name 192.168.1.2;</span></div></div><div><div><div>16</div></div><div><span>    </span><span>root</span><span> </span><span>/data/nginx/site2</span><span>;</span></div></div><div><div><div>17</div></div><div><span>    </span><span>index</span><span> </span><span>index.html</span><span>;</span></div></div><div><div><div>18</div></div><div><span>    </span><span>access_log</span><span> </span><span>logs/site2_access.log</span><span> </span><span>main</span><span>; </span><span># 独立日志</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h4>1.6.3.2 同域名同ip不同端口的虚拟主机<a href="#1632-同域名同ip不同端口的虚拟主机"><span>#</span></a></h4><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>server</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>listen</span><span> </span><span>80</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>server_name</span><span> </span><span>localhost</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span># 可为ip</span></div></div><div><div><div>5</div></div><div><span>  </span><span># server_name 192.168.1.1;</span></div></div><div><div><div>6</div></div><div><span>    </span><span>root</span><span> </span><span>/data/nginx/site1</span><span>;</span></div></div><div><div><div>7</div></div><div><span>    </span><span>index</span><span> </span><span>index.html</span><span>;</span></div></div><div><div><div>8</div></div><div><span>    </span><span>access_log</span><span> </span><span>logs/site1_access.log</span><span> </span><span>main</span><span>; </span><span># 独立日志</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>server</span><span> </span><span>{</span></div></div><div><div><div>12</div></div><div><span>    </span><span>listen</span><span> </span><span>8080</span><span>;</span></div></div><div><div><div>13</div></div><div><span>     </span><span>server_name</span><span> </span><span>localhost</span><span>;</span></div></div><div><div><div>14</div></div><div><span>    </span><span># 可为ip</span></div></div><div><div><div>15</div></div><div><span>  </span><span># server_name 192.168.1.1;</span></div></div><div><div><div>16</div></div><div><span>    </span><span>root</span><span> </span><span>/data/nginx/site2</span><span>;</span></div></div><div><div><div>17</div></div><div><span>    </span><span>index</span><span> </span><span>index.html</span><span>;</span></div></div><div><div><div>18</div></div><div><span>    </span><span>access_log</span><span> </span><span>logs/site2_access.log</span><span> </span><span>main</span><span>; </span><span># 独立日志</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section><section><h3>1.6.4 访问控制（IP 白名单 / 目录限制）<a href="#164-访问控制ip-白名单--目录限制"><span>#</span></a></h3><p><strong>场景说明</strong></p><p>限制后台 /admin 目录的访问（仅允许指定 IP 访问），适配安全需求，防止未授权访问。</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>server</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>listen</span><span> </span><span>80</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>server_name</span><span> </span><span>admin.yourdomain.com</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>    </span><span>root</span><span> </span><span>/data/nginx/admin</span><span>;</span></div></div><div><div><div>6</div></div><div><span>    </span><span>index</span><span> </span><span>index.html</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>    </span><span># 限制/admin目录仅允许指定IP访问（替换为你的白名单IP）</span></div></div><div><div><div>9</div></div><div><span>    </span><span>location</span><span> </span><span>/admin/</span><span> </span><span>{</span></div></div><div><div><div>10</div></div><div><span>        </span><span>allow</span><span> </span><span>192.168.1.0/24</span><span>; </span><span># 允许网段</span></div></div><div><div><div>11</div></div><div><span>        </span><span>allow</span><span> </span><span>127.0.0.1</span><span>;     </span><span># 本地IP</span></div></div><div><div><div>12</div></div><div><span>        </span><span>deny</span><span> </span><span>all</span><span>;            </span><span># 拒绝其他所有IP</span></div></div><div><div><div>13</div></div><div><span>        </span><span>auth_basic</span><span> </span><span>"请输入管理员账号密码"</span><span>; </span><span># 可选：密码认证</span></div></div><div><div><div>14</div></div><div><span>        </span><span>auth_basic_user_file</span><span> </span><span>/usr/local/nginx/conf/.htpasswd</span><span>; </span><span># 密码文件</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span># 密码文件生成</span></div></div><div><div><div>20</div></div><div><span># 安装htpasswd（CentOS：yum install httpd-tools -y；Ubuntu：apt install apache2-utils -y）</span></div></div><div><div><div>21</div></div><div><span>htpasswd</span><span> </span><span>-c</span><span> </span><span>/usr/local/nginx/conf/.htpasswd</span><span> </span><span>admin</span><span> </span><span># 生成admin用户的密码</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><h3>验证方法<a href="#验证方法-3"><span>#</span></a></h3><ul>
<li>非白名单 IP 访问<code>http://admin.yourdomain.com/admin/</code>，返回 403 Forbidden；</li>
<li>白名单 IP 访问，需输入账号密码（若配置了 auth_basic）。</li>
</ul></blockquote></section><section><h3>1.6.5 防盗链<a href="#165-防盗链"><span>#</span></a></h3><p>防止他人盗用你的图片 / JS/CSS 等静态资源（比如直接在他的网站引用你的图片链接），适配<code>http_referer</code>模块。</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>server</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>listen</span><span> </span><span>80</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>server_name</span><span> </span><span>img.yourdomain.com</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>    </span><span>root</span><span> </span><span>/data/nginx/images</span><span>;</span></div></div><div><div><div>6</div></div><div><span>    </span><span>index</span><span> </span><span>index.html</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>    </span><span># 防盗链：仅允许自己的域名引用资源</span></div></div><div><div><div>9</div></div><div><span>    </span><span>location</span><span> </span><span>~</span><span>*</span><span> </span><span>\.</span><span>(</span><span>jpg</span><span>|</span><span>jpeg</span><span>|</span><span>png</span><span>|</span><span>gif</span><span>|</span><span>css</span><span>|</span><span>js</span><span>)$ </span><span>{</span></div></div><div><div><div>10</div></div><div><span>        </span><span>valid_referers</span><span> </span><span>none</span><span> </span><span>blocked</span><span> </span><span>yourdomain.com</span><span> </span><span>*</span><span>.yourdomain.com</span><span>;</span></div></div><div><div><div>11</div></div><div><span>        </span><span>if</span><span> (</span><span>$invalid_referer</span><span>) {</span></div></div><div><div><div>12</div></div><div><span>            </span><span>return</span><span> </span><span>403</span><span>; </span><span># 非法引用返回403</span></div></div><div><div><div>13</div></div><div><span>            </span><span># 可选：跳转到自定义图片（如防盗链提示图）</span></div></div><div><div><div>14</div></div><div><span>            </span><span># rewrite ^/ https://yourdomain.com/anti-leech.png permanent;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>16</div></div><div><span>        </span><span>expires</span><span> </span><span>7d</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><h3>关键配置解释<a href="#关键配置解释-1"><span>#</span></a></h3><ul>
<li><code>valid_referers</code>：允许的引用域名（<code>none</code>允许直接访问，<code>blocked</code>允许无 referer 的情况）；</li>
<li><code>$invalid_referer</code>：若 referer 不在允许列表，返回 403。</li>
</ul></blockquote></section><section><h3>1.6.6 前端 SPA 路由适配（Vue/React）<a href="#166-前端-spa-路由适配vuereact"><span>#</span></a></h3><p>解决 Vue/React 单页应用刷新页面返回 404 的问题（前端路由由 JS 控制，Nginx 需重写所有请求到 index.html）。</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>server</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>listen</span><span> </span><span>80</span><span>;</span></div></div><div><div><div>3</div></div><div><span>    </span><span>server_name</span><span> </span><span>spa.yourdomain.com</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>    </span><span>root</span><span> </span><span>/data/nginx/spa/dist</span><span>; </span><span># 前端打包后的dist目录</span></div></div><div><div><div>6</div></div><div><span>    </span><span>index</span><span> </span><span>index.html</span><span>;</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>    </span><span># 适配SPA路由：所有请求重写到index.html</span></div></div><div><div><div>9</div></div><div><span>    </span><span>location</span><span> </span><span>/</span><span> </span><span>{</span></div></div><div><div><div>10</div></div><div><span>        </span><span>try_files</span><span> </span><span>$uri</span><span> </span><span>$uri</span><span>/</span><span> </span><span>/index.html</span><span>; </span><span># 先匹配文件，无则返回index.html</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>    </span><span># 静态资源缓存</span></div></div><div><div><div>14</div></div><div><span>    </span><span>location</span><span> </span><span>~</span><span>*</span><span> </span><span>\.</span><span>(</span><span>js</span><span>|</span><span>css</span><span>|</span><span>png</span><span>|</span><span>jpg</span><span>|</span><span>jpeg</span><span>|</span><span>gif</span><span>|</span><span>ico</span><span>)$ </span><span>{</span></div></div><div><div><div>15</div></div><div><span>        </span><span>expires</span><span> </span><span>30d</span><span>;</span></div></div><div><div><div>16</div></div><div><span>        </span><span>access_log</span><span> </span><span>off</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><h3>验证方法<a href="#验证方法-4"><span>#</span></a></h3><p>访问<code>http://spa.yourdomain.com/about</code>（前端路由），刷新页面后仍能正常显示，不返回 404。</p></blockquote></section><section><h3>1.6.7 Nginx 日志切割<a href="#167-nginx-日志切割"><span>#</span></a></h3><p>Nginx 默认将日志写入单个文件，长期运行会导致日志文件过大（几十 G），需定时切割日志（按天 / 按大小），保留历史日志。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># 切割脚本，/usr/local/nginx/logs/cut_nginx_log.sh</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>#!/bin/bash</span></div></div><div><div><div>4</div></div><div><span># Nginx安装目录</span></div></div><div><div><div>5</div></div><div><span>NGINX_PATH</span><span>=</span><span>"/usr/local/nginx"</span></div></div><div><div><div>6</div></div><div><span># 日志目录</span></div></div><div><div><div>7</div></div><div><span>LOG_PATH</span><span>=</span><span>"</span><span><span>${</span><span>NGINX_PATH</span><span>}</span></span><span>/logs"</span></div></div><div><div><div>8</div></div><div><span># 日期格式</span></div></div><div><div><div>9</div></div><div><span>DATE</span><span><span>=</span><span>$(</span></span><span>date</span><span> </span><span>+%Y%m%d</span><span>)</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span># 备份访问日志</span></div></div><div><div><div>12</div></div><div><span>mv</span><span> </span><span><span>${</span><span>LOG_PATH</span><span>}</span></span><span>/access.log</span><span> </span><span><span>${</span><span>LOG_PATH</span><span>}</span></span><span>/access_</span><span><span>${</span><span>DATE</span><span>}</span></span><span>.log</span></div></div><div><div><div>13</div></div><div><span># 备份错误日志</span></div></div><div><div><div>14</div></div><div><span>mv</span><span> </span><span><span>${</span><span>LOG_PATH</span><span>}</span></span><span>/error.log</span><span> </span><span><span>${</span><span>LOG_PATH</span><span>}</span></span><span>/error_</span><span><span>${</span><span>DATE</span><span>}</span></span><span>.log</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span># 向Nginx发送USR1信号，重新生成日志文件（不中断服务）</span></div></div><div><div><div>17</div></div><div><span><span>${</span><span>NGINX_PATH</span><span>}</span></span><span>/sbin/nginx -s reopen</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span># 删除7天前的旧日志（可选）</span></div></div><div><div><div>20</div></div><div><span>find</span><span> </span><span><span>${</span><span>LOG_PATH</span><span>}</span></span><span> </span><span>-name</span><span> </span><span>"access_*.log"</span><span> </span><span>-mtime</span><span> </span><span>+7</span><span> </span><span>-delete</span></div></div><div><div><div>21</div></div><div><span>find</span><span> </span><span><span>${</span><span>LOG_PATH</span><span>}</span></span><span> </span><span>-name</span><span> </span><span>"error_*.log"</span><span> </span><span>-mtime</span><span> </span><span>+7</span><span> </span><span>-delete</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span># ===============================================================</span></div></div><div><div><div>24</div></div><div><span># 添加定时任务（每天凌晨 0 点执行）</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span># 赋予脚本执行权限</span></div></div><div><div><div>27</div></div><div><span>chmod</span><span> </span><span>+x</span><span> </span><span>/usr/local/nginx/logs/cut_nginx_log.sh</span></div></div><div><div><div>28</div></div><div><span># 编辑crontab</span></div></div><div><div><div>29</div></div><div><span>crontab</span><span> </span><span>-e</span></div></div><div><div><div>30</div></div><div><span># 添加以下内容</span></div></div><div><div><div>31</div></div><div><span>0</span><span> </span><span>0</span><span> </span><span>*</span><span> </span><span>*</span><span> </span><span>*</span><span> </span><span>/usr/local/nginx/logs/cut_nginx_log.sh</span><span> &gt; </span><span>/dev/null</span><span> 2&gt;&amp;1</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><h3>验证方法<a href="#验证方法-5"><span>#</span></a></h3><p>每天凌晨 0 点，日志目录会生成<code>access_20260212.log</code>、<code>error_20260212.log</code>等按日期命名的日志文件，原日志文件被清空重新生成。</p></blockquote></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/%E6%95%B0%E5%AD%97%E8%AF%81%E4%B9%A6%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E8%B7%B5/</id>
      <title type="text">数字证书原理与实践</title>
      <published>2026-05-06T00:00:00.000Z</published>
      <updated>2026-05-06T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/%E6%95%B0%E5%AD%97%E8%AF%81%E4%B9%A6%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E8%B7%B5/"/>
      <summary type="text">数字证书原理与实践</summary>
      <content type="html"><![CDATA[<section><h1>数字证书原理与实践<a href="#数字证书原理与实践"><span>#</span></a></h1><section><h2>一、数字证书介绍<a href="#一数字证书介绍"><span>#</span></a></h2><p>数字证书是保障互联网通信安全与信任的基石，它如同网络世界的“身份证”。</p><section><h3>1.1 核心信任链<a href="#11-核心信任链"><span>#</span></a></h3><p>根证书 → 中间 CA 证书 → 业务证书（二级域名 / 泛域名 / 多域名）。</p><p>当浏览器验证一个网站的证书时，会沿 <code>业务证书 → 中间证书 → 根证</code> 的路径逐级验证签名，只要根证书是可信的，且链条完整，浏览器就会认为该网站是安全的。</p></section><section><h3>1.2 根证书（根 CA 证书）<a href="#12-根证书根-ca-证书"><span>#</span></a></h3><ul>
<li><strong>作用</strong>：作为整个信任体系的<strong>最终信任锚点</strong>、 HTTPS 的<strong>信任锚点</strong>。</li>
<li><strong>特点</strong>：自己给自己发证，没人比它更高。</li>
<li><strong>有效期</strong>：极长：10～20 年。</li>
<li><strong>安装位置</strong>：预先安装在操作系统和浏览器中。</li>
<li><strong>权限</strong>：可以签发中间 CA证书、下级根。</li>
<li><strong>私钥绝对离线</strong>：常年锁在机房保险柜，<strong>绝不直接给网站发证</strong>。</li>
<li><strong>示例</strong>：当在浏览器中访问 <code>https://www.example.com</code> 时，浏览器会检查该网站的证书。验证的最终一步，就是确认签发该证书的机构是否能追溯到浏览器内置的一个受信任的根证书（例如 <code>DigiCert Global Root G2</code>）。如果能成功追溯，浏览器就会显示“安全”的锁形图标。</li>
</ul></section><section><h3>1.3 中间证书<a href="#13-中间证书"><span>#</span></a></h3><ul>
<li>
<p><strong>是什么</strong>：中间证书是由根证书签发的，它扮演着“代理人”的角色。</p>
</li>
<li>
<p><strong>特点：</strong></p>
<ul>
<li>由根证书签发，不是自签。</li>
<li><strong>不预装在浏览器</strong>，网站部署时要一起配上去。</li>
<li>权限：可以签发<strong>网站证书、下级中间 CA</strong>。</li>
</ul>
</li>
</ul><ul>
<li><strong>给谁签发</strong>：给所有域名、服务器、设备签发 HTTPS 证书。</li>
<li><strong>有效期</strong>：3～5 年，比根短、比网站证书长。</li>
<li><strong>作用</strong>：
<ul>
<li><strong>保护根证书</strong>：即使中间证书的私钥不慎泄露，也只需吊销该中间证书，而不会危及整个根证书体系的信任，影响范围有限。</li>
<li><strong>提高签发效率</strong>：根证书离线保存，而中间证书在线处理海量的证书签发请求，实现了安全与效率的平衡。</li>
</ul>
</li>
</ul></section><section><h3>1.4 业务证书<a href="#14-业务证书"><span>#</span></a></h3><p>业务 SSL 证书根据其保护的域名范围和方式，主要分为以下几种类型：</p><section><h4>1.4.1 单域名证书<a href="#141-单域名证书"><span>#</span></a></h4><ul>
<li>
<p>也可以叫 <code>二级域名证书</code> ，是给<strong>单个固定二级域名</strong>用的终端业务证书。</p>
</li>
<li>
<p>一张证书仅能保护一个完整的域名（例如 <code>example.com</code> 或 <code>www.example.com</code> ），不支持任何其他子域名。</p>
</li>
<li>
<p>特点：</p>
<ul>
<li>由<strong>中间 CA</strong>签发。</li>
<li><strong>只能绑定 1 个域名</strong>。</li>
<li>只能给对应网站做 HTTPS，<strong>不能再签发任何子证书</strong>。</li>
<li>有效期：现在主流 <strong>1 年</strong>。</li>
<li>可以免费申请（Let’s Encrypt）。</li>
</ul>
</li>
<li>
<p><strong>适合场景</strong>：适合只有一个官方网站或博客的场景。</p>
</li>
</ul></section><section><h4>1.4.2 多域名证书<a href="#142-多域名证书"><span>#</span></a></h4><ul>
<li>也称为<code> SAN 证书或 UCC 证书</code> 。</li>
<li>一张证书可以同时保护多个完全不同的域名。例如，一张证书可以同时保护 <code>abc.com</code>、<code>kfc.cn</code> 和 <code>ccc.net</code> 。</li>
<li><strong>适合场景</strong>：非常适合拥有多个独立品牌、不同业务线或跨区域网站的企业集团。</li>
<li>由中间CA签发。</li>
</ul></section><section><h4>1.4.3 泛域名证书<a href="#143-泛域名证书"><span>#</span></a></h4><ul>
<li>
<p>泛域名证书通过使用通配符 <code>*</code> 来保护一个主域名下的所有同级（二级）子域名</p>
<ul>
<li>例如，一张 <code>*.abc.com</code> 的证书，可以保护 <code>www.abc.com</code> 、<code>shop.abc.com</code> 、<code>api.abc.com</code> 等任意数量的二级子域名。</li>
</ul>
</li>
<li>
<p>主要优势是<strong>无限扩展</strong>和<strong>管理便捷</strong>，新增子域名时无需重新申请或部署证书。</p>
</li>
<li>
<p>但需注意，它通常只能保护一层子域名，无法覆盖 <code>a.b.abc.com</code> 这样的三级域名。</p>
</li>
<li>
<p><strong>特点</strong>：</p>
<ul>
<li>中间 CA 签发的终端证书。</li>
<li>适合子域名多、业务系统多的企业。</li>
<li>免费证书也能申请泛域名。</li>
<li>风险：只要证书泄露，所有子域名都有风险。</li>
</ul>
</li>
</ul></section><section><h4>1.4.4 自签名证书<a href="#144-自签名证书"><span>#</span></a></h4><ul>
<li>
<p>一个使用 OpenSSL 自己给自己签发的证书，<strong>没有权威的根、中间 CA</strong>参与。</p>
</li>
<li>
<p>特点：</p>
<ul>
<li>没有权威 CA 背书。</li>
<li>浏览器、系统<strong>默认不信任</strong>，访问必报警告。</li>
<li>iBMC、路由器、内网设备默认都是自签名证书。</li>
<li>只能内网测试、设备管理用，<strong>不能公网正式建站</strong>。</li>
</ul>
</li>
<li>
<p>解决办法：把<strong>自签根证书</strong>导入电脑「受信任根证书」，就不告警了。</p>
</li>
</ul></section></section></section><section><h2>二、模拟证书签发流程<a href="#二模拟证书签发流程"><span>#</span></a></h2><p>使用 OpenSSL 工具生成各种证书，模拟 <strong>根 CA→中间 CA→网站域名证书</strong> 完整三级签发链条，以此熟悉根证书、中间证书、业务证书的上下级关系。</p><p><strong>注</strong>：颁发期限时，根证书 &gt; 中间证书 &gt; 实体证书。</p><section><h3>2.1 创建存放目录<a href="#21-创建存放目录"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/usr/local/CA</span></div></div><div><div><div>2</div></div><div><span>cd</span><span> </span><span>/usr/local/CA</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.2 自建根证书<a href="#22-自建根证书"><span>#</span></a></h3><blockquote><p>创建本地根证书，模拟官方全球根 CA。</p><p><strong>作用</strong>：整个信任链的最高源头，自签名、离线保存，只用来签发下级中间证书。</p></blockquote><section><h4>2.2.1 创建根证书配置文件<a href="#221-创建根证书配置文件"><span>#</span></a></h4><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>rootca.cnf</span><span> &lt;&lt; </span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>[ req ]</span></div></div><div><div><div>3</div></div><div><span>distinguished_name = req_distinguished_name</span></div></div><div><div><div>4</div></div><div><span>x509_extensions = v3_req</span></div></div><div><div><div>5</div></div><div><span>prompt = no</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>[ req_distinguished_name ]</span></div></div><div><div><div>8</div></div><div><span>C  = CN</span></div></div><div><div><div>9</div></div><div><span>ST = Beijing</span></div></div><div><div><div>10</div></div><div><span>L  = Beijing</span></div></div><div><div><div>11</div></div><div><span>O  = My Organization</span></div></div><div><div><div>12</div></div><div><span>OU = Root CA</span></div></div><div><div><div>13</div></div><div><span>CN = My Root CA</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>[ v3_req ]</span></div></div><div><div><div>16</div></div><div><span>keyUsage = critical, digitalSignature, keyEncipherment, dataEncipherment, keyAgreement, keyCertSign, cRLSign</span></div></div><div><div><div>17</div></div><div><span>extendedKeyUsage = serverAuth, clientAuth</span></div></div><div><div><div>18</div></div><div><span>basicConstraints = critical, CA:TRUE</span></div></div><div><div><div>19</div></div><div><span>subjectKeyIdentifier = hash</span></div></div><div><div><div>20</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><p><strong><code>[ req_distinguished_name ]</code> 配置参数说明：</strong></p><ul>
<li><code>C</code> ：国家；</li>
<li><code>O</code> ：组织机构；</li>
<li><code>OU</code> ：单位部门；</li>
<li><code>CN</code> ：通用名，有时候是一个域名，如xxx.com；</li>
<li><code>L </code> ：地区；</li>
<li><code>ST </code> ：省市；</li>
<li><code>STREET</code> ：街道；</li>
<li><code>POSTALCODE</code> ：邮编；</li>
<li><code>SERIALNUMBER </code> ：序列号。</li>
</ul><p><strong><code>[ v3_ca ]</code> 配置参数说明：</strong></p><ul>
<li><code>subjectAltName</code> ：证书使用者可选名称；</li>
<li><code>nsCaRevocationUrl</code> ：Netscape证书颁发机构吊销 URL；</li>
<li><code>nsBaseUrl</code> ：Netscape 证书基URLL；</li>
<li><code>nsRevocationUrl</code> ：Netscape 证书吊销 URLL；</li>
<li><code>nsRenewalUrl</code> ：Netscape 证书续订 URLL；</li>
<li><code>nsCaPolicyUrl</code> : Netscape 证书颁发机构策略 URLL；</li>
<li><code>nsSslServerName</code> ：Netscape 证书 SSL 服务器名称L。</li>
</ul></blockquote></section><section><h4>2.2.2 生成私钥和请求文件<a href="#222-生成私钥和请求文件"><span>#</span></a></h4><p>使用 <code>rootca.cnf</code> 根证书配置文件，生成 <code>rootca.csr</code> 请求文件，同时生成 <code>rootca.key</code> 根私钥文件：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>openssl</span><span> </span><span>req</span><span> </span><span>-config</span><span> </span><span>rootca.cnf</span><span> </span><span>-new</span><span> </span><span>-newkey</span><span> </span><span>rsa:4096</span><span> </span><span>-keyout</span><span> </span><span>rootca.key</span><span> </span><span>-out</span><span> </span><span>rootca.csr</span><span> </span><span>-nodes</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>2.2.3 生成根证书<a href="#223-生成根证书"><span>#</span></a></h4><p>使用根证书的配置文件、私钥、请求文件，生成 <code>rootca.crt</code> 根证书，期限为 <code>10</code> 年：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>openssl</span><span> </span><span>x509</span><span> </span><span>-req</span><span> </span><span>-extfile</span><span> </span><span>rootca.cnf</span><span> </span><span>-extensions</span><span> </span><span>v3_req</span><span> </span><span>-days</span><span> </span><span>3650</span><span> </span><span>-sha256</span><span> </span><span>-signkey</span><span> </span><span>rootca.key</span><span> </span><span>-in</span><span> </span><span>rootca.csr</span><span> </span><span>-out</span><span> </span><span>rootca.crt</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>2.2.4 查看根证书信息<a href="#224-查看根证书信息"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>openssl</span><span> </span><span>x509</span><span> </span><span>-in</span><span> </span><span>rootca.crt</span><span> </span><span>-noout</span><span> </span><span>-text</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>2.3 自建中间证书<a href="#23-自建中间证书"><span>#</span></a></h3><blockquote><p><strong>作用</strong>：根证书授权签发的二级机构，日常专门用来签发网站业务证书，真实环境不会用根证书直接给网站发证。</p></blockquote><section><h4>2.3.1 创建中间证书配置文件<a href="#231-创建中间证书配置文件"><span>#</span></a></h4><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>midca.cnf</span><span> &lt;&lt; </span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>[ req ]</span></div></div><div><div><div>3</div></div><div><span>distinguished_name = req_distinguished_name</span></div></div><div><div><div>4</div></div><div><span>x509_extensions = v3_req</span></div></div><div><div><div>5</div></div><div><span>prompt = no</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>[ req_distinguished_name ]</span></div></div><div><div><div>8</div></div><div><span>C  = CN</span></div></div><div><div><div>9</div></div><div><span>ST = Beijing</span></div></div><div><div><div>10</div></div><div><span>L  = Beijing</span></div></div><div><div><div>11</div></div><div><span>O  = My Organization</span></div></div><div><div><div>12</div></div><div><span>OU = Intermediate CA</span></div></div><div><div><div>13</div></div><div><span>CN = My Intermediate CA</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>[ v3_req ]</span></div></div><div><div><div>16</div></div><div><span>keyUsage = critical, keyCertSign, cRLSign</span></div></div><div><div><div>17</div></div><div><span>basicConstraints = critical, CA:TRUE, pathlen:0</span></div></div><div><div><div>18</div></div><div><span>subjectKeyIdentifier = hash</span></div></div><div><div><div>19</div></div><div><span>authorityKeyIdentifier = keyid</span></div></div><div><div><div>20</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h4>2.3.2 生成私钥和请求文件<a href="#232-生成私钥和请求文件"><span>#</span></a></h4><p>使用 <code>midca.cnf</code> 中间证书配置文件，生成 <code>midca.csr</code> 请求文件，同时生成 <code>midca.key</code> 私钥文件：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>openssl</span><span> </span><span>req</span><span> </span><span>-config</span><span> </span><span>midca.cnf</span><span> </span><span>-new</span><span> </span><span>-newkey</span><span> </span><span>rsa:4096</span><span> </span><span>-keyout</span><span> </span><span>midca.key</span><span> </span><span>-out</span><span> </span><span>midca.csr</span><span> </span><span>-nodes</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>2.3.3 生成中间证书<a href="#233-生成中间证书"><span>#</span></a></h4><p>使用中间证书的配置文件、私钥、请求文件，以及根证书和私钥文件，一起生成 <code>midca.crt</code> 中间证书，期限为 <code>5</code> 年：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>openssl</span><span> </span><span>x509</span><span> </span><span>-req</span><span> </span><span>-extfile</span><span> </span><span>midca.cnf</span><span> </span><span>-extensions</span><span> </span><span>v3_req</span><span> </span><span>-days</span><span> </span><span>1825</span><span> </span><span>-sha256</span><span>  </span><span>-CA</span><span> </span><span>rootca.crt</span><span> </span><span>-CAkey</span><span> </span><span>rootca.key</span><span> </span><span>-CAcreateserial</span><span> </span><span>-CAserial</span><span> </span><span>serial</span><span> </span><span>-in</span><span> </span><span>midca.csr</span><span> </span><span>-out</span><span> </span><span>midca.crt</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>2.3.4 验证中间证书<a href="#234-验证中间证书"><span>#</span></a></h4><p>使用 <code>rootca.crt</code> 根证书，来验证 <code>midca.crt</code> 中间证书是否正确，显示 <code>ok</code> ，则表示证书没有问题：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>openssl</span><span> </span><span>verify</span><span> </span><span>-CAfile</span><span> </span><span>rootca.crt</span><span> </span><span>midca.crt</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>2.3.5 查看中间证书信息<a href="#235-查看中间证书信息"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>openssl</span><span> </span><span>x509</span><span> </span><span>-in</span><span> </span><span>midca.crt</span><span> </span><span>-noout</span><span> </span><span>-text</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>2.4 签发业务证书<a href="#24-签发业务证书"><span>#</span></a></h3><section><h4>2.4.1 创建业务证书配置文件<a href="#241-创建业务证书配置文件"><span>#</span></a></h4><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>server.cnf</span><span> &lt;&lt; </span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>[ req ]</span></div></div><div><div><div>3</div></div><div><span>distinguished_name = req_distinguished_name</span></div></div><div><div><div>4</div></div><div><span>x509_extensions = v3_req</span></div></div><div><div><div>5</div></div><div><span>prompt = no</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>[ req_distinguished_name ]</span></div></div><div><div><div>8</div></div><div><span>C  = CN</span></div></div><div><div><div>9</div></div><div><span>ST = Beijing</span></div></div><div><div><div>10</div></div><div><span>L  = Beijing</span></div></div><div><div><div>11</div></div><div><span>O  = My Organization</span></div></div><div><div><div>12</div></div><div><span>OU = server ca</span></div></div><div><div><div>13</div></div><div><span>CN = my server ca</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>[ v3_req ]</span></div></div><div><div><div>16</div></div><div><span>keyUsage = critical, digitalSignature, keyEncipherment, dataEncipherment, keyAgreement</span></div></div><div><div><div>17</div></div><div><span>extendedKeyUsage = serverAuth, clientAuth</span></div></div><div><div><div>18</div></div><div><span>subjectKeyIdentifier = hash</span></div></div><div><div><div>19</div></div><div><span>authorityKeyIdentifier = keyid</span></div></div><div><div><div>20</div></div><div><span>basicConstraints = critical, CA:FALSE</span></div></div><div><div><div>21</div></div><div><span>subjectAltName = @alternate_names</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>[ alternate_names ]</span></div></div><div><div><div>24</div></div><div><span>DNS.1 = localhost</span></div></div><div><div><div>25</div></div><div><span>DNS.2 = test.cn</span></div></div><div><div><div>26</div></div><div><span>IP.1 = 127.0.0.1</span></div></div><div><div><div>27</div></div><div><span>IP.2 = 10.22.51.76</span></div></div><div><div><div>28</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><p><strong>注</strong>：<code>[ alternate_names ]</code> 块中的 <code>DNS</code> 和 <code>IP</code> 分别用来指定哪些 <strong>域名</strong> 和 <strong>IP</strong> 可以使用此证书，为此可以分出多种证书类型。</p><ol>
<li><strong>单域名 / IP 证书</strong>：</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 单域名证书</span></div></div><div><div><div>2</div></div><div><span>[ alternate_names ]</span></div></div><div><div><div>3</div></div><div><span>DNS.1</span><span> </span><span>=</span><span> </span><span>www.test.cn</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 单 IP 证书</span></div></div><div><div><div>6</div></div><div><span>[ alternate_names ]</span></div></div><div><div><div>7</div></div><div><span>IP.1</span><span> </span><span>=</span><span> </span><span>10.22.51.76</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li><strong>多域名 / IP 证书</strong>：</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>[ alternate_names ]</span></div></div><div><div><div>2</div></div><div><span>DNS.1</span><span> </span><span>=</span><span> </span><span>hututu.net</span></div></div><div><div><div>3</div></div><div><span>DNS.2</span><span> </span><span>=</span><span> </span><span>jenkins.love</span></div></div><div><div><div>4</div></div><div><span>DNS.3</span><span> </span><span>=</span><span> </span><span>test.xyz.com</span></div></div><div><div><div>5</div></div><div><span>IP.1</span><span> </span><span>=</span><span> </span><span>10.2.51.44</span></div></div><div><div><div>6</div></div><div><span>IP.2</span><span> </span><span>=</span><span> </span><span>10.22.51.76</span></div></div><div><div><div>7</div></div><div><span>IP.3</span><span> </span><span>=</span><span> </span><span>10.33.21.54</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li><strong>泛域名证书</strong>：</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>[alt_names]</span></div></div><div><div><div>2</div></div><div><span>DNS.1</span><span> </span><span>=</span><span> </span><span>*</span><span>.abc.com</span></div></div><div><div><div>3</div></div><div><span>DNS.2</span><span> </span><span>=</span><span> </span><span>*</span><span>.hututu.net</span></div></div></code></pre><div><div></div><div></div></div></figure></div></blockquote></section><section><h4>2.4.2 生成私钥和请求文件<a href="#242-生成私钥和请求文件"><span>#</span></a></h4><p>使用 <code>server.cnf</code> 业务证书配置文件，生成 <code>server.csr</code> 请求文件，同时生成 <code>server.key</code> 私钥文件：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>openssl</span><span> </span><span>req</span><span> </span><span>-config</span><span> </span><span>server.cnf</span><span> </span><span>-new</span><span> </span><span>-newkey</span><span> </span><span>rsa:4096</span><span> </span><span>-keyout</span><span> </span><span>server.key</span><span> </span><span>-out</span><span> </span><span>server.csr</span><span> </span><span>-nodes</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>2.4.3 生成业务证书<a href="#243-生成业务证书"><span>#</span></a></h4><p>使用业务证书的配置文件、私钥、请求文件，以及中间证书和私钥文件，一起生成 <code>midca.crt</code> 根证书，期限为 <code>1</code> 年：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>openssl</span><span> </span><span>x509</span><span> </span><span>-req</span><span> </span><span>-extfile</span><span> </span><span>server.cnf</span><span> </span><span>-extensions</span><span> </span><span>v3_req</span><span> </span><span>-days</span><span> </span><span>365</span><span> </span><span>-sha256</span><span> </span><span>-CA</span><span> </span><span>midca.crt</span><span> </span><span>-CAkey</span><span> </span><span>midca.key</span><span> </span><span>-CAcreateserial</span><span> </span><span>-in</span><span> </span><span>server.csr</span><span> </span><span>-out</span><span> </span><span>server.crt</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>2.4.4 查看业务证书信息<a href="#244-查看业务证书信息"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>openssl</span><span> </span><span>x509</span><span> </span><span>-in</span><span> </span><span>server.crt</span><span> </span><span>-noout</span><span> </span><span>-text</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>2.4.5 验证业务证书<a href="#245-验证业务证书"><span>#</span></a></h4><p>使用 <code>2.5.1</code> 生成的 <code>mid-root-ca_chain.crt</code> 复合证书，来验证 <code>server.crt</code> 业务证书是否正确，显示 <code>ok</code> ，则表示证书没有问题：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>openssl</span><span> </span><span>verify</span><span> </span><span>-CAfile</span><span> </span><span>mid-root-ca_chain.crt</span><span> </span><span>server.crt</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>2.4.6 验证完整证书链<a href="#246-验证完整证书链"><span>#</span></a></h4><p>使用根证书、中间证书、业务证书，验证完整的证书链，显示<code>ok</code>，则表示从域名证书 → 中间证书 → 根证书的完整信任链验证通过：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>openssl</span><span> </span><span>verify</span><span> </span><span>-CAfile</span><span> </span><span>rootca.crt</span><span> </span><span>-untrusted</span><span> </span><span>midca.crt</span><span> </span><span>server.crt</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>2.5 生成复合证书<a href="#25-生成复合证书"><span>#</span></a></h3><blockquote><p>将生成的证书合并，生成复合证书。</p><p><strong>拼接顺序</strong>：上游证书放后面，下游放前面。</p></blockquote><section><h4>2.5.1 生成 CA 链证书<a href="#251-生成-ca-链证书"><span>#</span></a></h4><p><strong>CA 链证书</strong> 也就是<strong>中间证书</strong>与<strong>根证书</strong>合并生成的一个复合证书，<strong>中间CA证书在前</strong>：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> </span><span>midca.crt</span><span> </span><span>rootca.crt</span><span> &gt; </span><span>mid-root-ca_chain.crt</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>适用场景</strong>：</p><ol>
<li>电脑 / 服务器 / 设备 <strong>导入私有信任库</strong>。</li>
<li>内网自建 CA，让整机<strong>信任所有由这个中间 CA 签发的业务证书</strong>。</li>
<li>签发证书时，作为 OpenSSL 的可信 CA 池。</li>
</ol></section><section><h4>2.5.2 生成全链证书<a href="#252-生成全链证书"><span>#</span></a></h4><p><strong>全链证书</strong> 也就是<strong>业务证书</strong>与<strong>中间证书</strong>合并生成的一个复合证书，<strong>业务证书在前</strong>：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> </span><span>server.crt</span><span> </span><span>midca.crt</span><span> &gt; </span><span>server-mid_chain.crt</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>适用场景</strong>：公网网站、普通内网 HTTPS、Nginx / 反向代理、常规服务器。</p></section><section><h4>2.5.3 生成含根全链证书<a href="#253-生成含根全链证书"><span>#</span></a></h4><p><strong>含根全链证书</strong> 也就是<strong>业务证书</strong>与<strong>中间证书</strong>与<strong>根证书</strong>三个证书合并生成，也叫<strong>完整证书链</strong>、<strong>全包证书链</strong>：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> </span><span>server.crt</span><span> </span><span>midca.crt</span><span> </span><span>rootca.crt</span><span> &gt; </span><span>server-mid-root_chain.crt</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>适用场景</strong>：</p><ol>
<li>
<p><strong>嵌入式老旧设备 / BMC / 工控机 / 打印机</strong>：</p>
<p>设备自身<strong>没有内置可信根证书库</strong>，不认公共根，必须整条链全给它。</p>
</li>
<li>
<p><strong>完全内网隔离环境，自建私有 CA</strong>：</p>
<p>员工电脑没导入私有根，又不想每台机器手动装根证书，只能服务端下发<strong>含根全链</strong>，让客户端直接整条链校验通过。</p>
</li>
</ol></section></section></section><section><h2>三、验证测试<a href="#三验证测试"><span>#</span></a></h2><section><h3>3.1 前言<a href="#31-前言"><span>#</span></a></h3><p>整体流程分为三步：</p><ol>
<li>将证书部署到 Nginx</li>
<li>客户端导入根证书</li>
<li>浏览器访问验证</li>
</ol><p>将 <code>rootca.crt</code> 根证书导入电脑受信任的根证书库后，再访问 Nginx 搭载的全链证书 <code>server-mid_chain.crt</code> 站点，浏览器即显示安全锁，不会弹出告警。</p></section><section><h3>3.2 客户端导入<a href="#32-客户端导入"><span>#</span></a></h3><section><h4>3.2.1 浏览器导入<a href="#321-浏览器导入"><span>#</span></a></h4><p>以谷歌浏览器为例，访问 <code>chrome://certificate-manager/</code>（或者打开【设置】——【隐私与安全】——【安全】——【管理证书】）进入证书管理器，点击左侧【您的证书】——【管理从 Windows 导入的证书】：</p><p></p><figure><img src="https://raw.githubusercontent.com/zyx3721/Picbed/main/blog-images/2026/05/13/18a39b48cdfc199bf71078f716b924da-image-20260513160142805-41ada6.png" alt="image-20260513160142805" /><figcaption>image-20260513160142805</figcaption></figure><p></p><p>打开【证书】窗口，点击【导入】，在【证书导入向导】中，选择下载好的 <code>rootca.crt</code> 根证书：</p><img src="https://raw.githubusercontent.com/zyx3721/Picbed/main/blog-images/2026/05/13/c7cb0a7570a2dac57b5c9963ed5e6591-image-20260513160242955-29c382.png" alt="image-20260513160242955" /><p>在下一步【证书存储】中，将其放到 <code>受信任的根证书颁发机构</code> 中，完成导入：</p><img src="https://raw.githubusercontent.com/zyx3721/Picbed/main/blog-images/2026/05/13/571b0a6aa21ba12d38cbebf3b0656b0a-image-20260513160337527-131af5.png" alt="image-20260513160337527" /><p>弹出窗口，选择【是】，安装证书：</p><img src="https://raw.githubusercontent.com/zyx3721/Picbed/main/blog-images/2026/05/13/62565a13ef5ec502baffdd524cceed96-image-20260513160416527-2398ef.png" alt="image-20260513160416527" /><p>安装完成后，进入【受信任的根证书颁发机构】栏，可查看到导入后的证书：</p><img src="https://raw.githubusercontent.com/zyx3721/Picbed/main/blog-images/2026/05/13/b40a44907f1350fbe86ea01fb27a8294-image-20260513160554125-9a81d9.png" alt="image-20260513160554125" /></section><section><h4>3.2.2 本地计算机导入<a href="#322-本地计算机导入"><span>#</span></a></h4><p>双击 <code>rootca.crt</code> 根证书，点击【安装证书】，选择【证书存储】为 <code>受信任的根证书颁发机构</code> ：</p><p></p><figure><img src="https://raw.githubusercontent.com/zyx3721/Picbed/main/blog-images/2026/05/13/8dedc61e497926a9501f503c01ce3444-image-20260513164105584-8c99d7.png" alt="image-20260513164105584" /><figcaption>image-20260513164105584</figcaption></figure><p></p><p>安装导入后，打开【运行】窗口，输入 <code>mmc</code> 进入【控制台根节点】，点击【文件】——【添加/删除管理单元】中的【证书】，双击打开【受信任的根证书颁发机构】中的【证书】，可看到自己已导入好的证书，双击可查看相应的信息内容：</p><p></p><figure><img src="https://raw.githubusercontent.com/zyx3721/Picbed/main/blog-images/2026/05/13/0d0f1e52a3073de9140807e2797ec193-image-20260513164359019-8c13e2.png" alt="image-20260513164359019" /><figcaption>image-20260513164359019</figcaption></figure><p></p></section></section><section><h3>3.3 配置 Nginx 证书部署<a href="#33-配置-nginx-证书部署"><span>#</span></a></h3><blockquote><p>将生成的 <code>server-mid_chain.crt</code> 全链证书与业务证书的 <code>server.key</code> 私钥文件部署到 Nginx，配置 HTTPS 服务供客户端访问。</p></blockquote><section><h4>3.3.1 部署证书文件<a href="#331-部署证书文件"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 创建证书存放目录</span></div></div><div><div><div>2</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/usr/local/nginx/conf/certs</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 复制私钥与全链证书</span></div></div><div><div><div>5</div></div><div><span>cp</span><span> </span><span>/usr/local/CA/server.key</span><span> </span><span>/usr/local/CA/server-mid_chain.crt</span><span> </span><span>/usr/local/nginx/conf/certs</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 重命名全链证书</span></div></div><div><div><div>8</div></div><div><span>mv</span><span> </span><span>/usr/local/nginx/conf/certs/server-mid_chain.crt</span><span> </span><span>/usr/local/nginx/conf/certs/server.crt</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 设置私钥权限（必须为 600）</span></div></div><div><div><div>11</div></div><div><span>chmod</span><span> </span><span>600</span><span> </span><span>/usr/local/nginx/conf/certs/server.key</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>3.3.2 创建站点配置文件<a href="#332-创建站点配置文件"><span>#</span></a></h4><p>在 <code>/usr/local/nginx/conf/conf.d</code> 目录下，创建名为 <code>ssl-test.conf</code> 站点配置文件，用于测试 HTTPS 访问，添加以下内容：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>/usr/local/nginx/conf/conf.d/ssl-test.conf</span><span> &lt;&lt; </span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>server {</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>listen 80;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>server_name test.cn localhost;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>return 301 https://$host$request_uri;</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>server {</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span># listen 443 ssl http2;  # Nginx 1.25 以下版本写法</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>listen 443 ssl;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>http2 on;</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>server_name test.cn localhost;</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>ssl_certificate         /usr/local/nginx/conf/certs/server.crt;</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>ssl_certificate_key     /usr/local/nginx/conf/certs/server.key;</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span><span>    </span></span><span>ssl_protocols           TLSv1.2 TLSv1.3;</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>ssl_ciphers             HIGH:!aNULL:!MD5;</span></div></div><div><div><div>19</div></div><div><span><span>    </span></span><span>ssl_prefer_server_ciphers on;</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>ssl_session_cache       shared:SSL:10m;</span></div></div><div><div><div>22</div></div><div><span><span>    </span></span><span>ssl_session_timeout     10m;</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>location / {</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>root   html;</span></div></div><div><div><div>26</div></div><div><span><span>        </span></span><span>index  ssl-test.html;</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>}</span></div></div><div><div><div>29</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><p><strong>关键参数说明</strong>：</p><ul>
<li><code>ssl_certificate</code>：指向<strong>全链证书</strong>，包含业务证书 + 中间证书。</li>
<li><code>ssl_certificate_key</code>：指向业务证书的私钥。</li>
<li><code>ssl_protocols</code>：仅启用 TLSv1.2 / TLSv1.3，禁用老旧协议。</li>
<li><code>return 301</code>：HTTP 自动跳转 HTTPS。</li>
</ul></blockquote></section><section><h4>3.3.3 创建静态文件<a href="#333-创建静态文件"><span>#</span></a></h4><p>在 <code>/usr/local/nginx/html</code> 目录下，创建名为 <code>ssl-test.html</code> 的静态文件，添加以下内容：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>cat &gt; /usr/local/nginx/html/ssl-test.html </span><span>&lt;&lt;</span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>&lt;!</span><span>DOCTYPE</span><span> </span><span>html</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span>&lt;</span><span>html</span><span> </span><span>lang</span><span>=</span><span>"zh-CN"</span><span>&gt;</span></div></div><div><div><div>4</div></div><div><span>&lt;</span><span>head</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>&lt;</span><span>meta</span><span> </span><span>charset</span><span>=</span><span>"UTF-8"</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>&lt;</span><span>meta</span><span> </span><span>name</span><span>=</span><span>"viewport"</span><span> </span><span>content</span><span>=</span><span>"width=device-width, initial-scale=1.0"</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>&lt;</span><span>title</span><span>&gt;HTTPS 测试页面&lt;/</span><span>title</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>&lt;</span><span>style</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>body</span><span> {</span></div></div><div><div><div>10</div></div><div><span><span>            </span></span><span>font-family: </span><span>-apple-system</span><span>, BlinkMacSystemFont, </span><span>"Segoe UI"</span><span>, Roboto, </span><span>"Helvetica Neue"</span><span>, </span><span>Arial</span><span>, </span><span>sans-serif</span><span>;</span></div></div><div><div><div>11</div></div><div><span><span>            </span></span><span>background-color: </span><span>#</span><span>f0f2f5</span><span>;</span></div></div><div><div><div>12</div></div><div><span><span>            </span></span><span>display: </span><span>flex</span><span>;</span></div></div><div><div><div>13</div></div><div><span><span>            </span></span><span>justify-content: </span><span>center</span><span>;</span></div></div><div><div><div>14</div></div><div><span><span>            </span></span><span>align-items: </span><span>center</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>            </span></span><span>height: </span><span><span>100</span><span>vh</span></span><span>;</span></div></div><div><div><div>16</div></div><div><span><span>            </span></span><span>margin: </span><span>0</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span>        </span><span>.card</span><span> {</span></div></div><div><div><div>19</div></div><div><span><span>            </span></span><span>background: </span><span>white</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>            </span></span><span>padding: </span><span><span>40</span><span>px</span></span><span>;</span></div></div><div><div><div>21</div></div><div><span><span>            </span></span><span>border-radius: </span><span><span>12</span><span>px</span></span><span>;</span></div></div><div><div><div>22</div></div><div><span><span>            </span></span><span>box-shadow: </span><span>0</span><span> </span><span><span>4</span><span>px</span></span><span> </span><span><span>12</span><span>px</span></span><span> </span><span>rgba</span><span>(</span><span>0</span><span>,</span><span>0</span><span>,</span><span>0</span><span>,</span><span>0.1</span><span>);</span></div></div><div><div><div>23</div></div><div><span><span>            </span></span><span>text-align: </span><span>center</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>            </span></span><span>max-width: </span><span><span>400</span><span>px</span></span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>        </span><span>h1</span><span> { color: </span><span>#</span><span>2c3e50</span><span>; margin-bottom: </span><span><span>10</span><span>px</span></span><span>; }</span></div></div><div><div><div>27</div></div><div><span>        </span><span>p</span><span> { color: </span><span>#</span><span>7f8c8d</span><span>; font-size: </span><span><span>16</span><span>px</span></span><span>; }</span></div></div><div><div><div>28</div></div><div><span>        </span><span>.status</span><span> {</span></div></div><div><div><div>29</div></div><div><span><span>            </span></span><span>display: </span><span>inline-block</span><span>;</span></div></div><div><div><div>30</div></div><div><span><span>            </span></span><span>margin-top: </span><span><span>20</span><span>px</span></span><span>;</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>padding: </span><span><span>8</span><span>px</span></span><span> </span><span><span>16</span><span>px</span></span><span>;</span></div></div><div><div><div>32</div></div><div><span><span>            </span></span><span>background-color: </span><span>#</span><span>e8f5e9</span><span>;</span></div></div><div><div><div>33</div></div><div><span><span>            </span></span><span>color: </span><span>#</span><span>2e7d32</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>            </span></span><span>border-radius: </span><span><span>20</span><span>px</span></span><span>;</span></div></div><div><div><div>35</div></div><div><span><span>            </span></span><span>font-weight: </span><span>bold</span><span>;</span></div></div><div><div><div>36</div></div><div><span><span>            </span></span><span>border: </span><span><span>1</span><span>px</span></span><span><span> </span><span>solid</span><span> </span></span><span>#</span><span>2e7d32</span><span>;</span></div></div><div><div><div>37</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>38</div></div><div><span>        </span><span>.icon</span><span> { font-size: </span><span><span>48</span><span>px</span></span><span>; margin-bottom: </span><span><span>20</span><span>px</span></span><span>; }</span></div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>&lt;/</span><span>style</span><span>&gt;</span></div></div><div><div><div>40</div></div><div><span>&lt;/</span><span>head</span><span>&gt;</span></div></div><div><div><div>41</div></div><div><span>&lt;</span><span>body</span><span>&gt;</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span><span>    </span></span><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"card"</span><span>&gt;</span></div></div><div><div><div>44</div></div><div><span><span>        </span></span><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"icon"</span><span>&gt;🔒&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>45</div></div><div><span><span>        </span></span><span>&lt;</span><span>h1</span><span>&gt;HTTPS 部署成功！&lt;/</span><span>h1</span><span>&gt;</span></div></div><div><div><div>46</div></div><div><span><span>        </span></span><span>&lt;</span><span>p</span><span>&gt;当前连接是安全的。&lt;/</span><span>p</span><span>&gt;</span></div></div><div><div><div>47</div></div><div><span><span>        </span></span><span>&lt;</span><span>p</span><span>&gt;服务器时间: &lt;</span><span>span</span><span> </span><span>id</span><span>=</span><span>"time"</span><span>&gt;&lt;/</span><span>span</span><span>&gt;&lt;/</span><span>p</span><span>&gt;</span></div></div><div><div><div>48</div></div><div><span><span>        </span></span><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"status"</span><span>&gt;SSL 证书工作正常&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>49</div></div><div><span><span>    </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></div></div><div><div><div>50</div></div><div>
</div></div><div><div><div>51</div></div><div><span><span>    </span></span><span>&lt;</span><span>script</span><span>&gt;</span></div></div><div><div><div>52</div></div><div><span>        </span><span>// 简单的脚本显示当前时间，证明页面是动态加载的</span></div></div><div><div><div>53</div></div><div><span><span>        </span></span><span>document</span><span>.</span><span>getElementById</span><span>(</span><span>'time'</span><span>).</span><span>innerText</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>Date</span><span>().</span><span>toLocaleString</span><span>();</span></div></div><div><div><div>54</div></div><div><span><span>    </span></span><span>&lt;/</span><span>script</span><span>&gt;</span></div></div><div><div><div>55</div></div><div>
</div></div><div><div><div>56</div></div><div><span>&lt;/</span><span>body</span><span>&gt;</span></div></div><div><div><div>57</div></div><div><span>&lt;/</span><span>html</span><span>&gt;</span></div></div><div><div><div>58</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h4>3.3.4 重载 Nginx 配置<a href="#334-重载-nginx-配置"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>nginx</span><span> </span><span>-t</span></div></div><div><div><div>2</div></div><div><span>nginx</span><span> </span><span>-s</span><span> </span><span>reload</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>3.4 浏览器安全验证<a href="#34-浏览器安全验证"><span>#</span></a></h3><blockquote><p>客户端导入根证书后，通过浏览器访问 Nginx 搭载的 HTTPS 站点，验证证书链完整性与浏览器安全提示是否正常。</p></blockquote><section><h4>3.4.1 修改本地 hosts 解析<a href="#341-修改本地-hosts-解析"><span>#</span></a></h4><p>以管理员身份编辑 <code>C:\Windows\System32\drivers\etc\hosts</code> 文件，添加以下内容：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>10.22.51.76</span><span> </span><span>test.cn</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>3.4.2 浏览器访问验证<a href="#342-浏览器访问验证"><span>#</span></a></h4><p>打开浏览器访问 <code>https://test.cn</code> ，点击地址栏旁边的锁图标按钮，可以看到显示 <code>连接是安全的</code> ：</p><p></p><figure><img src="https://raw.githubusercontent.com/zyx3721/Picbed/main/blog-images/2026/05/13/effda6f3d01bec87b00e380324238a7d-image-20260513164922854-025800.png" alt="image-20260513164922854" /><figcaption>image-20260513164922854</figcaption></figure><p></p><p>点击进入【证书有效】，可以查看证书详细信息，切换到【详细信息】标签页，可看到三层证书：<code>My Root CA → My Intermediate CA → my server ca</code> ，逐层点击可查看每级证书的详细信息（签发者、有效期、指纹等）：</p><img src="https://raw.githubusercontent.com/zyx3721/Picbed/main/blog-images/2026/05/13/5ad5a0183b94b4f263de57f27ddb4523-image-20260513165134555-8644c1.png" alt="image-20260513165134555" /><p>若证书链完整且根证书已导入受信任库，浏览器不会弹出安全告警，页面正常加载，即证明整套自建 CA 证书体系可正常用于内网 HTTPS 环境。</p><blockquote><p><strong>常见问题排查</strong>：</p>

<table><thead><tr><th>现象</th><th>原因</th><th>解决</th></tr></thead><tbody><tr><td>浏览器报 <code>NET::ERR_CERT_AUTHORITY_INVALID</code></td><td>根证书未导入受信任库</td><td>重新导入 <code>rootca.crt</code> 到「受信任的根证书颁发机构」</td></tr><tr><td>报 <code>NET::ERR_CERT_COMMON_NAME_INVALID</code></td><td>访问域名不在证书 SAN 列表中</td><td>检查 <code>server.cnf</code> 的 <code>[alternate_names]</code> 是否包含该域名</td></tr><tr><td>报 <code>NET::ERR_CERT_DATE_INVALID</code></td><td>证书已过期</td><td>重新签发业务证书</td></tr><tr><td>报 <code>SSL_ERROR_BAD_CERT_DOMAIN</code>（Firefox）</td><td>域名与证书不匹配</td><td>确认 hosts 中 IP 与证书 SAN 中的 IP/域名一致</td></tr></tbody></table></blockquote></section></section><section><h3>3.5 证书链验证原理<a href="#35-证书链验证原理"><span>#</span></a></h3><ol>
<li><strong>为什么只导入根证书而不导入中间证书，浏览器也认？</strong></li>
</ol><p>TLS 握手时，Nginx 通过 <code>ssl_certificate</code> 将 <strong>全链证书</strong> <code>server-mid_chain.crt</code>（业务证书 + 中间证书）完整发送给浏览器。浏览器拿到后，只需用本地已信任的根证书校验链条顶端签名即可：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>服务端在</span><span> </span><span>TLS</span><span> </span><span>握手时发送:</span><span>   </span><span>server.crt</span><span> </span><span>+</span><span> </span><span>midca.crt</span></div></div><div><div><div>2</div></div><div><span>客户端本地持有:</span><span>            </span><span>rootca.crt（已导入受信任库）</span></div></div><div><div><div>3</div></div><div><span>                              </span><span>↓</span></div></div><div><div><div>4</div></div><div><span>    </span><span>rootca</span><span> </span><span>签名验证</span><span> </span><span>midca</span><span>  </span><span>→</span><span>  </span><span>midca</span><span> </span><span>签名验证</span><span> </span><span>server</span><span>  </span><span>→</span><span>  </span><span>✅</span><span> </span><span>信任链完整</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>因此 <strong>中间证书无需客户端单独导入</strong>——它由服务端在握手阶段自动下发补全。客户端只需拥有根证书这一个信任锚点。</p><ol>
<li><strong>为什么双击 <code>server.crt</code> 提示「无法找到该证书的颁发者」？</strong></li>
</ol><p><code>server.crt</code> 是 <strong>单独的业务证书</strong>，内部不包含 <code>midca.crt</code>。双击打开时，系统依次在以下位置查找其签发者：</p>

<table><thead><tr><th>查找位置</th><th>是否有 midca.crt</th><th>说明</th></tr></thead><tbody><tr><td>当前 <code>.crt</code> 文件内部</td><td>❌ 不包含</td><td>server.crt 只有自身信息</td></tr><tr><td>Windows 证书存储（中间证书颁发机构）</td><td>❌ 未导入</td><td>只导入了根证书</td></tr><tr><td>操作系统内置公共 CA 库</td><td>❌ 不认自建 CA</td><td>自建 CA 不在公共信任列表中</td></tr></tbody></table><p>三个位置都找不到签发者，系统自然提示”无法找到该证书的颁发者”，<strong>这属于正常现象</strong>，并非证书有问题。需要再导入中间证书后，才会显示可信任。</p><p><strong>自行验证</strong>：双击 <code>server-mid_chain.crt</code> 全链证书，切换到「证书路径」标签页，即可看到完整三层链：<code>My Root CA → My Intermediate CA → my server ca</code> 。</p><blockquote><p><strong>总结</strong>：单看 <code>server.crt</code> 就像只看身份证却找不到发证机关是谁；全链证书 <code>server-mid_chain.crt</code> 则附上了发证机关的完整授权链，系统自然能追溯验证。</p></blockquote></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/zabbix%E4%BD%BF%E7%94%A8/</id>
      <title type="text">zabbix使用</title>
      <published>2026-04-28T00:00:00.000Z</published>
      <updated>2026-04-28T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/zabbix%E4%BD%BF%E7%94%A8/"/>
      <summary type="text">zabbix使用</summary>
      <content type="html"><![CDATA[<section><h1>一、zabbix使用<a href="#一zabbix使用"><span>#</span></a></h1><section><h2>1.1 前提准备<a href="#11-前提准备"><span>#</span></a></h2><ul>
<li>zabbix server 端开启</li>
<li>zabbix agent 监控端开启</li>
</ul></section><section><h2>1.2 添加主机<a href="#12-添加主机"><span>#</span></a></h2><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260402160559948.png" alt="image-20260402160559948" /><figcaption>image-20260402160559948</figcaption></figure><p></p><ul>
<li>**模版：**这个为监控模版，里面包含了<code>各种监控项、触发器</code>等指标</li>
<li>**主机群组：**存放主机的一个主机群组</li>
<li>**接口：**根据监控端的监控类型选择，有<code>agent、snmp、jmx、ipmi</code>监控类型，之后填写好对应的信息</li>
<li>**从哪监控：**如果有代理监控服务器，就选择proxy</li>
</ul><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260402160823166.png" alt="image-20260402160823166" /><figcaption>image-20260402160823166</figcaption></figure><p></p><p>添加完成后,等待会zbx亮灯说明连通性没问题</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260402163924828.png" alt="image-20260402163924828" /><figcaption>image-20260402163924828</figcaption></figure><p></p></section><section><h2>1.3 查看最新数据<a href="#13-查看最新数据"><span>#</span></a></h2><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260402164638745.png" alt="image-20260402164638745" /><figcaption>image-20260402164638745</figcaption></figure><p></p></section><section><h2>1.4 查看监控项<a href="#14-查看监控项"><span>#</span></a></h2><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260402165511673.png" alt="image-20260402165511673" /><figcaption>image-20260402165511673</figcaption></figure><p></p><p>搜索键值数据，查看对应监控项目，有些监控项目还提供触发器</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260402165608663.png" alt="image-20260402165608663" /><figcaption>image-20260402165608663</figcaption></figure><p></p><p>这里可以筛选更多精细数据</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260402170033337.png" alt="image-20260402170033337" /><figcaption>image-20260402170033337</figcaption></figure><p></p><p>选择对应的监控项，可以执行更多操作</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260402170157086.png" alt="image-20260402170157086" /><figcaption>image-20260402170157086</figcaption></figure><p></p></section><section><h2>1.5 查看模板<a href="#15-查看模板"><span>#</span></a></h2><p>主机：显示使用该模版的主机</p><p>监控项：定义采集那些监控指标</p><p>触发器：定义报警规则</p><p>图形：有几个数据会展示，提供了可视化展示</p><p>仪表盘：综合展示面板，一个可以自定义的大屏，你可以把上面提到的“图形”、系统状态、报警列表等拼凑在一起</p><p>自动发现：自动化扫描，设定一个 IP 段，会自动去扫描这个网段里有哪些活着的机器，并自动把它们加入监控</p><p>web检测：模拟用户访问，如模拟登录流程：打开首页 -&gt; 点击登录 -&gt; 输入账号密码。如果哪一步打不开或超时，就报警</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260402171940742.png" alt="image-20260402171940742" /><figcaption>image-20260402171940742</figcaption></figure><p></p></section><section><h2>1.6 创建自定义模版<a href="#16-创建自定义模版"><span>#</span></a></h2><p>创建自定义模板，先创建一个自定义模板组，之后在创建自定义模板时选择该模板组</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260403111153331.png" alt="image-20260403111153331" /><figcaption>image-20260403111153331</figcaption></figure><p></p><section><h3>1.6.1 标记<a href="#161-标记"><span>#</span></a></h3><p>用于标记该模板的一些具体事项</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260403111424054.png" alt="image-20260403111424054" /><figcaption>image-20260403111424054</figcaption></figure><p></p><p>显示效果</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260403111529706.png" alt="image-20260403111529706" /><figcaption>image-20260403111529706</figcaption></figure><p></p></section><section><h3>1.6.2 宏<a href="#162-宏"><span>#</span></a></h3><p><strong>宏”本质上就是“变量</strong>，“宏”就是为了让监控配置<strong>更灵活、更通用</strong>。它允许定义一个占位符（比如 <code>{$PORT}</code>），在不同的场景下自动替换成具体的数值。</p><p>可以在模板里把端口号写成 <code>{$MYSQL.PORT}</code>。</p><ul>
<li>当模板链接到 <strong>服务器 A</strong> 时，你只需告诉它 <code>{$MYSQL.PORT} = 3306</code>。</li>
<li>当模板链接到 <strong>服务器 B</strong> 时，你只需告诉它 <code>{$MYSQL.PORT} = 3307</code>。</li>
</ul><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260403112019397.png" alt="image-20260403112019397" /><figcaption>image-20260403112019397</figcaption></figure><p></p></section><section><h3>1.6.3 值映射<a href="#163-值映射"><span>#</span></a></h3><p>监控设备时，很多数据返回的都是枯燥的数字（比如 0、1、2），如果不加解释，你很难一眼看出它们代表什么状态。值映射就是为了解决这个问题,<code>将难懂的字符数字这些映射为易于理解的文字描述</code></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260403130840369.png" alt="image-20260403130840369" /><figcaption>image-20260403130840369</figcaption></figure><p></p></section></section><section><h2>1.7 创建自定义监控项<a href="#17-创建自定义监控项"><span>#</span></a></h2><p>在自定义模板中创建自定义监控项</p><ul>
<li>
<p>名称：这是给人看的名字。建议写得通俗易懂</p>
</li>
<li>
<p>类型：决定了 Zabbix Server 怎么去拿数据</p>
</li>
<li>
<p>键值：这是<strong>最核心</strong>的参数，是给机器看的指令代码，不同的监控项对应不同的键值，比如 <code>system.cpu.load</code> 就是监控 CPU 负载</p>
</li>
<li>
<p>信息类型：告诉 Zabbix 预期拿到的数据是什么格式。</p>
</li>
<li>
<p>更新间隔：默认多久采集一次数据。<code>1m</code> 代表 1 分钟，s、m、h、d</p>
</li>
<li>
<p>自定义时间间隔：对上面“更新间隔”的补充。允许你在特定时间段使用不同的采集频率</p>
<ul>
<li>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>类型</span><span>    </span><span>间隔</span><span>    </span><span>期间</span></div></div><div><div><div>2</div></div><div><span>灵活</span><span>    </span><span>50s</span><span>    </span><span>1-7,00:00-24:00</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 参数解释：</span></div></div><div><div><div>5</div></div><div><span>在一周的每一天（1-7），全天（00:00-24:00），把采集频率强制改为每</span><span> </span><span>50秒</span><span> </span><span>一次</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>类型</span><span>    </span><span>间隔</span></div></div><div><div><div>8</div></div><div><span>调度</span><span>    </span><span>wd1-5h9-18</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 参数解释</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul>
</li>
<li>
<p>超时：超过时间没收到返回数据，Zabbix 就会放弃并报错“超时”</p>
<ul>
<li>全局：使用zabbix全局的超时设置（路径：管理-常规-超时）</li>
<li>覆盖：不使用zabbix全局的超时设置，使用自定义的超时设置</li>
</ul>
</li>
<li>
<p>历史记录：原始数据保留多久，决定可以看多久的详细曲线图，或选择不保存</p>
</li>
<li>
<p>趋势：归档数据保留多久，Zabbix 会把每小时的最大值、最小值、平均值存一份“压缩包”。这份数据占用空间极小，可以存很久，决定了可以看多久的宏观趋势图</p>
</li>
<li>
<p>值映射：选择模版中创建的值映射</p>
</li>
<li>
<p>填入主机资产字段：把这个监控项采集到的数值，自动写入到主机的资产信息里，需要与资产管理模块配合使用</p>
</li>
<li>
<p>监控项参数：<code>net.tcp.service[service,&lt;ip&gt;,&lt;port&gt;]</code>，其中中括号里面的为参数，尖括号为<strong>可选参数</strong>，其余为<strong>必填参数</strong></p>
</li>
</ul><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260403134550381.png" alt="image-20260403134550381" /><figcaption>image-20260403134550381</figcaption></figure><p></p><section><h3>1.7.1 标记<a href="#171-标记"><span>#</span></a></h3><p>添加标记，用于更加好理解改监控项，也可以继承模板的标记</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260403134716907.png" alt="image-20260403134716907" /><figcaption>image-20260403134716907</figcaption></figure><p></p></section><section><h3>1.7.2 预处理<a href="#172-预处理"><span>#</span></a></h3><p>用于将监控获取到的数据做处理，提取出需要的数据</p><p>假设你监控一个网页，Zabbix 抓回来的原始数据是一大段 HTML 代码：
<code>&lt;html&gt;&lt;body&gt;&lt;h1&gt;当前温度：25.5度&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;</code></p><p>你只想要 <strong><code>25.5</code></strong> 这个数字来画图</p><ul>
<li><strong>步骤 1：模式表达式</strong>
在这里填入正则规则：<code>.*(\d+\.\d+)度.*</code>
<em>(意思是：找一个小数点数字，后面跟着“度”字，把它抓出来)</em></li>
<li><strong>步骤 2：输出</strong>
在这里填入：<code>\1</code>
<em>(意思是：只保留我抓到的第一个括号里的内容)</em></li>
<li><strong>结果</strong>
经过预处理，原本的一大段 HTML 变成了干净的 <strong><code>25.5</code></strong>。</li>
</ul><p>失败时采取的动作：</p><ul>
<li>
<p><strong>勾选状态</strong>：你截图中勾选了“失败时自定义值”。</p>
</li>
<li>
<p><strong>含义</strong>：如果正则表达式匹配失败了（比如网页结构变了，找不到温度了），Zabbix 该存什么数据？</p>
</li>
<li>
<p>选项</p>
<p>：</p>
<ul>
<li><strong>丢弃值</strong>：这次采集作废，不存数据。</li>
<li><strong>错误</strong>：标记为错误，可能会触发报警。</li>
<li><strong>特定值</strong>：比如填 0，匹配不到就给个 0。</li>
</ul>
</li>
</ul><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260403135842661.png" alt="image-20260403135842661" /><figcaption>image-20260403135842661</figcaption></figure><p></p></section></section><section><h2>1.8 创建自定义触发器<a href="#18-创建自定义触发器"><span>#</span></a></h2><ul>
<li>事件名称：写清楚**“谁”<strong>出了</strong>“什么问题”**。可以用宏来自动替换主机名，{HOST.NAME} 的 CPU 负载过高！</li>
<li>严重性：给报警定级别，通常对应不同的颜色</li>
<li>表达式：定义报警的<strong>逻辑条件</strong>。只有满足这个条件，才会报警
<ul>
<li>点击右边的 “添加”按钮，会弹出一个构造器，通常包含三部分：
<ol>
<li><strong>监控项</strong>：选择你要监控的数据</li>
<li><strong>功能</strong>：选择判断方式（比如 <code>最近一次值</code>、<code>平均值</code>、<code>最大值</code>）</li>
<li><strong>结果</strong>：选择比较符号和阈值（比如 <code>&gt; 5</code>）</li>
<li><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260403144418621.png" alt="image-20260403144418621" /><figcaption>image-20260403144418621</figcaption></figure></li>
</ol>
</li>
</ul>
</li>
<li>事件成功迭代：定义什么时候算“好了”，即报警恢复
<ul>
<li><strong>表达式</strong>（默认）：通常不需要改。默认逻辑是：如果报警条件是 <code>&gt; 5</code>，那么当数值变回 <code>&lt;= 5</code> 时，自动恢复</li>
<li><strong>恢复表达式</strong>：如果你想设置“回差”。比如：超过 90度 报警，但必须降到 60度 以下才算恢复（防止在 90度 附近反复横跳）</li>
</ul>
</li>
<li>问题事件生成模式：
<ul>
<li><strong>单个</strong>：只要触发器报警了（比如服务器A宕机），它就产生一条“问题”。哪怕这个触发器持续报警了一整天，在“问题”列表里，它始终只占<strong>一行</strong>。直到它恢复了，这行才会消失（或变成已解决）。</li>
<li><strong>多重</strong>：只要触发器处于报警状态，并且触发了更新，它就会不断生成<strong>新的</strong>问题记录。列表里会出现很多条关于同一个主机的报警</li>
</ul>
</li>
<li>事件成功关闭：决定了告警“恢复”或者条件满足时，系统怎么去消除那些报警记录
<ul>
<li><strong>所有问题</strong>：一旦恢复条件满足（或者你手动关闭），系统会把该触发器产生的<strong>所有</strong>未解决的问题记录统统关掉</li>
<li><strong>所有问题如果标签值匹配</strong>：精准打击，只关符合条件的，需要配合“标签”功能使用</li>
</ul>
</li>
<li>菜单条目名&amp;菜单条目URL：当这个触发器报警时，Zabbix 会在报警信息旁边生成一个<strong>超链接按钮</strong>
<ul>
<li>**菜单条目名：**按钮上显示的文字，比如<code>重启服务</code></li>
<li><strong>菜单条目 URL</strong>：点击按钮后跳转的地址，比如填写故障服务器的后台管理系统</li>
</ul>
</li>
</ul><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260403150712268.png" alt="image-20260403150712268" /><figcaption>image-20260403150712268</figcaption></figure><p></p><section><h3>1.8.1 标记<a href="#181-标记"><span>#</span></a></h3><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260403150728553.png" alt="image-20260403150728553" /><figcaption>image-20260403150728553</figcaption></figure><p></p></section><section><h3>1.8.2 依赖关系<a href="#182-依赖关系"><span>#</span></a></h3><p><strong>依赖关系 = 只有当“上游”没问题时，“下游”的报警才有效，当上游有问题时，只告警上游的问题，因为上游问题导致的告警不触发</strong></p><p><strong>场景模拟：</strong>
假设你有一个 <strong>核心交换机</strong>，下面连了 <strong>10台服务器</strong>。</p><ul>
<li>
<p><strong>如果没有依赖关系：</strong>
一旦核心交换机断电，10台服务器都会连不上。Zabbix 会瞬间给你发 <strong>11条</strong> 报警短信：</p>
<ul>
<li>1条：核心交换机宕机</li>
<li>10条：服务器A不可达、服务器B不可达……服务器J不可达</li>
</ul>
<p><strong>结果</strong>：你的手机狂响，你根本不知道是交换机坏了，还是机房全停电了，还是光缆被挖断了，因为信息太杂乱。</p>
</li>
<li>
<p><strong>如果设置了依赖关系：</strong>
你告诉 Zabbix：“如果核心交换机已经报警了，那么下面那10台服务器的报警就先别告诉我。”</p>
<ul>
<li><strong>配置</strong>：让“服务器A~J的触发器” <strong>依赖</strong> 于 “核心交换机的触发器”。</li>
<li><strong>结果</strong>：交换机断电时，你只会收到 <strong>1条</strong> 短信：“核心交换机宕机”。</li>
<li><strong>逻辑</strong>：既然交换机都挂了，服务器肯定也是挂的，没必要重复报警。等交换机修好了，如果服务器还没好，那时候再报服务器的警。</li>
</ul>
</li>
</ul><p><strong>设置</strong>：点击 <strong>“添加”</strong> 或 <strong>“添加主机触发器”</strong>。</p><ol>
<li><strong>选择父级触发器</strong>：
<ul>
<li>点击后会弹出一个列表，让你选择**“谁是大哥”**（即：谁出事了，我就不报警了）。</li>
<li>在这个例子里，你会选择那个**“核心交换机端口断开”<strong>或者</strong>“核心交换机Ping不通”**的触发器。</li>
</ul>
</li>
<li><strong>保存</strong>：
<ul>
<li>设置完成后，点击“添加”，然后“更新”。</li>
</ul>
</li>
</ol><p><strong>设置后的效果：</strong></p><ul>
<li>当 <strong>父触发器</strong>（交换机）处于“问题”状态时，<strong>子触发器</strong>（服务器）即使满足了报警条件，也会处于 <strong>“已禁用”</strong> 或 <strong>“不发送通知”</strong> 的状态（具体取决于版本和动作配置，通常表现为不发送消息，但在问题列表中可能会显示为“依赖未满足”或类似的抑制状态）。</li>
<li>只有当 <strong>父触发器</strong> 恢复正常后，<strong>子触发器</strong> 才会重新开始正常报警。</li>
</ul><p><code>图中理解就是若关联的huawei触发器如果告警了，那么这条触发器就不再触发了</code></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260403151515231.png" alt="image-20260403151515231" /><figcaption>image-20260403151515231</figcaption></figure><p></p></section></section><section><h2>1.9创建自定义图形<a href="#19创建自定义图形"><span>#</span></a></h2><ul>
<li><strong>名称</strong>：图表的标题，会显示在图表上方。</li>
<li><strong>宽(px) / 高(px)</strong>：图表的尺寸。900x200 是默认的仪表盘视图大小，如果你要全屏查看，可以设得更大。</li>
<li><strong>图形类别</strong>：主要用于在大屏上对图表进行分类，一般选“正常”即可。</li>
<li><strong>显示图例</strong>：建议勾选。它会在图表底部显示每条线代表什么监控项，以及当前的数值。</li>
<li><strong>查看工作时间</strong>：如果勾选，图表背景会将非工作时间（如周末、夜间）标记为灰色阴影，方便你区分业务高峰期和低谷期。</li>
<li><strong>查看触发器</strong>：建议勾选。它会在图表上用一条<strong>红色的虚线</strong>标出报警阈值。比如你设置了 CPU &gt; 80% 报警，图上就会出现一条 80 的横线，让你一眼看出什么时候超标了。</li>
<li><strong>百分比线(左/右)</strong>：一般不勾选。除非你监控的是百分比数据（如内存使用率），想画一条参考线（比如 90% 的警戒线）。</li>
<li>纵轴 Y 最小值/最大值：
<ul>
<li><strong>可计算的（默认）</strong>：Zabbix 会根据数据的最大值和最小值自动调整刻度。比如数据在 100-200 之间，Y 轴可能就是 0-250。</li>
<li><strong>固定</strong>：如果你想强制统一所有图表的比例，可以选固定。比如监控内存，你可以强制 Y 轴最大值为总内存大小（如 16GB），这样不管用了多少，图表的高度都是固定的，方便对比。</li>
</ul>
</li>
<li><strong>监控项配置</strong>：定了图表里画什么线</li>
<li><strong>名称</strong>：显示在图例里的名称</li>
<li><strong>功能</strong>：选择绘画最小值、平均值还是原始数值</li>
</ul><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260403153334744.png" alt="image-20260403153334744" /><figcaption>image-20260403153334744</figcaption></figure><p></p></section><section><h2>1.10 创建仪表盘<a href="#110-创建仪表盘"><span>#</span></a></h2><p>仪表盘分为<code>全局仪表盘</code>和<code>模板仪表盘</code></p>

<table><thead><tr><th>特性</th><th>模板仪表盘</th><th>全局仪表盘</th></tr></thead><tbody><tr><td><strong>配置位置</strong></td><td>在 <strong>模板</strong> 级别配置</td><td>在 界面<strong>仪表盘</strong> 中配置</td></tr><tr><td><strong>数据来源</strong></td><td>动态生成，仅显示<strong>单个主机</strong>的数据</td><td>可整合并显示<strong>多个主机、应用</strong>的数据</td></tr><tr><td><strong>主要用途</strong></td><td>提供标准化的“单机视图”</td><td>创建跨主机的综合性“上帝视角”</td></tr><tr><td><strong>管理方式</strong></td><td>集中管理，一处修改，处处生效</td><td>独立管理，手动创建和调整</td></tr></tbody></table><section><h3>1.10.1 全局仪表盘<a href="#1101-全局仪表盘"><span>#</span></a></h3><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260407142606336.png" alt="image-20260407142606336" /><figcaption>image-20260407142606336</figcaption></figure><p></p><ol>
<li>添加小组件</li>
</ol><p>选择好<code>类型和监控项</code>，之后自定义配置好适合的数据展示表格</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260407143119959.png" alt="image-20260407143119959" /><figcaption>image-20260407143119959</figcaption></figure><p></p><ol>
<li>添加页面</li>
</ol><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260407143303783.png" alt="image-20260407143303783" /><figcaption>image-20260407143303783</figcaption></figure><p></p></section><section><h3>1.10.2 模板仪表盘<a href="#1102-模板仪表盘"><span>#</span></a></h3><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260407143350931.png" alt="image-20260407143350931" /><figcaption>image-20260407143350931</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260407143423279.png" alt="image-20260407143423279" /><figcaption>image-20260407143423279</figcaption></figure><p></p><p>之后创建<code>小组件</code>的配置与全局仪表盘一致。</p><p>不同的是<code>全局仪表盘配置好后可以实时看到数据展示</code>，而模板配置好仪表盘后<code>需要前往应用该模板的主机里去查看数据</code></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260407143735518.png" alt="image-20260407143735518" /><figcaption>image-20260407143735518</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260407143826586.png" alt="image-20260407143826586" /><figcaption>image-20260407143826586</figcaption></figure><p></p></section></section><section><h2>1.11 创建告警媒介<a href="#111-创建告警媒介"><span>#</span></a></h2><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260408112940683.png" alt="image-20260408112940683" /><figcaption>image-20260408112940683</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260408113004032.png" alt="image-20260408113004032" /><figcaption>image-20260408113004032</figcaption></figure><p></p><ul>
<li>
<p><strong>名称</strong>：<code>邮件告警</code>（保持默认即可，方便识别）。</p>
</li>
<li>
<p><strong>类型</strong>：<code>电子邮件</code>（保持默认）。</p>
</li>
<li>
<p>邮箱提供商：选择 <strong><code>Generic SMTP</code></strong>（通用 SMTP）兼容性最好。</p>
</li>
<li>
<p>SMTP 服务器：填写你的邮件服务器地址。</p>
</li>
<li>
<p>SMTP 服务器端口：如果是 SSL 加密，通常填 <strong><code>465</code></strong>；如果是普通连接，通常填 <code>25</code>。</p>
</li>
<li>
<p>电子邮件：填写发件人邮箱地址、</p>
</li>
<li>
<p><strong>SMTP HELO</strong>：留空即可。</p>
</li>
<li>
<p>安全连接：根据你填写的端口选择：</p>
<ul>
<li>如果端口是 <strong>465</strong>，请点击选中 <strong><code>SSL/TLS</code></strong>。</li>
<li>如果端口是 <strong>25</strong>，通常选择 <code>STARTTLS</code> 或 <code>无</code>。</li>
</ul>
</li>
<li>
<p><strong>认证</strong>：选择 <strong><code>用户名和密码</code></strong>。</p>
</li>
<li>
<p>用户名：填写完整的发件人邮箱账号</p>
</li>
<li>
<p>密码：</p>
<ul>
<li><strong>注意</strong>：这里填的不一定是你的邮箱登录密码。很多企业邮箱（如腾讯企业邮）为了安全，需要开启 SMTP 服务并生成一个**“客户端专用密码”<strong>或</strong>“授权码”**。</li>
<li>如果你不知道，先尝试填登录密码；如果测试失败，请去网页版邮箱的设置里找“客户端设置”或“POP/SMTP”选项获取授权码。</li>
</ul>
</li>
<li>
<p><strong>消息格式</strong>：选择 <strong><code>HTML</code></strong>，这样告警邮件排版会更好看。</p>
</li>
</ul><section><h3>1.11.1 创建消息模板<a href="#1111-创建消息模板"><span>#</span></a></h3><p>创建消息通知的模板，选择<code>模板类型</code>和<code>模板格式(可自定义)</code></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260408113837234.png" alt="image-20260408113837234" /><figcaption>image-20260408113837234</figcaption></figure><p></p></section><section><h3>1.11.2 配置选项<a href="#1112-配置选项"><span>#</span></a></h3><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260408114317022.png" alt="image-20260408114317022" /><figcaption>image-20260408114317022</figcaption></figure><p></p><ul>
<li>并发会话：同时发送告警的线程数</li>
<li>尝试次数：如果第一次发送失败（比如网络抖动、SMTP 服务器超时），Zabbix 会重试几次</li>
<li>尝试间隔：每次重试的间隔</li>
</ul></section></section><section><h2>1.12 创建触发器动作<a href="#112-创建触发器动作"><span>#</span></a></h2><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260408114558981.png" alt="image-20260408114558981" /><figcaption>image-20260408114558981</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260408132749453.png" alt="image-20260408132749453" /><figcaption>image-20260408132749453</figcaption></figure><p></p><p>名称：触发动作的名称</p><p>计算方式：选择每个条件相互之间的触发条件是<code>与、或、非、也可以自定义计算方式</code>，zabbix会显示出全部条件的触发表达式</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260408133052470.png" alt="image-20260408133052470" /><figcaption>image-20260408133052470</figcaption></figure><p></p><p>配置动作满足后所要执行的操作</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260408133229727.png" alt="image-20260408133229727" /><figcaption>image-20260408133229727</figcaption></figure><p></p><p>**注意：**所选的用户组或用户中，需要配置相应的报警媒介（<code>邮箱地址等</code>）</p></section></section>
<section><h1>二、zabbix剩余功能使用<a href="#二zabbix剩余功能使用"><span>#</span></a></h1><section><h2>2.1 自动发现<a href="#21-自动发现"><span>#</span></a></h2><p>Zabbix 的自动发现（Auto Discovery）主要用于<strong>自动扫描网络中的设备并自动将其添加到监控中</strong>，非常适合大规模或动态变化的网络环境，能极大减少手动添加主机的工作量。</p><section><h3>2.1.1 新建自动发现规则<a href="#211-新建自动发现规则"><span>#</span></a></h3><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260408150133559.png" alt="image-20260408150133559" /><figcaption>image-20260408150133559</figcaption></figure><p></p><ul>
<li><strong>名称</strong>：自定义，例如 <code>扫描局域网段</code>。</li>
<li><strong>IP 范围</strong>：填写你要扫描的网段，例如 <code>192.168.1.1-254</code>。</li>
<li><strong>更新间隔</strong>：扫描频率，例如 <code>1h</code>（每小时扫描一次）。</li>
<li>检查：选择扫描方式。
<ul>
<li><strong>ICMP ping</strong>：最常用，仅检测 IP 是否存活。</li>
<li><strong>Zabbix 客户端</strong>：如果目标机器安装了 agent，可以检测端口 10050。</li>
<li><strong>SNMP</strong>：用于网络设备（交换机、路由器）。</li>
</ul>
</li>
<li><strong>设备唯一性标准</strong>：通常选择 <strong>IP 地址</strong>。</li>
<li><strong>主机名称/可见的名称</strong>：扫描添加的主机使用的名称/可见的名称</li>
</ul></section><section><h3>2.1.2 创建自动发现动作<a href="#212-创建自动发现动作"><span>#</span></a></h3><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260408150702460.png" alt="image-20260408150702460" /><figcaption>image-20260408150702460</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260408150738040.png" alt="image-20260408150738040" /><figcaption>image-20260408150738040</figcaption></figure><p></p><p>条件选择创建的<code>自动发现规则</code></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260408150840719.png" alt="image-20260408150840719" /><figcaption>image-20260408150840719</figcaption></figure><p></p><p>设置之后的动作</p></section></section><section><h2>2.2 关联事件规则<a href="#22-关联事件规则"><span>#</span></a></h2><p>与<code>触发器中的依赖关系</code>逻辑相同</p><ul>
<li><strong>场景一：用“恢复事件”关闭“故障事件”</strong>
<ul>
<li><strong>背景：</strong> 你有一个日志监控触发器，当发现 “Error” 时报警。</li>
<li><strong>关联规则：</strong> 当同一个主机检测到 “Service Started”（服务启动）的日志事件时，自动关闭所有该主机上之前因为 “Error” 产生的未解决问题。</li>
<li><strong>价值：</strong> 即使故障触发器还没恢复到正常值（比如日志文件里还留着 Error 记录），只要服务重启了，我们就认为问题解决了，自动清理报警列表。</li>
</ul>
</li>
<li><strong>场景二：识别重复告警</strong>
<ul>
<li><strong>背景：</strong> 某个不稳定的网络设备可能每隔几秒就断连一次。</li>
<li><strong>关联规则：</strong> 如果 1 分钟内同一个主机产生了 5 次“断连”事件，只保留最新的一个，关闭之前堆积的 4 个。</li>
<li><strong>价值：</strong> 防止告警列表被刷屏。</li>
</ul>
</li>
<li><strong>场景三：跨触发器关联</strong>
<ul>
<li><strong>背景：</strong> 触发器 A 监控 CPU 高负载，触发器 B 监控服务无响应。</li>
<li><strong>关联规则：</strong> 当触发器 B（服务无响应）触发时，自动关闭触发器 A（CPU 高负载）的报警。</li>
<li><strong>逻辑：</strong> 因为服务都挂了，CPU 肯定也不转了，没必要同时报两个警。</li>
</ul>
</li>
</ul></section><section><h2>2.3 维护<a href="#23-维护"><span>#</span></a></h2><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260408162832696.png" alt="image-20260408162832696" /><figcaption>image-20260408162832696</figcaption></figure><p></p><p>作用：<strong>在指定的时间段内，告诉 Zabbix“不要给这些主机发报警”，但后台依然会继续收集数据。</strong></p><p><strong>维护类型：有数据收集 vs 无数据收集</strong>：两者的区别在于**“数据还在不在”**：</p><ul>
<li><strong>有数据收集（默认，推荐）</strong>：
<ul>
<li><strong>现象</strong>：Zabbix 继续监控主机，图表上<strong>依然有数据</strong>（你会看到维护期间 CPU 飙高或网络断流的曲线）。</li>
<li><strong>告警</strong>：<strong>不发送报警</strong>。</li>
<li><strong>适用场景</strong>：大部分计划内维护（如重启服务、升级软件）。因为你事后需要看图表来分析维护期间的系统表现。</li>
</ul>
</li>
<li><strong>无数据收集</strong>：
<ul>
<li><strong>现象</strong>：Zabbix 停止监控，图表上这段时间是<strong>空白的（断层的）</strong>，就像 Zabbix 罢工了一样。</li>
<li><strong>告警</strong>：不发送报警。</li>
<li><strong>适用场景</strong>：极少使用。通常用于网络彻底切断，Zabbix 根本无法连上服务器的时候；或者你完全不在乎这段时间的数据。</li>
</ul>
</li>
</ul></section><section><h2>2.4 脚本<a href="#24-脚本"><span>#</span></a></h2><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260408165724640.png" alt="image-20260408165724640" /><figcaption>image-20260408165724640</figcaption></figure><p></p><p>在创建脚本的时候需要选择脚本的<code>范围和类型</code>，**“范围”<strong>决定了</strong>“谁”<strong>能运行这个脚本，而</strong>“类型”<strong>决定了脚本</strong>“怎么”**执行。</p><ul>
<li>类型：
<ul>
<li>脚本：
<ul>
<li><strong>机制</strong>：Zabbix Server/Proxy 调用配置文件中定义的 <code>UserParameter</code>，或者通过 Zabbix Agent 执行命令。</li>
<li><strong>要求</strong>：目标主机必须安装并运行 Zabbix Agent。</li>
<li><strong>适用</strong>：绝大多数 Linux/Windows 命令（如 <code>ls</code>, <code>ipconfig</code>, <code>systemctl</code>）。</li>
</ul>
</li>
<li>ssh：
<ul>
<li><strong>机制</strong>：Zabbix Server 通过 SSH 协议连接目标主机执行命令。</li>
<li><strong>要求</strong>：目标主机开启 SSH 服务，且 Zabbix Server 配置了 SSH 的公钥/私钥认证。</li>
<li><strong>适用</strong>：Agent 没装，但有 SSH 权限的机器。</li>
</ul>
</li>
<li>telnet：
<ul>
<li><strong>机制</strong>：通过 Telnet 协议连接执行。</li>
<li><strong>适用</strong>：老旧的网络设备（交换机、路由器），安全性低，现在用得很少。</li>
</ul>
</li>
<li>ipmi：
<ul>
<li><strong>机制</strong>：通过 IPMI 协议直接控制硬件。</li>
<li><strong>适用</strong>：硬件层面的操作，如远程开机、重启服务器、查看风扇转速。</li>
</ul>
</li>
<li>webhook：
<ul>
<li><strong>机制</strong>：发送 HTTP 请求（通常是 JSON 格式）到外部系统的 API 接口。</li>
<li>适用：与现代 DevOps 工具集成。
<ul>
<li>例子：
<ul>
<li>调用钉钉/飞书/企业微信机器人发送消息。</li>
<li>调用 Jira API 自动创建工单。</li>
<li>调用 Jenkins API 触发构建。</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul><section><h3>2.4.1 动作操作<a href="#241-动作操作"><span>#</span></a></h3><ul>
<li><strong>含义</strong>：脚本<strong>不会</strong>出现在菜单里让你手动点，而是由 Zabbix <strong>自动触发</strong>。</li>
<li>配合“告警 -&gt; 动作”使用。</li>
<li>当满足特定条件（如报警级别为“灾难”）时，Zabbix 自动运行这个脚本。</li>
</ul><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260409110130079.png" alt="image-20260409110130079" /><figcaption>image-20260409110130079</figcaption></figure><p></p><p>添加触发器动作</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260409112902270.png" alt="image-20260409112902270" /><figcaption>image-20260409112902270</figcaption></figure><p></p><p>触发问题，可以看到自动执行了脚本，解决了问题</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260409113045571.png" alt="image-20260409113045571" /><figcaption>image-20260409113045571</figcaption></figure><p></p></section><section><h3>2.4.2 手动执行主机操作<a href="#242-手动执行主机操作"><span>#</span></a></h3><ul>
<li><strong>含义</strong>：这是最常用的模式。脚本会出现在<strong>主机列表</strong>或<strong>主机详情页</strong>的菜单里。</li>
</ul><p>选择手动执行<code>主机操作</code>，类型选择<code>脚本</code>,填写命令，该命令会在zabbix客户端执行，执行身份为运行zabbix进程的用户，因此需要查看该用户是否有运行该命令的权限。如果没有则需要修改<code>visuo</code>配置，添加免密规则</p><p>还需修改agent的配置文件<code>zabbix_agentd.conf</code>，修改配置<code>EnableRemoteCommands=1</code></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 格式</span></div></div><div><div><div>2</div></div><div><span>&lt;你的用户名&gt;</span><span> </span><span>ALL=</span><span>(</span><span>ALL:ALL</span><span>) </span><span>NOPASSWD:</span><span> </span><span>ALL</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># &lt;你的用户名&gt;: 你想要赋予免密权限的用户。</span></div></div><div><div><div>5</div></div><div><span># ALL=(ALL:ALL): 允许在任何主机上，以任何用户和任何用户组的身份执行命令。</span></div></div><div><div><div>6</div></div><div><span># NOPASSWD: ALL: 执行任何命令都不需要密码。</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 具体示例</span></div></div><div><div><div>9</div></div><div><span>zabbix</span><span> </span><span>ALL=</span><span>(</span><span>ALL</span><span>) </span><span>NOPASSWD:</span><span> </span><span>/usr/bin/systemctl</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260409100910743.png" alt="image-20260409100910743" /><figcaption>image-20260409100910743</figcaption></figure><p></p><ul>
<li>主机群组：设置哪些主机可以出现该脚本</li>
</ul><p>​	路径：监测-&gt;主机，之后点击名称下的主机名称即可出现</p><p>​	也可在<code>监测-&gt;问题</code>中，点击问题事件中的主机</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260409104045468.png" alt="image-20260409104045468" /><figcaption>image-20260409104045468</figcaption></figure><p></p><ul>
<li>用户群组：设置哪些用户可以使用该脚本</li>
</ul></section><section><h3>2.4.3 手动执行事件操作<a href="#243-手动执行事件操作"><span>#</span></a></h3><ul>
<li><strong>含义</strong>：脚本会出现在<strong>告警事件列表</strong>（“监测 -&gt; 问题”）的操作菜单里。</li>
</ul><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260409105500933.png" alt="image-20260409105500933" /><figcaption>image-20260409105500933</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260409105939149.png" alt="image-20260409105939149" /><figcaption>image-20260409105939149</figcaption></figure><p></p></section></section></section>
<section><h1>三、自定义监控key<a href="#三自定义监控key"><span>#</span></a></h1><p>被监控端修改主配置文件<code>zabbix_agentd.conf</code>，开启配置文件子目录</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>Include</span><span>=</span><span>/usr/local/zabbix/etc/zabbix_agentd.conf.d/*.conf</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>将自定义key文件写入到子目录中</p><p><strong>编写 Key 定义</strong>：
格式非常严格，必须遵守以下语法：
<code>UserParameter=&lt;key&gt;,&lt;command&gt;</code></p><ul>
<li><strong><code>&lt;key&gt;</code></strong>：你在 Zabbix 前端使用的唯一标识符（建议加前缀区分，如 <code>myapp.status</code>）。</li>
<li><strong><code>&lt;command&gt;</code></strong>：具体的 Shell 命令或脚本路径。</li>
</ul><section><h2>3.1 基于linux命令的key<a href="#31-基于linux命令的key"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt;</span><span>/usr/local/zabbix/etc/zabbix_agentd.d/tcp_status.conf</span><span> &lt;&lt;</span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span>UserParameter=LISTEN,netstat -ant|grep -c LISTEN</span></div></div><div><div><div>3</div></div><div><span>UserParameter=TIME_WAIT,netstat -ant|grep -c TIME_WAIT</span></div></div><div><div><div>4</div></div><div><span>UserParameter=ESTABLISHED,netstat -ant|grep -c ESTABLISHED</span></div></div><div><div><div>5</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>3.2 基于脚本的key<a href="#32-基于脚本的key"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>UserParameter</span><span>=</span><span>custom.check_disk_usage,/etc/zabbix/scripts/check_disk.sh</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>3.3 自定义参数的key<a href="#33-自定义参数的key"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 定义一个通用的端口检查 Key</span></div></div><div><div><div>2</div></div><div><span>UserParameter</span><span>=</span><span>port.listen[*</span><span>],netstat -tln | </span><span>grep</span><span> </span><span>-c</span><span> </span><span>":</span><span>$1</span><span> "</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>使用方法</strong>：
在 Zabbix 前端或 <code>zabbix_get</code> 中调用时传入参数：</p><ul>
<li>检查 80 端口：<code>port.listen[80]</code></li>
<li>检查 3306 端口：<code>port.listen[3306]</code></li>
</ul></section><section><h2>3.4 前端配置<a href="#34-前端配置"><span>#</span></a></h2><p>新建监控项，键值填入自定义的key</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/zabbix/image-20260409155508564.png" alt="image-20260409155508564" /><figcaption>image-20260409155508564</figcaption></figure><p></p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/ubuntu220%E6%BA%90%E7%A0%81%E5%AE%89%E8%A3%85jumpserver/</id>
      <title type="text">ubuntu源码安装jumpserver</title>
      <published>2026-04-25T00:00:00.000Z</published>
      <updated>2026-04-25T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/ubuntu220%E6%BA%90%E7%A0%81%E5%AE%89%E8%A3%85jumpserver/"/>
      <summary type="text">ubuntu源码安装jumpserver</summary>
      <content type="html"><![CDATA[<section><h1>一、源码安装jumpserver堡垒机<a href="#一源码安装jumpserver堡垒机"><span>#</span></a></h1><section><h2>1.1 环境准备<a href="#11-环境准备"><span>#</span></a></h2><ul>
<li>数据库服务器：10.22.51.91（已安装mysql8.0及redis7.2.4）</li>
<li>堡垒机服务器：10.22.51.72（已安装python3.8.12）</li>
</ul></section><section><h2>1.2 数据库环境准备<a href="#12-数据库环境准备"><span>#</span></a></h2><section><h3>1.2.1 mysql环境准备<a href="#121-mysql环境准备"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># mysql创建数据库</span></div></div><div><div><div>2</div></div><div><span>create</span><span> </span><span>database</span><span> </span><span>jumpserver</span><span> </span><span>default</span><span> </span><span>charset</span><span> </span><span>'utf8'</span><span>;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>#  创建连接数据库的用户密码</span></div></div><div><div><div>5</div></div><div><span>create</span><span> </span><span>user</span><span> </span><span>'jumpserver'@'%'</span><span> </span><span>identified</span><span> </span><span>by</span><span> </span><span>'admin@123'</span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 授权jumpserver用户登录的权限</span></div></div><div><div><div>8</div></div><div><span>grant</span><span> </span><span>all</span><span> </span><span>on</span><span> </span><span>jumpserver.</span><span>*</span><span> </span><span>to</span><span> </span><span>'jumpserver'@'%'</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>flush</span><span> </span><span>privileges</span><span>;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.2.2 redis 环境准备<a href="#122-redis-环境准备"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'s/bind 127.0.0.1/bind 0.0.0.0/'</span><span> </span><span>/usr/local/redis/conf/redis.conf</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>'s/protected-mode yes/protected-mode no/'</span><span> </span><span>/usr/local/redis/conf/redis.conf</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 设置Redis密码（可选，建议设置）</span></div></div><div><div><div>6</div></div><div><span>echo</span><span> </span><span>"requirepass admin@123"</span><span> &gt;&gt; </span><span>/usr/local/redis/conf/redis.conf</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>1.3 jumpserver核心源码下载<a href="#13-jumpserver核心源码下载"><span>#</span></a></h2><section><h3>1.3.1 依赖安装<a href="#131-依赖安装"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>apt-get</span><span> </span><span>install</span><span> </span><span>-y</span><span> </span><span>pkg-config</span><span> </span><span>libxmlsec1-dev</span><span> </span><span>libpq-dev</span><span> </span><span>libffi-dev</span><span> </span><span>libxml2</span><span> </span><span>libxslt-dev</span><span> </span><span>libldap2-dev</span><span> </span><span>libsasl2-dev</span><span> </span><span>sshpass</span><span> </span><span>mariadb-client</span><span> </span><span>bash-completion</span><span> </span><span>g++</span><span> </span><span>make</span><span> </span><span>sshpass</span><span> </span><span>libmysqlclient-dev</span><span> </span><span>gcc</span><span> </span><span>python3-dev</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 下载源码</span></div></div><div><div><div>2</div></div><div><span> </span><span>cd</span><span> </span><span>/usr/local/src</span></div></div><div><div><div>3</div></div><div><span>wget</span><span>  </span><span>https://github.com/jumpserver/jumpserver/archive/refs/tags/v2.28.8.tar.gz</span></div></div><div><div><div>4</div></div><div><span># 解压源码</span></div></div><div><div><div>5</div></div><div><span>tar</span><span> </span><span>-xzf</span><span> </span><span>jumpserver-2.28.8.tar.gz</span></div></div><div><div><div>6</div></div><div><span># 移动源码并改名</span></div></div><div><div><div>7</div></div><div><span>mv</span><span> </span><span>jumpserver-2.28.8</span><span> </span><span>/opt/jumpserver/core</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>cd</span><span> </span><span>/opt/jumpserver/core</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.3.2 激活虚拟环境，安装核心依赖<a href="#132-激活虚拟环境安装核心依赖"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 创建python虚拟环境</span></div></div><div><div><div>2</div></div><div><span>python3</span><span> </span><span>-m</span><span> </span><span>venv</span><span> </span><span>/opt/py_jumperserver</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 激活虚拟环境（后续所有Python操作均需激活）</span></div></div><div><div><div>5</div></div><div><span>source</span><span> </span><span>/opt/py_jumperserver/bin/activate</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 进入requirements目录，安装核心源码所需的依赖</span></div></div><div><div><div>8</div></div><div><span>cd</span><span> </span><span>/opt/jumpserver/core/requirements</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>pip</span><span> </span><span>install</span><span> </span><span>-U</span><span> </span><span>pip</span><span> </span><span>setuptools</span><span> </span><span>wheel</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># 安装运行jumpserver核心源码所需的python依赖</span></div></div><div><div><div>13</div></div><div><span>pip</span><span> </span><span>install</span><span> </span><span>-r</span><span> </span><span>requirements.txt</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.3.3 配置jumpserver<a href="#133-配置jumpserver"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 复制配置文件模板</span></div></div><div><div><div>2</div></div><div><span>cp</span><span> </span><span>config_example.yml</span><span> </span><span>config.yml</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 创建两个秘钥</span></div></div><div><div><div>5</div></div><div><span># 先打印这2个变量看有没有</span></div></div><div><div><div>6</div></div><div><span>echo</span><span> </span><span>$SECRET_KEY</span></div></div><div><div><div>7</div></div><div><span>echo</span><span> </span><span>$BOOTSTRAP_TOKEN</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 生成如下2个变量的随机值，待会配置文件得用</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>if</span><span> [ </span><span>"</span><span>$SECRET_KEY</span><span>"</span><span><span> </span><span>=</span><span> </span></span><span>""</span><span> ]; </span><span>then</span><span> </span><span>SECRET_KEY</span><span>=</span><span>`</span><span>cat</span><span> /dev/urandom </span><span>|</span><span> </span><span>tr</span><span> </span><span>-dc</span><span> A-Za-z0-9 </span><span>|</span><span> </span><span>head</span><span> </span><span>-c</span><span> </span><span>50</span><span>`</span><span>; </span><span>echo</span><span> </span><span>"SECRET_KEY=</span><span>$SECRET_KEY</span><span>"</span><span> &gt;&gt; </span><span>~/.bashrc</span><span>; </span><span>echo</span><span> </span><span>$SECRET_KEY</span><span>; </span><span>else</span><span> </span><span>echo</span><span> </span><span>$SECRET_KEY</span><span>; </span><span>fi</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>if</span><span> [ </span><span>"</span><span>$BOOTSTRAP_TOKEN</span><span>"</span><span><span> </span><span>=</span><span> </span></span><span>""</span><span> ]; </span><span>then</span><span> </span><span>BOOTSTRAP_TOKEN</span><span>=</span><span>`</span><span>cat</span><span> /dev/urandom </span><span>|</span><span> </span><span>tr</span><span> </span><span>-dc</span><span> A-Za-z0-9 </span><span>|</span><span> </span><span>head</span><span> </span><span>-c</span><span> </span><span>16</span><span>`</span><span>; </span><span>echo</span><span> </span><span>"BOOTSTRAP_TOKEN=</span><span>$BOOTSTRAP_TOKEN</span><span>"</span><span> &gt;&gt; </span><span>~/.bashrc</span><span>; </span><span>echo</span><span> </span><span>$BOOTSTRAP_TOKEN</span><span>; </span><span>else</span><span> </span><span>echo</span><span> </span><span>$BOOTSTRAP_TOKEN</span><span>; </span><span>fi</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span># 编辑配置文件</span></div></div><div><div><div>17</div></div><div><span>vim</span><span> </span><span>config.yml</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>修改以下核心配置项（其余保持默认）：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># 基础配置解释</span></div></div><div><div><div>2</div></div><div><span>SECRET_KEY</span><span>: </span><span>"生成一个随机字符串（可执行 python -c 'import secrets; print(secrets.token_hex(16))' 生成）"</span></div></div><div><div><div>3</div></div><div><span>BOOTSTRAP_TOKEN</span><span>: </span><span>"生成一个随机字符串（同上）"</span></div></div><div><div><div>4</div></div><div><span>DEBUG</span><span>: </span><span>false</span></div></div><div><div><div>5</div></div><div><span>LOG_LEVEL</span><span>: </span><span>INFO</span></div></div><div><div><div>6</div></div><div><span>DOMAIN</span><span>: </span><span>"http://你的JumpServer服务器IP:8080"</span><span>  </span><span># 后续配置nginx后可改为域名</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 数据库配置（远程MySQL）</span></div></div><div><div><div>9</div></div><div><span>DB_ENGINE</span><span>: </span><span>mysql</span></div></div><div><div><div>10</div></div><div><span>DB_HOST</span><span>: </span><span>10.1.1.30</span></div></div><div><div><div>11</div></div><div><span>DB_PORT</span><span>: </span><span>3306</span></div></div><div><div><div>12</div></div><div><span>DB_USER</span><span>: </span><span>jumpserver</span></div></div><div><div><div>13</div></div><div><span>DB_PASSWORD</span><span>: </span><span>你的MySQL密码</span></div></div><div><div><div>14</div></div><div><span>DB_NAME</span><span>: </span><span>jumpserver</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span># Redis配置（远程Redis）</span></div></div><div><div><div>17</div></div><div><span>REDIS_HOST</span><span>: </span><span>10.1.1.30</span></div></div><div><div><div>18</div></div><div><span>REDIS_PORT</span><span>: </span><span>6379</span></div></div><div><div><div>19</div></div><div><span>REDIS_PASSWORD</span><span>: </span><span>你的Redis密码</span><span>  </span><span># 若未设置密码则注释此行</span></div></div><div><div><div>20</div></div><div><span>REDIS_DB</span><span>: </span><span>0</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># 复制粘贴使用配置</span></div></div><div><div><div>2</div></div><div><span>SECRET_KEY</span><span>: </span><span>"$SECRET_KEY"</span></div></div><div><div><div>3</div></div><div><span>BOOTSTRAP_TOKEN</span><span>: </span><span>"$BOOTSTRAP_TOKEN"</span></div></div><div><div><div>4</div></div><div><span>DEBUG</span><span>: </span><span>true</span></div></div><div><div><div>5</div></div><div><span>LOG_LEVEL</span><span>: </span><span>DEBUG</span></div></div><div><div><div>6</div></div><div><span>SESSION_EXPIRE_AT_BROWSER_CLOSE</span><span>: </span><span>true</span></div></div><div><div><div>7</div></div><div><span>DB_ENGINE</span><span>: </span><span>mysql</span></div></div><div><div><div>8</div></div><div><span>DB_HOST</span><span>: </span><span>10.22.51.91</span></div></div><div><div><div>9</div></div><div><span>DB_PORT</span><span>: </span><span>3306</span></div></div><div><div><div>10</div></div><div><span>DB_USER</span><span>: </span><span>jumpserver</span></div></div><div><div><div>11</div></div><div><span>DB_PASSWORD</span><span>: </span><span>admin@123</span></div></div><div><div><div>12</div></div><div><span>DB_NAME</span><span>: </span><span>jumpserver</span></div></div><div><div><div>13</div></div><div><span>HTTP_BIND_HOST</span><span>: </span><span>0.0.0.0</span></div></div><div><div><div>14</div></div><div><span>HTTP_LISTEN_PORT</span><span>: </span><span>8080</span></div></div><div><div><div>15</div></div><div><span>WS_LISTEN_PORT</span><span>: </span><span>8070</span></div></div><div><div><div>16</div></div><div><span>REDIS_HOST</span><span>: </span><span>10.22.51.91</span></div></div><div><div><div>17</div></div><div><span>REDIS_PORT</span><span>: </span><span>6379</span></div></div><div><div><div>18</div></div><div><span>REDIS_PASSWORD</span><span>: </span><span>admin@123</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>1.3.4 初始化数据库<a href="#134-初始化数据库"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 进入JumpServer目录</span></div></div><div><div><div>2</div></div><div><span>cd</span><span> </span><span>/opt/jumpserver/core/apps</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 下载 GeoLite2-City 地理 IP 数据库文件</span></div></div><div><div><div>5</div></div><div><span>wget</span><span> </span><span>https://download.jumpserver.org/files/ip/GeoLite2-City.mmdb</span><span> </span><span>-O</span><span> </span><span>common/utils/ip/geoip/GeoLite2-City.mmdb</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 下载 IPIP 免费版 IP 数据库文件</span></div></div><div><div><div>8</div></div><div><span>wget</span><span> </span><span>https://download.jumpserver.org/files/ip/ipipfree.ipdb</span><span> </span><span>-O</span><span> </span><span>common/utils/ip/ipip/ipipfree.ipdb</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 删除旧的翻译编译文件</span></div></div><div><div><div>11</div></div><div><span>rm</span><span> </span><span>-f</span><span> </span><span>locale/zh/LC_MESSAGES/django.mo</span><span> </span><span>apps/locale/zh/LC_MESSAGES/djangojs.mo</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>#生成数据库迁移文件</span></div></div><div><div><div>14</div></div><div><span>python3</span><span>  </span><span>./manage.py</span><span> </span><span>makemigrations</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span># 将迁移文件写入数据库中</span></div></div><div><div><div>17</div></div><div><span>python3</span><span>  </span><span>./manage.py</span><span> </span><span>migrate</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span># 编译生成新的翻译文件</span></div></div><div><div><div>20</div></div><div><span>python3</span><span> </span><span>manage.py</span><span> </span><span>compilemessages</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>进入数据库查看是否写入进去</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>[root@db-30 ~]#mysql -uroot -p</span></div></div><div><div><div>2</div></div><div><span>Enter</span><span> </span><span>password:</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>mysql</span><span>&gt; </span><span>show</span><span> </span><span>tables</span><span> </span><span>from</span><span> </span><span>jumpserver</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>133</span><span> </span><span>rows</span><span> </span><span>in</span><span> </span><span>set</span><span> (0.01 </span><span>sec</span><span>)</span></div></div><div><div><div>7</div></div><div><span># 可以看到写入了97张表</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.3.5 启动jumpserver核心<a href="#135-启动jumpserver核心"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>#进入目录</span></div></div><div><div><div>2</div></div><div><span>cd</span><span> </span><span>/opt/jumpserver/core</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 后台启动</span></div></div><div><div><div>5</div></div><div><span>./jms</span><span> </span><span>start</span><span> </span><span>all</span><span> </span><span>-d</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 启动后查看状态，./jms --help查看更多选项</span></div></div><div><div><div>8</div></div><div><span>(</span><span>py_jumperserver</span><span>) [root@mater-22 /usr/local/jumpserver]#./jms status</span></div></div><div><div><div>9</div></div><div><span>gunicorn</span><span> </span><span>is</span><span> </span><span>running:</span><span> </span><span>29057</span></div></div><div><div><div>10</div></div><div><span>flower</span><span> </span><span>is</span><span> </span><span>running:</span><span> </span><span>29085</span></div></div><div><div><div>11</div></div><div><span>daphne</span><span> </span><span>is</span><span> </span><span>running:</span><span> </span><span>29506</span></div></div><div><div><div>12</div></div><div><span>celery_ansible</span><span> </span><span>is</span><span> </span><span>running:</span><span> </span><span>29627</span></div></div><div><div><div>13</div></div><div><span>celery_default</span><span> </span><span>is</span><span> </span><span>running:</span><span> </span><span>30007</span></div></div><div><div><div>14</div></div><div><span>beat</span><span> </span><span>is</span><span> </span><span>running:</span><span> </span><span>30082</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span># 查看启动端口</span></div></div><div><div><div>17</div></div><div><span>(</span><span>py_jumperserver</span><span>) [root@mater-22 /usr/local/jumpserver]#netstat -tunlp | </span><span>grep</span><span> </span><span>python</span></div></div><div><div><div>18</div></div><div><span>tcp</span><span>        </span><span>0</span><span>      </span><span>0</span><span> </span><span>0.0.0.0:8080</span><span>            </span><span>0.0.0.0:</span><span>*</span><span>               </span><span>LISTEN</span><span>      </span><span>29057/python3</span></div></div><div><div><div>19</div></div><div><span>tcp</span><span>        </span><span>0</span><span>      </span><span>0</span><span> </span><span>0.0.0.0:5555</span><span>            </span><span>0.0.0.0:</span><span>*</span><span>               </span><span>LISTEN</span><span>      </span><span>29085/python3</span></div></div><div><div><div>20</div></div><div><span>tcp</span><span>        </span><span>0</span><span>      </span><span>0</span><span> </span><span>0.0.0.0:8070</span><span>            </span><span>0.0.0.0:</span><span>*</span><span>               </span><span>LISTEN</span><span>      </span><span>29506/python3</span></div></div><div><div><div>21</div></div><div><span>tcp6</span><span>       </span><span>0</span><span>      </span><span>0</span><span> </span><span>:::5555</span><span>                 </span><span>:::</span><span>*</span><span>                    </span><span>LISTEN</span><span>      </span><span>29085/python3</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span># 使用浏览器访问</span></div></div><div><div><div>24</div></div><div><span>10.1.1.22:8080</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span># 默认账户密码</span></div></div><div><div><div>27</div></div><div><span>admin</span></div></div><div><div><div>28</div></div><div><span>admin</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>至此，jumpserver的核心后端服务已经安装完成，此时可以退出python的虚拟环境</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>deactivate</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>之后启动jumpserver的核心后端服务，都需要进入到虚拟环境后在执行启动命令</strong>**</p></section></section><section><h2>1.4 安装前端lina组件<a href="#14-安装前端lina组件"><span>#</span></a></h2><section><h3>1.4.1 下载源码<a href="#141-下载源码"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/usr/local/src</span></div></div><div><div><div>2</div></div><div><span>wget</span><span> </span><span>-O</span><span> </span><span>./lina-v2.28.8.tar.gz</span><span> </span><span>https://github.com/jumpserver/lina/archive/refs/tags/v2.28.8.tar.gz</span></div></div><div><div><div>3</div></div><div><span># 解压源码</span></div></div><div><div><div>4</div></div><div><span>tar</span><span> </span><span>-xzf</span><span> </span><span>lina-2.12.0.tar.gz</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 移动lina源码并改名</span></div></div><div><div><div>7</div></div><div><span>mv</span><span> </span><span>lina-2.12.0</span><span> </span><span>/opt/jumpserver/lina</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.4.2 源码安装node.js<a href="#142-源码安装nodejs"><span>#</span></a></h3><section><h4>1.4.2.1 下载源码<a href="#1421-下载源码"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/usr/local/src</span></div></div><div><div><div>2</div></div><div><span>wget</span><span> </span><span>https://nodejs.org/download/release/v14.16.1/node-v14.16.1-linux-x64.tar.xz</span></div></div><div><div><div>3</div></div><div><span># 解压</span></div></div><div><div><div>4</div></div><div><span>tar</span><span> </span><span>-xf</span><span> </span><span>node-v14.16.1-linux-x64.tar.xz</span></div></div><div><div><div>5</div></div><div><span># 移动并改名</span></div></div><div><div><div>6</div></div><div><span>mv</span><span> </span><span>node-v14.16.1-linux-x64</span><span> </span><span>/opt/node</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>1.4.2.2 修改环境变量<a href="#1422-修改环境变量"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>/etc/profile.d/node.sh</span><span> &lt;&lt;</span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span># NODE</span></div></div><div><div><div>3</div></div><div><span>export NODE_HOME=/opt/node</span></div></div><div><div><div>4</div></div><div><span>export PATH=$NODE_HOME/bin:$PATH</span></div></div><div><div><div>5</div></div><div><span>export NODE_PATH=$NODE_HOME/lib/node_modules</span></div></div><div><div><div>6</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 刷新文件</span></div></div><div><div><div>2</div></div><div><span>source</span><span> </span><span>/etc/profile</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>1.4.2.3 验证版本<a href="#1423-验证版本"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>[root@mater-22 /usr/local/nodejs]#node -v</span></div></div><div><div><div>2</div></div><div><span>v14.16.1</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>[root@mater-22 /usr/local/nodejs]#npm -v</span></div></div><div><div><div>5</div></div><div><span>6.14.12</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>1.4.2.4 切换npm源<a href="#1424-切换npm源"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 切换为国内镜像源</span></div></div><div><div><div>2</div></div><div><span>npm</span><span> </span><span>config</span><span> </span><span>set</span><span> </span><span>registry</span><span> </span><span>https://registry.npmmirror.com/</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 验证配置</span></div></div><div><div><div>5</div></div><div><span>npm</span><span> </span><span>get</span><span> </span><span>registry</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>1.2.2.5 安装yarn工具<a href="#1225-安装yarn工具"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 全局安装yarn</span></div></div><div><div><div>2</div></div><div><span>npm</span><span> </span><span>install</span><span> </span><span>-g</span><span> </span><span>yarn</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 修改yarn镜像源</span></div></div><div><div><div>5</div></div><div><span>yarn</span><span> </span><span>config</span><span> </span><span>set</span><span> </span><span>registry</span><span> </span><span>https://registry.npmmirror.com/</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 验证配置</span></div></div><div><div><div>8</div></div><div><span>yarn</span><span> </span><span>config</span><span> </span><span>get</span><span> </span><span>registry</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>1.4.3 安装lina所需依赖<a href="#143-安装lina所需依赖"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 进入目录</span></div></div><div><div><div>2</div></div><div><span>cd</span><span> </span><span>/opt/jumpserver/lina</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 执行命令安装依赖,执行后会去当前目录下寻找package.json安装所需依赖</span></div></div><div><div><div>5</div></div><div><span>yarn</span><span> </span><span>install</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果<strong>执行 yarn install 报错</strong>，这可以按照以下内容进行修改</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 执行命令清除之前的缓存</span></div></div><div><div><div>2</div></div><div><span>cd</span><span> </span><span>/opt/jumpserver/lina</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 1. 清理旧依赖和锁文件</span></div></div><div><div><div>5</div></div><div><span>rm</span><span> </span><span>-rf</span><span> </span><span>node_modules</span><span> </span><span>yarn.lock</span><span> </span><span>package-lock.json</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 永久忽略 Node.js 版本检查（核心：避免引擎报错）</span></div></div><div><div><div>8</div></div><div><span>yarn</span><span> </span><span>config</span><span> </span><span>set</span><span> </span><span>ignore-engines</span><span> </span><span>true</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 关闭严格 SSL 验证（解决证书问题）</span></div></div><div><div><div>11</div></div><div><span>yarn</span><span> </span><span>config</span><span> </span><span>set</span><span> </span><span>strict-ssl</span><span> </span><span>false</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span># 进行安装</span></div></div><div><div><div>14</div></div><div><span>yarn</span><span> </span><span>install</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果还不行，则更换适配的yarn版本</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 执行命令清除之前的缓存</span></div></div><div><div><div>2</div></div><div><span>cd</span><span> </span><span>/opt/jumpserver/lina</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 1. 清理旧依赖和锁文件</span></div></div><div><div><div>5</div></div><div><span>rm</span><span> </span><span>-rf</span><span> </span><span>node_modules</span><span> </span><span>yarn.lock</span><span> </span><span>package-lock.json</span></div></div><div><div><div>6</div></div><div><span># 2. 安装适配的 yarn 1.22.10</span></div></div><div><div><div>7</div></div><div><span>npm</span><span> </span><span>install</span><span> </span><span>-g</span><span> </span><span>yarn@1.22.10</span><span> </span><span>--registry=http://registry.npmmirror.com</span><span> </span><span>--unsafe-perm=true</span></div></div><div><div><div>8</div></div><div><span># 3. 配置 yarn 适配 Node.js 10</span></div></div><div><div><div>9</div></div><div><span>yarn</span><span> </span><span>config</span><span> </span><span>set</span><span> </span><span>ignore-engines</span><span> </span><span>true</span></div></div><div><div><div>10</div></div><div><span>yarn</span><span> </span><span>config</span><span> </span><span>set</span><span> </span><span>strict-ssl</span><span> </span><span>false</span></div></div><div><div><div>11</div></div><div><span>yarn</span><span> </span><span>config</span><span> </span><span>set</span><span> </span><span>registry</span><span> </span><span>http://registry.npmmirror.com</span></div></div><div><div><div>12</div></div><div><span># 4. 安装依赖</span></div></div><div><div><div>13</div></div><div><span>yarn</span><span> </span><span>install</span><span> </span><span>--ignore-engines</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.4.4 修改配置文件<a href="#144-修改配置文件"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 修改版本号</span></div></div><div><div><div>2</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>"s@Version &lt;strong&gt;.*&lt;/strong&gt;@Version &lt;strong&gt;v2.28.8&lt;/strong&gt;@g"</span><span> </span><span>src/layout/components/Footer/index.vue</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 修改配置文件</span></div></div><div><div><div>5</div></div><div><span>vim</span><span> </span><span>.env.development</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 全局环境变量 请勿随意改动</span></div></div><div><div><div>2</div></div><div><span>ENV</span><span> </span><span>=</span><span> </span><span>'development'</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># base api</span></div></div><div><div><div>5</div></div><div><span>VUE_APP_BASE_API</span><span> </span><span>=</span><span> </span><span>''</span></div></div><div><div><div>6</div></div><div><span>VUE_APP_PUBLIC_PATH</span><span> </span><span>=</span><span> </span><span>'/ui/'</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable,</span></div></div><div><div><div>9</div></div><div><span># to control whether the babel-plugin-dynamic-import-node plugin is enabled.</span></div></div><div><div><div>10</div></div><div><span># It only does one thing by converting all import() to require().</span></div></div><div><div><div>11</div></div><div><span># This configuration can significantly increase the speed of hot updates,</span></div></div><div><div><div>12</div></div><div><span># when you have a large number of pages.</span></div></div><div><div><div>13</div></div><div><span># Detail:  https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/babel-preset-app/index.js</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>VUE_CLI_BABEL_TRANSPILE_MODULES</span><span> </span><span>=</span><span> </span><span>true</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span># External auth</span></div></div><div><div><div>18</div></div><div><span>VUE_APP_LOGIN_PATH</span><span> </span><span>=</span><span> </span><span>'/core/auth/login/'</span></div></div><div><div><div>19</div></div><div><span>VUE_APP_LOGOUT_PATH</span><span> </span><span>=</span><span> </span><span>'/core/auth/logout/'</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span># Dev server for core proxy</span></div></div><div><div><div>22</div></div><div><span>VUE_APP_CORE_HOST</span><span> </span><span>=</span><span> </span><span>'http://localhost:8080'</span><span>  </span><span># 修改成 Core 的 url 地址</span></div></div><div><div><div>23</div></div><div><span>VUE_APP_CORE_WS</span><span> </span><span>=</span><span> </span><span>'ws://localhost:8070'</span></div></div><div><div><div>24</div></div><div><span>VUE_APP_ENV</span><span> </span><span>=</span><span> </span><span>'development'</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>1.4.5 启动lina<a href="#145-启动lina"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 前台运行lina</span></div></div><div><div><div>2</div></div><div><span>yarn</span><span> </span><span>serve</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 后台运行，结束运行使用kill杀死进程即可</span></div></div><div><div><div>5</div></div><div><span>nohup</span><span> </span><span>yarn</span><span> </span><span>serve</span><span> &amp;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>启动后访问<code>ip:9528</code></p></section><section><h3>1.4.6 构建lina<a href="#146-构建lina"><span>#</span></a></h3><p>使用<code>yarn serve</code>打开每次都要编译，过于麻烦，只适用于开发调试代码时使用。使用构建lina可以生成可部署的静态文件，用于正式上线</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 1. 构建生产版本（构建完成后生成lina目录）</span></div></div><div><div><div>2</div></div><div><span>yarn</span><span> </span><span>build</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 2. 把构建好的 lina 目录复制一份，带上版本号</span></div></div><div><div><div>5</div></div><div><span>cp</span><span> </span><span>-rf</span><span> </span><span>lina</span><span> </span><span>lina-v2.28.8</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 3. 把版本目录打包成压缩包，方便传输、部署到服务器</span></div></div><div><div><div>8</div></div><div><span>tar</span><span> </span><span>-czf</span><span> </span><span>lina-bulid-v2.28.8.tar.gz</span><span> </span><span>lina-v2.28.8</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>1.5 安装前端luna组件<a href="#15-安装前端luna组件"><span>#</span></a></h2><section><h3>1.5.1 下载源码<a href="#151-下载源码"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/usr/local/src</span></div></div><div><div><div>2</div></div><div><span>wget</span><span> </span><span>-O</span><span> </span><span>./luna-v2.28.8.tar.gz</span><span> </span><span>https://github.com/jumpserver/luna/archive/refs/tags/v2.28.8.tar.gz</span></div></div><div><div><div>3</div></div><div><span># 解压源码</span></div></div><div><div><div>4</div></div><div><span>tar</span><span> </span><span>-xzf</span><span> </span><span>luna-v2.28.8.tar.gz</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 移动lina源码并改名</span></div></div><div><div><div>7</div></div><div><span>mv</span><span> </span><span>luna-2.28.8/</span><span> </span><span>/opt/jumpserver/luna</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.5.2 下载luna所需依赖<a href="#152-下载luna所需依赖"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 进入 luna 项目目录</span></div></div><div><div><div>2</div></div><div><span>cd</span><span> </span><span>/opt/jumpserver/luna</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 安装适配依赖</span></div></div><div><div><div>5</div></div><div><span>yarn</span><span> </span><span>install</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.5.3 修改luna配置文件<a href="#153-修改luna配置文件"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 修改版本号</span></div></div><div><div><div>2</div></div><div><span>sed</span><span> </span><span>-i</span><span> </span><span>"s@[0-9].[0-9].[0-9]@v2.28.8@g"</span><span> </span><span>src/environments/environment.prod.ts</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 备份配置文件</span></div></div><div><div><div>5</div></div><div><span>cp</span><span> </span><span>proxy.conf.json</span><span> </span><span>proxy.conf.json.bak</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 编辑配置文件</span></div></div><div><div><div>8</div></div><div><span>vim</span><span> </span><span>proxy.conf.json</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>{</span></div></div><div><div><div>2</div></div><div><span>  </span><span>"/koko"</span><span>:</span><span> </span><span>{</span></div></div><div><div><div>3</div></div><div><span>    </span><span>"target"</span><span>:</span><span> </span><span>"http://localhost:5000",</span><span>  </span><span># KoKo 地址</span></div></div><div><div><div>4</div></div><div><span>    </span><span>"secure"</span><span>:</span><span> </span><span>false</span><span>,</span></div></div><div><div><div>5</div></div><div><span>    </span><span>"ws"</span><span>:</span><span> </span><span>true</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>7</div></div><div><span>  </span><span>"/media/"</span><span>:</span><span> </span><span>{</span></div></div><div><div><div>8</div></div><div><span>    </span><span>"target"</span><span>:</span><span> </span><span>"http://localhost:8080",</span><span>  </span><span># Core 地址</span></div></div><div><div><div>9</div></div><div><span>    </span><span>"secure"</span><span>:</span><span> </span><span>false</span><span>,</span></div></div><div><div><div>10</div></div><div><span>    </span><span>"changeOrigin"</span><span>:</span><span> </span><span>true</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>12</div></div><div><span>  </span><span>"/api/"</span><span>:</span><span> </span><span>{</span></div></div><div><div><div>13</div></div><div><span>    </span><span>"target"</span><span>:</span><span> </span><span>"http://localhost:8080",</span><span>  </span><span># Core 地址</span></div></div><div><div><div>14</div></div><div><span>    </span><span>"secure"</span><span>:</span><span> </span><span>false</span><span>,</span><span>                    </span><span># https ssl 需要开启</span></div></div><div><div><div>15</div></div><div><span>    </span><span>"changeOrigin"</span><span>:</span><span> </span><span>true</span></div></div><div><div><div>16</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>17</div></div><div><span>  </span><span>"/core"</span><span>:</span><span> </span><span>{</span></div></div><div><div><div>18</div></div><div><span>    </span><span>"target"</span><span>:</span><span> </span><span>"http://localhost:8080",</span><span>  </span><span># Core 地址</span></div></div><div><div><div>19</div></div><div><span>    </span><span>"secure"</span><span>:</span><span> </span><span>false</span><span>,</span></div></div><div><div><div>20</div></div><div><span>    </span><span>"changeOrigin"</span><span>:</span><span> </span><span>true</span></div></div><div><div><div>21</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>22</div></div><div><span>  </span><span>"/static"</span><span>:</span><span> </span><span>{</span></div></div><div><div><div>23</div></div><div><span>    </span><span>"target"</span><span>:</span><span> </span><span>"http://localhost:8080",</span><span>  </span><span># Core 地址</span></div></div><div><div><div>24</div></div><div><span>    </span><span>"secure"</span><span>:</span><span> </span><span>false</span><span>,</span></div></div><div><div><div>25</div></div><div><span>    </span><span>"changeOrigin"</span><span>:</span><span> </span><span>true</span></div></div><div><div><div>26</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>27</div></div><div><span>  </span><span>"/lion"</span><span>:</span><span> </span><span>{</span></div></div><div><div><div>28</div></div><div><span>    </span><span>"target"</span><span>:</span><span> </span><span>"http://localhost:9529",</span><span>  </span><span># Lion 地址</span></div></div><div><div><div>29</div></div><div><span>    </span><span>"secure"</span><span>:</span><span> </span><span>false</span><span>,</span></div></div><div><div><div>30</div></div><div><span>    </span><span>"pathRewrite"</span><span>:</span><span> </span><span>{</span></div></div><div><div><div>31</div></div><div><span>      </span><span>"^/lion/monitor"</span><span>:</span><span> </span><span>"/monitor"</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>},</span></div></div><div><div><div>33</div></div><div><span>    </span><span>"ws"</span><span>:</span><span> </span><span>true</span><span>,</span></div></div><div><div><div>34</div></div><div><span>    </span><span>"changeOrigin"</span><span>:</span><span> </span><span>true</span></div></div><div><div><div>35</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>36</div></div><div><span>  </span><span>"/omnidb"</span><span>:</span><span> </span><span>{</span></div></div><div><div><div>37</div></div><div><span>    </span><span>"target"</span><span>:</span><span> </span><span>"http://localhost:8082",</span></div></div><div><div><div>38</div></div><div><span>    </span><span>"secure"</span><span>:</span><span> </span><span>false</span><span>,</span></div></div><div><div><div>39</div></div><div><span>    </span><span>"ws"</span><span>:</span><span> </span><span>true</span><span>,</span></div></div><div><div><div>40</div></div><div><span>    </span><span>"changeOrigin"</span><span>:</span><span> </span><span>true</span></div></div><div><div><div>41</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>42</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>1.5.4 启动luna<a href="#154-启动luna"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 安装ng命令，添加--unsafe-perm参数，提权，让node的权限大一点</span></div></div><div><div><div>2</div></div><div><span>npm</span><span> </span><span>install</span><span> </span><span>-g</span><span> </span><span>@angular/cli</span><span> </span><span>--unsafe-perm</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 检查版本</span></div></div><div><div><div>5</div></div><div><span>ng</span><span> </span><span>-v</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 前台运行luna，指定端口是为了测试，不指定为本地地址</span></div></div><div><div><div>8</div></div><div><span>./node_modules/.bin/ng</span><span> </span><span>serve</span><span> </span><span>--proxy-config</span><span> </span><span>proxy.conf.json</span><span> </span><span>--host</span><span> </span><span>0.0.0.0</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 后台运行</span></div></div><div><div><div>11</div></div><div><span>nohup</span><span> </span><span>./node_modules/.bin/ng</span><span> </span><span>serve</span><span> </span><span>--proxy-config</span><span> </span><span>proxy.conf.json</span><span> </span><span>--host</span><span> </span><span>0.0.0.0</span><span> &amp;</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span># 访问地址,将ip更改为实际ip</span></div></div><div><div><div>14</div></div><div><span>http://ip:4200/webpack-dev-server/</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.5.5 构建luna<a href="#155-构建luna"><span>#</span></a></h3><p>与lina类似，对luna进行构建</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 构建生产版本（构建完成后生成luna目录）</span></div></div><div><div><div>2</div></div><div><span>yarn</span><span> </span><span>build</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 复制国际化文件到构建目录</span></div></div><div><div><div>5</div></div><div><span>cp</span><span> </span><span>-R</span><span> </span><span>src/assets/i18n</span><span> </span><span>luna/</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 备份版本目录</span></div></div><div><div><div>8</div></div><div><span>cp</span><span> </span><span>-rf</span><span> </span><span>luna</span><span> </span><span>luna-v2.28.8</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 打包成压缩包</span></div></div><div><div><div>11</div></div><div><span>tar</span><span> </span><span>-czf</span><span> </span><span>luna-build-v2.28.8.tar.gz</span><span> </span><span>luna-v2.28.8</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>1.6 安装coco组件<a href="#16-安装coco组件"><span>#</span></a></h2><section><h3>1.6.1 下载二进制源码<a href="#161-下载二进制源码"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/usr/local/src</span></div></div><div><div><div>2</div></div><div><span>wget</span><span> </span><span>https://github.com/jumpserver/koko/releases/download/v2.28.7/koko-v2.28.7-linux-amd64.tar.gz</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 解压源码</span></div></div><div><div><div>5</div></div><div><span>tar</span><span> </span><span>-xf</span><span> </span><span>koko-v2.28.7-linux-amd64.tar.gz</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 移动lina源码并改名</span></div></div><div><div><div>8</div></div><div><span>mv</span><span> </span><span>koko-v2.28.7-linux-amd64</span><span> </span><span>/opt/jumpserver/koko</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>cd</span><span> </span><span>/opt/jumpserver/koko</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>mv</span><span> </span><span>kubectl</span><span> </span><span>/usr/local/bin/kubectl</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.6.2 下载koko所需依赖<a href="#162-下载koko所需依赖"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 安装add-apt-repository 命令，用于添加第三方软件源</span></div></div><div><div><div>2</div></div><div><span>apt</span><span> </span><span>install</span><span> </span><span>software-properties-common</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 添加 Redis 软件源</span></div></div><div><div><div>5</div></div><div><span>add-apt-repository</span><span> </span><span>-y</span><span> </span><span>ppa:redislabs/redis</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 核心客户端依赖安装</span></div></div><div><div><div>8</div></div><div><span>apt-get</span><span> </span><span>install</span><span> </span><span>-y</span><span> </span><span>mariadb-client</span><span> </span><span>bash-completion</span><span> </span><span>redis-tools</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>cd</span><span> </span><span>/usr/local/src</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span># 下载并部署 kubectl</span></div></div><div><div><div>14</div></div><div><span>wget</span><span> </span><span>https://download.jumpserver.org/public/kubectl-linux-amd64.tar.gz</span><span> </span><span>-O</span><span> </span><span>kubectl.tar.gz</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>tar</span><span> </span><span>-xf</span><span> </span><span>kubectl.tar.gz</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>mv</span><span> </span><span>kubectl</span><span> </span><span>/usr/local/bin/rawkubectl</span></div></div><div><div><div>19</div></div><div><span># 下载并部署 helm</span></div></div><div><div><div>20</div></div><div><span>wget</span><span> </span><span>https://download.jumpserver.org/public/helm-v3.9.0-linux-amd64.tar.gz</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>tar</span><span> </span><span>-xf</span><span> </span><span>helm-v3.9.0-linux-amd64.tar.gz</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>mv</span><span> </span><span>linux-amd64/helm</span><span> </span><span>/usr/local/bin/rawhelm</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span># 修改权限</span></div></div><div><div><div>27</div></div><div><span>chmod</span><span> </span><span>755</span><span> </span><span>/usr/local/bin/rawkubectl</span><span> </span><span>/usr/local/bin/rawhelm</span></div></div><div><div><div>28</div></div><div><span>chown</span><span> </span><span>root:root</span><span> </span><span>/usr/local/bin/rawkubectl</span><span> </span><span>/usr/local/bin/rawhelm</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>1.6.3 源码安装go<a href="#163-源码安装go"><span>#</span></a></h3><section><h4>1.6.3.1 下载源码<a href="#1631-下载源码"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/usr/local/src</span></div></div><div><div><div>2</div></div><div><span>wget</span><span> </span><span>https://golang.google.cn/dl/go1.18.7.linux-amd64.tar.gz</span></div></div><div><div><div>3</div></div><div><span>tar</span><span> </span><span>-xf</span><span> </span><span>go1.18.7.linux-amd64.tar.gz</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>mv</span><span> </span><span>./go</span><span> </span><span>/opt/</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>1.6.3.2 添加环境变量<a href="#1632-添加环境变量"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> &gt; </span><span>/etc/profile.d/go.sh</span><span> &lt;&lt;</span><span>'EOF'</span></div></div><div><div><div>2</div></div><div><span># go</span></div></div><div><div><div>3</div></div><div><span>export PATH=/opt/go/bin:$PATH</span></div></div><div><div><div>4</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 刷新文件</span></div></div><div><div><div>2</div></div><div><span>source</span><span> </span><span>/etc/profile</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>1.6.3.3 验证版本<a href="#1633-验证版本"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>[root@ubuntu-22 /opt]# go version</span></div></div><div><div><div>2</div></div><div><span>go</span><span> </span><span>version</span><span> </span><span>go1.18.7</span><span> </span><span>linux/amd64</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>1.6.4修改配置文件<a href="#164修改配置文件"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/opt/jumpserver/koko</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>cp</span><span> </span><span>config_example.yml</span><span> </span><span>config.yml</span></div></div><div><div><div>4</div></div><div><span>vim</span><span> </span><span>config.yml</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 项目名称, 会用来向Jumpserver注册, 识别而已, 不能重复</span></div></div><div><div><div>2</div></div><div><span># NAME: {{ Hostname }}</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># Jumpserver项目的url, api请求注册会使用</span></div></div><div><div><div>5</div></div><div><span>CORE_HOST:</span><span> </span><span>http://127.0.0.1:8080</span><span>   </span><span># Core 的地址</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># Bootstrap Token, 预共享秘钥, 用来注册coco使用的service account和terminal</span></div></div><div><div><div>8</div></div><div><span># 请和jumpserver 配置文件中保持一致，注册完成后可以删除</span></div></div><div><div><div>9</div></div><div><span>BOOTSTRAP_TOKEN:</span><span> </span><span>"</span><span>$BOOTSTRAP_TOKEN</span><span>"</span><span>  </span><span># 和 Core config.yml 的值保持一致</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span># 启动时绑定的ip, 默认 0.0.0.0</span></div></div><div><div><div>12</div></div><div><span>BIND_HOST:</span><span> </span><span>0.0.0.0</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span># 监听的SSH端口号, 默认2222</span></div></div><div><div><div>15</div></div><div><span>SSHD_PORT:</span><span> </span><span>2222</span><span>            </span><span># 使用 0.0.0.0:2222</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span># 监听的HTTP/WS端口号，默认5000</span></div></div><div><div><div>18</div></div><div><span>HTTPD_PORT:</span><span> </span><span>5000</span><span>           </span><span># 使用 0.0.0.0:5000</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span># 项目使用的ACCESS KEY, 默认会注册,并保存到 ACCESS_KEY_STORE中,</span></div></div><div><div><div>21</div></div><div><span># 如果有需求, 可以写到配置文件中, 格式 access_key_id:access_key_secret</span></div></div><div><div><div>22</div></div><div><span># ACCESS_KEY: null</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span># ACCESS KEY 保存的地址, 默认注册后会保存到该文件中</span></div></div><div><div><div>25</div></div><div><span># ACCESS_KEY_FILE: data/keys/.access_key</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span># 设置日志级别 [DEBUG, INFO, WARN, ERROR, FATAL, CRITICAL]</span></div></div><div><div><div>28</div></div><div><span>LOG_LEVEL:</span><span> </span><span>DEBUG</span><span>           </span><span># 开发建议设置 DEBUG, 生产环境推荐使用 ERROR</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span># SSH连接超时时间 (default 15 seconds)</span></div></div><div><div><div>31</div></div><div><span># SSH_TIMEOUT: 15</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span># 语言 [en,zh]</span></div></div><div><div><div>34</div></div><div><span># LANGUAGE_CODE: zh</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span># SFTP的根目录, 可选 /tmp, Home其他自定义目录</span></div></div><div><div><div>37</div></div><div><span># SFTP_ROOT: /tmp</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span># SFTP是否显示隐藏文件</span></div></div><div><div><div>40</div></div><div><span># SFTP_SHOW_HIDDEN_FILE: false</span></div></div><div><div><div>41</div></div><div>
</div></div><div><div><div>42</div></div><div><span># 是否复用和用户后端资产已建立的连接(用户不会复用其他用户的连接)</span></div></div><div><div><div>43</div></div><div><span># REUSE_CONNECTION: true</span></div></div><div><div><div>44</div></div><div>
</div></div><div><div><div>45</div></div><div><span># 资产加载策略, 可根据资产规模自行调整. 默认异步加载资产, 异步搜索分页; 如果为all, 则资产全部加载, 本地搜索分页.</span></div></div><div><div><div>46</div></div><div><span># ASSET_LOAD_POLICY:</span></div></div><div><div><div>47</div></div><div>
</div></div><div><div><div>48</div></div><div><span># zip压缩的最大额度 (单位: M)</span></div></div><div><div><div>49</div></div><div><span># ZIP_MAX_SIZE: 1024M</span></div></div><div><div><div>50</div></div><div>
</div></div><div><div><div>51</div></div><div><span># zip压缩存放的临时目录 /tmp</span></div></div><div><div><div>52</div></div><div><span># ZIP_TMP_PATH: /tmp</span></div></div><div><div><div>53</div></div><div>
</div></div><div><div><div>54</div></div><div><span># 向 SSH Client 连接发送心跳的时间间隔 (单位: 秒)，默认为30, 0则表示不发送</span></div></div><div><div><div>55</div></div><div><span># CLIENT_ALIVE_INTERVAL: 30</span></div></div><div><div><div>56</div></div><div>
</div></div><div><div><div>57</div></div><div><span># 向资产发送心跳包的重试次数，默认为3</span></div></div><div><div><div>58</div></div><div><span># RETRY_ALIVE_COUNT_MAX: 3</span></div></div><div><div><div>59</div></div><div>
</div></div><div><div><div>60</div></div><div><span># 会话共享使用的类型 [local, redis], 默认local</span></div></div><div><div><div>61</div></div><div><span># SHARE_ROOM_TYPE: local</span></div></div><div><div><div>62</div></div><div>
</div></div><div><div><div>63</div></div><div><span># Redis配置</span></div></div><div><div><div>64</div></div><div><span># REDIS_HOST: 127.0.0.1      # 如果需要部署多个 koko, 需要通过 redis 来保持会话</span></div></div><div><div><div>65</div></div><div><span># REDIS_PORT: 6379</span></div></div><div><div><div>66</div></div><div><span># REDIS_PASSWORD:</span></div></div><div><div><div>67</div></div><div><span># REDIS_CLUSTERS:</span></div></div><div><div><div>68</div></div><div><span># REDIS_DB_ROOM:</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>1.6.5 启动koko<a href="#165-启动koko"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>./koko</span><span> </span><span>-d</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>1.7 安装lion组件<a href="#17-安装lion组件"><span>#</span></a></h2><section><h3>1.7.1 安装guacd<a href="#171-安装guacd"><span>#</span></a></h3><section><h4>1.7.1.1 下载源码<a href="#1711-下载源码"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/usr/local/src</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>wget</span><span> </span><span>http://download.jumpserver.org/public/guacamole-server-1.4.0.tar.gz</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>tar</span><span> </span><span>-xzf</span><span> </span><span>guacamole-server-1.4.0.tar.gz</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>cd</span><span> </span><span>guacamole-server-1.4.0/</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>1.7.1.2 安装所需依赖<a href="#1712-安装所需依赖"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>apt-get</span><span> </span><span>install</span><span> </span><span>-y</span><span> </span><span>libcairo2-dev</span><span> </span><span>libjpeg-turbo8-dev</span><span> </span><span>libpng-dev</span><span> </span><span>libtool-bin</span><span> </span><span>libossp-uuid-dev</span></div></div><div><div><div>2</div></div><div><span>apt-get</span><span> </span><span>install</span><span> </span><span>-y</span><span> </span><span>libavcodec-dev</span><span> </span><span>libavformat-dev</span><span> </span><span>libavutil-dev</span><span> </span><span>libswscale-dev</span><span> </span><span>freerdp2-dev</span><span> </span><span>libpango1.0-dev</span><span> </span><span>libssh2-1-dev</span><span> </span><span>libtelnet-dev</span><span> </span><span>libvncserver-dev</span><span> </span><span>libwebsockets-dev</span><span> </span><span>libpulse-dev</span><span> </span><span>libssl-dev</span><span> </span><span>libvorbis-dev</span><span> </span><span>libwebp-dev</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>1.7.1.3 构建guacd<a href="#1713-构建guacd"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>./configure</span><span> </span><span>--with-init-dir=/etc/init.d</span><span> </span><span>CFLAGS="-Wno-error"</span></div></div><div><div><div>2</div></div><div><span>make</span></div></div><div><div><div>3</div></div><div><span>make</span><span> </span><span>install</span></div></div><div><div><div>4</div></div><div><span>ldconfig</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>1.7.2 下载lion二进制包<a href="#172-下载lion二进制包"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/usr/local/src</span></div></div><div><div><div>2</div></div><div><span>wget</span><span> </span><span>https://github.com/jumpserver/lion-release/releases/download/v2.28.8/lion-v2.28.8-linux-amd64.tar.gz</span></div></div><div><div><div>3</div></div><div><span>tar</span><span> </span><span>-xf</span><span> </span><span>lion-v2.28.8-linux-amd64.tar.gz</span></div></div><div><div><div>4</div></div><div><span>mv</span><span> </span><span>lion-v2.28.8-linux-amd64</span><span> </span><span>/opt/jumpserver/lion</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.7.3 修改配置文件<a href="#173-修改配置文件"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/opt/jumpserver/lion</span></div></div><div><div><div>2</div></div><div><span>cp</span><span> </span><span>config_example.yml</span><span> </span><span>config.yml</span></div></div><div><div><div>3</div></div><div><span>vim</span><span> </span><span>config.yml</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 项目名称, 会用来向Jumpserver注册, 识别而已, 不能重复</span></div></div><div><div><div>2</div></div><div><span># NAME: {{ Hostname }}</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># Jumpserver项目的url, api请求注册会使用</span></div></div><div><div><div>5</div></div><div><span>CORE_HOST:</span><span> </span><span>http://127.0.0.1:8080</span><span>   </span><span># Core 的地址</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># Bootstrap Token, 预共享秘钥, 用来注册使用的service account和terminal</span></div></div><div><div><div>8</div></div><div><span># 请和jumpserver 配置文件中保持一致，注册完成后可以删除</span></div></div><div><div><div>9</div></div><div><span>BOOTSTRAP_TOKEN:</span><span> </span><span>"</span><span>$BOOTSTRAP_TOKEN</span><span>"</span><span>  </span><span># 和 Core config.yml 的值保持一致</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span># 启动时绑定的ip, 默认 0.0.0.0</span></div></div><div><div><div>12</div></div><div><span>BIND_HOST:</span><span> </span><span>0.0.0.0</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span># 监听的HTTP/WS端口号，默认8081</span></div></div><div><div><div>15</div></div><div><span>HTTPD_PORT:</span><span> </span><span>8081</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span># 设置日志级别 [DEBUG, INFO, WARN, ERROR, FATAL, CRITICAL]</span></div></div><div><div><div>18</div></div><div><span>LOG_LEVEL:</span><span> </span><span>DEBUG</span><span>           </span><span># 开发建议设置 DEBUG, 生产环境推荐使用 ERROR</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span># Guacamole Server ip，默认127.0.0.1</span></div></div><div><div><div>21</div></div><div><span># GUA_HOST: 127.0.0.1</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span># Guacamole Server 端口号，默认4822</span></div></div><div><div><div>24</div></div><div><span># GUA_PORT: 4822</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span># 会话共享使用的类型 [local, redis], 默认local</span></div></div><div><div><div>27</div></div><div><span># SHARE_ROOM_TYPE: local</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span># Redis配置</span></div></div><div><div><div>30</div></div><div><span># REDIS_HOST: 127.0.0.1</span></div></div><div><div><div>31</div></div><div><span># REDIS_PORT: 6379</span></div></div><div><div><div>32</div></div><div><span># REDIS_PASSWORD:</span></div></div><div><div><div>33</div></div><div><span># REDIS_DB_ROOM:</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>1.7.4 启动guacd<a href="#174-启动guacd"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>/etc/init.d/guacd</span><span> </span><span>start</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.7.5 启动lion<a href="#175-启动lion"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>./lion</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>1.8 使用nginx进行整合<a href="#18-使用nginx进行整合"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>apt</span><span> </span><span>install</span><span> </span><span>-y</span><span> </span><span>nginx</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>nginx</span><span> </span><span>-v</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>1.8.1 整合jumpserver各组件<a href="#181-整合jumpserver各组件"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vim</span><span> </span><span>/etc/nginx/conf.d/jumpserver.conf</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>server</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>  </span><span>listen</span><span> </span><span>8077</span><span>;</span></div></div><div><div><div>3</div></div><div><span>  </span><span>server_name</span><span> </span><span>_</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>  </span><span>client_max_body_size</span><span> </span><span>5000m</span><span>; </span><span># 文件大小限制</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>  </span><span># Luna 配置</span></div></div><div><div><div>8</div></div><div><span>  </span><span>location</span><span> </span><span>/luna/</span><span> </span><span>{</span></div></div><div><div><div>9</div></div><div><span>    </span><span># 开发启动配置</span></div></div><div><div><div>10</div></div><div><span>    </span><span># proxy_pass       http://127.0.0.1:4200;</span></div></div><div><div><div>11</div></div><div><span>    </span><span>#proxy_pass http://127.0.0.1:4200;</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>    </span><span># 如果构建出来了静态文件，则可以使用该配置</span></div></div><div><div><div>14</div></div><div><span>    </span><span>try_files</span><span> </span><span>$uri</span><span> </span><span>/</span><span> </span><span>/index.html</span><span>;</span></div></div><div><div><div>15</div></div><div><span>    </span><span>alias</span><span> </span><span>/opt/jumpserver/luna/luna/</span><span>;</span></div></div><div><div><div>16</div></div><div><span>    </span><span>expires</span><span> </span><span>24h</span><span>;</span></div></div><div><div><div>17</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>  </span><span># Core data 静态资源</span></div></div><div><div><div>20</div></div><div><span>  </span><span>location</span><span> </span><span>/media/replay/</span><span> </span><span>{</span></div></div><div><div><div>21</div></div><div><span>    </span><span>add_header</span><span> </span><span>Content-Encoding</span><span> </span><span>gzip</span><span>;</span></div></div><div><div><div>22</div></div><div><span>    </span><span>root</span><span> </span><span>/opt/jumpserver/core/data/</span><span>;</span></div></div><div><div><div>23</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>  </span><span>location</span><span> </span><span>/media/</span><span> </span><span>{</span></div></div><div><div><div>26</div></div><div><span>    </span><span>root</span><span> </span><span>/opt/jumpserver/core/data/</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>  </span><span>location</span><span> </span><span>/static/</span><span> </span><span>{</span></div></div><div><div><div>30</div></div><div><span>    </span><span>root</span><span> </span><span>/opt/jumpserver/core/data/</span><span>;</span></div></div><div><div><div>31</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span>  </span><span># KoKo Lion 配置</span></div></div><div><div><div>34</div></div><div><span>  </span><span>location</span><span> </span><span>/koko/</span><span> </span><span>{</span></div></div><div><div><div>35</div></div><div><span>    </span><span># 注意将模板中的组件名称替换为服务实际 ip 地址， 如都在本机部署</span></div></div><div><div><div>36</div></div><div><span>    </span><span># proxy_pass       http://127.0.0.1:5000;</span></div></div><div><div><div>37</div></div><div><span>    </span><span>proxy_pass</span><span>       </span><span>http://127.0.0.1:5000</span><span>;</span></div></div><div><div><div>38</div></div><div><span>    </span><span>proxy_set_header</span><span> </span><span>X-Real-IP</span><span> </span><span>$remote_addr</span><span>;</span></div></div><div><div><div>39</div></div><div><span>    </span><span>proxy_set_header</span><span> </span><span>Host</span><span> </span><span>$host</span><span>;</span></div></div><div><div><div>40</div></div><div><span>    </span><span>proxy_set_header</span><span> </span><span>X-Forwarded-For</span><span> </span><span>$proxy_add_x_forwarded_for</span><span>;</span></div></div><div><div><div>41</div></div><div><span>    </span><span>proxy_http_version</span><span> </span><span>1.1</span><span>;</span></div></div><div><div><div>42</div></div><div><span>    </span><span>proxy_buffering</span><span> </span><span>off</span><span>;</span></div></div><div><div><div>43</div></div><div><span>    </span><span>proxy_set_header</span><span> </span><span>Upgrade</span><span> </span><span>$http_upgrade</span><span>;</span></div></div><div><div><div>44</div></div><div><span>    </span><span>proxy_set_header</span><span> </span><span>Connection</span><span> </span><span>"upgrade"</span><span>;</span></div></div><div><div><div>45</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>46</div></div><div>
</div></div><div><div><div>47</div></div><div><span>  </span><span># lion 配置</span></div></div><div><div><div>48</div></div><div><span>  </span><span>location</span><span> </span><span>/lion/</span><span> </span><span>{</span></div></div><div><div><div>49</div></div><div><span>    </span><span># 注意将模板中的组件名称替换为服务实际 ip 地址， 如都在本机部署</span></div></div><div><div><div>50</div></div><div><span>    </span><span># proxy_pass       http://127.0.0.1:8081;</span></div></div><div><div><div>51</div></div><div><span>    </span><span>proxy_pass</span><span> </span><span>http://127.0.0.1:8081</span><span>;</span></div></div><div><div><div>52</div></div><div><span>    </span><span>proxy_buffering</span><span> </span><span>off</span><span>;</span></div></div><div><div><div>53</div></div><div><span>    </span><span>proxy_request_buffering</span><span> </span><span>off</span><span>;</span></div></div><div><div><div>54</div></div><div><span>    </span><span>proxy_http_version</span><span> </span><span>1.1</span><span>;</span></div></div><div><div><div>55</div></div><div><span>    </span><span>proxy_set_header</span><span> </span><span>X-Forwarded-For</span><span> </span><span>$proxy_add_x_forwarded_for</span><span>;</span></div></div><div><div><div>56</div></div><div><span>    </span><span>proxy_set_header</span><span> </span><span>Upgrade</span><span> </span><span>$http_upgrade</span><span>;</span></div></div><div><div><div>57</div></div><div><span>    </span><span>proxy_set_header</span><span> </span><span>Connection</span><span> </span><span>$http_connection</span><span>;</span></div></div><div><div><div>58</div></div><div><span>    </span><span>proxy_ignore_client_abort</span><span> </span><span>on</span><span>;</span></div></div><div><div><div>59</div></div><div><span>    </span><span>proxy_connect_timeout</span><span> </span><span>600</span><span>;</span></div></div><div><div><div>60</div></div><div><span>    </span><span>proxy_send_timeout</span><span> </span><span>600</span><span>;</span></div></div><div><div><div>61</div></div><div><span>    </span><span>proxy_read_timeout</span><span> </span><span>600</span><span>;</span></div></div><div><div><div>62</div></div><div><span>    </span><span>send_timeout</span><span> </span><span>6000</span><span>;</span></div></div><div><div><div>63</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>64</div></div><div>
</div></div><div><div><div>65</div></div><div><span>  </span><span># Core 配置</span></div></div><div><div><div>66</div></div><div><span>  </span><span>location</span><span> </span><span>/ws/</span><span> </span><span>{</span></div></div><div><div><div>67</div></div><div><span>    </span><span># 注意将模板中的组件名称替换为服务实际 ip 地址， 如都在本机部署</span></div></div><div><div><div>68</div></div><div><span>    </span><span># proxy_pass       http://127.0.0.1:8070;</span></div></div><div><div><div>69</div></div><div><span>    </span><span>proxy_pass</span><span> </span><span>http://127.0.0.1:8070</span><span>;</span></div></div><div><div><div>70</div></div><div><span>    </span><span>proxy_set_header</span><span> </span><span>X-Real-IP</span><span> </span><span>$remote_addr</span><span>;</span></div></div><div><div><div>71</div></div><div><span>    </span><span>proxy_set_header</span><span> </span><span>Host</span><span> </span><span>$host</span><span>;</span></div></div><div><div><div>72</div></div><div><span>    </span><span>proxy_set_header</span><span> </span><span>X-Forwarded-For</span><span> </span><span>$proxy_add_x_forwarded_for</span><span>;</span></div></div><div><div><div>73</div></div><div><span>    </span><span>proxy_http_version</span><span> </span><span>1.1</span><span>;</span></div></div><div><div><div>74</div></div><div><span>    </span><span>proxy_buffering</span><span> </span><span>off</span><span>;</span></div></div><div><div><div>75</div></div><div><span>    </span><span>proxy_set_header</span><span> </span><span>Upgrade</span><span> </span><span>$http_upgrade</span><span>;</span></div></div><div><div><div>76</div></div><div><span>    </span><span>proxy_set_header</span><span> </span><span>Connection</span><span> </span><span>"upgrade"</span><span>;</span></div></div><div><div><div>77</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>78</div></div><div>
</div></div><div><div><div>79</div></div><div><span>  </span><span>location</span><span> </span><span>/api/</span><span> </span><span>{</span></div></div><div><div><div>80</div></div><div><span>    </span><span># 注意将模板中的组件名称替换为服务实际 ip 地址， 如都在本机部署</span></div></div><div><div><div>81</div></div><div><span>    </span><span># proxy_pass       http://127.0.0.1:8080;</span></div></div><div><div><div>82</div></div><div><span>    </span><span>proxy_pass</span><span> </span><span>http://127.0.0.1:8080</span><span>;</span></div></div><div><div><div>83</div></div><div><span>    </span><span>proxy_set_header</span><span> </span><span>X-Real-IP</span><span> </span><span>$remote_addr</span><span>;</span></div></div><div><div><div>84</div></div><div><span>    </span><span>proxy_set_header</span><span> </span><span>Host</span><span> </span><span>$host</span><span>;</span></div></div><div><div><div>85</div></div><div><span>    </span><span>proxy_set_header</span><span> </span><span>X-Forwarded-For</span><span> </span><span>$proxy_add_x_forwarded_for</span><span>;</span></div></div><div><div><div>86</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>87</div></div><div>
</div></div><div><div><div>88</div></div><div><span>  </span><span>location</span><span> </span><span>/core/</span><span> </span><span>{</span></div></div><div><div><div>89</div></div><div><span>    </span><span># 注意将模板中的组件名称替换为服务实际 ip 地址， 如都在本机部署</span></div></div><div><div><div>90</div></div><div><span>    </span><span># proxy_pass       http://127.0.0.1:8080;</span></div></div><div><div><div>91</div></div><div><span>    </span><span>proxy_pass</span><span> </span><span>http://127.0.0.1:8080</span><span>;</span></div></div><div><div><div>92</div></div><div><span>    </span><span>proxy_set_header</span><span> </span><span>X-Real-IP</span><span> </span><span>$remote_addr</span><span>;</span></div></div><div><div><div>93</div></div><div><span>    </span><span>proxy_set_header</span><span> </span><span>Host</span><span> </span><span>$host</span><span>;</span></div></div><div><div><div>94</div></div><div><span>    </span><span>proxy_set_header</span><span> </span><span>X-Forwarded-For</span><span> </span><span>$proxy_add_x_forwarded_for</span><span>;</span></div></div><div><div><div>95</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>96</div></div><div>
</div></div><div><div><div>97</div></div><div><span>  </span><span># 前端 Lina</span></div></div><div><div><div>98</div></div><div><span>  </span><span>location</span><span> </span><span>/ui/</span><span> </span><span>{</span></div></div><div><div><div>99</div></div><div><span>    </span><span># 测试使用配置</span></div></div><div><div><div>100</div></div><div><span>    </span><span># proxy_pass       http://127.0.0.1:9528;</span></div></div><div><div><div>101</div></div><div><span>    </span><span>#proxy_pass http://127.0.0.1:9528;</span></div></div><div><div><div>102</div></div><div><span>    </span><span>#proxy_set_header X-Real-IP $remote_addr;</span></div></div><div><div><div>103</div></div><div><span>    </span><span>#proxy_set_header Host $host;</span></div></div><div><div><div>104</div></div><div><span>    </span><span>#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span></div></div><div><div><div>105</div></div><div>
</div></div><div><div><div>106</div></div><div><span>    </span><span># 构建静态文件后使用配置</span></div></div><div><div><div>107</div></div><div><span>    </span><span>try_files</span><span> </span><span>$uri</span><span> </span><span>/</span><span> </span><span>/index.html</span><span>;</span></div></div><div><div><div>108</div></div><div><span>    </span><span>alias</span><span> </span><span>/opt/jumpserver/lina/lina/</span><span>;</span></div></div><div><div><div>109</div></div><div><span>    </span><span>expires</span><span> </span><span>24h</span><span>;</span></div></div><div><div><div>110</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>111</div></div><div>
</div></div><div><div><div>112</div></div><div><span>  </span><span>location</span><span> </span><span>/</span><span> </span><span>{</span></div></div><div><div><div>113</div></div><div><span>    </span><span>rewrite</span><span> </span><span>^/</span><span>(</span><span>.</span><span>*</span><span>)$ </span><span>/ui/</span><span><span>$1</span><span> </span></span><span>last</span><span>;</span></div></div><div><div><div>114</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>115</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>nginx</span><span> </span><span>-t</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>nginx</span><span> </span><span>-s</span><span> </span><span>reload</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>systemctl</span><span> </span><span>start</span><span> </span><span>nginx</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.8.2 访问使用<a href="#182-访问使用"><span>#</span></a></h3><p>访问：<code>ip:8077</code></p><p>测试各个组件有无问题</p></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/ssl%E8%AF%81%E4%B9%A6%E9%85%8D%E7%BD%AE%E7%94%B3%E8%AF%B7/</id>
      <title type="text">ssl证书申请及配置</title>
      <published>2026-04-22T00:00:00.000Z</published>
      <updated>2026-04-22T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/ssl%E8%AF%81%E4%B9%A6%E9%85%8D%E7%BD%AE%E7%94%B3%E8%AF%B7/"/>
      <summary type="text">ssl证书申请及配置</summary>
      <content type="html"><![CDATA[<section><h1>一、自签名SSL证书<a href="#一自签名ssl证书"><span>#</span></a></h1><section><h2>1.1 创建自签名 SSL 证书<a href="#11-创建自签名-ssl-证书"><span>#</span></a></h2><p>自签名证书适合测试、内网环境使用（浏览器会提示 “不安全”，但通信本身是加密的）。</p><section><h3>1.1.1 前提条件<a href="#111-前提条件"><span>#</span></a></h3><p>确保服务器已安装 <code>openssl</code> 和 <code>nginx</code>：本篇nginx为源码安装，因此nginx的配置目录可能有所不同</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># CentOS/RHEL 系统</span></div></div><div><div><div>2</div></div><div><span>yum</span><span> </span><span>install</span><span> </span><span>-y</span><span> </span><span>openssl</span><span> </span><span>nginx</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># Ubuntu/Debian 系统</span></div></div><div><div><div>5</div></div><div><span>apt</span><span> </span><span>update</span><span> &amp;&amp; </span><span>apt</span><span> </span><span>install</span><span> </span><span>-y</span><span> </span><span>openssl</span><span> </span><span>nginx</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.1.2 创建证书存放目录<a href="#112-创建证书存放目录"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 创建目录，建议将证书放在 /etc/nginx/ssl 下</span></div></div><div><div><div>2</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/usr/local/nginx/ssl</span></div></div><div><div><div>3</div></div><div><span>cd</span><span> </span><span>/usr/local/nginx/ssl</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.1.3 生成自签名证书<a href="#113-生成自签名证书"><span>#</span></a></h3><p>执行以下命令生成私钥（key）和证书（crt），过程中会提示输入信息，直接按回车默认即可（测试环境无需填写真实信息）：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 生成有效期 3650 天（10 年）的自签名证书</span></div></div><div><div><div>2</div></div><div><span>openssl</span><span> </span><span>req</span><span> </span><span>-x509</span><span> </span><span>-nodes</span><span> </span><span>-days</span><span> </span><span>3650</span><span> </span><span>-newkey</span><span> </span><span>rsa:2048</span><span> </span><span>-keyout</span><span> </span><span>server.key</span><span> </span><span>-out</span><span> </span><span>server.crt</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>命令参数解释：
<ul>
<li><code>-x509</code>：生成自签名证书（而非证书请求）；</li>
<li><code>-nodes</code>：私钥不加密（避免 Nginx 启动时需要输入密码）；</li>
<li><code>-days 3650</code>：证书有效期 10 年；</li>
<li><code>-newkey rsa:2048</code>：同时生成 2048 位 RSA 私钥；</li>
<li><code>server.key</code>：生成的私钥文件；</li>
<li><code>server.crt</code>：生成的证书文件。</li>
</ul>
</li>
</ul></section><section><h3>1.1.5 设置证书权限（关键！避免 Nginx 无权读取）<a href="#115-设置证书权限关键避免-nginx-无权读取"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 仅 root 用户可读写，Nginx 进程（www-data/nginx 用户）可读</span></div></div><div><div><div>2</div></div><div><span>chmod</span><span> </span><span>600</span><span> </span><span>/usr/local/nginx/ssl/server.key</span></div></div><div><div><div>3</div></div><div><span>chmod</span><span> </span><span>644</span><span> </span><span>/usr/local/nginx/ssl/server.crt</span></div></div><div><div><div>4</div></div><div><span>chown</span><span> </span><span>root:root</span><span> </span><span>/usr/lcoal/nginx/ssl/</span><span>*</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>1.2 配置 Nginx 启用 HTTPS<a href="#12-配置-nginx-启用-https"><span>#</span></a></h2><section><h3>1.2.1 编辑 Nginx 配置文件<a href="#121-编辑-nginx-配置文件"><span>#</span></a></h3><p>Nginx 主配置文件<code>/usr/local/nginx/conf/nginx.conf</code>,添加如下内容：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>user</span><span> </span><span>root</span><span>;</span></div></div><div><div><div>2</div></div><div><span>worker_processes</span><span> </span><span>auto</span><span>;</span></div></div><div><div><div>3</div></div><div><span>error_log</span><span> </span><span>logs/error.log</span><span>;</span></div></div><div><div><div>4</div></div><div><span>pid</span><span> </span><span>/run/nginx.pid</span><span>;</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>events</span><span> </span><span>{</span></div></div><div><div><div>7</div></div><div><span>    </span><span>worker_connections</span><span> </span><span>1024</span><span>;</span></div></div><div><div><div>8</div></div><div><span>}</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>http</span><span> </span><span>{</span></div></div><div><div><div>11</div></div><div><span>    </span><span>log_format</span><span>  </span><span>main</span><span>  </span><span>'$remote_addr - $remote_user [$time_local] "$request" '</span></div></div><div><div><div>12</div></div><div><span>                      </span><span>'$status $body_bytes_sent "$http_referer" '</span></div></div><div><div><div>13</div></div><div><span>                      </span><span>'"$http_user_agent" "$http_x_forwarded_for"'</span><span>;</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>    </span><span>access_log</span><span>          </span><span>logs/access.log</span><span>  </span><span>main</span><span>;</span></div></div><div><div><div>16</div></div><div><span>    </span><span>sendfile</span><span>            </span><span>on</span><span>;</span></div></div><div><div><div>17</div></div><div><span>    </span><span>tcp_nopush</span><span>          </span><span>on</span><span>;</span></div></div><div><div><div>18</div></div><div><span>    </span><span>tcp_nodelay</span><span>         </span><span>on</span><span>;</span></div></div><div><div><div>19</div></div><div><span>    </span><span>server_tokens</span><span>       </span><span>off</span><span>;</span></div></div><div><div><div>20</div></div><div><span>    </span><span>keepalive_timeout</span><span>   </span><span>65</span><span>;</span></div></div><div><div><div>21</div></div><div><span>    </span><span>types_hash_max_size</span><span> </span><span>4096</span><span>;</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>    </span><span>include</span><span>             </span><span>mime.types</span><span>;</span></div></div><div><div><div>24</div></div><div><span>    </span><span>default_type</span><span>        </span><span>application/octet-stream</span><span>;</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>    </span><span>gzip</span><span>                </span><span>on</span><span>;</span></div></div><div><div><div>27</div></div><div><span>    </span><span>gzip_types</span><span>          </span><span>text/plain</span><span> </span><span>text/css</span><span> </span><span>application/json</span><span> </span><span>application/javascript</span><span> </span><span>text/xml</span><span> </span><span>application/xml</span><span> </span><span>application/xml+rss</span><span> </span><span>text/javascript</span><span>;</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>    </span><span>include</span><span> </span><span>conf.d/</span><span>*</span><span>.conf</span><span>;</span></div></div><div><div><div>30</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>1.2.2 编辑虚拟主机<a href="#122-编辑虚拟主机"><span>#</span></a></h3><p>进入<code>/usr/local/nginx/conf/conf.d/</code>目录下创建虚拟主机文件<code>static_web.conf</code>，添加如下内容：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>server</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span># 监听 443 端口（HTTPS 默认端口）</span></div></div><div><div><div>3</div></div><div><span>    </span><span>listen</span><span> </span><span>443</span><span> </span><span>ssl</span><span>;</span></div></div><div><div><div>4</div></div><div><span>    </span><span># 你的域名/服务器IP（需和证书一致）</span></div></div><div><div><div>5</div></div><div><span>    </span><span>server_name</span><span> </span><span>_</span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>    </span><span># 证书文件路径</span></div></div><div><div><div>8</div></div><div><span>    </span><span>ssl_certificate</span><span> </span><span>/usr/local/nginx/ssl/server.crt</span><span>;</span></div></div><div><div><div>9</div></div><div><span>    </span><span># 私钥文件路径</span></div></div><div><div><div>10</div></div><div><span>    </span><span>ssl_certificate_key</span><span> </span><span>/usr/local/nginx/ssl/server.key</span><span>;</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>    </span><span># 可选：优化 SSL 配置（提升安全性和性能）</span></div></div><div><div><div>13</div></div><div><span>    </span><span>ssl_protocols</span><span> </span><span>TLSv1.2</span><span> </span><span>TLSv1.3</span><span>;  </span><span># 仅启用安全的 TLS 版本</span></div></div><div><div><div>14</div></div><div><span>    </span><span>ssl_prefer_server_ciphers</span><span> </span><span>on</span><span>;</span></div></div><div><div><div>15</div></div><div><span>    </span><span>ssl_ciphers</span><span> </span><span>ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384</span><span>;</span></div></div><div><div><div>16</div></div><div><span>    </span><span>ssl_session_timeout</span><span> </span><span>10m</span><span>;</span></div></div><div><div><div>17</div></div><div><span>    </span><span>ssl_session_cache</span><span> </span><span>shared:SSL:10m</span><span>;</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>    </span><span># 网站根目录（根据你的实际路径修改）</span></div></div><div><div><div>20</div></div><div><span>    </span><span>root</span><span> </span><span>/usr/local/nginx/html</span><span>;</span></div></div><div><div><div>21</div></div><div><span>    </span><span>index</span><span> </span><span>index.html</span><span> </span><span>index.htm</span><span>;</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span>}</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span># 将 HTTP（80 端口）请求重定向到 HTTPS</span></div></div><div><div><div>26</div></div><div><span>server</span><span> </span><span>{</span></div></div><div><div><div>27</div></div><div><span>  </span><span>listen</span><span> </span><span>80</span><span>;</span></div></div><div><div><div>28</div></div><div><span>  </span><span>server_name</span><span> </span><span>_</span><span>;</span></div></div><div><div><div>29</div></div><div><span>  </span><span>return</span><span> </span><span>301</span><span> </span><span>https://</span><span>$host$request_uri</span><span>;</span></div></div><div><div><div>30</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><p>主要修改：证书和公钥的配置</p></blockquote></section><section><h3>1.2.3 检查 Nginx 配置重启<a href="#123-检查-nginx-配置重启"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>nginx -t</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果输出 <code>nginx: configuration file /etc/nginx/nginx.conf test is successful</code>，说明配置无错；否则根据提示修正。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 重启</span></div></div><div><div><div>2</div></div><div><span>systemctl</span><span> </span><span>restart</span><span> </span><span>nginx</span></div></div><div><div><div>3</div></div><div><span># 设置开机自启（可选）</span></div></div><div><div><div>4</div></div><div><span>systemctl</span><span> </span><span>enable</span><span> </span><span>nginx</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>1.3 验证 HTTPS 访问<a href="#13-验证-https-访问"><span>#</span></a></h2><ol>
<li>打开浏览器，访问 <code>https://你的服务器IP/</code> 或 <code>https://your_domain.com/</code>；</li>
<li>浏览器会提示 “证书不受信任”（自签名证书的正常现象），点击 “高级”→“继续访问”（不同浏览器表述略有差异）；</li>
<li>页面能正常加载，且地址栏显示 “锁形” 图标（部分浏览器显示 “不安全”，但锁形图标仍在），说明 HTTPS 配置成功。</li>
</ol></section><section><h2>1.4 注意事项<a href="#14-注意事项"><span>#</span></a></h2><ol>
<li><strong>自签名证书的局限性</strong>：仅适合测试 / 内网，公网环境需使用 Let’s Encrypt 免费证书（可自动续期，浏览器信任）；</li>
<li><strong>端口放行</strong>：确保服务器防火墙 / 安全组放行 443 端口（HTTPS）和 80 端口（HTTP 重定向）；</li>
<li><strong>证书路径</strong>：配置文件中证书路径必须绝对正确，否则 Nginx 启动失败；</li>
<li><strong>权限问题</strong>：Nginx 进程用户（通常是 <code>nginx</code> 或 <code>www-data</code>）必须能读取证书文件（<code>server.crt</code> 需 644 权</li>
</ol></section></section>
<section><h1>二、Let’s Encrypt免费证书申请<a href="#二lets-encrypt免费证书申请"><span>#</span></a></h1><section><h2>2.1 为什么选择Let’s Encrypt？<a href="#21-为什么选择lets-encrypt"><span>#</span></a></h2><p>在网络安全威胁日益严峻的今天，SSL/TLS证书已成为网站标配。传统商业证书年费动辄数百美元，而Let’s Encrypt通过自动化流程向全球提供免费的DV域名验证证书，其核心优势体现在：</p><ol>
<li><strong>完全免费</strong>：无隐藏费用，支持无限次申请</li>
<li><strong>全自动化</strong>：90天自动更新机制消除手动维护成本</li>
<li><strong>行业认可</strong>：证书由非营利组织ISRG签发，被所有主流浏览器信任</li>
<li><strong>广泛兼容</strong>：支持RSA 2048/4096及ECC加密算法</li>
</ol></section><section><h2>2.2 证书类型与适用场景<a href="#22-证书类型与适用场景"><span>#</span></a></h2><p>Let’s Encrypt主要提供三种证书类型：</p><ol>
<li><strong>单域名证书</strong>：适用于单个域名（如example.com）</li>
<li><strong>SAN证书</strong>：支持多域名（Subject Alternative Name），最多可包含100个域名</li>
<li><strong>通配符证书</strong>：使用<code>*.example.com</code>格式保护所有子域名</li>
</ol><p>通配符证书特别适合以下场景：</p><ul>
<li>动态子域名系统（如用户自定义域名）</li>
<li>微服务架构中的多服务部署</li>
<li>需要频繁添加子域名的开发环境</li>
</ul></section><section><h2>2.3 申请前的准备工作<a href="#23-申请前的准备工作"><span>#</span></a></h2><section><h3>2.3.1 服务器环境要求<a href="#231-服务器环境要求"><span>#</span></a></h3><ul>
<li>公开可访问的域名（需完成DNS解析）</li>
<li>运行中的Web服务器（Nginx/Apache等）</li>
<li>服务器时间同步（建议配置NTP服务）</li>
<li>80/443端口开放（用于ACME协议验证）</li>
</ul></section><section><h3>2.3.2 验证方式选择<a href="#232-验证方式选择"><span>#</span></a></h3><p>Let’s Encrypt支持两种验证方式：</p><ul>
<li><strong>HTTP-01验证</strong>：在网站根目录放置验证文件</li>
<li><strong>DNS-01验证</strong>：通过添加TXT记录完成验证</li>
</ul><p>对于通配符证书，必须使用DNS-01验证方式。建议提前在DNS服务商处配置API访问权限，以便实现自动化验证。</p></section></section><section><h2>2.4 Certbot自动化部署指南<a href="#24-certbot自动化部署指南"><span>#</span></a></h2><section><h3>2.4.1 安装Certbot<a href="#241-安装certbot"><span>#</span></a></h3><section><h4>2.4.1.1 Ubuntu/Debian系统：<a href="#2411-ubuntudebian系统"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>apt</span><span> </span><span>update</span></div></div><div><div><div>2</div></div><div><span>sudo</span><span> </span><span>apt</span><span> </span><span>install</span><span> </span><span>certbot</span><span> </span><span>python3-certbot-nginx</span><span> </span><span># Nginx用户</span></div></div><div><div><div>3</div></div><div><span>sudo</span><span> </span><span>apt</span><span> </span><span>install</span><span> </span><span>certbot</span><span> </span><span>python3-certbot-apache</span><span> </span><span># Apache用户</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>2.4.1.2 CentOS/RHEL系统：<a href="#2412-centosrhel系统"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>yum</span><span> </span><span>install</span><span> </span><span>epel-release</span></div></div><div><div><div>2</div></div><div><span>yum</span><span> </span><span>install</span><span> </span><span>certbot</span><span> </span><span>python3-certbot-nginx</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>2.4.2 获取证书（以Nginx为例）<a href="#242-获取证书以nginx为例"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo certbot --nginx -d example.com -d www.example.com</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>命令执行后，Certbot会自动：</p><ol>
<li>验证域名所有权</li>
<li>生成私钥和证书</li>
<li>修改Nginx配置添加HTTPS</li>
<li>设置自动重定向（可选）</li>
</ol></section><section><h3>2.4.3 测试配置<a href="#243-测试配置"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>nginx</span><span> </span><span>-t</span><span>  </span><span># 测试配置语法</span></div></div><div><div><div>2</div></div><div><span>sudo</span><span> </span><span>systemctl</span><span> </span><span>reload</span><span> </span><span>nginx</span><span>  </span><span># 重新加载配置</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>2.5 进阶使用场景<a href="#25-进阶使用场景"><span>#</span></a></h2><section><h3>2.5.1 通配符证书申请<a href="#251-通配符证书申请"><span>#</span></a></h3><p>使用DNS插件实现自动化验证（以Cloudflare为例）：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>apt</span><span> </span><span>install</span><span> </span><span>certbot</span><span> </span><span>python3-certbot-dns-cloudflare</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>创建<code>/etc/letsencrypt/cloudflare.ini</code>配置文件：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>dns_cloudflare_email</span><span> </span><span>=</span><span> </span><span>your@email.comdns_cloudflare_api_key</span><span> </span><span>=</span><span> </span><span>your_api_key</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>执行申请命令：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo certbot certonly --dns-cloudflare \</span></div></div><div><div><div>2</div></div><div><span>-d "*.example.com" \</span></div></div><div><div><div>3</div></div><div><span>--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.5.2 多服务器证书共享<a href="#252-多服务器证书共享"><span>#</span></a></h3><p>对于负载均衡环境，建议：</p><ol>
<li>在主服务器生成证书</li>
<li>使用<code>certbot certificates</code>命令查看证书路径</li>
<li>通过rsync同步证书文件到其他服务器</li>
<li>配置统一的cron任务进行更新</li>
</ol></section></section><section><h2>2.6 证书更新与续期策略<a href="#26-证书更新与续期策略"><span>#</span></a></h2><p>Let’s Encrypt证书有效期为90天，建议设置自动更新：</p><section><h3>2.6.1 测试更新流程<a href="#261-测试更新流程"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>certbot</span><span> </span><span>renew</span><span> </span><span>--dry-run</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.6.2 配置自动更新<a href="#262-配置自动更新"><span>#</span></a></h3><p>编辑crontab：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>crontab</span><span> </span><span>-e</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>添加以下内容（建议每周一凌晨3点执行）：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>30</span><span> </span><span>3</span><span> </span><span>*</span><span> </span><span>*</span><span> </span><span>1</span><span> </span><span>/usr/bin/certbot</span><span> </span><span>renew</span><span> </span><span>--quiet</span><span> </span><span>--no-self-upgrade</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.6.3 更新后处理<a href="#263-更新后处理"><span>#</span></a></h3><p>自动更新后可能需要：</p><ul>
<li>重新加载Web服务器</li>
<li>通知依赖证书的服务（如邮件服务器）</li>
<li>验证证书生效时间</li>
</ul></section></section><section><h2>2.7 安全实践与故障排除<a href="#27-安全实践与故障排除"><span>#</span></a></h2><section><h3>2.7.1 最佳安全实践<a href="#271-最佳安全实践"><span>#</span></a></h3><ul>
<li>定期轮换账户密钥（每年至少一次）</li>
<li>限制证书私钥的访问权限（600权限）</li>
<li>启用OCSP Stapling提升连接速度</li>
<li>配置HSTS头强制HTTPS访问</li>
</ul></section><section><h3>2.7.2 常见问题解决<a href="#272-常见问题解决"><span>#</span></a></h3><p><strong>问题1：验证失败</strong></p><ul>
<li>检查DNS记录是否生效</li>
<li>确认服务器防火墙未阻止80/443端口</li>
<li>检查Web服务器配置是否正确</li>
</ul><p><strong>问题2：证书未自动更新</strong></p><ul>
<li>检查cron任务是否正常运行</li>
<li>查看<code>/var/log/letsencrypt/</code><a href="https://cloud.baidu.com/product/bls.html" target="_blank">日志</a>文件</li>
<li>确认系统时间是否准确</li>
</ul><p><strong>问题3：通配符证书申请失败</strong></p><ul>
<li>检查DNS API密钥权限</li>
<li>确认TXT记录已全球生效（使用<code>dig TXT _acme-challenge.example.com</code>验证）</li>
</ul></section></section><section><h2>2.8 性能优化建议<a href="#28-性能优化建议"><span>#</span></a></h2><ol>
<li><strong>ECC证书选择</strong>：使用<code>--key-type ec</code>参数生成更高效的ECC证书</li>
<li><strong>证书链优化</strong>：确保包含完整的中间证书（通过<code>-d</code>参数指定）</li>
<li><strong>会话恢复</strong>：在Web服务器中启用TLS会话票证</li>
<li><strong>协议版本</strong>：禁用不安全的TLS 1.0/1.1，强制使用TLS 1.2+</li>
</ol></section><section><h2>2.9 监控与告警设置<a href="#29-监控与告警设置"><span>#</span></a></h2><p>建议配置监控系统跟踪：</p><ul>
<li>证书过期时间（通过<code>openssl x509 -noout -enddate -in /path/to/cert.pem</code>）</li>
<li>HTTPS可用性（使用工具如UptimeRobot）</li>
<li>协议版本合规性（通过SSL Labs测试）</li>
</ul><p>当证书剩余有效期少于30天时，应触发告警通知管理员。</p></section><section><h2>2.10 替代方案对比<a href="#210-替代方案对比"><span>#</span></a></h2><p>对于特殊需求场景，可考虑：</p><ol>
<li><strong>ZeroSSL</strong>：提供图形界面，适合非技术用户</li>
<li><strong>BuyPass Go SSL</strong>：免费证书有效期延长至180天</li>
<li><strong>AWS ACM</strong>：对AWS用户提供完全免费的证书管理</li>
</ol></section></section>
<section><h1>三、zeroSSL免费证书申请<a href="#三zerossl免费证书申请"><span>#</span></a></h1><section><h2>3.1 注册账号<a href="#31-注册账号"><span>#</span></a></h2><p>访问官网<a href="https://zerossl.com/" target="_blank">Free SSL Certificates and SSL Tools - ZeroSSL</a>，注册账号</p></section><section><h2>3.2 创建证书<a href="#32-创建证书"><span>#</span></a></h2><p>登录账号后，可以看到自身账号的数量，点击<code>new certificate</code>创建证书</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssl/image-20260306171538789.png" alt="image-20260306171538789" /><figcaption>image-20260306171538789</figcaption></figure><p></p><p>填写<code>ip或域名</code>,zerossl支持<code>申请纯ip及域名</code>格式的证书</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssl/image-20260306171727844.png" alt="image-20260306171727844" /><figcaption>image-20260306171727844</figcaption></figure><p></p><p>选择证书<code>期限</code>，选择90天免费证书</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssl/image-20260306171952033.png" alt="image-20260306171952033" /><figcaption>image-20260306171952033</figcaption></figure><p></p><p>取消附加组件，否则会收费</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssl/image-20260306172139854.png" alt="image-20260306172139854" /><figcaption>image-20260306172139854</figcaption></figure><p></p><p>取消自动获取商业证书，下一步</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssl/image-20260306172300489.png" alt="image-20260306172300489" /><figcaption>image-20260306172300489</figcaption></figure><p></p><p>选择机密类型，默认即可</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssl/image-20260306172400557.png" alt="image-20260306172400557" /><figcaption>image-20260306172400557</figcaption></figure><p></p><p>直接下一步，不用选择任何计划</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssl/image-20260306172518024.png" alt="image-20260306172518024" /><figcaption>image-20260306172518024</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssl/image-20260306172549822.png" alt="image-20260306172549822" /><figcaption>image-20260306172549822</figcaption></figure><p></p><p>提示这个，说明证书创建成功</p></section><section><h2>3.3 验证服务器<a href="#33-验证服务器"><span>#</span></a></h2><p>之后根据提示，选择验证服务器的方式，将证书上传至服务器中</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssl/image-20260306172955889.png" alt="image-20260306172955889" /><figcaption>image-20260306172955889</figcaption></figure><p></p></section><section><h2>3.4 证书使用示例<a href="#34-证书使用示例"><span>#</span></a></h2><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssl/image-20260309160540568.png" alt="image-20260309160540568" /><figcaption>image-20260309160540568</figcaption></figure><p></p><p>下载的证书有这三个，nginx使用时需要将<code>ca_bundle.crt</code>导入到<code>certificate.crt</code>中，之后在nginx中，<code>ssl_certificate</code>指向<code>certificate.crt</code>,<code>ssl_certificate_key</code>指向<code>private.key</code>即可</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cat</span><span> </span><span>ca_bundle.crt</span><span> &gt;&gt; </span><span>certificate.crt</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/iptables/</id>
      <title type="text">iptables</title>
      <published>2026-04-18T00:00:00.000Z</published>
      <updated>2026-04-18T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/iptables/"/>
      <summary type="text">rsync使用</summary>
      <content type="html"><![CDATA[<section><h1>一、iptables<a href="#一iptables"><span>#</span></a></h1><p>iptables 是 Linux 内核态<strong>包过滤防火墙</strong>，主流用于 CentOS 7/6、Debian 等传统发行版；CentOS 8+/Ubuntu 20.04+ 默认改用 <code>nftables</code>，但 iptables 语法仍广泛兼容。</p><hr /><section><h2>1.1 核心理论基础<a href="#11-核心理论基础"><span>#</span></a></h2><section><h4>1.1.1 四表五链<a href="#111-四表五链"><span>#</span></a></h4><p>iptables 用<strong>表（table）</strong> 区分功能，<strong>链（chain）</strong> 是规则挂载点，数据包按顺序经过链上规则匹配执行动作。</p></section><section><h4>1.1.1.1 四大表（优先级从高到低）<a href="#1111-四大表优先级从高到低"><span>#</span></a></h4><ol>
<li>
<p><strong>raw</strong>：优先级最高，关闭连接追踪（conntrack），极少用</p>
</li>
<li>
<p><strong>mangle</strong>：修改数据包标记、TTL、QoS，多用于高级路由 / 流量控制</p>
</li>
<li>
<p><strong>nat</strong>：网络地址转换（端口转发、IP 映射、共享上网）</p>
</li>
<li>
<p><strong>filter</strong>：<strong>默认表、最常用</strong>，负责包过滤（放行 / 拒绝流量）</p>
</li>
</ol></section><section><h4>1.1.1.2 五条内置链（数据包流转链路）<a href="#1112-五条内置链数据包流转链路"><span>#</span></a></h4>

<table><thead><tr><th>链名</th><th>作用场景</th><th>所属常用表</th></tr></thead><tbody><tr><td><strong>PREROUTING</strong></td><td>数据包进入网卡后、路由判断前</td><td>raw、mangle、nat</td></tr><tr><td><strong>INPUT</strong></td><td>目标是<strong>本机</strong>的数据包</td><td>filter、mangle</td></tr><tr><td><strong>FORWARD</strong></td><td>经本机转发、<strong>目标不是本机</strong>的数据包</td><td>filter、mangle</td></tr><tr><td><strong>OUTPUT</strong></td><td><strong>本机主动发出</strong>的数据包</td><td>raw、mangle、nat、filter</td></tr><tr><td><strong>POSTROUTING</strong></td><td>路由判断后、离开网卡前</td><td>mangle、nat</td></tr></tbody></table><blockquote><p>数据包流转路径（两种核心场景）</p><ol>
<li>
<p><strong>访问本机</strong>：外网 → 网卡 → PREROUTING → INPUT → 本机进程</p>
</li>
<li>
<p><strong>本机做路由转发</strong>：外网 → 网卡 → PREROUTING → FORWARD → POSTROUTING → 内网主机</p>
</li>
<li>
<p><strong>本机向外发包</strong>：本机进程 → OUTPUT → POSTROUTING → 外网</p>
</li>
</ol><p>数据包流向图：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>        </span></span><span>[外部网络]</span></div></div><div><div><div>2</div></div><div><span><span>             </span></span><span>│</span></div></div><div><div><div>3</div></div><div><span><span>      </span></span><span>┌──────▼──────┐</span></div></div><div><div><div>4</div></div><div><span><span>      </span></span><span>│ PREROUTING  │ ◄── raw, mangle, nat (DNAT在此做)</span></div></div><div><div><div>5</div></div><div><span><span>      </span></span><span>└──────┬──────┘</span></div></div><div><div><div>6</div></div><div><span><span>             </span></span><span>│</span></div></div><div><div><div>7</div></div><div><span><span>      </span></span><span>┌──────▼──────┐    ┌─────────────┐</span></div></div><div><div><div>8</div></div><div><span><span>      </span></span><span>│   路由判断   │───►│   OUTPUT    │ ◄── 本机进程发出的包</span></div></div><div><div><div>9</div></div><div><span><span>      </span></span><span>└──────┬──────┘    └──────┬──────┘</span></div></div><div><div><div>10</div></div><div><span><span>             </span></span><span>│                  │</span></div></div><div><div><div>11</div></div><div><span><span>      </span></span><span>┌──────▼──────┐           │</span></div></div><div><div><div>12</div></div><div><span><span>      </span></span><span>│   FORWARD   │           │</span></div></div><div><div><div>13</div></div><div><span><span>      </span></span><span>└──────┬──────┘           │</span></div></div><div><div><div>14</div></div><div><span><span>             </span></span><span>│                  │</span></div></div><div><div><div>15</div></div><div><span><span>      </span></span><span>┌──────▼──────┐    ┌──────▼──────┐</span></div></div><div><div><div>16</div></div><div><span><span>      </span></span><span>│ POSTROUTING │◄───│ POSTROUTING │ ◄── mangle, nat (SNAT/MASQUERADE在此做)</span></div></div><div><div><div>17</div></div><div><span><span>      </span></span><span>└──────┬──────┘    └──────┬──────┘</span></div></div><div><div><div>18</div></div><div><span><span>             </span></span><span>│                  │</span></div></div><div><div><div>19</div></div><div><span><span>        </span></span><span>[内部网络]          [外部网络]</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>* 发给本机的包: PREROUTING -&gt; INPUT -&gt; 本机进程</span></div></div><div><div><div>22</div></div><div><span>* 本机发出的包: 本机进程 -&gt; OUTPUT -&gt; POSTROUTING</span></div></div><div><div><div>23</div></div><div><span>* 转发的包:   PREROUTING -&gt; FORWARD -&gt; POSTROUTING</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></blockquote></section><section><h3>1.1.2 规则匹配三要素<a href="#112-规则匹配三要素"><span>#</span></a></h3><p>一条 iptables 规则格式：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>iptables</span><span> [-t </span><span>表名]</span><span> </span><span>链名</span><span> </span><span>匹配条件</span><span> </span><span>-j</span><span> </span><span>动作</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>
<p><strong>表</strong>：不写默认 <code>filter</code></p>
</li>
<li>
<p><strong>匹配条件</strong>：源 IP、目标 IP、端口、协议、网卡、状态等</p>
</li>
<li>
<p><strong>动作（target）</strong>：匹配后执行的操作</p>
</li>
</ol><blockquote><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 详细规则格式</span></div></div><div><div><div>2</div></div><div><span>iptables</span><span> [-t </span><span>表名]</span><span> [-A/I/D/R] &lt;链名&gt; [规则号] &lt;-i/o 网卡名&gt; -p 协议名 &lt;-s 源IP/源子网&gt; --sport 源端口 &lt;-d 目标IP/目标子网&gt; --dport 目标端口&gt; -j 动作</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h4>参数释义<a href="#参数释义"><span>#</span></a></h4><ol>
<li>
<p><code>-A/I/D/R</code>：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span> </span></span><span>- `-A`：追加规则；`-I`：插入规则；`-D`：删除规则；`-R`：替换修改规则</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p><code>&lt;链名称&gt;</code>：INPUT 、OUTPUT 、FORWARD 、PREROUTING 、POSTROUTING，可选填写规则序号</p>
</li>
<li>
<p><code>-i 入网卡</code>：匹配入站网卡；<code>-o 出网卡</code>：匹配出站网卡</p>
</li>
<li>
<p><code>-p</code>：指定协议（tcp/udp/icmp/all）</p>
</li>
<li>
<p><code>-s</code>：源地址（IP / 网段），<code>! -s</code> 取反</p>
</li>
<li>
<p><code>--sport</code>：源端口；<code>--dport</code>：目标端口</p>
</li>
<li>
<p><code>-j</code>：动作：<code>ACCEPT</code>放行 / <code>DROP</code>丢弃 / <code>REJECT</code>拒绝等</p>
</li>
</ol></section></blockquote><section><h4>1.1.2.1 常用动作（Target）<a href="#1121-常用动作target"><span>#</span></a></h4><p>对规则的具体处理方法：<code>-j 动作</code>，以下为常用动作：</p><ul>
<li>
<p><code>ACCEPT</code>：放行数据包</p>
</li>
<li>
<p><code>DROP</code>：丢弃数据包（<strong>无回应</strong>，客户端直接超时）</p>
</li>
<li>
<p><code>REJECT</code>：拒绝数据包（返回拒绝报文，客户端立刻提示无法连接）</p>
</li>
<li>
<p><code>SNAT</code>：源地址转换（nat 表 POSTROUTING 链，内网主机共享公网 IP 上网）</p>
</li>
<li>
<p><code>DNAT</code>：目标地址转换（nat 表 PREROUTING 链，端口转发、外网访问内网服务）</p>
</li>
<li>
<p><code>MASQUERADE</code>：动态 SNAT（适配动态公网 IP，如拨号上网）</p>
</li>
<li>
<p><code>LOG</code>：记录日志到 <code>/var/log/messages</code>，不中断流量</p>
</li>
</ul></section><section><h4>1.1.2.2 协议与常用匹配参数<a href="#1122-协议与常用匹配参数"><span>#</span></a></h4><ul>
<li>
<p>协议：<code>-p tcp</code>  <code>-p udp</code>  <code>-p icmp</code>  <code>-p all</code></p>
</li>
<li>
<p>源 IP：<code>-s 192.168.1.0/24</code>（源地址）</p>
</li>
<li>
<p>目标 IP：<code>-d 10.0.0.1</code>（目标地址）</p>
</li>
<li>
<p>源端口：<code>--sport 1024-65535</code></p>
</li>
<li>
<p>目标端口：<code>--dport 80</code>（仅 tcp/udp 可用）</p>
</li>
<li>
<p>网卡：<code>-i eth0</code>（入网卡）、<code>-o eth1</code>（出网卡）</p>
</li>
<li>
<p>连接状态（<code>-m state </code>模块）：</p>
<ul>
<li>
<p><code>NEW</code>：新连接请求</p>
</li>
<li>
<p><code>ESTABLISHED</code>：已建立的连接</p>
</li>
<li>
<p><code>RELATED</code>：关联连接（如 FTP 被动模式）</p>
</li>
<li>
<p><code>INVALID</code>：无效数据包</p>
</li>
</ul>
</li>
</ul><hr /></section></section><section><h3>1.1.3 基础命令语法<a href="#113-基础命令语法"><span>#</span></a></h3><section><h4>1.1.3.1 查看规则<a href="#1131-查看规则"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 查看 filter 表所有规则（常用）</span></div></div><div><div><div>2</div></div><div><span>iptables</span><span> </span><span>-L</span><span> </span><span>-n</span><span> </span><span>-v</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 查看 nat 表规则</span></div></div><div><div><div>5</div></div><div><span>iptables</span><span> </span><span>-t</span><span> </span><span>nat</span><span> </span><span>-L</span><span> </span><span>-n</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>参数说明：</span></div></div><div><div><div>8</div></div><div><span>-L</span><span> </span><span>列出规则</span></div></div><div><div><div>9</div></div><div><span>-n</span><span> </span><span>不解析域名/端口（加速，必加）</span></div></div><div><div><div>10</div></div><div><span>-v</span><span> </span><span>详细信息</span></div></div><div><div><div>11</div></div><div><span>--line-numbers</span><span> </span><span>显示规则行号（删除规则用）</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>1.1.3.2 增 / 删 / 改规则<a href="#1132-增--删--改规则"><span>#</span></a></h4><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 1. 在链末尾追加规则（-A append）</span></div></div><div><div><div>2</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>链名</span><span> </span><span>匹配</span><span> </span><span>动作</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 2. 在指定行号插入规则（-I insert，插在最前面/指定位置）</span></div></div><div><div><div>5</div></div><div><span>iptables</span><span> </span><span>-I</span><span> </span><span>链名</span><span> </span><span>行号</span><span> </span><span>匹配</span><span> </span><span>动作</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 3. 删除指定行号规则</span></div></div><div><div><div>8</div></div><div><span>iptables</span><span> </span><span>-D</span><span> </span><span>链名</span><span> </span><span>行号</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 4. 清空某条链所有规则(不指定默认为filter链)</span></div></div><div><div><div>11</div></div><div><span>iptables</span><span> </span><span>-F</span><span> </span><span>链名</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span># 5. 清空整张表所有规则</span></div></div><div><div><div>14</div></div><div><span>iptables</span><span> </span><span>-t</span><span> </span><span>nat</span><span> </span><span>-F</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span># 6. 设置链默认策略（重要！默认拒绝/放行所有流量）</span></div></div><div><div><div>17</div></div><div><span>iptables</span><span> </span><span>-P</span><span> </span><span>链名</span><span> </span><span>ACCEPT/DROP</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span># 7. 删除自定义链</span></div></div><div><div><div>20</div></div><div><span>iptables</span><span> </span><span>-X</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span># 8. 计数器归零</span></div></div><div><div><div>23</div></div><div><span>iptables</span><span> </span><span>-Z</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><p>安全原则：<strong>先放行必要流量，再把默认策略设为 DROP</strong>，避免服务器暴露端口。</p></blockquote></section><section><h4>1.3.3.3 规则持久化（重启不失效）<a href="#1333-规则持久化重启不失效"><span>#</span></a></h4><p>不同系统保存方式不同：</p><div><figure><figcaption><span>/etc/sysconfig/iptables</span></figcaption><pre><code><div><div><div>1</div></div><div><span># CentOS 6/7</span></div></div><div><div><div>2</div></div><div><span>service</span><span> </span><span>iptables</span><span> </span><span>save</span></div></div><div><div><div>3</div></div><div><span># 导出规则</span></div></div><div><div><div>4</div></div><div><span>iptables-save</span><span> &gt; </span><span>/opt/rule.txt</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 导入规则</span></div></div><div><div><div>7</div></div><div><span>iptables-restore</span><span> &lt; </span><span>/opt/rule.txt</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section></section></section><section><h2>1.2 基础练习<a href="#12-基础练习"><span>#</span></a></h2><blockquote><p>前置说明：</p><ol>
<li>使用docker创建一个模拟环境进行练习
<ol>
<li>拉取镜像：<code>docker pull ubuntu:latest</code></li>
<li>iptables 需要操作网络内核模块，<strong>必须加 <code>--privileged</code></strong>
<ol>
<li><code>docker run -d -it --privileged --name iptables-linux ubuntu:latest /bin/bash</code></li>
<li>进入容器，<code>docker exec -it iptables-linux /bin/bash</code></li>
</ol>
</li>
<li>进入容器安装iptables，<code>apt update &amp;&amp; apt install -y iptables</code></li>
<li>查看版本，<code>iptables --version</code></li>
</ol>
</li>
<li>先执行 <code>iptables -F &amp;&amp; iptables -t nat -F</code> 清空原有规则，避免冲突</li>
<li>练习顺序：基础过滤 → 状态规则 → 端口 / IP 限制 → NAT 转发</li>
</ol></blockquote><section><h3>1.2.1 filter表练习<a href="#121-filter表练习"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 追加规则：所有IP访问本机80端口，放行</span></div></div><div><div><div>2</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>INPUT</span><span> </span><span>-p</span><span> </span><span>tcp</span><span> </span><span>--dport</span><span> </span><span>80</span><span> </span><span>-j</span><span> </span><span>ACCEPT</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 拒绝192.168.1.100访问本机所有端口</span></div></div><div><div><div>5</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>INPUT</span><span> </span><span>-s</span><span> </span><span>192.168.1.100</span><span> </span><span>-j</span><span> </span><span>DROP</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 放行ssh</span></div></div><div><div><div>8</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>INPUT</span><span> </span><span>-p</span><span> </span><span>tcp</span><span> </span><span>--dport</span><span> </span><span>22</span><span> </span><span>-j</span><span> </span><span>ACCEPT</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>需求：放行<strong>已建立 / 关联连接</strong>，只拦截新非法连接，本机对外访问的回应包属于 <code>ESTABLISHED</code>，需要放行。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 放行所有已建立、关联的入站连接</span></div></div><div><div><div>2</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>INPUT</span><span> </span><span>-m</span><span> </span><span>state</span><span> </span><span>--state</span><span> </span><span>ESTABLISHED,RELATED</span><span> </span><span>-j</span><span> </span><span>ACCEPT</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 仅放行本机主动向外发起的连接回应（OUTPUT 链）</span></div></div><div><div><div>5</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>OUTPUT</span><span> </span><span>-m</span><span> </span><span>state</span><span> </span><span>--state</span><span> </span><span>ESTABLISHED,RELATED</span><span> </span><span>-j</span><span> </span><span>ACCEPT</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>组合完整安全基线规则：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 清空规则</span></div></div><div><div><div>2</div></div><div><span>iptables</span><span> </span><span>-F</span></div></div><div><div><div>3</div></div><div><span>iptables</span><span> </span><span>-t</span><span> </span><span>nat</span><span> </span><span>-F</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 1. 放行本地回环网卡 lo（本机程序互访，必须加）</span></div></div><div><div><div>6</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>INPUT</span><span> </span><span>-i</span><span> </span><span>lo</span><span> </span><span>-j</span><span> </span><span>ACCEPT</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 2. 放行已建立连接</span></div></div><div><div><div>9</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>INPUT</span><span> </span><span>-m</span><span> </span><span>state</span><span> </span><span>--state</span><span> </span><span>ESTABLISHED,RELATED</span><span> </span><span>-j</span><span> </span><span>ACCEPT</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span># 3. 放行SSH、HTTP、HTTPS</span></div></div><div><div><div>12</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>INPUT</span><span> </span><span>-p</span><span> </span><span>tcp</span><span> </span><span>--dport</span><span> </span><span>22</span><span> </span><span>-j</span><span> </span><span>ACCEPT</span></div></div><div><div><div>13</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>INPUT</span><span> </span><span>-p</span><span> </span><span>tcp</span><span> </span><span>--dport</span><span> </span><span>80</span><span> </span><span>-j</span><span> </span><span>ACCEPT</span></div></div><div><div><div>14</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>INPUT</span><span> </span><span>-p</span><span> </span><span>tcp</span><span> </span><span>--dport</span><span> </span><span>443</span><span> </span><span>-j</span><span> </span><span>ACCEPT</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span># 4. 允许 ICMP ping</span></div></div><div><div><div>17</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>INPUT</span><span> </span><span>-p</span><span> </span><span>icmp</span><span> </span><span>--icmp-type</span><span> </span><span>echo-request</span><span> </span><span>-j</span><span> </span><span>ACCEPT</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span># 5. 默认拒绝所有入站</span></div></div><div><div><div>20</div></div><div><span>iptables</span><span> </span><span>-P</span><span> </span><span>INPUT</span><span> </span><span>DROP</span></div></div><div><div><div>21</div></div><div><span>iptables</span><span> </span><span>-P</span><span> </span><span>FORWARD</span><span> </span><span>DROP</span></div></div><div><div><div>22</div></div><div><span>iptables</span><span> </span><span>-P</span><span> </span><span>OUTPUT</span><span> </span><span>ACCEPT</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 仅允许 192.168.1.0/24网段访问本机3306端口</span></div></div><div><div><div>2</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>INPUT</span><span> </span><span>-s</span><span> </span><span>192.168.1.0/24</span><span> </span><span>-p</span><span> </span><span>tcp</span><span> </span><span>--dport</span><span> </span><span>3306</span><span> </span><span>-j</span><span> </span><span>ACCEPT</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 禁止所有主机 ping 本机</span></div></div><div><div><div>5</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>INPUT</span><span> </span><span>-p</span><span> </span><span>icmp</span><span> </span><span>-j</span><span> </span><span>DROP</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 限制单个 IP 最多同时发起 10 个 TCP 连接</span></div></div><div><div><div>8</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>INPUT</span><span> </span><span>-p</span><span> </span><span>tcp</span><span> </span><span>--dport</span><span> </span><span>80</span><span> </span><span>-m</span><span> </span><span>connlimit</span><span> </span><span>--connlimit-above</span><span> </span><span>10</span><span> </span><span>-j</span><span> </span><span>DROP</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.2.2 FORWARD 链（路由转发基础）<a href="#122-forward-链路由转发基础"><span>#</span></a></h3><p>场景：当前 Linux 作为<strong>网关</strong>，转发内网流量。</p><ol>
<li>开启内核转发（必须，否则 FORWARD 和NAT不生效）</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 临时开启</span></div></div><div><div><div>2</div></div><div><span>echo</span><span> </span><span>1</span><span> &gt; </span><span>/proc/sys/net/ipv4/ip_forward</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 永久开启（CentOS7）</span></div></div><div><div><div>5</div></div><div><span>vi</span><span> </span><span>/etc/sysctl.conf</span></div></div><div><div><div>6</div></div><div><span># 添加/修改</span></div></div><div><div><div>7</div></div><div><span>net.ipv4.ip_forward</span><span> </span><span>=</span><span> </span><span>1</span></div></div><div><div><div>8</div></div><div><span>sysctl</span><span> </span><span>-p</span><span>  </span><span># 生效</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>放行转发流量</li>
</ol><p>允许内网 <code>192.168.2.0/24</code> 网段转发流量：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>FORWARD</span><span> </span><span>-s</span><span> </span><span>192.168.2.0/24</span><span> </span><span>-j</span><span> </span><span>ACCEPT</span></div></div><div><div><div>2</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>FORWARD</span><span> </span><span>-d</span><span> </span><span>192.168.2.0/24</span><span> </span><span>-j</span><span> </span><span>ACCEPT</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section><section><h3>1.2.3 NAT表练习<a href="#123-nat表练习"><span>#</span></a></h3><section><h4>场景 1：SNAT 内网主机共享公网 IP 上网<a href="#场景-1snat-内网主机共享公网-ip-上网"><span>#</span></a></h4><p>网卡：<code>eth0</code>（公网 IP：203.0.113.10），<code>eth1</code>（内网 192.168.2.0/24）</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># nat表 POSTROUTING 链，内网访问外网做源地址转换</span></div></div><div><div><div>2</div></div><div><span>iptables</span><span> </span><span>-t</span><span> </span><span>nat</span><span> </span><span>-A</span><span> </span><span>POSTROUTING</span><span> </span><span>-s</span><span> </span><span>192.168.2.0/24</span><span> </span><span>-o</span><span> </span><span>eth0</span><span> </span><span>-j</span><span> </span><span>SNAT</span><span> </span><span>--to-source</span><span> </span><span>203.0.113.10</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>场景 2：MASQUERADE（动态 IP 上网，如宽带拨号）<a href="#场景-2masquerade动态-ip-上网如宽带拨号"><span>#</span></a></h4><p>公网 IP 不固定时用此替代 SNAT：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>iptables</span><span> </span><span>-t</span><span> </span><span>nat</span><span> </span><span>-A</span><span> </span><span>POSTROUTING</span><span> </span><span>-s</span><span> </span><span>192.168.3.0/24</span><span> </span><span>-o</span><span> </span><span>eth0</span><span> </span><span>-j</span><span> </span><span>MASQUERADE</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>场景 3：DNAT 端口转发（外网访问内网服务）<a href="#场景-3dnat-端口转发外网访问内网服务"><span>#</span></a></h4><p>需求：访问网关公网 IP <code>203.0.113.10:8080</code>，转发到内网 <code>192.168.2.10:80</code></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># PREROUTING 链：目标端口转发</span></div></div><div><div><div>2</div></div><div><span>iptables</span><span> </span><span>-t</span><span> </span><span>nat</span><span> </span><span>-A</span><span> </span><span>PREROUTING</span><span> </span><span>-d</span><span> </span><span>203.0.113.10</span><span> </span><span>-p</span><span> </span><span>tcp</span><span> </span><span>--dport</span><span> </span><span>8080</span><span> </span><span>-j</span><span> </span><span>DNAT</span><span> </span><span>--to-destination</span><span> </span><span>192.168.2.10:80</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section></section><section><h3>1.2.4 recent 模块练习(防御暴力破解)<a href="#124-recent-模块练习防御暴力破解"><span>#</span></a></h3><p>限制同一 IP 在 60 秒内最多新建 4 次 SSH 连接。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 标记新连接的 SSH 请求</span></div></div><div><div><div>2</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>INPUT</span><span> </span><span>-p</span><span> </span><span>tcp</span><span> </span><span>--dport</span><span> </span><span>22</span><span> </span><span>-m</span><span> </span><span>state</span><span> </span><span>--state</span><span> </span><span>NEW</span><span> </span><span>-m</span><span> </span><span>recent</span><span> </span><span>--name</span><span> </span><span>SSH_BRUTE</span><span> </span><span>--set</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 如果 60秒内超过4次，则 DROP</span></div></div><div><div><div>5</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>INPUT</span><span> </span><span>-p</span><span> </span><span>tcp</span><span> </span><span>--dport</span><span> </span><span>22</span><span> </span><span>-m</span><span> </span><span>state</span><span> </span><span>--state</span><span> </span><span>NEW</span><span> </span><span>\</span></div></div><div><div><div>6</div></div><div><span>  </span><span>-m</span><span> </span><span>recent</span><span> </span><span>--name</span><span> </span><span>SSH_BRUTE</span><span> </span><span>--update</span><span> </span><span>--seconds</span><span> </span><span>60</span><span> </span><span>--hitcount</span><span> </span><span>4</span><span> </span><span>-j</span><span> </span><span>DROP</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 正常放行</span></div></div><div><div><div>9</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>INPUT</span><span> </span><span>-p</span><span> </span><span>tcp</span><span> </span><span>--dport</span><span> </span><span>22</span><span> </span><span>-m</span><span> </span><span>state</span><span> </span><span>--state</span><span> </span><span>NEW</span><span> </span><span>-j</span><span> </span><span>ACCEPT</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.2.5 日志审计练习<a href="#125-日志审计练习"><span>#</span></a></h3><p>记录被 DROP 的数据包以便排查问题</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 在所有 DROP 规则之前添加 LOG 规则</span></div></div><div><div><div>2</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>INPUT</span><span> </span><span>-j</span><span> </span><span>LOG</span><span> </span><span>--log-prefix</span><span> </span><span>"IPT_INPUT_DROP: "</span><span> </span><span>--log-level</span><span> </span><span>4</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 查看日志</span></div></div><div><div><div>5</div></div><div><span>dmesg</span><span> | </span><span>grep</span><span> </span><span>"IPT_INPUT_DROP"</span></div></div><div><div><div>6</div></div><div><span># 或</span></div></div><div><div><div>7</div></div><div><span>journalctl</span><span> </span><span>-k</span><span> | </span><span>grep</span><span> </span><span>"IPT_INPUT_DROP"</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.2.6 取反符号<a href="#126-取反符号"><span>#</span></a></h3><p><code>!</code>：<strong>取反匹配，放在匹配参数前面</strong>，含义：<strong>不满足后面条件的报文才匹配本条规则</strong></p><p>语法格式：<code>! + 匹配项</code>，空格必须隔开 <code>!</code> 和参数</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 除了 192.168.1.1 之外，所有 IP 禁止访问 22 端口</span></div></div><div><div><div>2</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>INPUT</span><span> </span><span>-p</span><span> </span><span>tcp</span><span> </span><span>--dport</span><span> </span><span>22</span><span> </span><span>!</span><span> </span><span>-s</span><span> </span><span>192.168.1.1</span><span> </span><span>-j</span><span> </span><span>DROP</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 放行除 3306 以外本机所有 TCP 端口</span></div></div><div><div><div>5</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>INPUT</span><span> </span><span>-p</span><span> </span><span>tcp</span><span> </span><span>!</span><span> </span><span>--dport</span><span> </span><span>3306</span><span> </span><span>-j</span><span> </span><span>ACCEPT</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 除 eth0 网卡外，其他入网卡全部丢弃入站流量</span></div></div><div><div><div>8</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>INPUT</span><span> </span><span>!</span><span> </span><span>-i</span><span> </span><span>eth0</span><span> </span><span>-j</span><span> </span><span>DROP</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 放行非 ICMP 协议所有入站流量</span></div></div><div><div><div>11</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>INPUT</span><span> </span><span>!</span><span> </span><span>-p</span><span> </span><span>icmp</span><span> </span><span>-j</span><span> </span><span>ACCEPT</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span># 状态取反：不是 ESTABLISHED 状态的新连接全部丢弃</span></div></div><div><div><div>14</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>INPUT</span><span> </span><span>-m</span><span> </span><span>state</span><span> </span><span>!</span><span> </span><span>--state</span><span> </span><span>ESTABLISHED</span><span> </span><span>-j</span><span> </span><span>DROP</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span># 网段取反：非 10.0.0.0/24 全部拒绝访问 80</span></div></div><div><div><div>17</div></div><div><span>iptables</span><span> </span><span>-A</span><span> </span><span>INPUT</span><span> </span><span>!</span><span> </span><span>-s</span><span> </span><span>10.0.0.0/24</span><span> </span><span>-p</span><span> </span><span>tcp</span><span> </span><span>--dport</span><span> </span><span>80</span><span> </span><span>-j</span><span> </span><span>DROP</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>1.2.7 规则管理与持久化<a href="#127-规则管理与持久化"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 保存规则（Debian/Ubuntu）</span></div></div><div><div><div>2</div></div><div><span>sudo</span><span> </span><span>apt</span><span> </span><span>install</span><span> </span><span>iptables-persistent</span></div></div><div><div><div>3</div></div><div><span>sudo</span><span> </span><span>netfilter-persistent</span><span> </span><span>save</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 保存规则（CentOS/RHEL）</span></div></div><div><div><div>6</div></div><div><span>sudo</span><span> </span><span>service</span><span> </span><span>iptables</span><span> </span><span>save</span></div></div><div><div><div>7</div></div><div><span># 或</span></div></div><div><div><div>8</div></div><div><span>sudo</span><span> </span><span>iptables-save</span><span> &gt; </span><span>/etc/sysconfig/iptables</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 删除特定规则（按行号）</span></div></div><div><div><div>11</div></div><div><span>sudo</span><span> </span><span>iptables</span><span> </span><span>-D</span><span> </span><span>INPUT</span><span> </span><span>3</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span># 插入规则到指定位置</span></div></div><div><div><div>14</div></div><div><span>sudo</span><span> </span><span>iptables</span><span> </span><span>-I</span><span> </span><span>INPUT</span><span> </span><span>2</span><span> </span><span>-p</span><span> </span><span>tcp</span><span> </span><span>--dport</span><span> </span><span>3306</span><span> </span><span>-j</span><span> </span><span>ACCEPT</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/ssh%E5%85%8D%E5%AF%86%E7%99%BB%E5%BD%95/</id>
      <title type="text">ssh免密登录</title>
      <published>2026-04-18T00:00:00.000Z</published>
      <updated>2026-04-18T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/ssh%E5%85%8D%E5%AF%86%E7%99%BB%E5%BD%95/"/>
      <summary type="text">ssh免密登录</summary>
      <content type="html"><![CDATA[<section><h1>一、Windows的SSH免密登录操作步骤<a href="#一windows的ssh免密登录操作步骤"><span>#</span></a></h1><section><h2>1.1 客户端生成秘钥对<a href="#11-客户端生成秘钥对"><span>#</span></a></h2><p>在Windows客户端中创建秘钥对，以xshell为例创建秘钥对</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssh/image-20260119113007105.png" alt="image-20260119113007105" /><figcaption>image-20260119113007105</figcaption></figure><p></p><p>秘钥参数中的<code>秘钥类型</code>和<code>秘钥长度</code>可自定义选择，这里默认即可，点击下一步</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssh/image-20260119113059912.png" alt="image-20260119113059912" /><figcaption>image-20260119113059912</figcaption></figure><p></p><p>点击完成下一步后再点击下一步，来到这个界面</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssh/image-20260119113303583.png" alt="image-20260119113303583" /><figcaption>image-20260119113303583</figcaption></figure><p></p><p>秘钥<code>名称</code>和<code>注释</code>按需求设置，其中秘钥的<code>密码</code>可设置，设置后每次使用秘钥需要输入密码，这里不进行密码设置，直接下一步来到公钥界面</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssh/image-20260119113529886.png" alt="image-20260119113529886" /><figcaption>image-20260119113529886</figcaption></figure><p></p><p><code>公钥的格式也有多个可选</code>，这里默认选择常用的为ssh2-openssh，点击完成即可。</p><p>至此，Windows客户端就生成了一个秘钥对，一个公钥加一个秘钥（私钥）</p><blockquote><ul>
<li><code>SSH1</code>：已废弃，不安全，<strong>强烈建议不要使用</strong>。</li>
<li><code>SSH2 - OpenSSH</code>：现代标准，绝大多数 Linux 系统默认支持。</li>
<li><code>SSH2 - IETF SECSH</code>：较新标准，也兼容 OpenSSH，但较少见。使用该格式时若ssh服务端不支持，这需要转换格式或者更换ssh服务端</li>
</ul></blockquote></section><section><h2>1.2 将公钥上传至服务器<a href="#12-将公钥上传至服务器"><span>#</span></a></h2><p>手动将<code>公钥内容</code>复制或者将<code>保存下来的公钥文件</code>上传到服务器中</p><p>存放公钥的默认文件位置和名称（若不存在创建即可）</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>～/.ssh/authorized_keys</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 修改权限</span></div></div><div><div><div>4</div></div><div><span>chmod</span><span> </span><span>700</span><span> </span><span>～/.ssh</span></div></div><div><div><div>5</div></div><div><span>chmod</span><span> </span><span>600</span><span> </span><span>～/.ssh/authorized_keys</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>修改sshd配置文件</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vim</span><span> </span><span>/etc/ssh/sshd_conf</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 禁用密码认证</span></div></div><div><div><div>4</div></div><div><span>PasswordAuthentication</span><span> </span><span>no</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 禁用空密码登录（默认通常已是 no）</span></div></div><div><div><div>7</div></div><div><span>PermitEmptyPasswords</span><span> </span><span>no</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 确保启用公钥认证</span></div></div><div><div><div>10</div></div><div><span>PubkeyAuthentication</span><span> </span><span>yes</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># 指定 authorized_keys 文件路径（通常默认即可）</span></div></div><div><div><div>13</div></div><div><span>AuthorizedKeysFile</span><span> </span><span>.ssh/authorized_keys</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span># （可选）禁止 root 直接登录（推荐）</span></div></div><div><div><div>16</div></div><div><span>PermitRootLogin</span><span> </span><span>no</span></div></div><div><div><div>17</div></div><div><span># 或设为 prohibit-password（等同于只允许密钥）</span></div></div><div><div><div>18</div></div><div><span># PermitRootLogin prohibit-password</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>重启sshd服务</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>systemctl</span><span> </span><span>restart</span><span> </span><span>sshd</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>1.3 测试<a href="#13-测试"><span>#</span></a></h2><p>在客户端使用生成的密钥对进行测试，这里使用xshell进行测试</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssh/image-20260119133013221.png" alt="image-20260119133013221" /><figcaption>image-20260119133013221</figcaption></figure><p></p><p>新建标签页，然后设置好<code>名称</code>、<code>主机</code>、和	<code>端口号</code>，然后点击<strong>用户身份验证</strong></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssh/image-20260119133757887.png" alt="image-20260119133757887" /><figcaption>image-20260119133757887</figcaption></figure><p></p><p><code>用户名</code>：为root或其他可登录用户</p><p><code>密码</code>：输入密码、如果使用的是秘钥登录，那么这里为空</p><blockquote><p><code>方法</code>：主要使用<code>pubic key</code>和<code>password</code></p><p>如果使用的是<code>密码登录</code>，那么在密码输框输入密码并将<code>password`勾选并上移至第一选项，如果使用`秘钥登录</code>，那么密码输入框为空并将<code>public key</code>上移到第一选项，之后点击设置选择秘钥</p></blockquote><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssh/image-20260119134413567.png" alt="image-20260119134413567" /><figcaption>image-20260119134413567</figcaption></figure><p></p><p>如果秘钥设置了密码，那么可以摘密码输入框中输入密码。</p><p>设置完成后点击确定连接即可</p><blockquote><p><strong>选择的即为秘钥对中的私钥，不可泄露，使用秘钥可以生成公钥</strong></p></blockquote></section></section>
<section><h1>二、linux的SSH免密登录操作<a href="#二linux的ssh免密登录操作"><span>#</span></a></h1><section><h2>2.1 linux客户端创建秘钥对<a href="#21-linux客户端创建秘钥对"><span>#</span></a></h2><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 推荐使用 ed25519（更安全、更快）</span></div></div><div><div><div>2</div></div><div><span>ssh-keygen</span><span> </span><span>-t</span><span> </span><span>ed25519</span></div></div><div><div><div>3</div></div><div><span># 如果配置了邮箱服务，可加-C参数</span></div></div><div><div><div>4</div></div><div><span>ssh-keygen</span><span> </span><span>-t</span><span> </span><span>ed25519</span><span> </span><span>-C</span><span> </span><span>"your_email@example.com"</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 或使用 RSA（兼容性更好，但需指定长度）</span></div></div><div><div><div>7</div></div><div><span># ssh-keygen -t rsa -b 4096</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># ======================================================</span></div></div><div><div><div>10</div></div><div><span>[root@mater-22 ~/.ssh]#ssh-keygen -t ed25519</span></div></div><div><div><div>11</div></div><div><span>Generating</span><span> </span><span>public/private</span><span> </span><span>ed25519</span><span> </span><span>key</span><span> </span><span>pair.</span></div></div><div><div><div>12</div></div><div><span>Enter</span><span> </span><span>file</span><span> </span><span>in</span><span> </span><span>which</span><span> </span><span>to</span><span> </span><span>save</span><span> </span><span>the</span><span> </span><span>key</span><span> (/root/.ssh/id_ed25519):   </span><span># 指定秘钥对保存路径，空为默认</span></div></div><div><div><div>13</div></div><div><span>Enter</span><span> </span><span>passphrase</span><span> (empty </span><span>for</span><span> </span><span>no</span><span> </span><span>passphrase</span><span>):   </span><span># 秘钥密码</span></div></div><div><div><div>14</div></div><div><span>Enter</span><span> </span><span>same</span><span> </span><span>passphrase</span><span> </span><span>again:</span></div></div><div><div><div>15</div></div><div><span>Your</span><span> </span><span>identification</span><span> </span><span>has</span><span> </span><span>been</span><span> </span><span>saved</span><span> </span><span>in</span><span> </span><span>/root/.ssh/id_ed25519.</span></div></div><div><div><div>16</div></div><div><span>Your</span><span> </span><span>public</span><span> </span><span>key</span><span> </span><span>has</span><span> </span><span>been</span><span> </span><span>saved</span><span> </span><span>in</span><span> </span><span>/root/.ssh/id_ed25519.pub.</span></div></div><div><div><div>17</div></div><div><span>The</span><span> </span><span>key</span><span> </span><span>fingerprint</span><span> </span><span>is:</span></div></div><div><div><div>18</div></div><div><span>SHA256:iyIZe5+EhfLt5w7wwv2fphndIAMpk0NRJ4JPbrc2x0I</span><span> </span><span>root@mater-22</span></div></div><div><div><div>19</div></div><div><span>The</span><span> </span><span>key's randomart image is:</span></div></div><div><div><div>20</div></div><div><span>+--[ED25519 256]--+</span></div></div><div><div><div>21</div></div><div><span>|   .+oo .        |</span></div></div><div><div><div>22</div></div><div><span>|  ...o +         |</span></div></div><div><div><div>23</div></div><div><span>|   += o          |</span></div></div><div><div><div>24</div></div><div><span>|    +=E.         |</span></div></div><div><div><div>25</div></div><div><span>|  o.oo.oS .      |</span></div></div><div><div><div>26</div></div><div><span>|   B B=.o= o     |</span></div></div><div><div><div>27</div></div><div><span>|  + B.B+o . .    |</span></div></div><div><div><div>28</div></div><div><span>|   o * +.o..     |</span></div></div><div><div><div>29</div></div><div><span>|      ++*+o      |</span></div></div><div><div><div>30</div></div><div><span>+----[SHA256]-----+</span></div></div><div><div><div>31</div></div><div><span># ==================================================================</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h2>2.2 将公钥上传至服务端<a href="#22-将公钥上传至服务端"><span>#</span></a></h2><p><strong>使用</strong> <code>ssh-copy-id</code><strong>（最简单，推荐）</strong></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 格式：ssh-copy-id -i ～/.ssh/id_ed25519.pub username@server_ip</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>ssh-copy-id</span><span> </span><span>-i</span><span> </span><span>/root/.ssh/id_ed25519.pub</span><span> </span><span>root@10.1.1.28</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>输入命令回车，提示输入 <strong>服务器密码</strong>（仅这一次），然后自动将公钥追加到服务器的 <code>～/.ssh/authorized_keys</code> 文件中。</p><p>手动上传的话和上边Windows的方式一样。</p></section><section><h2>2.3 修改sshd配置文件<a href="#23-修改sshd配置文件"><span>#</span></a></h2><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vim</span><span> </span><span>/etc/ssh/sshd_config</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 禁用密码认证</span></div></div><div><div><div>4</div></div><div><span>PasswordAuthentication</span><span> </span><span>no</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 禁用空密码登录（默认通常已是 no）</span></div></div><div><div><div>7</div></div><div><span>PermitEmptyPasswords</span><span> </span><span>no</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 确保启用公钥认证</span></div></div><div><div><div>10</div></div><div><span>PubkeyAuthentication</span><span> </span><span>yes</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># 指定 authorized_keys 文件路径（通常默认即可）</span></div></div><div><div><div>13</div></div><div><span>AuthorizedKeysFile</span><span> </span><span>.ssh/authorized_keys</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span># （可选）禁止 root 直接登录（推荐）</span></div></div><div><div><div>16</div></div><div><span>PermitRootLogin</span><span> </span><span>no</span></div></div><div><div><div>17</div></div><div><span># 或设为 prohibit-password（等同于只允许密钥）</span></div></div><div><div><div>18</div></div><div><span># PermitRootLogin prohibit-password</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h2>2.4 测试<a href="#24-测试"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 格式：ssh 用户名@ip -p 端口</span></div></div><div><div><div>2</div></div><div><span>[root@mater-22 /]#ssh root@10.1.1.28</span></div></div><div><div><div>3</div></div><div><span>Last</span><span> </span><span>login:</span><span> </span><span>Mon</span><span> </span><span>Jan</span><span> </span><span>19</span><span> </span><span>14:41:04</span><span> </span><span>2026</span><span> </span><span>from</span><span> </span><span>192.168.106.22</span></div></div><div><div><div>4</div></div><div><span>[root@nfs-28 ~]#</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>可以看到主机名已经从<code>mater-22</code>切换至<code>nfs-28</code>，说明已经登录成功，且没有输入密码。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 正常密码登录过程</span></div></div><div><div><div>2</div></div><div><span>[root@nfs-28 ~/.ssh]#ssh root@10.1.1.22</span></div></div><div><div><div>3</div></div><div><span>root@10.1.1.22</span><span>'s password:</span></div></div><div><div><div>4</div></div><div><span>Last login: Mon Jan 19 14:47:10 2026 from 10.1.1.28</span></div></div><div><div><div>5</div></div><div><span>[root@mater-22 ~]#</span></div></div><div><div><div>6</div></div><div><span>[root@mater-22 ~]#</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h1>三、服务器查看公钥<a href="#三服务器查看公钥"><span>#</span></a></h1><p>服务器中存在两个公钥：</p><ul>
<li>
<p>一个为<code>服务器主机公钥（Host Key）</code></p>
</li>
<li>
<p>一个为<code>登录公钥（User Public Key）</code></p>
</li>
</ul><section><h2>3.1 服务器主机公钥<a href="#31-服务器主机公钥"><span>#</span></a></h2><p>第一次登录服务器要求保存的就是：<strong>主机公钥（Host Key）</strong></p><ul>
<li><strong>是谁的</strong>：<strong>服务器自己的</strong></li>
<li><strong>作用</strong>：<strong>认服务器</strong>，防止你连到假服务器</li>
<li>存在哪：<code>/etc/ssh/ssh_host_rsa_key.pub</code></li>
<li><strong>你只负责保存，不负责生成</strong></li>
</ul></section><section><h2>3.2 登录公钥<a href="#32-登录公钥"><span>#</span></a></h2><p><strong>是谁的</strong>：<strong>用户自己的生成，生成的为秘钥对，包含了公钥和私钥</strong></p><p><strong>作用</strong>：<strong>证明你是你</strong>，让服务器允许你登录</p><p><strong>存在哪</strong>：<code>~/.ssh/authorized_keys</code></p><p><strong>用户生成，然后上传到服务器中</strong></p></section><section><h2>3.3 主机公钥、登录公钥、私钥的通俗理解<a href="#33-主机公钥登录公钥私钥的通俗理解"><span>#</span></a></h2><p><strong>你去开一个带门禁的保密机房</strong></p><section><h3>① 主机公钥 = 机房的门牌 / 身份证<a href="#-主机公钥--机房的门牌--身份证"><span>#</span></a></h3><ul>
<li>第一次去，你看一眼门牌：<strong>哦，这是真机房</strong></li>
<li>以后再来，先对门牌：<strong>门牌没变，才进去</strong></li>
<li>这就是：<strong>主机公钥</strong></li>
</ul></section><section><h3>② 你的登录公钥 = 机房里录入的你的门禁卡信息<a href="#-你的登录公钥--机房里录入的你的门禁卡信息"><span>#</span></a></h3><ul>
<li>你提前把<strong>卡的信息</strong>交给管理员，录入系统</li>
<li>这就是：<strong>把 id_rsa.pub 放进 authorized_keys</strong></li>
</ul></section><section><h3>③ 你的私钥 = 你手里真正的门禁卡<a href="#-你的私钥--你手里真正的门禁卡"><span>#</span></a></h3><ul>
<li>你刷卡 → 系统对比你录入的信息</li>
<li>对上了 → 开门</li>
<li>这就是：<strong>私钥登录</strong></li>
</ul><blockquote><p><strong>主机公钥</strong>：<strong>服务器的身份证</strong>，用户保存，用来验证服务器的真假。</p><p><strong>登录公钥</strong>：<strong>用户的身份信息</strong>，放服务器，用来认证。</p><p><strong>私钥</strong>：<strong>只和用户自己的登录公钥配对</strong>，是用户登录的凭证。</p></blockquote></section></section></section>
<section><h1>四、主机查看公钥<a href="#四主机查看公钥"><span>#</span></a></h1><section><h2>4.1 查看用户主机公钥<a href="#41-查看用户主机公钥"><span>#</span></a></h2><section><h3>4.1.1 xshell<a href="#411-xshell"><span>#</span></a></h3><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssh/image-20260225114944773.png" alt="image-20260225114944773" /><figcaption>image-20260225114944773</figcaption></figure><p></p><p>进入后</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssh/image-20260225115034207.png" alt="image-20260225115034207" /><figcaption>image-20260225115034207</figcaption></figure><p></p><p><strong>之后与<code>/etc/ssh/ssh_host_rsa_key.pub</code>中的主机公钥进行比对，看是否一致</strong></p></section><section><h3>4.1.2 CRT<a href="#412-crt"><span>#</span></a></h3><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssh/image-20260225130548743.png" alt="image-20260225130548743" /><figcaption>image-20260225130548743</figcaption></figure><p></p><p>进入后</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssh/image-20260225130656566.png" alt="image-20260225130656566" /><figcaption>image-20260225130656566</figcaption></figure><p></p></section></section><section><h2>4.2 查看登录公钥<a href="#42-查看登录公钥"><span>#</span></a></h2><section><h3>4.2.1 xshell<a href="#421-xshell"><span>#</span></a></h3><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssh/image-20260225130833340.png" alt="image-20260225130833340" /><figcaption>image-20260225130833340</figcaption></figure><p></p><p>进入后</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssh/image-20260225130911267.png" alt="image-20260225130911267" /><figcaption>image-20260225130911267</figcaption></figure><p></p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssh/image-20260225130937001.png" alt="image-20260225130937001" /><figcaption>image-20260225130937001</figcaption></figure><p></p></section><section><h3>4.2.2 CRT<a href="#422-crt"><span>#</span></a></h3><section><h4>4.2.2.1 生成秘钥对<a href="#4221-生成秘钥对"><span>#</span></a></h4><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssh/image-20260225131621285.png" alt="image-20260225131621285" /><figcaption>image-20260225131621285</figcaption></figure><p></p></section><section><h4>4.2.2.2 查看登录公钥<a href="#4222-查看登录公钥"><span>#</span></a></h4><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/ssh/image-20260225132125852.png" alt="image-20260225132125852" /><figcaption>image-20260225132125852</figcaption></figure><p></p></section></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/keepalived%E4%BD%BF%E7%94%A8/</id>
      <title type="text">keepalived使用</title>
      <published>2026-04-15T00:00:00.000Z</published>
      <updated>2026-04-15T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/keepalived%E4%BD%BF%E7%94%A8/"/>
      <summary type="text">rsync使用</summary>
      <content type="html"><![CDATA[<section><h1>一、keepalived简介<a href="#一keepalived简介"><span>#</span></a></h1><p>Keepalived 是基于 VRRP（虚拟路由冗余协议）实现的高可用解决方案，主要用于实现服务器（如 Nginx、MySQL）的故障自动切换，核心是通过虚拟 IP（VIP）在主备节点间漂移来保证服务不中断。</p><section><h2>1.1 Keepalived 核心配置结构<a href="#11-keepalived-核心配置结构"><span>#</span></a></h2><p>Keepalived 的主配置文件默认路径是 <code>/etc/keepalived/keepalived.conf</code>，核心分为 3 个区块：</p><ol>
<li><strong>global_defs</strong>：全局配置（日志、标识等）；</li>
<li><strong>vrrp_instance</strong>：VRRP 实例配置（核心，定义 VIP、主备角色、切换规则）；</li>
<li><strong>virtual_server</strong>（可选）：虚拟服务器配置（结合 LVS 时使用，纯高可用可省略）。</li>
</ol></section><section><h2>2.1 环境介绍<a href="#21-环境介绍"><span>#</span></a></h2><p>四台服务器，规划如下：</p><ul>
<li>负载均衡器主<code>lsb-23</code>（MASTER）：IP = 192.168.106.23</li>
<li>负载均衡器备<code>lsb-24</code>（BACKUP）：IP = 192.168.106.24</li>
<li>虚拟 IP（VIP）：192.168.106.100（确保无机器使用）</li>
<li>nginx服务器<code>web-34</code>：IP=192.168.106.34</li>
<li>nginx服务器<code>web-36</code>：IP=192.168.106.36</li>
</ul></section><section><h2>2.2 实现效果<a href="#22-实现效果"><span>#</span></a></h2><p>在正常使用过程中，负载均衡器主<code>lsb-23</code>，负责将web请求分发到<code>web-34,web-36</code>这两台web服务器中，当<code>lsb-23</code>服务出现故障时可以切换负载均衡器备<code>lsb-24</code>来顶替，确保业务不中断。当<code>lsb-23</code>恢复时可直接切换为主负载均衡器</p><p>（单节点负载均衡查看上篇）</p></section><section><h2>2.3 配置步骤<a href="#23-配置步骤"><span>#</span></a></h2><section><h3>2.3.1 主节点（MASTER）配置<a href="#231-主节点master配置"><span>#</span></a></h3><p><code>/etc/keepalived/keepalived.conf</code></p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 全局配置</span></div></div><div><div><div>2</div></div><div><span>global_defs</span><span> </span><span>{</span></div></div><div><div><div>3</div></div><div><span>    </span><span># 标识本节点的字符串（自定义，建议唯一）</span></div></div><div><div><div>4</div></div><div><span>    </span><span>router_id</span><span> </span><span>lsb-23</span></div></div><div><div><div>5</div></div><div><span>    </span><span># 禁止 SNMP 陷阱（新手可忽略）</span></div></div><div><div><div>6</div></div><div><span>    </span><span>vrrp_skip_check_adv_addr</span></div></div><div><div><div>7</div></div><div><span>    </span><span># 严格遵守 VRRP 协议</span></div></div><div><div><div>8</div></div><div><span>    </span><span>#vrrp_strict</span></div></div><div><div><div>9</div></div><div><span>    </span><span># 日志级别：0(调试)~7(紧急)</span></div></div><div><div><div>10</div></div><div><span>    </span><span>vrrp_garp_interval</span><span> </span><span>0</span></div></div><div><div><div>11</div></div><div><span>    </span><span>vrrp_gna_interval</span><span> </span><span>0</span></div></div><div><div><div>12</div></div><div><span>}</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span># VRRP 实例配置（实例名自定义，如 VI_1）</span></div></div><div><div><div>15</div></div><div><span>vrrp_instance</span><span> </span><span>VIP_1</span><span> </span><span>{</span></div></div><div><div><div>16</div></div><div><span>    </span><span># 角色：MASTER（主）/BACKUP（备）</span></div></div><div><div><div>17</div></div><div><span>    </span><span>state</span><span> </span><span>MASTER</span></div></div><div><div><div>18</div></div><div><span>    </span><span># 绑定的网卡（需替换为你的网卡名，如 eth0、ens33）</span></div></div><div><div><div>19</div></div><div><span>    </span><span>interface</span><span> </span><span>ens32</span></div></div><div><div><div>20</div></div><div><span>    </span><span># VRRP 实例 ID（主备节点必须相同，范围 0-255）</span></div></div><div><div><div>21</div></div><div><span>    </span><span>virtual_router_id</span><span> </span><span>50</span></div></div><div><div><div>22</div></div><div><span>    </span><span># 优先级（主节点要高于备节点，范围 0-254）</span></div></div><div><div><div>23</div></div><div><span>    </span><span>priority</span><span> </span><span>150</span></div></div><div><div><div>24</div></div><div><span>    </span><span># 心跳检测间隔（秒）</span></div></div><div><div><div>25</div></div><div><span>    </span><span>advert_int</span><span> </span><span>1</span></div></div><div><div><div>26</div></div><div><span>    </span><span># 认证配置（主备节点必须一致，防止非法节点接入）</span></div></div><div><div><div>27</div></div><div><span>    </span><span>authentication</span><span> </span><span>{</span></div></div><div><div><div>28</div></div><div><span>        </span><span>auth_type</span><span> </span><span>PASS</span></div></div><div><div><div>29</div></div><div><span>        </span><span>auth_pass</span><span> </span><span>1111</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span>    </span><span># 虚拟 IP（VIP，可配置多个，每行一个）</span></div></div><div><div><div>32</div></div><div><span>    </span><span>virtual_ipaddress</span><span> </span><span>{</span></div></div><div><div><div>33</div></div><div><span>        </span><span>192.168.106.100/24</span><span> </span><span>dev</span><span> </span><span>ens32</span><span>  </span><span># dev 指定网卡，/24 是子网掩码</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>2.3.2 备节点（BACKUP）配置<a href="#232-备节点backup配置"><span>#</span></a></h3><p>仅需修改 <code>state</code> 和 <code>priority</code>，其余与主节点一致：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>global_defs</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>router_id</span><span> </span><span>lsb-23</span></div></div><div><div><div>3</div></div><div><span>    </span><span>vrrp_skip_check_adv_addr</span></div></div><div><div><div>4</div></div><div><span>    </span><span># vrrp_strict</span></div></div><div><div><div>5</div></div><div><span>    </span><span>vrrp_garp_interval</span><span> </span><span>0</span></div></div><div><div><div>6</div></div><div><span>    </span><span>vrrp_gna_interval</span><span> </span><span>0</span></div></div><div><div><div>7</div></div><div><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>vrrp_instance</span><span> </span><span>VIP_1</span><span> </span><span>{</span></div></div><div><div><div>10</div></div><div><span>    </span><span>state</span><span> </span><span>BACKUP</span></div></div><div><div><div>11</div></div><div><span>    </span><span>interface</span><span> </span><span>ens32</span></div></div><div><div><div>12</div></div><div><span>    </span><span>virtual_router_id</span><span> </span><span>50</span></div></div><div><div><div>13</div></div><div><span>    </span><span>priority</span><span> </span><span>90</span></div></div><div><div><div>14</div></div><div><span>    </span><span>advert_int</span><span> </span><span>1</span></div></div><div><div><div>15</div></div><div><span>    </span><span>authentication</span><span> </span><span>{</span></div></div><div><div><div>16</div></div><div><span>        </span><span>auth_type</span><span> </span><span>PASS</span></div></div><div><div><div>17</div></div><div><span>        </span><span>auth_pass</span><span> </span><span>1111</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>    </span><span>virtual_ipaddress</span><span> </span><span>{</span></div></div><div><div><div>20</div></div><div><span>      </span><span>192.168.106.100/24</span><span> </span><span>dev</span><span> </span><span>ens32</span></div></div><div><div><div>21</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>22</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>2.3.3 关键参数解释<a href="#233-关键参数解释"><span>#</span></a></h3>

<table><thead><tr><th>参数</th><th>作用</th></tr></thead><tbody><tr><td><code>router_id</code></td><td>节点标识，仅用于日志区分，无实际功能，建议主备节点不同（如 MASTER_100）。</td></tr><tr><td><code>vrrp_strict</code></td><td>严格模式，禁止无效的 VRRP 数据包，防止攻击，新手必开。</td></tr><tr><td><code>state</code></td><td>主备角色，但<strong>优先级才是决定主备的核心</strong>（优先级高的为实际主节点）。</td></tr><tr><td><code>interface</code></td><td>绑定的网卡，必须是服务器上存在的网卡（可通过 <code>ip addr</code> 查看）。</td></tr><tr><td><code>virtual_router_id</code></td><td>VRRP 实例 ID，主备节点必须相同，不同实例用不同 ID（避免冲突）。</td></tr><tr><td><code>priority</code></td><td>优先级（0-254），数值越高越优先成为主节点，主节点建议设 100，备节点 90。</td></tr><tr><td><code>advert_int</code></td><td>心跳间隔，主节点每隔该时间发送广播包，备节点未收到则判定主节点故障。</td></tr><tr><td><code>authentication</code></td><td>认证配置，<code>auth_type PASS</code> 为密码认证，<code>auth_pass</code> 主备必须一致（仅用于内网）。</td></tr><tr><td><code>virtual_ipaddress</code></td><td>虚拟 IP，服务对外提供的 IP，故障时会从主节点漂移到备节点。</td></tr></tbody></table></section></section><section><h2>2.4 配置后验证步骤<a href="#24-配置后验证步骤"><span>#</span></a></h2><section><h3>2.4.1 启动 Keepalived<a href="#241-启动-keepalived"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># 启动</span></div></div><div><div><div>2</div></div><div><span>systemctl start keepalived</span></div></div><div><div><div>3</div></div><div><span># 设置开机自启</span></div></div><div><div><div>4</div></div><div><span>systemctl enable keepalived</span></div></div><div><div><div>5</div></div><div><span># 查看状态</span></div></div><div><div><div>6</div></div><div><span>systemctl status keepalived</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.4.2 检查 VIP<a href="#242-检查-vip"><span>#</span></a></h3><p>主节点执行</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ip</span><span> </span><span>addr</span><span> </span><span>show</span><span> </span><span>dev</span><span> </span><span>ens32</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>[root@lsb-23 /etc/keepalived]#ip addr show dev ens32</span></div></div><div><div><div>4</div></div><div><span>2:</span><span> </span><span>ens32:</span><span> </span><span>&lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt;</span><span> </span><span>mtu</span><span> </span><span>1500</span><span> </span><span>qdisc</span><span> </span><span>pfifo_fast</span><span> </span><span>state</span><span> </span><span>UP</span><span> </span><span>group</span><span> </span><span>default</span><span> </span><span>qlen</span><span> </span><span>1000</span></div></div><div><div><div>5</div></div><div><span>    </span><span>link/ether</span><span> </span><span>00:0c:29:b4:f6:cd</span><span> </span><span>brd</span><span> </span><span>ff:ff:ff:ff:ff:ff</span></div></div><div><div><div>6</div></div><div><span>    </span><span>inet</span><span> </span><span>192.168.106.23/24</span><span> </span><span>brd</span><span> </span><span>192.168.106.255</span><span> </span><span>scope</span><span> </span><span>global</span><span> </span><span>ens32</span></div></div><div><div><div>7</div></div><div><span>       </span><span>valid_lft</span><span> </span><span>forever</span><span> </span><span>preferred_lft</span><span> </span><span>forever</span></div></div><div><div><div>8</div></div><div><span>    </span><span>inet</span><span> </span><span>192.168.106.100/24</span><span> </span><span>scope</span><span> </span><span>global</span><span> </span><span>secondary</span><span> </span><span>ens32</span></div></div><div><div><div>9</div></div><div><span>       </span><span>valid_lft</span><span> </span><span>forever</span><span> </span><span>preferred_lft</span><span> </span><span>forever</span></div></div><div><div><div>10</div></div><div><span>    </span><span>inet6</span><span> </span><span>fe80::20c:29ff:feb4:f6cd/64</span><span> </span><span>scope</span><span> </span><span>link</span></div></div><div><div><div>11</div></div><div><span>       </span><span>valid_lft</span><span> </span><span>forever</span><span> </span><span>preferred_lft</span><span> </span><span>forever</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>，能看到 VIP（192.168.106.100）绑定在网卡上；备节点无 VIP。</p></section><section><h3>2.4.3 故障切换测试<a href="#243-故障切换测试"><span>#</span></a></h3><p>停止主节点 Keepalived，备节点会自动绑定 VIP；重启主节点后，VIP 会漂移回主节点（抢占模式，默认开启）。</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 关闭主节点</span></div></div><div><div><div>2</div></div><div><span>systemctl</span><span> </span><span>stop</span><span> </span><span>keepalived</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 查看备用节点</span></div></div><div><div><div>5</div></div><div><span>[root@lsb-24 /etc/keepalived]#ip addr show dev ens32</span></div></div><div><div><div>6</div></div><div><span>2:</span><span> </span><span>ens32:</span><span> </span><span>&lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt;</span><span> </span><span>mtu</span><span> </span><span>1500</span><span> </span><span>qdisc</span><span> </span><span>pfifo_fast</span><span> </span><span>state</span><span> </span><span>UP</span><span> </span><span>group</span><span> </span><span>default</span><span> </span><span>qlen</span><span> </span><span>1000</span></div></div><div><div><div>7</div></div><div><span>    </span><span>link/ether</span><span> </span><span>00:0c:29:1a:ec:dd</span><span> </span><span>brd</span><span> </span><span>ff:ff:ff:ff:ff:ff</span></div></div><div><div><div>8</div></div><div><span>    </span><span>inet</span><span> </span><span>192.168.106.24/24</span><span> </span><span>brd</span><span> </span><span>192.168.106.255</span><span> </span><span>scope</span><span> </span><span>global</span><span> </span><span>ens32</span></div></div><div><div><div>9</div></div><div><span>       </span><span>valid_lft</span><span> </span><span>forever</span><span> </span><span>preferred_lft</span><span> </span><span>forever</span></div></div><div><div><div>10</div></div><div><span>    </span><span>inet</span><span> </span><span>192.168.106.100/24</span><span> </span><span>scope</span><span> </span><span>global</span><span> </span><span>secondary</span><span> </span><span>ens32</span></div></div><div><div><div>11</div></div><div><span>       </span><span>valid_lft</span><span> </span><span>forever</span><span> </span><span>preferred_lft</span><span> </span><span>forever</span></div></div><div><div><div>12</div></div><div><span>    </span><span>inet6</span><span> </span><span>fe80::20c:29ff:fe1a:ecdd/64</span><span> </span><span>scope</span><span> </span><span>link</span></div></div><div><div><div>13</div></div><div><span>       </span><span>valid_lft</span><span> </span><span>forever</span><span> </span><span>preferred_lft</span><span> </span><span>forever</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span># 恢复主节点</span></div></div><div><div><div>16</div></div><div><span>systemctl</span><span> </span><span>start</span><span> </span><span>keepalived</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span># 再次查看，可以看到又切换回了主节点</span></div></div><div><div><div>19</div></div><div><span>[root@lsb-23 /etc/keepalived]#ip addr show dev ens32</span></div></div><div><div><div>20</div></div><div><span>2:</span><span> </span><span>ens32:</span><span> </span><span>&lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt;</span><span> </span><span>mtu</span><span> </span><span>1500</span><span> </span><span>qdisc</span><span> </span><span>pfifo_fast</span><span> </span><span>state</span><span> </span><span>UP</span><span> </span><span>group</span><span> </span><span>default</span><span> </span><span>qlen</span><span> </span><span>1000</span></div></div><div><div><div>21</div></div><div><span>    </span><span>link/ether</span><span> </span><span>00:0c:29:b4:f6:cd</span><span> </span><span>brd</span><span> </span><span>ff:ff:ff:ff:ff:ff</span></div></div><div><div><div>22</div></div><div><span>    </span><span>inet</span><span> </span><span>192.168.106.23/24</span><span> </span><span>brd</span><span> </span><span>192.168.106.255</span><span> </span><span>scope</span><span> </span><span>global</span><span> </span><span>ens32</span></div></div><div><div><div>23</div></div><div><span>       </span><span>valid_lft</span><span> </span><span>forever</span><span> </span><span>preferred_lft</span><span> </span><span>forever</span></div></div><div><div><div>24</div></div><div><span>    </span><span>inet</span><span> </span><span>192.168.106.100/24</span><span> </span><span>scope</span><span> </span><span>global</span><span> </span><span>secondary</span><span> </span><span>ens32</span></div></div><div><div><div>25</div></div><div><span>       </span><span>valid_lft</span><span> </span><span>forever</span><span> </span><span>preferred_lft</span><span> </span><span>forever</span></div></div><div><div><div>26</div></div><div><span>    </span><span>inet6</span><span> </span><span>fe80::20c:29ff:feb4:f6cd/64</span><span> </span><span>scope</span><span> </span><span>link</span></div></div><div><div><div>27</div></div><div><span>       </span><span>valid_lft</span><span> </span><span>forever</span><span> </span><span>preferred_lft</span><span> </span><span>forever</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section></section>
<section><h1>二、keepalived脑裂问题<a href="#二keepalived脑裂问题"><span>#</span></a></h1><section><h2>2.1 脑裂原因<a href="#21-脑裂原因"><span>#</span></a></h2><ol>
<li>
<p>backup收不到master的数据包，导致backup抢夺VIP，出现VIP争夺现象</p>
</li>
<li>
<p>master节点<code>keepalived服务正常</code>但<code>其他服务故障</code>（<code>如负责负载均衡的nginx故障</code>），backup节点无法正确的接替VIP去工作</p>
</li>
</ol></section><section><h2>2.2 问题1解决方法<a href="#22-问题1解决方法"><span>#</span></a></h2><section><h3>2.2.1 创建shell脚本<a href="#221-创建shell脚本"><span>#</span></a></h3><p>备节点<code>lsb-24</code>创建shell脚本，使用该脚本的前提是<code>主节点需要支持免密登录</code></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vim</span><span> </span><span>/etc/keepalived/check_vip.sh</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>添加如下脚本</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>#!/bin/bash</span></div></div><div><div><div>2</div></div><div><span># 远程查看主节点lsb-23是否存在VIP</span></div></div><div><div><div>3</div></div><div><span>MASTER_VIP</span><span><span>=</span><span>$(</span></span><span>ssh</span><span> </span><span>192.168.106.23</span><span> </span><span>ip</span><span> </span><span>addr</span><span>|</span><span>grep</span><span> </span><span>192.168.106.100</span><span> |</span><span>wc</span><span> </span><span>-l</span><span>)</span></div></div><div><div><div>4</div></div><div><span># 判断当前机器是否有VIP</span></div></div><div><div><div>5</div></div><div><span>MY_VIP</span><span><span>=</span><span>$(</span></span><span>ip</span><span> </span><span>addr</span><span>|</span><span>grep</span><span> </span><span>192.168.106.100</span><span>|</span><span>wc</span><span> </span><span>-l</span><span>)</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 如果远程有VIP并且自己本地也存在了VIP，就干掉自己</span></div></div><div><div><div>8</div></div><div><span>if</span><span> [ </span><span><span>${</span><span>MASTER_VIP</span><span>}</span></span><span><span> </span><span>==</span><span> </span></span><span>1</span><span><span> </span><span>-a</span><span> </span></span><span><span>${</span><span>MY_VIP</span><span>}</span></span><span><span> </span><span>==</span><span> </span></span><span>1</span><span> ]</span></div></div><div><div><div>9</div></div><div><span>then</span></div></div><div><div><div>10</div></div><div><span>   </span><span>systemctl</span><span> </span><span>stop</span><span> </span><span>keepalived</span></div></div><div><div><div>11</div></div><div><span>fi</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>添加执行权限</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>chmod</span><span> </span><span>755</span><span> </span><span>/etc/keepalived/check_vip.sh</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.2.2修改配置文件<a href="#222修改配置文件"><span>#</span></a></h3><p>使用<code>vrrp_script</code>块定义脚本、之后使用“vrrp_instance`块中引用脚本</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>global_defs</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>router_id</span><span> </span><span>lsb-24</span></div></div><div><div><div>3</div></div><div><span>    </span><span>vrrp_skip_check_adv_addr</span></div></div><div><div><div>4</div></div><div><span>    </span><span># vrrp_strict</span></div></div><div><div><div>5</div></div><div><span>    </span><span>vrrp_garp_interval</span><span> </span><span>0</span></div></div><div><div><div>6</div></div><div><span>    </span><span>vrrp_gna_interval</span><span> </span><span>0</span></div></div><div><div><div>7</div></div><div><span>}</span></div></div><div><div><div>8</div></div><div><span># 定义脚本</span></div></div><div><div><div>9</div></div><div><span>vrrp_script</span><span> </span><span>check_vip</span><span> </span><span>{</span></div></div><div><div><div>10</div></div><div><span>  </span><span># 脚本路径</span></div></div><div><div><div>11</div></div><div><span>    </span><span>script</span><span> </span><span>"/etc/keepalived/check_vip.sh"</span></div></div><div><div><div>12</div></div><div><span>    </span><span># 脚本执行间隔</span></div></div><div><div><div>13</div></div><div><span>    </span><span>interval</span><span> </span><span>5</span></div></div><div><div><div>14</div></div><div><span>}</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>vrrp_instance</span><span> </span><span>VIP_1</span><span> </span><span>{</span></div></div><div><div><div>17</div></div><div><span>    </span><span>state</span><span> </span><span>BACKUP</span></div></div><div><div><div>18</div></div><div><span>    </span><span>interface</span><span> </span><span>ens32</span></div></div><div><div><div>19</div></div><div><span>    </span><span>virtual_router_id</span><span> </span><span>50</span></div></div><div><div><div>20</div></div><div><span>    </span><span>priority</span><span> </span><span>90</span></div></div><div><div><div>21</div></div><div><span>    </span><span>advert_int</span><span> </span><span>1</span></div></div><div><div><div>22</div></div><div><span>    </span><span>authentication</span><span> </span><span>{</span></div></div><div><div><div>23</div></div><div><span>        </span><span>auth_type</span><span> </span><span>PASS</span></div></div><div><div><div>24</div></div><div><span>        </span><span>auth_pass</span><span> </span><span>1111</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>26</div></div><div><span>    </span><span>virtual_ipaddress</span><span> </span><span>{</span></div></div><div><div><div>27</div></div><div><span>      </span><span>192.168.106.100/24</span><span> </span><span>dev</span><span> </span><span>ens32</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>     </span><span># 引用脚本</span></div></div><div><div><div>30</div></div><div><span>    </span><span>track_script</span><span> </span><span>{</span></div></div><div><div><div>31</div></div><div><span>        </span><span>check_vip</span></div></div><div><div><div>32</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>2.2.3 重启keepalived<a href="#223-重启keepalived"><span>#</span></a></h3><p>重启keepalived后，查看效果，有条件可以加上邮箱提醒服务，当出现切换时邮箱提醒运维人员</p></section><section><h3>2.2.4 模拟故障<a href="#224-模拟故障"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 主节点抓取报文转发过程</span></div></div><div><div><div>2</div></div><div><span>[root@lsb-23 ~/.ssh]#tcpdump -nn -i any host 224.0.0.18</span></div></div><div><div><div>3</div></div><div><span>tcpdump:</span><span> </span><span>verbose</span><span> </span><span>output</span><span> </span><span>suppressed,</span><span> </span><span>use</span><span> </span><span>-v</span><span> </span><span>or</span><span> </span><span>-vv</span><span> </span><span>for</span><span> </span><span>full</span><span> </span><span>protocol</span><span> </span><span>decode</span></div></div><div><div><div>4</div></div><div><span>listening</span><span> </span><span>on</span><span> </span><span>any,</span><span> </span><span>link-type</span><span> </span><span>LINUX_SLL</span><span> (Linux </span><span>cooked</span><span>), capture size 262144 bytes</span></div></div><div><div><div>5</div></div><div><span>17:14:48.654619</span><span> </span><span>IP</span><span> </span><span>192.168.106.23</span><span> &gt; </span><span>224.0.0.18:</span><span> </span><span>VRRPv2,</span><span> </span><span>Advertisement,</span><span> </span><span>vrid</span><span> </span><span>50,</span><span> </span><span>prio</span><span> </span><span>150,</span><span> </span><span>authtype</span><span> </span><span>simple,</span><span> </span><span>intvl</span><span> </span><span>1s,</span><span> </span><span>length</span><span> </span><span>20</span></div></div><div><div><div>6</div></div><div><span>17:14:49.656096</span><span> </span><span>IP</span><span> </span><span>192.168.106.23</span><span> &gt; </span><span>224.0.0.18:</span><span> </span><span>VRRPv2,</span><span> </span><span>Advertisement,</span><span> </span><span>vrid</span><span> </span><span>50,</span><span> </span><span>prio</span><span> </span><span>150,</span><span> </span><span>authtype</span><span> </span><span>simple,</span><span> </span><span>intvl</span><span> </span><span>1s,</span><span> </span><span>length</span><span> </span><span>20</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 开启防火墙，并创建规则，阻止本机发送组播报文</span></div></div><div><div><div>9</div></div><div><span>systemctl</span><span> </span><span>restart</span><span> </span><span>firewalld</span></div></div><div><div><div>10</div></div><div><span>[root@lsb-23 ~/.ssh]#iptables -A OUTPUT -d 224.0.0.18 -j DROP</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># 再次查看发现无报文发送</span></div></div><div><div><div>13</div></div><div><span>[root@lsb-23 ~/.ssh]#tcpdump -nn -i any host 224.0.0.18</span></div></div><div><div><div>14</div></div><div><span>tcpdump:</span><span> </span><span>verbose</span><span> </span><span>output</span><span> </span><span>suppressed,</span><span> </span><span>use</span><span> </span><span>-v</span><span> </span><span>or</span><span> </span><span>-vv</span><span> </span><span>for</span><span> </span><span>full</span><span> </span><span>protocol</span><span> </span><span>decode</span></div></div><div><div><div>15</div></div><div><span>listening</span><span> </span><span>on</span><span> </span><span>any,</span><span> </span><span>link-type</span><span> </span><span>LINUX_SLL</span><span> (Linux </span><span>cooked</span><span>), capture size 262144 bytes</span></div></div><div><div><div>16</div></div><div><span>^C</span></div></div><div><div><div>17</div></div><div><span>0</span><span> </span><span>packets</span><span> </span><span>captured</span></div></div><div><div><div>18</div></div><div><span>0</span><span> </span><span>packets</span><span> </span><span>received</span><span> </span><span>by</span><span> </span><span>filter</span></div></div><div><div><div>19</div></div><div><span>0</span><span> </span><span>packets</span><span> </span><span>dropped</span><span> </span><span>by</span><span> </span><span>kernel</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span># 此时查看备用节点lsb-24的keepalived服务状态</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>[root@lsb-24 /etc/keepalived]#systemctl status keepalived.service</span></div></div><div><div><div>25</div></div><div><span>●</span><span> </span><span>keepalived.service</span><span> </span><span>-</span><span> </span><span>LVS</span><span> </span><span>and</span><span> </span><span>VRRP</span><span> </span><span>High</span><span> </span><span>Availability</span><span> </span><span>Monitor</span></div></div><div><div><div>26</div></div><div><span>   </span><span>Loaded:</span><span> </span><span>loaded</span><span> (/usr/lib/systemd/system/keepalived.service; </span><span>disabled</span><span>; </span><span>vendor</span><span> </span><span>preset:</span><span> </span><span>disabled</span><span>)</span></div></div><div><div><div>27</div></div><div><span>   </span><span>Active:</span><span> </span><span>inactive</span><span> (dead)</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>Mar</span><span> </span><span>09</span><span> </span><span>17:14:57</span><span> </span><span>lsb-24</span><span> </span><span>Keepalived_vrrp[1707]:</span><span> </span><span>Sending</span><span> </span><span>gratuitous</span><span> </span><span>ARP</span><span> </span><span>o...</span></div></div><div><div><div>30</div></div><div><span>Mar</span><span> </span><span>09</span><span> </span><span>17:14:57</span><span> </span><span>lsb-24</span><span> </span><span>Keepalived_vrrp[1707]:</span><span> </span><span>Sending</span><span> </span><span>gratuitous</span><span> </span><span>ARP</span><span> </span><span>o...</span></div></div><div><div><div>31</div></div><div><span>Mar</span><span> </span><span>09</span><span> </span><span>17:15:01</span><span> </span><span>lsb-24</span><span> </span><span>Keepalived[1705]:</span><span> </span><span>Stopping</span></div></div><div><div><div>32</div></div><div><span>Mar</span><span> </span><span>09</span><span> </span><span>17:15:01</span><span> </span><span>lsb-24</span><span> </span><span>systemd[1]:</span><span> </span><span>Stopping</span><span> </span><span>LVS</span><span> </span><span>and</span><span> </span><span>VRRP</span><span> </span><span>High</span><span> </span><span>Ava</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>可以发现，<code>脚本已经执行，把自身的keepalived给关掉了</code></p></section></section><section><h2>2.3 问题2解决方法<a href="#23-问题2解决方法"><span>#</span></a></h2><section><h3>2.3.1 核心思路<a href="#231-核心思路"><span>#</span></a></h3><ol>
<li>编写 Shell 脚本，检测 Nginx 是否正常提供服务（不仅检测进程，还检测端口 / 访问状态）；</li>
<li>在 Keepalived 配置中引用该脚本，设置检测频率；</li>
<li>当脚本检测到 Nginx 故障时，Keepalived 会自动降低当前节点优先级，触发 VIP 漂移到备节点。</li>
</ol></section><section><h3>2.3.2 编写健康检查脚本<a href="#232-编写健康检查脚本"><span>#</span></a></h3><p>主节点<code>slb-23</code>创建脚本文件 <code>/etc/keepalived/check_nginx.sh</code>，内容如下</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>#!/bin/bash</span></div></div><div><div><div>2</div></div><div><span># 检测 Nginx 是否存活</span></div></div><div><div><div>3</div></div><div><span>NGINX_PID</span><span><span>=</span><span>$(</span></span><span>ps</span><span> </span><span>-ef</span><span> | </span><span>grep</span><span> </span><span>nginx</span><span> | </span><span>grep</span><span> </span><span>-v</span><span> </span><span>grep</span><span> | </span><span>wc</span><span> </span><span>-l</span><span>)</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 1. 先检测 Nginx 进程是否存在</span></div></div><div><div><div>6</div></div><div><span>if</span><span> [ </span><span>$NGINX_PID</span><span><span> </span><span>-eq</span><span> </span></span><span>0</span><span> ]; </span><span>then</span></div></div><div><div><div>7</div></div><div><span>    </span><span># 进程不存在，尝试重启 Nginx</span></div></div><div><div><div>8</div></div><div><span>    </span><span>systemctl</span><span> </span><span>start</span><span> </span><span>nginx</span></div></div><div><div><div>9</div></div><div><span>    </span><span>sleep</span><span> </span><span>3</span></div></div><div><div><div>10</div></div><div><span>    </span><span># 重启后再次检测，仍不存在则停止 Keepalived（触发 VIP 漂移）</span></div></div><div><div><div>11</div></div><div><span>    </span><span>NGINX_PID</span><span><span>=</span><span>$(</span></span><span>ps</span><span> </span><span>-ef</span><span> | </span><span>grep</span><span> </span><span>nginx</span><span> | </span><span>grep</span><span> </span><span>-v</span><span> </span><span>grep</span><span> | </span><span>wc</span><span> </span><span>-l</span><span>)</span></div></div><div><div><div>12</div></div><div><span>    </span><span>if</span><span> [ </span><span>$NGINX_PID</span><span><span> </span><span>-eq</span><span> </span></span><span>0</span><span> ]; </span><span>then</span></div></div><div><div><div>13</div></div><div><span>        </span><span>systemctl</span><span> </span><span>stop</span><span> </span><span>keepalived</span></div></div><div><div><div>14</div></div><div><span>    </span><span>fi</span></div></div><div><div><div>15</div></div><div><span>fi</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span># 2. 进阶检测：检测 Nginx 是否能正常响应 HTTP 请求（可选，更精准）</span></div></div><div><div><div>18</div></div><div><span># 可替换为你的业务接口，比如 /index.html</span></div></div><div><div><div>19</div></div><div><span>HTTP_CODE</span><span><span>=</span><span>$(</span></span><span>curl</span><span> </span><span>-o</span><span> </span><span>/dev/null</span><span> </span><span>-s</span><span> </span><span>-w</span><span> </span><span>"%{http_code}"</span><span> </span><span>http://127.0.0.1:80/</span><span>)</span></div></div><div><div><div>20</div></div><div><span>if</span><span> [ </span><span>$HTTP_CODE</span><span><span> </span><span>-ne</span><span> </span></span><span>200</span><span> ]; </span><span>then</span></div></div><div><div><div>21</div></div><div><span>    </span><span>systemctl</span><span> </span><span>stop</span><span> </span><span>keepalived</span></div></div><div><div><div>22</div></div><div><span>fi</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>2.3.3 脚本权限配置<a href="#233-脚本权限配置"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 添加执行权限</span></div></div><div><div><div>2</div></div><div><span>chmod</span><span> </span><span>+x</span><span> </span><span>/etc/keepalived/check_nginx.sh</span></div></div><div><div><div>3</div></div><div><span># 测试脚本是否能正常运行</span></div></div><div><div><div>4</div></div><div><span>bash</span><span> </span><span>/etc/keepalived/check_nginx.sh</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>2.3.4 修改 Keepalived 配置（主 / 备节点均需修改）<a href="#234-修改-keepalived-配置主--备节点均需修改"><span>#</span></a></h3><p>在原有配置基础上，添加 <code>vrrp_script</code>（脚本定义）和 <code>track_script</code>（脚本引用），完整配置如下：</p><section><h4>2.3.4.1 主节点（MASTER）完整配置<a href="#2341-主节点master完整配置"><span>#</span></a></h4><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>global_defs</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>router_id</span><span> </span><span>lsb-23</span></div></div><div><div><div>3</div></div><div><span>    </span><span>vrrp_skip_check_adv_addr</span></div></div><div><div><div>4</div></div><div><span>    </span><span># vrrp_strict</span></div></div><div><div><div>5</div></div><div><span>    </span><span>vrrp_garp_interval</span><span> </span><span>0</span></div></div><div><div><div>6</div></div><div><span>    </span><span>vrrp_gna_interval</span><span> </span><span>0</span></div></div><div><div><div>7</div></div><div><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 1. 定义健康检查脚本</span></div></div><div><div><div>10</div></div><div><span>vrrp_script</span><span> </span><span>check_nginx</span><span> </span><span>{</span></div></div><div><div><div>11</div></div><div><span>    </span><span>script</span><span> </span><span>"/etc/keepalived/check_nginx.sh"</span><span>  </span><span># 脚本路径</span></div></div><div><div><div>12</div></div><div><span>    </span><span>interval</span><span> </span><span>2</span><span>                               </span><span># 检测间隔（秒）</span></div></div><div><div><div>13</div></div><div><span>    </span><span>weight</span><span> </span><span>-100</span><span>                               </span><span># 检测失败时，节点优先级降低 100</span></div></div><div><div><div>14</div></div><div><span>    </span><span>fall</span><span> </span><span>3</span><span>                                   </span><span># 连续 3 次检测失败，判定为故障</span></div></div><div><div><div>15</div></div><div><span>    </span><span>rise</span><span> </span><span>2</span><span>                                   </span><span># 连续 2 次检测成功，恢复优先级</span></div></div><div><div><div>16</div></div><div><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>vrrp_instance</span><span> </span><span>VIP_1</span><span> </span><span>{</span></div></div><div><div><div>19</div></div><div><span>    </span><span>state</span><span> </span><span>MASTER</span></div></div><div><div><div>20</div></div><div><span>    </span><span>interface</span><span> </span><span>ens32</span></div></div><div><div><div>21</div></div><div><span>    </span><span>virtual_router_id</span><span> </span><span>50</span></div></div><div><div><div>22</div></div><div><span>    </span><span>priority</span><span> </span><span>150</span></div></div><div><div><div>23</div></div><div><span>    </span><span>advert_int</span><span> </span><span>1</span></div></div><div><div><div>24</div></div><div><span>    </span><span>authentication</span><span> </span><span>{</span></div></div><div><div><div>25</div></div><div><span>        </span><span>auth_type</span><span> </span><span>PASS</span></div></div><div><div><div>26</div></div><div><span>        </span><span>auth_pass</span><span> </span><span>1111</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>    </span><span>virtual_ipaddress</span><span> </span><span>{</span></div></div><div><div><div>29</div></div><div><span>      </span><span>192.168.106.100/24</span><span> </span><span>dev</span><span> </span><span>ens32</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span>     </span><span># 引用健康检查脚本</span></div></div><div><div><div>32</div></div><div><span>    </span><span>track_script</span><span> </span><span>{</span></div></div><div><div><div>33</div></div><div><span>        </span><span>check_nginx</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>    </span><span># 可选：抢占模式（默认开启，主节点恢复后抢回 VIP）</span></div></div><div><div><div>36</div></div><div><span>    </span><span># nopreempt  # 如需关闭抢占（备节点不主动归还 VIP），取消注释</span></div></div><div><div><div>37</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h4>2.3.4.2 备节点（BACKUP）完整配置<a href="#2342-备节点backup完整配置"><span>#</span></a></h4><p>仅 <code>state</code> 和 <code>priority</code> 不同，其余与主节点一致：</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>global_defs</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>router_id</span><span> </span><span>lsb-24</span></div></div><div><div><div>3</div></div><div><span>    </span><span>vrrp_skip_check_adv_addr</span></div></div><div><div><div>4</div></div><div><span>    </span><span># vrrp_strict</span></div></div><div><div><div>5</div></div><div><span>    </span><span>vrrp_garp_interval</span><span> </span><span>0</span></div></div><div><div><div>6</div></div><div><span>    </span><span>vrrp_gna_interval</span><span> </span><span>0</span></div></div><div><div><div>7</div></div><div><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 1. 定义健康检查脚本</span></div></div><div><div><div>10</div></div><div><span>vrrp_script</span><span> </span><span>check_nginx</span><span> </span><span>{</span></div></div><div><div><div>11</div></div><div><span>    </span><span>script</span><span> </span><span>"/etc/keepalived/check_nginx.sh"</span><span>  </span><span># 脚本路径</span></div></div><div><div><div>12</div></div><div><span>    </span><span>interval</span><span> </span><span>2</span><span>                               </span><span># 检测间隔（秒）</span></div></div><div><div><div>13</div></div><div><span>    </span><span>weight</span><span> </span><span>-100</span><span>                               </span><span># 检测失败时，节点优先级降低 100</span></div></div><div><div><div>14</div></div><div><span>    </span><span>fall</span><span> </span><span>3</span><span>                                   </span><span># 连续 3 次检测失败，判定为故障</span></div></div><div><div><div>15</div></div><div><span>    </span><span>rise</span><span> </span><span>2</span><span>                                   </span><span># 连续 2 次检测成功，恢复优先级</span></div></div><div><div><div>16</div></div><div><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>vrrp_instance</span><span> </span><span>VIP_1</span><span> </span><span>{</span></div></div><div><div><div>19</div></div><div><span>    </span><span>state</span><span> </span><span>BACKUP</span></div></div><div><div><div>20</div></div><div><span>    </span><span>interface</span><span> </span><span>ens32</span></div></div><div><div><div>21</div></div><div><span>    </span><span>virtual_router_id</span><span> </span><span>50</span></div></div><div><div><div>22</div></div><div><span>    </span><span>priority</span><span> </span><span>90</span></div></div><div><div><div>23</div></div><div><span>    </span><span>advert_int</span><span> </span><span>1</span></div></div><div><div><div>24</div></div><div><span>    </span><span>authentication</span><span> </span><span>{</span></div></div><div><div><div>25</div></div><div><span>        </span><span>auth_type</span><span> </span><span>PASS</span></div></div><div><div><div>26</div></div><div><span>        </span><span>auth_pass</span><span> </span><span>1111</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span>    </span><span>virtual_ipaddress</span><span> </span><span>{</span></div></div><div><div><div>29</div></div><div><span>      </span><span>192.168.106.100/24</span><span> </span><span>dev</span><span> </span><span>ens32</span></div></div><div><div><div>30</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>31</div></div><div><span>     </span><span># 引用健康检查脚本</span></div></div><div><div><div>32</div></div><div><span>    </span><span>track_script</span><span> </span><span>{</span></div></div><div><div><div>33</div></div><div><span>        </span><span>check_nginx</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div><span>    </span><span># 可选：抢占模式（默认开启，主节点恢复后抢回 VIP）</span></div></div><div><div><div>36</div></div><div><span>    </span><span># nopreempt  # 如需关闭抢占（备节点不主动归还 VIP），取消注释</span></div></div><div><div><div>37</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section><section><h3>2.3.5 关键参数解释（新增部分）<a href="#235-关键参数解释新增部分"><span>#</span></a></h3>

<table><thead><tr><th>参数</th><th>作用</th></tr></thead><tbody><tr><td><code>vrrp_script</code></td><td>定义健康检查脚本的区块，名称（如 check_nginx）自定义。</td></tr><tr><td><code>script</code></td><td>脚本的绝对路径，必须确保 Keepalived 进程有权限执行（建议用 root）。</td></tr><tr><td><code>interval</code></td><td>脚本执行间隔（秒），建议设 2-5 秒，过短会增加系统开销。</td></tr><tr><td><code>weight</code></td><td>权重调整值（负数）：检测失败时，节点优先级 = 原优先级 + weight（如 100-20=80），低于备节点的 90，触发漂移。</td></tr><tr><td><code>fall</code></td><td>连续失败次数，达到该次数才判定故障（避免网络抖动误判）。</td></tr><tr><td><code>rise</code></td><td>连续成功次数，达到该次数恢复原优先级（主节点恢复后抢回 VIP）。</td></tr><tr><td><code>track_script</code></td><td>在 VRRP 实例中引用定义好的健康检查脚本，可引用多个（用逗号分隔）。</td></tr><tr><td><code>nopreempt</code></td><td>非抢占模式：主节点故障恢复后，不会主动抢回 VIP，需手动切换（适合对服务稳定性要求高的场景）。</td></tr></tbody></table></section><section><h3>2.3.6 验证健康检查功能<a href="#236-验证健康检查功能"><span>#</span></a></h3><ol>
<li>
<p>重启 Keepalived</p>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>systemctl</span><span> </span><span>restart</span><span> </span><span>keepalived</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>模拟 Nginx 故障</p>
<div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 停止 Nginx</span></div></div><div><div><div>2</div></div><div><span>systemctl</span><span> </span><span>stop</span><span> </span><span>nginx</span></div></div><div><div><div>3</div></div><div><span># 等待 3*2=6 秒（fall=3 + interval=2）</span></div></div><div><div><div>4</div></div><div><span>sleep</span><span> </span><span>6</span></div></div><div><div><div>5</div></div><div><span># 查看 VIP 位置（备节点会绑定 VIP）</span></div></div><div><div><div>6</div></div><div><span>ip</span><span> </span><span>addr</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>[root@lsb-24 /etc/keepalived]#ip addr show ens32</span></div></div><div><div><div>9</div></div><div><span>2:</span><span> </span><span>ens32:</span><span> </span><span>&lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt;</span><span> </span><span>mtu</span><span> </span><span>1500</span><span> </span><span>qdisc</span><span> </span><span>pfifo_fast</span><span> </span><span>state</span><span> </span><span>UP</span><span> </span><span>group</span><span> </span><span>default</span><span> </span><span>qlen</span><span> </span><span>1000</span></div></div><div><div><div>10</div></div><div><span>    </span><span>link/ether</span><span> </span><span>00:0c:29:1a:ec:dd</span><span> </span><span>brd</span><span> </span><span>ff:ff:ff:ff:ff:ff</span></div></div><div><div><div>11</div></div><div><span>    </span><span>inet</span><span> </span><span>192.168.106.24/24</span><span> </span><span>brd</span><span> </span><span>192.168.106.255</span><span> </span><span>scope</span><span> </span><span>global</span><span> </span><span>ens32</span></div></div><div><div><div>12</div></div><div><span>       </span><span>valid_lft</span><span> </span><span>forever</span><span> </span><span>preferred_lft</span><span> </span><span>forever</span></div></div><div><div><div>13</div></div><div><span>    </span><span>inet</span><span> </span><span>192.168.106.100/24</span><span> </span><span>scope</span><span> </span><span>global</span><span> </span><span>secondary</span><span> </span><span>ens32</span></div></div><div><div><div>14</div></div><div><span>       </span><span>valid_lft</span><span> </span><span>forever</span><span> </span><span>preferred_lft</span><span> </span><span>forever</span></div></div><div><div><div>15</div></div><div><span>    </span><span>inet6</span><span> </span><span>fe80::20c:29ff:fe1a:ecdd/64</span><span> </span><span>scope</span><span> </span><span>link</span></div></div><div><div><div>16</div></div><div><span>       </span><span>valid_lft</span><span> </span><span>forever</span><span> </span><span>preferred_lft</span><span> </span><span>forever</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
</li>
<li>
<p>恢复 Nginx</p>
<div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 启动 Nginx及keepalived</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>systemctl</span><span> </span><span>start</span><span> </span><span>keepalived</span><span>;</span><span>systemctl</span><span> </span><span>start</span><span> </span><span>nginx</span></div></div><div><div><div>4</div></div><div><span># 等待 2*2=4 秒（rise=2 + interval=2）</span></div></div><div><div><div>5</div></div><div><span>sleep</span><span> </span><span>4</span></div></div><div><div><div>6</div></div><div><span># 主节点会抢回 VIP（默认抢占模式）</span></div></div><div><div><div>7</div></div><div><span>ip</span><span> </span><span>addr</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>[root@lsb-23 /etc/keepalived]#ip addr show ens32</span></div></div><div><div><div>11</div></div><div><span>2:</span><span> </span><span>ens32:</span><span> </span><span>&lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt;</span><span> </span><span>mtu</span><span> </span><span>1500</span><span> </span><span>qdisc</span><span> </span><span>pfifo_fast</span><span> </span><span>state</span><span> </span><span>UP</span><span> </span><span>group</span><span> </span><span>default</span><span> </span><span>qlen</span><span> </span><span>1000</span></div></div><div><div><div>12</div></div><div><span>    </span><span>link/ether</span><span> </span><span>00:0c:29:b4:f6:cd</span><span> </span><span>brd</span><span> </span><span>ff:ff:ff:ff:ff:ff</span></div></div><div><div><div>13</div></div><div><span>    </span><span>inet</span><span> </span><span>192.168.106.23/24</span><span> </span><span>brd</span><span> </span><span>192.168.106.255</span><span> </span><span>scope</span><span> </span><span>global</span><span> </span><span>ens32</span></div></div><div><div><div>14</div></div><div><span>       </span><span>valid_lft</span><span> </span><span>forever</span><span> </span><span>preferred_lft</span><span> </span><span>forever</span></div></div><div><div><div>15</div></div><div><span>    </span><span>inet</span><span> </span><span>192.168.106.100/24</span><span> </span><span>scope</span><span> </span><span>global</span><span> </span><span>secondary</span><span> </span><span>ens32</span></div></div><div><div><div>16</div></div><div><span>       </span><span>valid_lft</span><span> </span><span>forever</span><span> </span><span>preferred_lft</span><span> </span><span>forever</span></div></div><div><div><div>17</div></div><div><span>    </span><span>inet6</span><span> </span><span>fe80::20c:29ff:feb4:f6cd/64</span><span> </span><span>scope</span><span> </span><span>link</span></div></div><div><div><div>18</div></div><div><span>       </span><span>valid_lft</span><span> </span><span>forever</span><span> </span><span>preferred_lft</span><span> </span><span>forever</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
</li>
</ol></section><section><h3>2.3.7 适配其他服务（如 MySQL）<a href="#237-适配其他服务如-mysql"><span>#</span></a></h3><p>只需修改健康检查脚本即可，示例 MySQL 检测脚本：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>#!/bin/bash</span></div></div><div><div><div>2</div></div><div><span># 检测 MySQL 是否存活（需配置免密登录）</span></div></div><div><div><div>3</div></div><div><span>MYSQL_STATUS</span><span><span>=</span><span>$(</span></span><span>mysql</span><span> </span><span>-uroot</span><span> </span><span>-p</span><span>'你的密码'</span><span> </span><span>-e</span><span> </span><span>"select 1"</span><span> 2&gt;</span><span>/dev/null</span><span> | </span><span>wc</span><span> </span><span>-l</span><span>)</span></div></div><div><div><div>4</div></div><div><span>if</span><span> [ </span><span>$MYSQL_STATUS</span><span><span> </span><span>-eq</span><span> </span></span><span>0</span><span> ]; </span><span>then</span></div></div><div><div><div>5</div></div><div><span>    </span><span>systemctl</span><span> </span><span>stop</span><span> </span><span>keepalived</span></div></div><div><div><div>6</div></div><div><span>fi</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/lnmp%E6%9E%B6%E6%9E%84%E5%88%86%E7%A6%BB/</id>
      <title type="text">lnmp架构分离</title>
      <published>2026-04-13T00:00:00.000Z</published>
      <updated>2026-04-13T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/lnmp%E6%9E%B6%E6%9E%84%E5%88%86%E7%A6%BB/"/>
      <summary type="text">lnmp架构分离</summary>
      <content type="html"><![CDATA[<blockquote><p>文档参考：</p><ul>
<li>CentOS7 源码安装MySQL 8.0</li>
<li>CentOS7 源码安装Nginx</li>
<li>CentOS7 源码安装PHP</li>
</ul></blockquote>
<section><h1>一、前提需求<a href="#一前提需求"><span>#</span></a></h1><ul>
<li>至少准备三台机器，分别安装好nginx、mysql、php</li>
<li>各自网络互通</li>
</ul></section>
<section><h1>二、实现效果<a href="#二实现效果"><span>#</span></a></h1><p>使用lnmp架构分离来搭建wordpress博客网站，实现当访问博客网站时，nginx接受请求，若是静态资源则由nginx服务器直接处理并返回结果，若是动态资源，则将请求转发至php服务器处理，若是数据库文件则由php服务器向mysql服务器请求</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/lnmp/image-20260304164049854.png" alt="image-20260304164049854" /><figcaption>image-20260304164049854</figcaption></figure><p></p></section>
<section><h1>三、mysql服务器配置<a href="#三mysql服务器配置"><span>#</span></a></h1><section><h2>3.1 创建 WordPress 数据库和专用用户<a href="#31-创建-wordpress-数据库和专用用户"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>-- 创建数据库（名称可自定义，比如 wordpress）</span></div></div><div><div><div>2</div></div><div><span>CREATE</span><span> </span><span>DATABASE</span><span> </span><span>wordpress</span><span> </span><span>DEFAULT</span><span> </span><span>CHARACTER</span><span> </span><span>SET</span><span> utf8mb4 </span><span>COLLATE</span><span> utf8mb4_unicode_ci;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>-- 创建用户</span></div></div><div><div><div>5</div></div><div><span>CREATE</span><span> </span><span>USER</span><span> '</span><span>wordpress</span><span>'@</span><span>'%'</span><span> IDENTIFIED </span><span>BY</span><span> </span><span>'wordpress'</span><span>;</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>-- 授权该用户操作 wordpress 数据库的所有权限</span></div></div><div><div><div>8</div></div><div><span>GRANT</span><span> ALL PRIVILEGES </span><span>ON</span><span> wordpress.* </span><span>TO</span><span> </span><span>'wordpress'</span><span>@</span><span>'%'</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>-- 刷新权限</span></div></div><div><div><div>11</div></div><div><span>FLUSH PRIVILEGES;</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>-- 退出 MySQL</span></div></div><div><div><div>14</div></div><div><span>EXIT;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>3.2 修改 MySQL 配置，允许远程访问<a href="#32-修改-mysql-配置允许远程访问"><span>#</span></a></h2><p>修改编辑 MySQL 配置文件：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vim</span><span> </span><span>/data/mysql/mysql/my.cnf</span><span>  </span><span># 此为自定义的文件，具体位置根据自身机器决定</span></div></div><div><div><div>2</div></div><div><span> </span><span># 修改如下行，# 允许所有IP访问</span></div></div><div><div><div>3</div></div><div><span> </span><span>bind-address</span><span> </span><span>=</span><span> </span><span>0.0.0.0</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span> </span><span>systemctl</span><span> </span><span>restart</span><span> </span><span>mysqld</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h1>四、php服务器配置<a href="#四php服务器配置"><span>#</span></a></h1><section><h2>4.1 配置 PHP-FPM 监听ip<a href="#41-配置-php-fpm-监听ip"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vim</span><span> </span><span>/usr/local/software/php/etc/php-fpm.d/www.conf</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 修改如listen行，监听所有ip或指定监听网段</span></div></div><div><div><div>4</div></div><div><span># listen = 10.1.1.35:9000</span></div></div><div><div><div>5</div></div><div><span>listen</span><span> </span><span>=</span><span> </span><span>0.0.0.0:9000</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># （可选）在 listen 行下方添加 Nginx 服务器的 IP 白名单</span></div></div><div><div><div>8</div></div><div><span>listen.allowed_clients</span><span> </span><span>=</span><span> </span><span>10.1.1.34</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>systemctl</span><span> </span><span>restart</span><span> </span><span>php-fpm</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>4.2 下载wordpress源码<a href="#42-下载wordpress源码"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/usr/local/src</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>wget</span><span> </span><span>https://wordpress.org/wordpress-6.8.3.tar.gz</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>tar</span><span> </span><span>-xzf</span><span> </span><span>wordpress-6.8.3.tar.gz</span><span> </span><span>-C</span><span> </span><span>/usr/local/software</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 修改目录属主和属组，改为与php的www.conf配置里面的user用户一致</span></div></div><div><div><div>8</div></div><div><span>chown</span><span> </span><span>-R</span><span> </span><span>php:php</span><span> </span><span>/usr/local/software/wordpress</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 修改文件权限</span></div></div><div><div><div>11</div></div><div><span>find</span><span> </span><span>/usr/local/software/wordpress</span><span> </span><span>-type</span><span> </span><span>d</span><span> </span><span>-exec</span><span> </span><span>chmod</span><span> </span><span>755</span><span> </span><span>{}</span><span> </span><span>\;</span></div></div><div><div><div>12</div></div><div><span>find</span><span> </span><span>/usr/local/software/wordpress</span><span> </span><span>-type</span><span> </span><span>f</span><span> </span><span>-exec</span><span> </span><span>chmod</span><span> </span><span>644</span><span> </span><span>{}</span><span> </span><span>\;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>4.3 创建测试文件<a href="#43-创建测试文件"><span>#</span></a></h2><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 创建测试文件用于后续测试php与mysql的联通性</span></div></div><div><div><div>2</div></div><div><span>cd</span><span> </span><span>/usr/local/software/wordpress</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>vim</span><span> </span><span>mysql_test.php</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 粘贴如下内容</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>&lt;?php</span></div></div><div><div><div>9</div></div><div><span>//</span><span> </span><span>替换为你创建的</span><span> </span><span>MySQL</span><span> </span><span>用户名和密码及数据库</span></div></div><div><div><div>10</div></div><div><span>$conn</span><span> = mysqli_connect(</span><span>'10.1.1.30'</span><span>,</span><span> </span><span>'wordpress',</span><span> </span><span>'wordpress',</span><span> </span><span>'wordpress'</span><span>);</span></div></div><div><div><div>11</div></div><div><span>if</span><span> (</span><span>$conn</span><span>) {</span></div></div><div><div><div>12</div></div><div><span>    </span><span>echo</span><span> </span><span>"PHP 连接 MySQL 成功！"</span><span>;</span></div></div><div><div><div>13</div></div><div><span>    </span><span>mysqli_close($conn</span><span>);</span></div></div><div><div><div>14</div></div><div><span>} </span><span>else</span><span> {</span></div></div><div><div><div>15</div></div><div><span>    </span><span>echo</span><span> </span><span>"连接失败："</span><span> </span><span>.</span><span> </span><span>mysqli_connect_error</span><span>();</span></div></div><div><div><div>16</div></div><div><span>}</span></div></div><div><div><div>17</div></div><div><span>?&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section>
<section><h1>五、修改nginx服务器配置<a href="#五修改nginx服务器配置"><span>#</span></a></h1><section><h2>5.1 创建 Nginx 虚拟主机配置文件<a href="#51-创建-nginx-虚拟主机配置文件"><span>#</span></a></h2><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/opt/nginx/conf/conf.d</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 粘贴如下配置</span></div></div><div><div><div>4</div></div><div><span>#####################################</span></div></div><div><div><div>5</div></div><div><span>server</span><span> </span><span>{</span></div></div><div><div><div>6</div></div><div><span>    </span><span>listen</span><span> </span><span>10000</span><span>;</span></div></div><div><div><div>7</div></div><div><span>    </span><span>server_name</span><span> </span><span>wp.laixianshen.com</span><span>;  </span><span># 若有域名可替换，比如 blog.example.com</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>    </span><span># 静态文件目录（Nginx 本机，可放 WordPress 静态资源，也可空）</span></div></div><div><div><div>10</div></div><div><span>    </span><span>root</span><span> </span><span>/usr/local/software/wordpress</span><span>;</span></div></div><div><div><div>11</div></div><div><span>    </span><span>index</span><span> </span><span>index.php</span><span> </span><span>index.html</span><span> </span><span>index.htm</span><span>;</span></div></div><div><div><div>12</div></div><div><span>    </span><span>access_log</span><span>  </span><span>/opt/nginx/logs/wordpress_access.log</span><span>;</span></div></div><div><div><div>13</div></div><div><span>    </span><span>error_log</span><span>   </span><span>/opt/nginx/logs/wordpress_error.log</span><span> </span><span>warn</span><span>;</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>    </span><span># 新增全局 try_files 规则（核心修复）</span></div></div><div><div><div>16</div></div><div><span>    </span><span># 无论访问根路径还是其他路径，只要找不到对应文件 / 目录，就自动转发到 index.php</span></div></div><div><div><div>17</div></div><div><span>    </span><span>try_files</span><span> </span><span>$uri</span><span> </span><span>$uri</span><span>/</span><span> </span><span>/index.php</span><span>$is_args$args</span><span>;</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>    </span><span># 静态文件缓存，提升速度</span></div></div><div><div><div>21</div></div><div><span>    </span><span>location</span><span> </span><span>~</span><span>*</span><span> </span><span>\.</span><span>(</span><span>jpg</span><span>|</span><span>jpeg</span><span>|</span><span>png</span><span>|</span><span>gif</span><span>|</span><span>ico</span><span>|</span><span>css</span><span>|</span><span>js</span><span>)$ </span><span>{</span></div></div><div><div><div>22</div></div><div><span>        </span><span>expires</span><span> </span><span>30d</span><span>;  </span><span># 缓存30天</span></div></div><div><div><div>23</div></div><div><span>        </span><span>add_header</span><span> </span><span>Cache-Control</span><span> </span><span>"public, max-age=2592000"</span><span>;</span></div></div><div><div><div>24</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>25</div></div><div>
</div></div><div><div><div>26</div></div><div><span>    </span><span># 核心：转发 PHP 请求到 PHP 服务器</span></div></div><div><div><div>27</div></div><div><span>    </span><span>location</span><span> </span><span>~</span><span> </span><span>\.</span><span>php</span><span>$ </span><span>{</span></div></div><div><div><div>28</div></div><div><span>        </span><span># 指向 PHP 服务器的 IP 和端口</span></div></div><div><div><div>29</div></div><div><span>        </span><span>fastcgi_pass</span><span> </span><span>10.1.1.35:9000</span><span>;</span></div></div><div><div><div>30</div></div><div><span>        </span><span>fastcgi_index</span><span> </span><span>index.php</span><span>;</span></div></div><div><div><div>31</div></div><div><span>        </span><span># 注意：这里的 SCRIPT_FILENAME 是 PHP 服务器上的路径（/var/www/html），不是 Nginx 本机</span></div></div><div><div><div>32</div></div><div><span>        </span><span>fastcgi_param</span><span> </span><span>SCRIPT_FILENAME</span><span> </span><span>/usr/local/software/wordpress</span><span>$fastcgi_script_name</span><span>;</span></div></div><div><div><div>33</div></div><div><span>        </span><span>include</span><span> </span><span>fastcgi_params</span><span>;</span></div></div><div><div><div>34</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span>    </span><span># 禁止访问隐藏文件（比如 .htaccess）</span></div></div><div><div><div>37</div></div><div><span>    </span><span>location</span><span> </span><span>~</span><span> </span><span>/</span><span>\.</span><span>ht</span><span> </span><span>{</span></div></div><div><div><div>38</div></div><div><span>        </span><span>deny</span><span> </span><span>all</span><span>;</span></div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>40</div></div><div><span>}</span></div></div><div><div><div>41</div></div><div><span>###################################################</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span>nginx</span><span> </span><span>-t</span><span>  </span><span># 检查语法，无报错再重启</span></div></div><div><div><div>44</div></div><div><span>systemctl</span><span> </span><span>restart</span><span> </span><span>nginx</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h2>5.2 telnet测试连通性<a href="#52-telnet测试连通性"><span>#</span></a></h2><p>使用telnet来测试 Nginx服务器 到 PHP服务器 的连通性</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>telnet</span><span> </span><span>10.1.1.35</span><span> </span><span>9000</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h1>六、网站测试<a href="#六网站测试"><span>#</span></a></h1><p>使用浏览器访问nginx的ip<code>10.1.1.34:10000</code></p><p>发现可以正常访问到wordpress的安装页面，但样式不对，<code>这是因为nginx没有转发CSS、JS 等静态文件请求到php服务器上</code></p><blockquote><section><h3>1. 解决方案一：在 Nginx 服务器上部署静态资源<a href="#1-解决方案一在-nginx-服务器上部署静态资源"><span>#</span></a></h3><p><strong>同步代码</strong>：将 PHP 服务器（10.1.1.35）上的 WordPress 代码，完整复制到 Nginx 服务器（10.1.1.34）的 <code>/usr/local/software/wordpress</code> 目录下。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 在 Nginx 服务器 (10.1.1.34) 上执行</span></div></div><div><div><div>2</div></div><div><span>scp</span><span> </span><span>-r</span><span> </span><span>root@10.1.1.35:/usr/local/software/wordpress</span><span> </span><span>/usr/local/software/</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这样当需要静态文件资源时，会从nginx服务器本地获取，但问题是需要经常同步两台机器的目录，因此不推荐</p></section><section><h3>2. 解决方案二：修改 Nginx 配置，转发静态资源请求到 PHP 服务器<a href="#2-解决方案二修改-nginx-配置转发静态资源请求到-php-服务器"><span>#</span></a></h3><p>修改虚拟主机配置，修改如下参数，其余保持不变</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 全局 try_files 规则，所有找不到的文件都转发给 PHP-FPM</span></div></div><div><div><div>2</div></div><div><span>location</span><span> </span><span>/</span><span> </span><span>{</span></div></div><div><div><div>3</div></div><div><span>  </span><span>try_files</span><span> </span><span>$uri</span><span> </span><span>/index.php?</span><span>$args</span><span>;</span></div></div><div><div><div>4</div></div><div><span>}</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 静态文件缓存规则（保留）</span></div></div><div><div><div>7</div></div><div><span>location</span><span> </span><span>~</span><span>*</span><span> </span><span>\.</span><span>(</span><span>jpg</span><span>|</span><span>jpeg</span><span>|</span><span>png</span><span>|</span><span>gif</span><span>|</span><span>ico</span><span>|</span><span>css</span><span>|</span><span>js</span><span>)$ </span><span>{</span></div></div><div><div><div>8</div></div><div><span>  </span><span># 转发静态资源请求到 PHP 服务器</span></div></div><div><div><div>9</div></div><div><span>  </span><span>proxy_pass</span><span> </span><span>http://10.1.1.35</span><span>;</span></div></div><div><div><div>10</div></div><div><span>  </span><span>expires</span><span> </span><span>30d</span><span>;</span></div></div><div><div><div>11</div></div><div><span>  </span><span>add_header</span><span> </span><span>Cache-Control</span><span> </span><span>"public, max-age=2592000"</span><span>;</span></div></div><div><div><div>12</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这样nginx就可以将静态文件资源请求转发到php服务器上，但需要注意的是使用的是proxy_pass参数，所以php服务器也需要安装nginx。</p></section><section><h3>3. 使用共享存储，将存储文件分离（推荐）<a href="#3-使用共享存储将存储文件分离推荐"><span>#</span></a></h3><p>将wordpress目录分离出来，存放至nfs服务器中，nginx和php服务器通过nfs协议从nfs服务器中获取资源</p><section><h4>3.1 配置步骤<a href="#31-配置步骤"><span>#</span></a></h4><p>一台可以正常使用的nfs服务器</p><ol>
<li>配置nfs服务器</li>
</ol><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 创建共享目录</span></div></div><div><div><div>2</div></div><div><span>mkdir</span><span> </span><span>/wordpress</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 将php服务器的wordpress目录复制到nfs服务器上</span></div></div><div><div><div>5</div></div><div><span>scp</span><span> </span><span>-r</span><span> </span><span>root@10.1.1.35:/usr/local/software/wordpress/</span><span>*</span><span> </span><span>/wordpress</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 修改nfs配置文件</span></div></div><div><div><div>8</div></div><div><span>vim</span><span> </span><span>/etc/exports</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 添加如下配置</span></div></div><div><div><div>11</div></div><div><span>/wordpress</span><span> </span><span>*</span><span>(</span><span>rw,sync,no_root_squash</span><span>)</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span># 刷新配置</span></div></div><div><div><div>14</div></div><div><span>exportfs</span><span> </span><span>-ra</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>#查看已共享目录</span></div></div><div><div><div>17</div></div><div><span>showmount</span><span> </span><span>-e</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><ol>
<li>nginx和php服务器进行挂载</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 安装nfs客户端</span></div></div><div><div><div>2</div></div><div><span>yum</span><span> </span><span>install</span><span> </span><span>-y</span><span> </span><span>nfs-utils</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># nginx服务器挂载</span></div></div><div><div><div>5</div></div><div><span>[root@web-34 ~]#mount -t nfs  10.1.1.28:/wordpress /usr/local/software/wordpress/</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>#php服务器挂载</span></div></div><div><div><div>8</div></div><div><span>[root@php-35 ~]#mount -t nfs  10.1.1.28:/wordpress /usr/local/software/wordpress/</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># （可选）永久挂载，将以下文件写入到/etc/fstab</span></div></div><div><div><div>11</div></div><div><span>10.1.1.28:/wordpress</span><span>  </span><span>/usr/local/software/wordpress</span><span>  </span><span>nfs</span><span>  </span><span>defaults,_netdev,auto</span><span>  </span><span>0</span><span>  </span><span>0</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>nginx和php服务器对于共享目录的权限配置</li>
</ol><p>nginx和php服务器对于推荐改为一样的uid，这样在不同的机器中所看到的文件所属人都是他们自己，利于文件读写</p><p>以下为不同服务器显示的文件所属人</p><p>nginx 服务器：</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/lnmp/image-20260305102833374.png" alt="image-20260305102833374" /><figcaption>image-20260305102833374</figcaption></figure><p></p><p>php服务器：</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/lnmp/image-20260305102904130.png" alt="image-20260305102904130" /><figcaption>image-20260305102904130</figcaption></figure><p></p><p>nfs服务器：</p><p></p><figure><img src="https://gitee.com/lumiair/picture/raw/master/images/2026/07/17/lnmp/image-20260305103231054.png" alt="image-20260305103231054" /><figcaption>image-20260305103231054</figcaption></figure><p></p></section></section></blockquote><p>使用解决方案三后，即可正常显示wordpress中的静态文件资源及用户上传的图片资源。即使php后端修改了静态资源文件，nginx也能实时读取到</p><section><h2>6.1 进入安装页面配置mysql<a href="#61-进入安装页面配置mysql"><span>#</span></a></h2><p>打开浏览器，访问 <code>http://10.1.1.34:10000</code>（Nginx 服务器 IP），会进入 WordPress 安装向导；</p><p>选择 “简体中文”，点击 “现在就开始”；</p><p>填写数据库信息：</p><ul>
<li>数据库名：<code>wordpress</code>（第一步创建的）</li>
<li>用户名：<code>wordpress</code></li>
<li>密码：<code>wordpress</code>（你自定义的）</li>
<li>数据库主机：<code>10.1.1.30</code>（MySQL 服务器 IP）</li>
<li>表前缀：默认 <code>wp_</code> 即可</li>
</ul><p>点击 “提交”→“运行安装程序”；</p><p>填写博客标题、管理员账号 / 密码 / 邮箱，点击 “安装 WordPress”；</p><p>安装完成后，登录后台即可使用。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/rsync%E4%BD%BF%E7%94%A8/</id>
      <title type="text">rsync使用</title>
      <published>2026-04-07T00:00:00.000Z</published>
      <updated>2026-04-07T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/rsync%E4%BD%BF%E7%94%A8/"/>
      <summary type="text">rsync使用</summary>
      <content type="html"><![CDATA[<section><h2>一.rsync简介<a href="#一rsync简介"><span>#</span></a></h2><section><h3>1.什么是rsync<a href="#1什么是rsync"><span>#</span></a></h3><blockquote><ul>
<li>rsync是一款开源的、快速的、多功能的、可实现<strong>全量及增量</strong>的本地或远程数据<strong>同步备份</strong>的优秀工具。并且可以不进行改变原有数据的属性信息，实现数据的备份迁移特性。</li>
<li>rsync（remote synchronize）是Liunx/Unix下的一个远程数据同步工具。</li>
<li>它可通过LAN/WAN快速同步多台主机间的文件和目录，并适当利用rsync算法（差分编码）以减少数据的传输。</li>
<li>rsync算法并不是每一次都整份传输，而是只传输两个文件的<strong>不同部分</strong>，因此其<strong>传输速度相当快</strong></li>
</ul></blockquote></section><section><h3>2.rsync的优点<a href="#2rsync的优点"><span>#</span></a></h3><ul>
<li>可以镜像保存整个目录树和文件系统。</li>
<li>可以做到保持原来文件的权限、时间、软硬连接等。</li>
<li>无需特殊权限即可安装。</li>
<li>快速：第一次同步时rsync复制全部内容，但在下一次值传输修改过的内容</li>
<li>压缩传输：rysnc在传输的过程中可以实行压缩及解压缩操作，可以使用更少的带宽</li>
<li>安全：可以使用scp、ssh等方式来进行文件传输</li>
<li>支持匿名传输，以方便进行网站镜像</li>
<li>rsync不仅可以远程同步数据（类似于scp），而且可以本地同步数据（类似于cp），做差异同步</li>
</ul></section><section><h3>3.rsync同步的方式<a href="#3rsync同步的方式"><span>#</span></a></h3><ol>
<li><code>全量备份</code>：原有的数据全部传送，把原来的文件和新的文件一起统一传送，全量复制，效率低</li>
<li><code>差量备份</code>：备份上次完全备份以后有变化的数据（针对的是上次的完全备份，备份过程中不清除存档属性)</li>
<li><code>增量备份</code>：在传输数据之前通过算法将你有的数据和我有的数据进行对比，把不一样的数据通过网络传输增量复制，效率高</li>
</ol></section><section><h3>4.rsync的认证方式<a href="#4rsync的认证方式"><span>#</span></a></h3><blockquote><p>rsync有两种常用的认证方式，一种是<strong>rsync-daemon</strong>方式，另外一种是<strong>ssh</strong>方式。
在平时使用过程，我们使用最多的是rsync-daemon方式。
注意：在使用rsync时，服务器和客户端都必须安装rsync程序。</p></blockquote><section><h4>4.1 rsync-daemon认证<a href="#41-rsync-daemon认证"><span>#</span></a></h4><p>rsync在rsync-daemon认证方式下，默认监听TCP的<strong>873</strong>端口。</p><p><strong>rsync-daemon认证方式</strong>是rsync的<strong>主要认证方式</strong>，这个也是我们经常使用的认证方式。
并且也只有在此种模式下，rsync才可以把密码写入到一个文件中。</p><p><strong>注意：</strong>
rsync-daemon认证方式，需要服务器和客户端都安装rsync服务
并且只需要rsync服务器端启动rsync，同时配置rsync配置文件。
客户端启动不启动rsync服务，都不影响同步的正常进行。</p></section><section><h4>4.2 ssh认证<a href="#42-ssh认证"><span>#</span></a></h4><p>rsync在ssh认证方式下，可通过系统用户进行认证，即在rsync上通过ssh隧道进行传输，类似于<code>scp</code>工具。
此时同步操作不在局限于rsync中定义的同步文件夹。</p><p><strong>注意：</strong>
ssh认证方式，<strong>不需要服务器和客户端配置rsync配置文件</strong>
<strong>只需要双方都安装rsync服务，并且也不需要双方启动rsync</strong>。</p><p>若rsync服务端SSH为标准端口，此时rsync使用方式如下：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>rsync</span><span> </span><span>-avzp</span><span>  </span><span>/root/test</span><span> </span><span>root@10.10.10.10:/root/</span></div></div><div><div><div>2</div></div><div><span># 从远端服务器下载到本地</span></div></div><div><div><div>3</div></div><div><span>rsync</span><span> </span><span>-avzp</span><span> </span><span>root@10.10.10.10:/var/</span><span>  </span><span>/root/test</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>若rsync服务端SSH为非标准端口，可通过rsync的-e参数进行端口指定。使用方式如下：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>rsync</span><span> </span><span>-avz</span><span> </span><span>/root/test</span><span> </span><span>-e</span><span> </span><span>'ssh -p 1234'</span><span> </span><span>root@10.10.10.10:/root/</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>5. rsync-daemon认证配置<a href="#5-rsync-daemon认证配置"><span>#</span></a></h3><section><h4>5.1 服务端配置<a href="#51-服务端配置"><span>#</span></a></h4><ol>
<li>安装rsync</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>yum</span><span> </span><span>install</span><span> </span><span>rsync</span><span> </span><span>-y</span></div></div><div><div><div>2</div></div><div><span># 配置开机自启动</span></div></div><div><div><div>3</div></div><div><span>systemctl</span><span> </span><span>enable</span><span> </span><span>rsyncd</span></div></div><div><div><div>4</div></div><div><span>systemctl</span><span> </span><span>start</span><span> </span><span>rsyncd</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>修改配置文件</li>
</ol><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span> </span><span>编辑配置文件</span><span> </span><span>vim</span><span>  </span><span>/etc/rsyncd.conf</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>cat</span><span> &gt;&gt; </span><span>/etc/rsyncd.conf</span><span>  &lt;&lt; </span><span>EOF</span></div></div><div><div><div>4</div></div><div><span>uid = rsync</span></div></div><div><div><div>5</div></div><div><span>gid = rsync</span></div></div><div><div><div>6</div></div><div><span>port = 873</span></div></div><div><div><div>7</div></div><div><span>fake super = yes</span></div></div><div><div><div>8</div></div><div><span>use chroot = no</span></div></div><div><div><div>9</div></div><div><span>max connection = 200</span></div></div><div><div><div>10</div></div><div><span>timeout = 600</span></div></div><div><div><div>11</div></div><div><span>pid file = /var/run/rsyncd.pid</span></div></div><div><div><div>12</div></div><div><span>lock file = /var/run/rsync.lock</span></div></div><div><div><div>13</div></div><div><span>log file = /var/log/rsyncd.log</span></div></div><div><div><div>14</div></div><div><span>ignore errors</span></div></div><div><div><div>15</div></div><div><span>read only = false</span></div></div><div><div><div>16</div></div><div><span>list = yes</span></div></div><div><div><div>17</div></div><div><span>auth users = myuser</span></div></div><div><div><div>18</div></div><div><span>secrets file = /etc/rsync.passwd</span></div></div><div><div><div>19</div></div><div>
</div></div><div><div><div>20</div></div><div><span>[backup]</span></div></div><div><div><div>21</div></div><div><span>comment = backup_dir</span></div></div><div><div><div>22</div></div><div><span>path = /bakup</span></div></div><div><div><div>23</div></div><div>
</div></div><div><div><div>24</div></div><div><span>[date]</span></div></div><div><div><div>25</div></div><div><span>comment =date_dir</span></div></div><div><div><div>26</div></div><div><span>path = /test1/date</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>EOF</span></div></div><div><div><div>29</div></div><div>
</div></div><div><div><div>30</div></div><div><span> </span><span># 以用户rsync用户启动，此用户对应后续创建的无法登录shell的系统用户</span></div></div><div><div><div>31</div></div><div><span>uid</span><span> </span><span>=</span><span> </span><span>rsync</span></div></div><div><div><div>32</div></div><div><span>gid</span><span> </span><span>=</span><span> </span><span>rsync</span></div></div><div><div><div>33</div></div><div><span># 监听端口信息(默认为873)</span></div></div><div><div><div>34</div></div><div><span>port</span><span> </span><span>=</span><span> </span><span>873</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span> </span><span>#无需让rsync以root身份运行，允许接受文件的完整性</span></div></div><div><div><div>37</div></div><div><span>fake</span><span> </span><span>super</span><span> </span><span>=</span><span> </span><span>yes</span></div></div><div><div><div>38</div></div><div><span>#禁锢推送的数据至某个目录，不允许跳出该目录</span></div></div><div><div><div>39</div></div><div><span>use</span><span> </span><span>chroot</span><span> </span><span>=</span><span> </span><span>no</span></div></div><div><div><div>40</div></div><div><span> </span><span>#最大连接数</span></div></div><div><div><div>41</div></div><div><span>max</span><span> </span><span>connection</span><span> </span><span>=</span><span> </span><span>200</span></div></div><div><div><div>42</div></div><div><span>#超时时间</span></div></div><div><div><div>43</div></div><div><span>timeout</span><span> </span><span>=</span><span> </span><span>600</span></div></div><div><div><div>44</div></div><div><span> </span><span>#进程对应的进程号文件</span></div></div><div><div><div>45</div></div><div><span>pid</span><span> </span><span>file</span><span> </span><span>=</span><span> </span><span>/var/run/rsyncd.pid</span></div></div><div><div><div>46</div></div><div><span> </span><span>#锁文件</span></div></div><div><div><div>47</div></div><div><span>lock</span><span> </span><span>file</span><span> </span><span>=</span><span> </span><span>/var/run/rsync.lock</span></div></div><div><div><div>48</div></div><div><span> </span><span>#日志文件，显示出错信息</span></div></div><div><div><div>49</div></div><div><span>log</span><span> </span><span>file</span><span> </span><span>=</span><span> </span><span>/var/log/rsyncd.log</span></div></div><div><div><div>50</div></div><div><span> </span><span>#忽略错误信息</span></div></div><div><div><div>51</div></div><div><span>ignore</span><span> </span><span>errors</span></div></div><div><div><div>52</div></div><div><span>#对备份数据可读写</span></div></div><div><div><div>53</div></div><div><span>read</span><span> </span><span>only</span><span> </span><span>=</span><span> </span><span>false</span></div></div><div><div><div>54</div></div><div><span> </span><span>#允许查看模块信息</span></div></div><div><div><div>55</div></div><div><span>list</span><span> </span><span>=</span><span> </span><span>yes</span></div></div><div><div><div>56</div></div><div>
</div></div><div><div><div>57</div></div><div><span># 定义虚拟用户，作为连接认证用户,此为myuser</span></div></div><div><div><div>58</div></div><div><span>auth</span><span> </span><span>users</span><span> </span><span>=</span><span> </span><span>myuser</span></div></div><div><div><div>59</div></div><div>
</div></div><div><div><div>60</div></div><div><span>#定义rsync服务用户连接认证密码文件路径</span></div></div><div><div><div>61</div></div><div><span>secrets</span><span> </span><span>file</span><span> </span><span>=</span><span> </span><span>/etc/rsync.passwd</span></div></div><div><div><div>62</div></div><div>
</div></div><div><div><div>63</div></div><div><span>#定义模块信息，可设置多个模块，此为backup模块</span></div></div><div><div><div>64</div></div><div><span>[backup]</span></div></div><div><div><div>65</div></div><div><span>#模块注释信息</span></div></div><div><div><div>66</div></div><div><span>comment</span><span> </span><span>=</span><span> </span><span>commit</span></div></div><div><div><div>67</div></div><div><span>#定义接受备份数据目录</span></div></div><div><div><div>68</div></div><div><span>path</span><span> </span><span>=</span><span> </span><span>/bakup</span></div></div><div><div><div>69</div></div><div><span># 此为date模块</span></div></div><div><div><div>70</div></div><div><span>[date]</span></div></div><div><div><div>71</div></div><div><span>comment</span><span> </span><span>=date</span></div></div><div><div><div>72</div></div><div><span>path</span><span> </span><span>=</span><span> </span><span>/date</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>其余配置参数说明</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 在独立运行时，用于指定的服务器运行的 IP 地址</span></div></div><div><div><div>2</div></div><div><span>address</span><span> </span><span>=</span><span> </span><span>IP</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 无需让rsync以root身份运行，允许接收文件的完整属性</span></div></div><div><div><div>5</div></div><div><span>fake</span><span> </span><span>super</span><span> </span><span>=</span><span> </span><span>yes</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 指定当客户请求列出可以使用的模块列表时，该模块是否应该被列出。</span></div></div><div><div><div>8</div></div><div><span># 默认为 true，如果设置该选项为 false，可以创建隐藏的模块</span></div></div><div><div><div>9</div></div><div><span>list</span><span> </span><span>=</span><span> </span><span>false</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>模块其余参数说明</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 指定多个由空格隔开的多个文件或目录(相对路径)</span></div></div><div><div><div>2</div></div><div><span># 并将其添加到 exclude 列表中。这等同于在客户端命令中使用 –exclude 来指定模式。</span></div></div><div><div><div>3</div></div><div><span>exclude</span><span> </span><span>=</span><span> </span><span>exclude_file</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 指定一个包含 exclude 规则定义的文件名，服务器从该文件中读取 exclude 列表定义</span></div></div><div><div><div>6</div></div><div><span>exclude</span><span> </span><span>from</span><span> </span><span>=</span><span> </span><span>exclude-file.txt</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 指定多个由空格隔开的多个文件或目录(相对路径)，并将其添加到 include 列表中。</span></div></div><div><div><div>9</div></div><div><span># 这等同于在客户端命令中使用 –include 来指定模式 。</span></div></div><div><div><div>10</div></div><div><span>include</span><span> </span><span>=</span><span> </span><span>include-file.txt</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># 指定一个包含 include 规则定义的文件名，服务器从该文件中读取 include 列表定义</span></div></div><div><div><div>13</div></div><div><span>include</span><span> </span><span>from</span><span> </span><span>=</span><span> </span><span>exclude-file.txt</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span># 一个模块只能指定一个exclude 参数、一个include 参数</span></div></div><div><div><div>16</div></div><div><span># 结合 include 和 exclude 可以定义复杂的exclude/include 规则</span></div></div><div><div><div>17</div></div><div><span># 这几个参数分别与相应的rsync 客户命令选项等价，唯一不同的是它们作用在服务器端</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><ol>
<li>创建用户</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span> </span><span># 创建一个rsync进程运行时使用的普通用户 rsync</span></div></div><div><div><div>2</div></div><div><span> </span><span>useradd</span><span> </span><span>rsync</span><span> </span><span>-M</span><span> </span><span>-s</span><span> </span><span>/sbin/nologin</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>创建两个模块中的备份目录</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/backup</span><span> </span><span>/test1/date</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>修改目录所有者</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>chown</span><span> </span><span>-R</span><span> </span><span>rsync:rsync</span><span> </span><span>/backup</span><span>;</span><span>chown</span><span> </span><span>-R</span><span> </span><span>rsync:rsync</span><span> </span><span>/test1/date</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>创建rsync软件专用的账号密码</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>#服务端需要定义一个客户端连接    虚拟用户名和密码</span></div></div><div><div><div>2</div></div><div><span>#密码文件形式  user:passwd</span></div></div><div><div><div>3</div></div><div><span># 该存放密码文件的位置和名称随意，但需要与rsync.conf中的secrets file指定的路径一致</span></div></div><div><div><div>4</div></div><div><span>echo</span><span> </span><span>"myuser:123456"</span><span> &gt; </span><span>/etc/rsync.passwd</span></div></div><div><div><div>5</div></div><div><span># 降低文件权限为600，必须是600</span></div></div><div><div><div>6</div></div><div><span>chmod</span><span> </span><span>600</span><span> </span><span>/etc/rsync.passwd</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>以上配置完成，重启服务</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>systemctl</span><span> </span><span>restart</span><span> </span><span>rsyncd</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>5.2 客户端配置<a href="#52-客户端配置"><span>#</span></a></h4><blockquote><ul>
<li>在客户端安装完毕rsync服务后，是不需要启动rsync服务的。</li>
<li>我们只需要在客户端创建连接rsync服务器时，验证码用户所需要的密码文件即可。</li>
<li>账号和密码需要与<code> /etc/rsync.passwd</code>中的一致</li>
</ul></blockquote><ol>
<li>安装rsync</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>yum</span><span> </span><span>install</span><span> </span><span>rsync</span><span> </span><span>-y</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>提供密码认证</li>
</ol><p>客户端进行密码认证时有2个简便方法，默认是<strong>无密码文件，无密码变量</strong>，需要自己手动输入虚拟用户的密码</p><p><code>方式一：</code>使用密码文件，将密码写入到密码文件中，使用时调用密码文件即可</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>#密码写入到密码文件，此密码文件无位置名称限制</span></div></div><div><div><div>2</div></div><div><span>echo</span><span> </span><span>“123456</span><span>”&gt;&gt;</span><span>/etc/rsync.passwd</span></div></div><div><div><div>3</div></div><div><span>chmod</span><span> </span><span>600</span><span> </span><span>/etc/rsync.passwd</span><span>            </span><span># 修改权限，必须是660</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 查看 rsync 守护程序分配的所有 模块 列表，可以执行下面命令。</span></div></div><div><div><div>6</div></div><div><span>   </span><span>rsync</span><span> </span><span>rsync://192.168.106.29</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 使用示例参考</span></div></div><div><div><div>10</div></div><div><span>rsync</span><span> </span><span>-avzP</span><span>   </span><span>/var/nginx.log</span><span>  </span><span>账户@主机名::模块名</span></div></div><div><div><div>11</div></div><div><span>rsync</span><span> </span><span>-avzP</span><span>  </span><span>--password-file=/etc/rsync.passwd</span><span>   </span><span>/var/nginx.log</span><span>  </span><span>myuser@192.168.106.29::date</span></div></div><div><div><div>12</div></div><div><span># 从远端服务器下载文件到本地</span></div></div><div><div><div>13</div></div><div><span>rsync</span><span> </span><span>-avzP</span><span>  </span><span>--password-file=/etc/rsync.passwd</span><span>    </span><span>myuser@192.168.106.29::backup</span><span> </span><span>/etc/nginx/backup</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><code>方式二：</code>使用密码变量，<code>RSYNC_PASSWORD</code></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>export</span><span> </span><span>RSYNC_PASSWORD</span><span>=</span><span>'123456'</span><span> </span><span># 导入myuser的密码</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>rsync</span><span> </span><span>-avzP</span><span>    </span><span>/var/nginx.log</span><span>  </span><span>myuser@192.168.106.29::backup</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 撤销这个密码变量,或重启失效</span></div></div><div><div><div>6</div></div><div><span>unset</span><span> </span><span>RSYNC_PASSWORD</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/%E5%AE%9E%E6%97%B6%E5%90%8C%E6%AD%A5/</id>
      <title type="text">实时同步</title>
      <published>2026-04-05T00:00:00.000Z</published>
      <updated>2026-04-05T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/%E5%AE%9E%E6%97%B6%E5%90%8C%E6%AD%A5/"/>
      <summary type="text">intiofy-sersync-lsyncd实时同步</summary>
      <content type="html"><![CDATA[<section><h1>一、inotify+rsync实现实时同步<a href="#一inotifyrsync实现实时同步"><span>#</span></a></h1><section><h2>1.1 环境准备<a href="#11-环境准备"><span>#</span></a></h2><p>测试环境介绍：2台机器，系统Linux（centos 7）
nfs存储共享服务器<code>ip：10.1.1.28</code> （已安装nfs，rsync）
rsync备份服务器<code>ip ：10.1.1.29</code>（已安装rsync服务端）
实现效果：inotify+rsync监控nfs服务器 <code>/nfs-nginx</code>目录，有更新或修改文件后，同步至rsync备份服务器<code>/backup/</code>目录。</p></section><section><h2>1.2 inotify-tools安装使用<a href="#12-inotify-tools安装使用"><span>#</span></a></h2><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># nfs服务器安装inotify-tools工具</span></div></div><div><div><div>2</div></div><div><span>yum</span><span> </span><span>install</span><span> </span><span>inotify-tools</span><span> </span><span>-y</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 使用语法格式</span></div></div><div><div><div>5</div></div><div><span>inotifywait</span><span> [选项] 文件或目录...</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 选项参数</span></div></div><div><div><div>8</div></div><div><span>-r：递归查询目录</span></div></div><div><div><div>9</div></div><div><span>-q：打印监控时间信息</span></div></div><div><div><div>10</div></div><div><span>-m：始终保持时间监听状态</span></div></div><div><div><div>11</div></div><div><span>--excludei：</span><span> </span><span>排除文件或目录时，不区分大小写。</span></div></div><div><div><div>12</div></div><div><span>--timefmt：</span><span> </span><span>指定时间输出的格式</span></div></div><div><div><div>13</div></div><div><span>--format：</span><span> </span><span>打印使用指定的输出类似格式字符串</span></div></div><div><div><div>14</div></div><div><span># 自定义输出格式参数</span></div></div><div><div><div>15</div></div><div><span>a、</span><span> </span><span>%w：显示被监控文件的文件名；</span></div></div><div><div><div>16</div></div><div><span>b、</span><span> </span><span>%f：如果发生某事件的对象是目录，则显示被监控目录的名字；默认显示为空串；</span></div></div><div><div><div>17</div></div><div><span>c、</span><span> </span><span>%T：使用--timefmt</span><span> </span><span>选项中自定义的时间格式；</span></div></div><div><div><div>18</div></div><div><span>d、</span><span> </span><span>%e</span><span> </span><span>表示发生的事件</span></div></div><div><div><div>19</div></div><div><span>e、</span><span> </span><span>%Xe</span><span> </span><span>事件以“X”分隔</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span># -e：指定需要监控的事件</span></div></div><div><div><div>22</div></div><div><span>access：</span><span> </span><span>文件或目录被读取</span></div></div><div><div><div>23</div></div><div><span>modify：</span><span> </span><span>文件或目录内容被修改</span></div></div><div><div><div>24</div></div><div><span>attrib：</span><span> </span><span>文件或目录属性被改变</span></div></div><div><div><div>25</div></div><div><span>close：</span><span> </span><span>文件或目录封闭，无论读/写模式</span></div></div><div><div><div>26</div></div><div><span>open：文件或目录被打开</span></div></div><div><div><div>27</div></div><div><span>move_to：文件或目录被移动到另外一个目录</span></div></div><div><div><div>28</div></div><div><span>move：文件或目录被移动另一个目录或从另一个目录移动到当前目录</span></div></div><div><div><div>29</div></div><div><span>create：文件或目录被创建在当前目录</span></div></div><div><div><div>30</div></div><div><span>delete：文件或目录被删除</span></div></div><div><div><div>31</div></div><div><span>unmount：文件系统被卸载</span></div></div><div><div><div>32</div></div><div><span>常用组合：close_write,modify,delete,create,attrib</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>测试inotify使用</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 打开两个窗口，一个窗口执行命令</span></div></div><div><div><div>2</div></div><div><span>inotifywait</span><span> </span><span>-mrq</span><span> </span><span>--timefmt</span><span> </span><span>'%Y-%m-%d %H:%M'</span><span> </span><span>--format</span><span> </span><span>'%T %w %f 事件：%e'</span><span> </span><span>-e</span><span> </span><span>create</span><span> </span><span>delete</span><span> </span><span>modify</span><span> </span><span>/nfs-nginx</span></div></div><div><div><div>3</div></div><div><span># 另一个窗口在监控目录下创建文件</span></div></div><div><div><div>4</div></div><div><span>touch</span><span> </span><span>hello.txt</span></div></div><div><div><div>5</div></div><div><span># 看到如下信息表示监控成功</span></div></div><div><div><div>6</div></div><div><span>2026-01-15</span><span> </span><span>11:51</span><span> </span><span>/nfs-nginx/</span><span> </span><span>hello.txt</span><span> </span><span>事件：CREATE</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>1.3 编写监控脚本<a href="#13-编写监控脚本"><span>#</span></a></h2><p>编写脚本前提：需要在服务端中提前搭建好rsync服务端，配置好相应的配置文件</p><p>以下为监控脚本：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vim</span><span> </span><span>/etc/rsync-inotify.sh</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>#!/bin/bash</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># ================== 配置区 ==================</span></div></div><div><div><div>4</div></div><div><span>LOCAL_DIR</span><span>=</span><span>"/nfs-nginx"</span><span>          </span><span># 本地监控目录（绝对路径）</span></div></div><div><div><div>5</div></div><div><span>RSYNC_MODULE</span><span>=</span><span>"backup"</span><span>                 </span><span># rsyncd.conf 中定义的模块名</span></div></div><div><div><div>6</div></div><div><span>RSYNC_USER</span><span>=</span><span>"myuser"</span><span>                   </span><span># rsync 用户名（auth users 中定义）</span></div></div><div><div><div>7</div></div><div><span>RSYNC_HOST</span><span>=</span><span>"10.1.1.29"</span><span>            </span><span># rsync 服务器 IP 或域名</span></div></div><div><div><div>8</div></div><div><span>RSYNC_PASSWORD_FILE</span><span>=</span><span>"/etc/rsync.passwd"</span><span>  </span><span># 密码文件路径（chmod 600）</span></div></div><div><div><div>9</div></div><div><span># srsync 备份参数</span></div></div><div><div><div>10</div></div><div><span>RSYNC_OPTS</span><span>=</span><span>"-avz --delete --password-file=</span><span>$RSYNC_PASSWORD_FILE</span><span>"</span></div></div><div><div><div>11</div></div><div><span># inotify 事件参数</span></div></div><div><div><div>12</div></div><div><span>INOTIFY_EVENTS</span><span>=</span><span>"create,modify,delete,move,attrib"</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span># ===========================================</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span># 检查依赖</span></div></div><div><div><div>17</div></div><div><span>if</span><span> ! </span><span>command</span><span> </span><span>-v</span><span> </span><span>inotifywait</span><span> &amp;&gt; /dev/null; </span><span>then</span></div></div><div><div><div>18</div></div><div><span>    </span><span>echo</span><span> </span><span>"错误: inotifywait 未安装，请先安装 inotify-tools"</span></div></div><div><div><div>19</div></div><div><span>    </span><span>exit</span><span> </span><span>1</span></div></div><div><div><div>20</div></div><div><span>fi</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>if</span><span><span> [ </span><span>!</span><span> </span><span>-f</span><span> </span></span><span>"</span><span>$RSYNC_PASSWORD_FILE</span><span>"</span><span> ]; </span><span>then</span></div></div><div><div><div>23</div></div><div><span>    </span><span>echo</span><span> </span><span>"错误: 密码文件不存在: </span><span>$RSYNC_PASSWORD_FILE</span><span>"</span></div></div><div><div><div>24</div></div><div><span>    </span><span>echo</span><span> </span><span>"请创建该文件并写入密码，然后执行: chmod 600 </span><span>$RSYNC_PASSWORD_FILE</span><span>"</span></div></div><div><div><div>25</div></div><div><span>    </span><span>exit</span><span> </span><span>1</span></div></div><div><div><div>26</div></div><div><span>fi</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>if</span><span><span> [ </span><span>!</span><span> </span><span>-d</span><span> </span></span><span>"</span><span>$LOCAL_DIR</span><span>"</span><span> ]; </span><span>then</span></div></div><div><div><div>29</div></div><div><span>    </span><span>echo</span><span> </span><span>"错误: 本地目录不存在: </span><span>$LOCAL_DIR</span><span>"</span></div></div><div><div><div>30</div></div><div><span>    </span><span>exit</span><span> </span><span>1</span></div></div><div><div><div>31</div></div><div><span>fi</span></div></div><div><div><div>32</div></div><div>
</div></div><div><div><div>33</div></div><div><span># 确保路径以 / 结尾</span></div></div><div><div><div>34</div></div><div><span>[[ </span><span>"</span><span>$LOCAL_DIR</span><span>"</span><span><span> </span><span>!=</span><span> */ ]] &amp;&amp; </span></span><span>LOCAL_DIR</span><span>=</span><span>"</span><span>$LOCAL_DIR</span><span>/"</span></div></div><div><div><div>35</div></div><div>
</div></div><div><div><div>36</div></div><div><span># myuser@10.1.1.29::backup</span></div></div><div><div><div>37</div></div><div><span>REMOTE_TARGET</span><span>=</span><span>"</span><span><span>${</span><span>RSYNC_USER</span><span>}</span></span><span>@</span><span><span>${</span><span>RSYNC_HOST</span><span>}</span></span><span>::</span><span><span>${</span><span>RSYNC_MODULE</span><span>}</span></span><span>"</span></div></div><div><div><div>38</div></div><div>
</div></div><div><div><div>39</div></div><div><span>echo</span><span> </span><span>"监控目录: </span><span>$LOCAL_DIR</span><span>"</span></div></div><div><div><div>40</div></div><div><span>echo</span><span> </span><span>"同步目标: </span><span>$REMOTE_TARGET</span><span>"</span></div></div><div><div><div>41</div></div><div><span>echo</span><span> </span><span>"按 Ctrl+C 停止..."</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span># 初始全量同步</span></div></div><div><div><div>44</div></div><div><span>echo</span><span> </span><span>"执行初始同步..."</span></div></div><div><div><div>45</div></div><div><span># rsync -avz --delete --password-file=/etc/rsync.passwd /nfs-nginx myuser@10.1.1.29::backup</span></div></div><div><div><div>46</div></div><div><span>if</span><span> </span><span>rsync</span><span> </span><span>$RSYNC_OPTS</span><span> </span><span>"</span><span>$LOCAL_DIR</span><span>"</span><span> </span><span>"</span><span>$REMOTE_TARGET</span><span>"</span><span>; </span><span>then</span></div></div><div><div><div>47</div></div><div><span>    </span><span>echo</span><span> </span><span>"初始同步完成"</span></div></div><div><div><div>48</div></div><div><span>else</span></div></div><div><div><div>49</div></div><div><span>    </span><span>echo</span><span> </span><span>"初始同步失败，请检查网络、权限或 rsync 服务配置"</span></div></div><div><div><div>50</div></div><div><span>    </span><span>exit</span><span> </span><span>1</span></div></div><div><div><div>51</div></div><div><span>fi</span></div></div><div><div><div>52</div></div><div>
</div></div><div><div><div>53</div></div><div><span># 开始实时监控</span></div></div><div><div><div>54</div></div><div><span>echo</span><span> </span><span>"开始监听文件系统事件..."</span></div></div><div><div><div>55</div></div><div><span>inotifywait</span><span> </span><span>-m</span><span> </span><span>-r</span><span> </span><span>-e</span><span> </span><span>$INOTIFY_EVENTS</span><span>  </span><span>--timefmt</span><span> </span><span>'%Y-%m-%d %H:%M'</span><span> </span><span>--format</span><span> </span><span>'%T %w %f 事件：%e'</span><span> </span><span>"</span><span>$LOCAL_DIR</span><span>"</span><span> | </span><span>while</span><span> </span><span>read</span><span> </span><span>filepath</span><span> </span><span>event</span><span>; </span><span>do</span></div></div><div><div><div>56</div></div><div><span>    </span><span>echo</span><span> </span><span>"$(</span><span>date</span><span> '+%Y-%m-%d %H:%M:%S') 检测到变更: </span><span>$filepath</span><span> (</span><span>$event</span><span>)"</span></div></div><div><div><div>57</div></div><div>
</div></div><div><div><div>58</div></div><div><span>    </span><span># 执行增量同步（整个目录，由 rsync 处理差异）</span></div></div><div><div><div>59</div></div><div><span>    </span><span>if</span><span> </span><span>rsync</span><span> </span><span>$RSYNC_OPTS</span><span> </span><span>"</span><span>$LOCAL_DIR</span><span>"</span><span> </span><span>"</span><span>$REMOTE_TARGET</span><span>"</span><span>; </span><span>then</span></div></div><div><div><div>60</div></div><div><span>        </span><span>echo</span><span> </span><span>"同步成功"</span></div></div><div><div><div>61</div></div><div><span>    </span><span>else</span></div></div><div><div><div>62</div></div><div><span>        </span><span>echo</span><span> </span><span>"同步失败！请检查 rsync 服务状态或认证信息"</span></div></div><div><div><div>63</div></div><div><span>    </span><span>fi</span></div></div><div><div><div>64</div></div><div><span>done</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><section><h3>1.3.1 修改文件权限，修改脚本后台运行<a href="#131-修改文件权限修改脚本后台运行"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>chmod</span><span> </span><span>755</span><span> </span><span>/etc/rsync-inotify.sh</span></div></div><div><div><div>2</div></div><div><span># 后台运行,并写入日志</span></div></div><div><div><div>3</div></div><div><span>nohup</span><span> </span><span>/etc/rsync-inotify.sh</span><span> &gt; </span><span>/etc/rsync-inotify.log</span><span> 2&gt;&amp;1 &amp;</span></div></div><div><div><div>4</div></div><div><span># 查看日志信息</span></div></div><div><div><div>5</div></div><div><span>tail</span><span> </span><span>-f</span><span> </span><span>rsync-inotify.log</span></div></div><div><div><div>6</div></div><div><span># 查看进程</span></div></div><div><div><div>7</div></div><div><span>ps</span><span> </span><span>-ef</span><span> | </span><span>grep</span><span> </span><span>"rsync-inotify.sh"</span></div></div><div><div><div>8</div></div><div><span># 结束运行</span></div></div><div><div><div>9</div></div><div><span>kill</span><span> </span><span>进程号</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.3.2 测试<a href="#132-测试"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 在nfs的/etc/nginx文件夹中创建文件，查看是否同步过去</span></div></div><div><div><div>2</div></div><div><span>touch</span><span> </span><span>nihao.txt</span></div></div><div><div><div>3</div></div><div><span># 删除文件</span></div></div><div><div><div>4</div></div><div><span>rm</span><span> </span><span>-rf</span><span> </span><span>nihao.txt</span></div></div><div><div><div>5</div></div><div><span># 查看日志</span></div></div><div><div><div>6</div></div><div><span>vim</span><span> </span><span>/etc/rsync-iontify.log</span></div></div><div><div><div>7</div></div><div><span># 查看rsync服务端是否接收到了文件</span></div></div><div><div><div>8</div></div><div><span>cd</span><span> </span><span>/backup</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.3.3 创建systemd服务文件,实现脚本开机自启（可选）<a href="#133-创建systemd服务文件实现脚本开机自启可选"><span>#</span></a></h3><div><div><div><figure><figcaption><span>/etc/systemd/system/inotify-rsync.service</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vim</span><span> </span><span>/etc/systemd/system/inotify-rsync.service</span></div></div><div><div><div>2</div></div><div><span>[Unit]</span></div></div><div><div><div>3</div></div><div><span>Description</span><span>=</span><span>Inotify</span><span> </span><span>+</span><span> </span><span>Rsync</span><span> </span><span>Realtime</span><span> </span><span>Sync</span></div></div><div><div><div>4</div></div><div><span>Requires</span><span>=</span><span>rsyncd.service</span></div></div><div><div><div>5</div></div><div><span>After</span><span>=</span><span>rsyncd.service</span><span> </span><span>network.target</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>[Service]</span></div></div><div><div><div>8</div></div><div><span>Type</span><span>=</span><span>simple</span></div></div><div><div><div>9</div></div><div><span>User</span><span>=</span><span>root</span></div></div><div><div><div>10</div></div><div><span>ExecStart</span><span>=</span><span>/bin/bash</span><span> </span><span>/etc/rsync-inotify.sh</span></div></div><div><div><div>11</div></div><div><span>Restart</span><span>=</span><span>always</span></div></div><div><div><div>12</div></div><div><span>RestartSec</span><span>=</span><span>5</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>[Install]</span></div></div><div><div><div>15</div></div><div><span>WantedBy</span><span>=</span><span>multi-user.target</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>自启动服务</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>systemctl</span><span> </span><span>daemon-reload</span></div></div><div><div><div>2</div></div><div><span>systemctl</span><span> </span><span>enable</span><span> </span><span>--now</span><span> </span><span>inotify-rsync.service</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>1.4 修改inotify默认参数（可选）<a href="#14-修改inotify默认参数可选"><span>#</span></a></h2><p>inotify默认内核参数值太小，分别就是
查看系统默认参数值</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sysctl</span><span> </span><span>-a</span><span> | </span><span>grep</span><span> </span><span>max_queued_events</span></div></div><div><div><div>2</div></div><div><span>结果是：fs.inotify.max_queued_events</span><span> </span><span>=</span><span> </span><span>16384</span></div></div><div><div><div>3</div></div><div><span>sysctl</span><span> </span><span>-a</span><span> | </span><span>grep</span><span> </span><span>max_user_watches</span></div></div><div><div><div>4</div></div><div><span>结果是：fs.inotify.max_user_watches</span><span> </span><span>=</span><span> </span><span>8192</span></div></div><div><div><div>5</div></div><div><span>sysctl</span><span> </span><span>-a</span><span> | </span><span>grep</span><span> </span><span>max_user_instances</span></div></div><div><div><div>6</div></div><div><span>结果是：fs.inotify.max_user_instances</span><span> </span><span>=</span><span> </span><span>128</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>修改参数命令</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sysctl</span><span> </span><span>-w</span><span> </span><span>fs.inotify.max_queued_events="99999999"</span></div></div><div><div><div>2</div></div><div><span>sysctl</span><span> </span><span>-w</span><span> </span><span>fs.inotify.max_user_watches="99999999"</span></div></div><div><div><div>3</div></div><div><span>sysctl</span><span> </span><span>-w</span><span> </span><span>fs.inotify.max_user_instances="65535"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>并在sysctl.conf文件添加以下内容</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vim</span><span>   </span><span>/etc/sysctl.conf</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>fs.inotify.max_queued_events</span><span>=99999999</span></div></div><div><div><div>4</div></div><div><span>fs.inotify.max_user_watches</span><span>=99999999</span></div></div><div><div><div>5</div></div><div><span>fs.inotify.max_user_instances</span><span>=65535</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>保存退出完成。</p><p><strong>参数说明：</strong>
max_queued_events：
inotify队列最大长度，如果值太小，会出现”** Event Queue Overflow **“错误，导致监控文件不准确</p><p>max_user_watches：
设置inotifywait或inotifywatch命令可以监视的文件数量（单进程）</p><p>max_user_instances：
每个用户创建inotify实例最大值
【inotify在实际生产环境中，对于50-200KB的文件，inotify的最发并发量为200-300，如果客户端写入速度大于这个量，将会造成短暂的延迟】</p></section></section>
<section><h1>二、sersync+rsync实现实时同步<a href="#二sersyncrsync实现实时同步"><span>#</span></a></h1><section><h2>2.1 sersync简介<a href="#21-sersync简介"><span>#</span></a></h2><p>sersync是基于inotify开发的，类似于inotify-tools的工具。所以同样内核需先支持inotify，才能搭建。</p><p>sersync可以记录下被监听目录中发生变化的（包括增加、删除、修改）具体某一个文件或者某一个目录的名字，然后使用rsync同步的时候，只同步发生变化的文件或者目录。</p><p>相对于inotify-tools遍历更快，在同步大量数据时更有优势，搭建更快，无需额外编写脚本。</p></section><section><h2>2.2 sersync安装<a href="#22-sersync安装"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/usr/local</span></div></div><div><div><div>2</div></div><div><span>wget</span><span> </span><span>https://github.com/wsgzao/sersync/raw/refs/heads/master/sersync2.5.4_64bit_binary_stable_final.tar.gz</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 解压</span></div></div><div><div><div>5</div></div><div><span>tar</span><span> </span><span>-xvf</span><span> </span><span>sersync2.5.4_64bit_binary_stable_final.tar.gz</span></div></div><div><div><div>6</div></div><div><span># 修改名字</span></div></div><div><div><div>7</div></div><div><span>mv</span><span> </span><span>./GNU-Linux-x86/</span><span>  </span><span>sersync</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>cd</span><span> </span><span>sersync</span></div></div><div><div><div>10</div></div><div><span>cp</span><span> </span><span>confxml.xml</span><span> </span><span>confxml.xml-bak</span><span>     </span><span>#备份原文件</span></div></div><div><div><div>11</div></div><div><span>vim</span><span> </span><span>confxml.xml</span><span>            </span><span>#编辑，修改下面的代码</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h3>2.1 修改serync区块内容<a href="#21-修改serync区块内容"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span> </span><span>&lt;sersync&gt;</span></div></div><div><div><div>2</div></div><div><span>     </span><span># 这里填写nfs存储服务器（源服务器）要同步的文件夹路径。</span></div></div><div><div><div>3</div></div><div><span>        </span><span>&lt;localpath</span><span> </span><span>watch="/nfs-nginx"&gt;</span></div></div><div><div><div>4</div></div><div><span>          </span><span># 填写对端ip，即rsync的ip及模块名，可配置多个对端服务器</span></div></div><div><div><div>5</div></div><div><span>            </span><span>&lt;remote</span><span> </span><span>ip="10.1.1.29"</span><span> </span><span>name="backup"/&gt;</span></div></div><div><div><div>6</div></div><div><span>            </span><span>&lt;!--</span><span>&lt;remote </span><span>ip="192.168.8.39"</span><span> </span><span>name="tongbu"/&gt;-</span><span>-&gt;</span></div></div><div><div><div>7</div></div><div><span>            </span><span>&lt;!--</span><span>&lt;remote </span><span>ip="192.168.8.40"</span><span> </span><span>name="tongbu"/&gt;-</span><span>-&gt;</span></div></div><div><div><div>8</div></div><div><span>        </span><span>&lt;/localpath&gt;</span></div></div><div><div><div>9</div></div><div><span>        </span><span>&lt;rsync&gt;</span></div></div><div><div><div>10</div></div><div><span>          </span><span># 此为rsync的选项参数</span></div></div><div><div><div>11</div></div><div><span>            </span><span>&lt;commonParams</span><span> </span><span>params="-avz --delete"/&gt;</span></div></div><div><div><div>12</div></div><div><span>            </span><span>#启用密码认证，配置auth users+密码文件路径，rsync备份服务器的认证信息。</span></div></div><div><div><div>13</div></div><div><span>            </span><span>&lt;auth</span><span> </span><span>start="true"</span><span> </span><span>users="myuser"</span><span> </span><span>passwordfile="/etc/rsync.passwd"/&gt;</span></div></div><div><div><div>14</div></div><div><span>            </span><span># 指定 rsync 服务的自定义端口，通常不修改</span></div></div><div><div><div>15</div></div><div><span>            </span><span>&lt;userDefinedPort</span><span> </span><span>start="false"</span><span> </span><span>port="874"/&gt;&lt;!--</span><span> </span><span>port=</span><span>874</span><span> </span><span>--&gt;</span></div></div><div><div><div>16</div></div><div><span>            </span><span># 设置 rsync 命令的超时时间（秒）</span></div></div><div><div><div>17</div></div><div><span>            </span><span>&lt;timeout</span><span> </span><span>start="false"</span><span> </span><span>time="100"/&gt;&lt;!--</span><span> </span><span>timeout=</span><span>100</span><span> </span><span>--&gt;</span></div></div><div><div><div>18</div></div><div><span>            </span><span># 是否使用 SSH 模式，否为daemon模式</span></div></div><div><div><div>19</div></div><div><span>            </span><span>&lt;ssh</span><span> </span><span>start="false"/&gt;</span></div></div><div><div><div>20</div></div><div><span>        </span><span>&lt;/rsync&gt;</span></div></div><div><div><div>21</div></div><div><span>        </span><span># 当同步失败时，sersync 会将失败的 rsync 命令写入 path 指定的脚本文件 默认60分钟执行一次脚本</span></div></div><div><div><div>22</div></div><div><span>        </span><span>&lt;failLog</span><span> </span><span>path="/tmp/rsync_fail_log.sh"</span><span> </span><span>timeToExecute="60"/&gt;&lt;!--default</span><span> </span><span>every</span><span> </span><span>60mins</span><span> </span><span>execute</span><span> </span><span>once--&gt;</span></div></div><div><div><div>23</div></div><div><span>        </span><span># 定期全量同步，默认600分钟</span></div></div><div><div><div>24</div></div><div><span>        </span><span>&lt;crontab</span><span> </span><span>start="false"</span><span> </span><span>schedule="600"&gt;&lt;!--600mins--&gt;</span></div></div><div><div><div>25</div></div><div><span>          </span><span># 同步时文件过滤</span></div></div><div><div><div>26</div></div><div><span>            </span><span>&lt;crontabfilter</span><span> </span><span>start="false"&gt;</span></div></div><div><div><div>27</div></div><div><span>                </span><span>&lt;exclude</span><span> </span><span>expression="*.php"&gt;&lt;/exclude&gt;</span></div></div><div><div><div>28</div></div><div><span>                </span><span>&lt;exclude</span><span> </span><span>expression="info/*"&gt;&lt;/exclude&gt;</span></div></div><div><div><div>29</div></div><div><span>            </span><span>&lt;/crontabfilter&gt;</span></div></div><div><div><div>30</div></div><div><span>        </span><span>&lt;/crontab&gt;</span></div></div><div><div><div>31</div></div><div><span>        </span><span>#启用插件机制（如同步后执行自定义命令）</span></div></div><div><div><div>32</div></div><div><span>        </span><span>#name="command"：表示使用命令插件（可在文件变动后触发 shell 命令）</span></div></div><div><div><div>33</div></div><div><span>        </span><span>&lt;plugin</span><span> </span><span>start="false"</span><span> </span><span>name="command"/&gt;</span></div></div><div><div><div>34</div></div><div><span>    </span><span>&lt;/sersync&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section><section><h2>2.2 开启sersync守护进程同步数据并测试程序<a href="#22-开启sersync守护进程同步数据并测试程序"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>/usr/local/sersync/sersync2</span><span>  </span><span>-d</span><span> </span><span>-r</span><span> </span><span>-o</span><span> </span><span>/usr/local/sersync/confxml.xml</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>参数用法：</span></div></div><div><div><div>4</div></div><div><span>-d:启用守护进程模式</span></div></div><div><div><div>5</div></div><div><span>-r:在监控前，将监控目录与远程主机用rsync命令推送一遍</span></div></div><div><div><div>6</div></div><div><span>-n:</span><span> </span><span>指定开启守护线程的数量，默认为10个</span></div></div><div><div><div>7</div></div><div><span>-o:指定配置文件，默认使用confxml.xml文件</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span># 查看守护进程是否开启</span></div></div><div><div><div>11</div></div><div><span>[root@nfs-28 /usr/local/sersync]#ps -ef | </span><span>grep</span><span> </span><span>"sersync"</span></div></div><div><div><div>12</div></div><div><span>root</span><span>      </span><span>21495</span><span>      </span><span>1</span><span>  </span><span>0</span><span> </span><span>16:17</span><span> </span><span>?</span><span>        </span><span>00:00:00</span><span> </span><span>/usr/local/sersync/sersync2</span><span> </span><span>-d</span><span> </span><span>-r</span><span> </span><span>-o</span><span> </span><span>/usr/local/sersync/confxml.xml</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>查看rsync服务器是否同步过来</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/backup</span></div></div><div><div><div>2</div></div><div><span>ls</span></div></div><div><div><div>3</div></div><div><span># 在nfs客户端的/nfs-nginx/创建文件</span></div></div><div><div><div>4</div></div><div><span>touch</span><span> </span><span>hello.txt</span></div></div><div><div><div>5</div></div><div><span># 再次查看是否同步过来，删除后呢</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>2.3 配置sersync环境变量并开机启动<a href="#23-配置sersync环境变量并开机启动"><span>#</span></a></h2><p>配置环境变量</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>echo</span><span>"PATH=</span><span>$PATH</span><span>:/usr/local/sersync/"</span><span>&gt;&gt;</span><span>/etc/profile</span></div></div><div><div><div>2</div></div><div><span>source</span><span> </span><span>/etc/profile</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>将命令添加到/etc/rc.local，实现开机启动：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>echo</span><span> </span><span>'/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/conf/confxml.xml'</span><span> &gt;&gt; </span><span>/etc/rc.local</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h1>三、lsyncd实现实时同步<a href="#三lsyncd实现实时同步"><span>#</span></a></h1><section><h2>3.1 lsyncd简介<a href="#31-lsyncd简介"><span>#</span></a></h2><p>Lysncd 实际上是lua语言封装了 inotify 和 rsync 工具，采用了 Linux 内核（2.6.13 及以后）里的 inotify 触发机制，然后通过rsync去差异同步，达到实时的效果。我认为它最令人称道的特性是，完美解决了 inotify + rsync海量文件同步带来的文件频繁发送文件列表的问题&lt;通过时间延迟或累计触发事件次数实现&gt;。另外，它的配置方式很简单，lua本身就是一种配置语言，可读性非常强。lsyncd也有多种工作模式可以选择，本地目录cp，本地目录rsync，远程目录rsyncssh。 实现简单高效的本地目录同步备份（网络存储挂载也当作本地目录），一个命令搞定。</p></section><section><h2>3.2 安装配置<a href="#32-安装配置"><span>#</span></a></h2><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>yum</span><span> </span><span>install</span><span> </span><span>lsyncd</span><span> </span><span>-y</span></div></div><div><div><div>2</div></div><div><span># 配置文件路径</span></div></div><div><div><div>3</div></div><div><span>vim</span><span> </span><span>/etc/lsyncd.conf</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 文件参数说明</span></div></div><div><div><div>6</div></div><div><span># -- 全局配置：</span></div></div><div><div><div>7</div></div><div><span>settings</span><span> </span><span>{</span></div></div><div><div><div>8</div></div><div><span>        </span><span>logfile</span><span> </span><span>="/var/log/lsyncd/lsyncd.log",</span><span> </span><span># -- 定义日志文件</span></div></div><div><div><div>9</div></div><div><span>        </span><span>statusFile</span><span> </span><span>="/var/log/lsyncd/lsyncd.status",</span><span>  </span><span># -- 定义状态文件</span></div></div><div><div><div>10</div></div><div><span>        </span><span>pidfile</span><span> </span><span>=</span><span> </span><span>"/var/log/lsyncd/lsyncd.pid",#</span><span> </span><span>--</span><span> </span><span>定义pid文件</span></div></div><div><div><div>11</div></div><div><span>        </span><span>inotifyMode</span><span> </span><span>=</span><span> </span><span>"CloseWrite",#</span><span> </span><span>--</span><span> </span><span>指定inotify监控的事件，默认是CloseWrite，还可以是Modify或CloseWrite</span><span> </span><span>or</span><span> </span><span>Modify</span></div></div><div><div><div>12</div></div><div><span>        </span><span>maxProcesses</span><span> </span><span>=</span><span> </span><span>7,#</span><span> </span><span>--</span><span> </span><span>同步进程的最大个数。假如同时有20个文件需要同步，而maxProcesses</span><span> </span><span>=</span><span> </span><span>8，则最大能看到有8个rysnc进程</span></div></div><div><div><div>13</div></div><div><span>        </span><span>nodaemon</span><span> </span><span>=</span><span>true</span><span>,#</span><span> </span><span>--</span><span> </span><span>表示不启用守护模式，默认；</span></div></div><div><div><div>14</div></div><div><span>        </span><span>maxDelays</span><span> </span><span>=</span><span> </span><span>1,</span><span> </span><span># --  累计到多少所监控的事件激活一次同步，即使后面的delay延迟时间还未到</span></div></div><div><div><div>15</div></div><div><span>        </span><span>inist</span><span> </span><span>=</span><span> </span><span>ture</span><span> </span><span># --keep running at startup although one or more targets failed due to not being reachable.  一般不用配置</span></div></div><div><div><div>16</div></div><div><span><span>       </span></span><span>}</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span># -- sync部分配置：</span></div></div><div><div><div>19</div></div><div><span>sync</span><span> </span><span>{</span></div></div><div><div><div>20</div></div><div><span>      </span><span>default.rsync,</span><span>     </span><span># -- rsync、rsyncssh、direct三种模式：</span></div></div><div><div><div>21</div></div><div><span>    </span><span># -- default.rsync ：本地目录间同步，使用rsync，也可以达到使用ssh形式的远程rsync效果，或daemon方式连接远程rsyncd进程；</span></div></div><div><div><div>22</div></div><div><span>    </span><span># -- default.direct ：本地目录间同步，使用cp、rm等命令完成差异文件备份；</span></div></div><div><div><div>23</div></div><div><span>    </span><span># -- default.rsyncssh ：同步到远程主机目录，rsync的ssh模式，需要使用key来认证；</span></div></div><div><div><div>24</div></div><div><span>      </span><span>source</span><span> </span><span>=</span><span> </span><span>"/tmp/src",</span><span> </span><span># -- source 同步的源目录，使用绝对路径</span></div></div><div><div><div>25</div></div><div><span>      </span><span>target</span><span> </span><span>=</span><span> </span><span>"/tmp/dest",</span><span> </span><span># -- target 定义目的地址.对应不同的模式有几种写法:</span></div></div><div><div><div>26</div></div><div><span>      </span><span># -- /tmp/dest ：本地目录同步，可用于direct和rsync模式；</span></div></div><div><div><div>27</div></div><div><span>      </span><span># -- 10.4.7.10:/tmp/dest ：同步到远程服务器目录，可用于rsync和rsyncssh模式，拼接的命令类似于/usr/bin/rsync -ltsd --delete --include-from=- --exclude=* SOURCE TARGET，剩下的就是rsync的内容了，比如指定username，免密码同步；</span></div></div><div><div><div>28</div></div><div><span>       </span><span># -- 10.4.7.10::module ：同步到远程服务器目录，用于rsync模式；</span></div></div><div><div><div>29</div></div><div><span>      </span><span>init</span><span> </span><span>=</span><span> </span><span>true</span><span>,</span><span>  </span><span># -- init 这是一个优化选项，当init = false，只同步进程启动以后发生改动事件的文件，原有的目录即使有差异也不会同步。默认是true；</span></div></div><div><div><div>30</div></div><div><span>      </span><span>delay</span><span> </span><span>=</span><span> </span><span>3,</span><span> </span><span># -- delay 累计事件，等待rsync同步延时时间，默认15秒（最大累计到1000个不可合并的事件）。也就是15s内监控目录下发生的改动，会累积到一次rsync同步，避免过于频繁的同步。（可合并的意思是，15s内两次修改了同一文件，最后只同步最新的文件）;</span></div></div><div><div><div>31</div></div><div><span>      </span><span>excludeFrom</span><span> </span><span>=</span><span> </span><span>"/etc/rsyncd.d/rsync_exclude.lst",</span><span>  </span><span># -- excludeFrom 排除选项，后面指定排除的列表文件，如excludeFrom = "/etc/lsyncd.exclude"，如果是简单的排除，可以使用exclude = LIST。这里的排除规则写法与原生rsync有点不同，更为简单：</span></div></div><div><div><div>32</div></div><div><span>    </span><span># -- 监控路径里的任何部分匹配到一个文本，都会被排除，例如/bin/foo/bar可以匹配规则foo</span></div></div><div><div><div>33</div></div><div><span>    </span><span># -- 如果规则以斜线/开头，则从头开始要匹配全部</span></div></div><div><div><div>34</div></div><div><span>    </span><span># -- 如果规则以/结尾，则要匹配监控路径的末尾</span></div></div><div><div><div>35</div></div><div><span>    </span><span># -- ?匹配任何字符，但不包括/</span></div></div><div><div><div>36</div></div><div><span>    </span><span># -- *匹配0或多个字符，但不包括/</span></div></div><div><div><div>37</div></div><div><span>    </span><span># -- **匹配0或多个字符，可以是/</span></div></div><div><div><div>38</div></div><div><span>      </span><span>delete</span><span>  </span><span>=</span><span>  </span><span>'running',</span><span>  </span><span># -- delete 为了保持target与souce完全同步，Lsyncd默认会delete = true来允许同步删除。它除了false，还有startup、running值：</span></div></div><div><div><div>39</div></div><div><span>      </span><span>--</span><span> </span><span>delete</span><span>  </span><span>=</span><span>  </span><span>true</span><span>       </span><span># 始终删除：无论启动时还是运行中，都会删除目标上源没有的文件</span></div></div><div><div><div>40</div></div><div><span>      </span><span>--</span><span> </span><span>delete</span><span>  </span><span>=</span><span>  </span><span>false</span><span>      </span><span># 从不删除：不会删除目标上的任何文件，即使源删了</span></div></div><div><div><div>41</div></div><div><span>      </span><span>--</span><span> </span><span>delete</span><span>  </span><span>=</span><span>  </span><span>'startup'</span><span>  </span><span># 仅启动时删除：开机或重启 lsyncd 时清理目标多余文件，但运行中不删</span></div></div><div><div><div>42</div></div><div><span>      </span><span>--</span><span> </span><span>delete</span><span>  </span><span>=</span><span>  </span><span>'running'</span><span>  </span><span># 仅运行时删除：启动时不删，但运行中会删除源已删的文件</span></div></div><div><div><div>43</div></div><div>
</div></div><div><div><div>44</div></div><div>
</div></div><div><div><div>45</div></div><div><span># -- rsync部分配置：</span></div></div><div><div><div>46</div></div><div><span>      </span><span># -- delete和exclude本来都是rsync的选项，上面是配置在sync中的，这样做的原因是为了减少rsync的开销</span></div></div><div><div><div>47</div></div><div><span>      </span><span>rsync</span><span> </span><span>=</span><span> </span><span>{</span></div></div><div><div><div>48</div></div><div><span>             </span><span>bwlimit</span><span>=</span><span>200,</span><span> </span><span># -- bwlimit 限速，单位kb/s，与rsync相同（这么重要的选项在文档里竟然没有标出）；</span></div></div><div><div><div>49</div></div><div><span>             </span><span>binary</span><span> </span><span>=</span><span> </span><span>"/usr/bin/rsync",</span><span> </span><span># -- rsync可执行程序地址，默认/usr/bin/rsync</span></div></div><div><div><div>50</div></div><div><span>             </span><span>archive</span><span> </span><span>=</span><span> </span><span>true</span><span>,</span><span> </span><span># -- 默认false，以递归方式传输文件，并保持所有文件属性</span></div></div><div><div><div>51</div></div><div><span>             </span><span>compress</span><span> </span><span>=</span><span> </span><span>true</span><span>,#</span><span> </span><span>--</span><span> </span><span>压缩传输默认为true。在带宽与cpu负载之间权衡，本地目录同步可以考虑把它设为false；</span></div></div><div><div><div>52</div></div><div><span>             </span><span>verbose</span><span> </span><span>=</span><span> </span><span>true</span><span>,#</span><span> </span><span>--同步详细模式输出</span></div></div><div><div><div>53</div></div><div><span>           </span><span>perms</span><span> </span><span>=</span><span> </span><span>true</span><span> </span><span># -- perms 保留文件权限,默认为true；</span></div></div><div><div><div>54</div></div><div><span>           </span><span>_extra</span><span> </span><span>=</span><span> </span><span>{</span><span>    </span><span># --rsyn附加参数</span></div></div><div><div><div>55</div></div><div><span>            </span><span>"--delete"</span><span>,</span></div></div><div><div><div>56</div></div><div><span>            </span><span>"--password-file=/etc/rsync.passwd"</span></div></div><div><div><div>57</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>58</div></div><div><span><span>      </span></span><span>}</span></div></div><div><div><div>59</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>lsyncd同样支持多个文件夹同步，创建多个sync{ }块即可实现</p><section><h3>3.2.1 常用配置<a href="#321-常用配置"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 示例配置</span></div></div><div><div><div>2</div></div><div><span>sync</span><span> </span><span>{</span></div></div><div><div><div>3</div></div><div><span>    </span><span>default.rsync,</span></div></div><div><div><div>4</div></div><div><span>    </span><span>source</span><span> </span><span>=</span><span> </span><span>"/nfs-nginx/",</span></div></div><div><div><div>5</div></div><div><span>    </span><span>target</span><span> </span><span>=</span><span> </span><span>"mysuer@10.1.1.29::backup",</span></div></div><div><div><div>6</div></div><div><span>    </span><span>delay</span><span> </span><span>=</span><span> </span><span>5,</span></div></div><div><div><div>7</div></div><div><span>    </span><span>delete</span><span> </span><span>=</span><span> </span><span>true</span><span>,</span></div></div><div><div><div>8</div></div><div><span>    </span><span>rsync</span><span> </span><span>=</span><span> </span><span>{</span></div></div><div><div><div>9</div></div><div><span>        </span><span>binary</span><span> </span><span>=</span><span> </span><span>"/usr/bin/rsync",</span></div></div><div><div><div>10</div></div><div><span>        </span><span>archive</span><span> </span><span>=</span><span> </span><span>true</span><span>,</span></div></div><div><div><div>11</div></div><div><span>        </span><span>compress</span><span> </span><span>=</span><span> </span><span>true</span><span>,</span></div></div><div><div><div>12</div></div><div><span>        </span><span>verbose</span><span> </span><span>=</span><span> </span><span>true</span><span>,</span></div></div><div><div><div>13</div></div><div><span>        </span><span>perms</span><span> </span><span>=</span><span> </span><span>true</span><span>,</span></div></div><div><div><div>14</div></div><div><span>        </span><span>_extra</span><span> </span><span>=</span><span> </span><span>{</span></div></div><div><div><div>15</div></div><div><span>            </span><span>"--delete"</span><span>,</span></div></div><div><div><div>16</div></div><div><span>            </span><span>"--password-file=/etc/rsync.passwd"</span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>19</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section><section><h2>3.3 启动测试<a href="#33-启动测试"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>systemctl</span><span> </span><span>start</span><span> </span><span>lsyncd</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 查看rsync服务端是否接收到了文件</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>cd</span><span> </span><span>/backup</span></div></div><div><div><div>6</div></div><div><span>ll</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>]]></content>
    </entry>
    <entry>
      <id>https://2233941.xyz/posts/%E6%BA%90%E7%A0%81%E5%AE%89%E8%A3%85zabbix/</id>
      <title type="text">源码安装zabbix</title>
      <published>2026-04-05T00:00:00.000Z</published>
      <updated>2026-04-05T00:00:00.000Z</updated>
      <author><name>lumifly</name></author>
      <link rel="alternate" href="https://2233941.xyz/posts/%E6%BA%90%E7%A0%81%E5%AE%89%E8%A3%85zabbix/"/>
      <summary type="text">源码安装zabbix</summary>
      <content type="html"><![CDATA[<section><h1>一、源码编译安装zabbix服务端<a href="#一源码编译安装zabbix服务端"><span>#</span></a></h1><section><h2>1.1 环境准备<a href="#11-环境准备"><span>#</span></a></h2><ul>
<li>数据库：postresql</li>
</ul></section><section><h2>1.2 下载zabbix server源码<a href="#12-下载zabbix-server源码"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>wget</span><span> </span><span>https://cdn.zabbix.com/zabbix/sources/stable/7.4/zabbix-7.4.8.tar.gz</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>tar</span><span> </span><span>-xf</span><span> </span><span>zabbix-7.4.8.tar.gz</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>1.3 创建用户组和用户<a href="#13-创建用户组和用户"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 创建用户zabbix组 参数：system：创建系统用户组、quiet：静默模式</span></div></div><div><div><div>2</div></div><div><span>addgroup</span><span> </span><span>--system</span><span> </span><span>--quiet</span><span> </span><span>zabbix</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 创建用户zabbix 参数：disabled-login：禁止登录、ingroup：加入组、home：指定家目录、no-create-home:不创建默认家目录</span></div></div><div><div><div>5</div></div><div><span>adduser</span><span> </span><span>--quiet</span><span> </span><span>--system</span><span> </span><span>--disabled-login</span><span> </span><span>--ingroup</span><span> </span><span>zabbix</span><span> </span><span>--home</span><span> </span><span>/var/lib/zabbix</span><span> </span><span>--no-create-home</span><span> </span><span>zabbix</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>1.4 创建zabbix数据库<a href="#14-创建zabbix数据库"><span>#</span></a></h2><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 创建数据库用户，回车后输入密码，我这里输入密码admin@123</span></div></div><div><div><div>2</div></div><div><span>sudo</span><span> </span><span>-u</span><span> </span><span>postgres</span><span> </span><span>createuser</span><span> </span><span>--pwprompt</span><span> </span><span>zabbix</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span># 创建数据库</span></div></div><div><div><div>5</div></div><div><span>sudo</span><span> </span><span>-u</span><span> </span><span>postgres</span><span> </span><span>createdb</span><span> </span><span>-O</span><span> </span><span>zabbix</span><span> </span><span>-E</span><span> </span><span>Unicode</span><span> </span><span>-T</span><span> </span><span>template0</span><span> </span><span>zabbix</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 进入源码目录导入初始模式和数据</span></div></div><div><div><div>8</div></div><div><span>cd</span><span> </span><span>/usr/local/src/zabbix-7.4.8</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>cd</span><span> </span><span>database/postgresql</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># 如果是给Zabbix proxy创建数据库只应导入 schema.sql</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>cat</span><span> </span><span>schema.sql</span><span> | </span><span>sudo</span><span> </span><span>-u</span><span> </span><span>zabbix</span><span> </span><span>psql</span><span> </span><span>zabbix</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>cat</span><span> </span><span>images.sql</span><span> | </span><span>sudo</span><span> </span><span>-u</span><span> </span><span>zabbix</span><span> </span><span>psql</span><span> </span><span>zabbix</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>cat</span><span> </span><span>data.sql</span><span> | </span><span>sudo</span><span> </span><span>-u</span><span> </span><span>zabbix</span><span> </span><span>psql</span><span> </span><span>zabbix</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h2>1.5 编译安装<a href="#15-编译安装"><span>#</span></a></h2><p>先安装依赖</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>apt-get</span><span> </span><span>install</span><span> </span><span>-y</span><span> </span><span>\</span></div></div><div><div><div>2</div></div><div><span>  </span><span>libsnmp-dev</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>  </span><span>libmysqlclient-dev</span><span> </span><span>\</span></div></div><div><div><div>4</div></div><div><span>  </span><span>libcurl4-openssl-dev</span><span> </span><span>\</span></div></div><div><div><div>5</div></div><div><span>  </span><span>libxml2-dev</span><span> </span><span>\</span></div></div><div><div><div>6</div></div><div><span>  </span><span>libevent-dev</span><span> </span><span>\</span></div></div><div><div><div>7</div></div><div><span>  </span><span>libssl-dev</span><span> </span><span>\</span></div></div><div><div><div>8</div></div><div><span>  </span><span>libpcre3-dev</span><span> </span><span>\</span></div></div><div><div><div>9</div></div><div><span>  </span><span>libopenipmi-dev</span><span> </span><span>\</span></div></div><div><div><div>10</div></div><div><span>  </span><span>libpcre2-dev</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 配置编译参数</span></div></div><div><div><div>2</div></div><div><span>./configure</span><span> </span><span>--prefix=/usr/local/zabbix</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>--enable-server </span><span>--enable-agent</span><span> </span><span>--enable-ipv6</span><span> </span><span>\</span></div></div><div><div><div>4</div></div><div><span>--with-net-snmp </span><span>--with-libcurl</span><span> </span><span>--with-libxml2</span><span> </span><span>--with-openipmi</span><span> </span><span>\</span></div></div><div><div><div>5</div></div><div><span>--with-postgresql=/usr/local/pgsql/bin/pg_config</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># 编译安装</span></div></div><div><div><div>8</div></div><div><span>make</span><span> </span><span>install</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>参数详细解释：</p><ol>
<li><code>--prefix=/usr/local/zabbix</code>：</li>
</ol><ul>
<li>指定 Zabbix 的安装前缀目录。这意味着所有 Zabbix 的程序和文件将被安装在这个路径下。</li>
</ul><ol>
<li><code>--enable-server</code>：</li>
</ol><ul>
<li>启用 Zabbix 服务器功能。如果你打算运行 Zabbix 服务器，你需要启用这个选项。</li>
</ul><ol>
<li><code>--enable-agent</code>：</li>
</ol><ul>
<li>启用 Zabbix 代理功能。如果你打算运行 Zabbix 代理，你需要启用这个选项。</li>
</ul><ol>
<li><code>--with-postgresql=/usr/local/pgsql/bin/pg_config</code>：</li>
</ol><ul>
<li>指定 PostgreSQL 配置文件的位置。这里的路径指向 <code>pg_config</code> 工具，这个工具可以提供 PostgreSQL 的配置信息和路径。</li>
</ul><ol>
<li><code>--enable-ipv6</code>：</li>
</ol><ul>
<li>启用 IPv6 支持。如果你的系统支持 IPv6，并且你希望 Zabbix 支持 IPv6，你需要启用这个选项。</li>
</ul><ol>
<li><code>--with-net-snmp</code>：</li>
</ol><ul>
<li>指定 Net-SNMP（网络管理系统）的安装路径。这通常通过 <code>net-snmp-config</code> 工具自动检测，但如果需要手动指定，可以使用这个参数。</li>
</ul><ol>
<li><code>--with-libcurl</code>：</li>
</ol><ul>
<li>指定 libcurl（一个支持多种协议的客户端-服务器程序库）的安装路径。这通常通过 <code>libcurl-config</code> 工具自动检测，但如果需要手动指定，可以使用这个参数。</li>
</ul><ol>
<li><code>--with-libxml2</code>：</li>
</ol><ul>
<li>指定 libxml2（一个用于处理 XML 数据的 C 库）的安装路径。这通常通过 <code>libxml2-config</code> 工具自动检测，但如果需要手动指定，可以使用这个参数。</li>
</ul><ol>
<li><code>--with-openipmi</code>：</li>
</ol><ul>
<li>指定 OpenIPMI（开放 IPMI 接口）的安装路径。这通常通过 <code>openipmi-config</code> 工具自动检测，但如果需要手动指定，可以使用这个参数。
这个配置命令告诉 <code>./configure</code> 脚本你想要安装 Zabbix 服务器和代理，并连接到 PostgreSQL 数据库。此外，它还启用了对 IPv6、Net-SNMP、libcurl、libxml2 和 OpenIPMI 的支持。如果你不需要某些功能（例如，如果你不打算运行 Zabbix 代理或使用特定的库），你可以相应地省略或禁用这些选项。</li>
</ul></blockquote><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 修改安装目录权限</span></div></div><div><div><div>2</div></div><div><span>chown</span><span> </span><span>-R</span><span>  </span><span>zabbix:zabbix</span><span> </span><span>/usr/local/zabbix</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>1.6 修改zabbix配置文件<a href="#16-修改zabbix配置文件"><span>#</span></a></h2><p>编辑<code>zabbix_server.conf</code></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/usr/local/zabbix/etc</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 修改以下配置</span></div></div><div><div><div>4</div></div><div><span>LogFile</span><span>=</span><span>/data/zabbix/logs/zabbix_server.log</span></div></div><div><div><div>5</div></div><div><span>DBName</span><span>=</span><span>zabbix_server</span><span> </span><span>#数据库名称</span></div></div><div><div><div>6</div></div><div><span>DBSchema</span><span><span>=</span><span> </span></span><span>#数据库访问协议</span></div></div><div><div><div>7</div></div><div><span>DBUser</span><span>=</span><span>zabbix</span><span> </span><span>#数据库用户名称</span></div></div><div><div><div>8</div></div><div><span>DBPassword</span><span>=</span><span>123456</span><span> </span><span>#数据库用户密码</span></div></div><div><div><div>9</div></div><div><span>DBPort</span><span>=</span><span>5432</span><span> </span><span>#数据库端口</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>1.7 启动zabbix<a href="#17-启动zabbix"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>/usr/local/zabbix/sbin/zabbix_server</span><span> </span><span>-c</span><span> </span><span>/usr/local/zabbix/etc/zabbix_server.conf</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>1.8 安装nginx及php<a href="#18-安装nginx及php"><span>#</span></a></h2><p>这里使用apt进行安装</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>apt</span><span> </span><span>install</span><span> </span><span>nginx</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 安装php各个组件</span></div></div><div><div><div>4</div></div><div><span>apt</span><span> </span><span>install</span><span> </span><span>php</span><span> </span><span>php-fpm</span><span> </span><span>php-mysql</span><span> </span><span>php-gd</span><span> </span><span>php-mbstring</span><span> </span><span>php-xml</span><span> </span><span>php-curl</span><span> </span><span>php-zip</span><span> </span><span>php-bcmath</span><span> </span><span>php-ldap</span><span> </span><span>php-pgsql</span><span> </span><span>-y</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>1.9 修改nginx及php配置<a href="#19-修改nginx及php配置"><span>#</span></a></h2><section><h3>1.9.1 nginx配置<a href="#191-nginx配置"><span>#</span></a></h3><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/etc/nginx/conf.d</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>vim</span><span> </span><span>zabbix.conf</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 添加如下配置</span></div></div><div><div><div>6</div></div><div><span>server</span><span> </span><span>{</span></div></div><div><div><div>7</div></div><div><span>    </span><span>listen</span><span>       </span><span>80</span><span>;</span></div></div><div><div><div>8</div></div><div><span>    </span><span>server_name</span><span>  </span><span>localhost</span><span>; </span><span># 这里可以改成你的域名或IP</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>    </span><span>location</span><span> </span><span>/</span><span> </span><span>{</span></div></div><div><div><div>12</div></div><div><span>        </span><span>root</span><span>   </span><span>/var/nginx/html/ui</span><span>;</span></div></div><div><div><div>13</div></div><div><span>        </span><span>try_files</span><span> </span><span>$uri</span><span> </span><span>$uri</span><span>/</span><span> </span><span>/index.php?query_string</span><span>;</span></div></div><div><div><div>14</div></div><div><span>        </span><span>index</span><span> </span><span>index.php</span><span> </span><span>index.html</span><span> </span><span>index.htm</span><span>;</span></div></div><div><div><div>15</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>    </span><span>location</span><span> </span><span>~</span><span> </span><span>\.</span><span>php</span><span>$ </span><span>{</span></div></div><div><div><div>18</div></div><div><span>        </span><span>root</span><span>   </span><span>/var/nginx/html/ui</span><span>;</span></div></div><div><div><div>19</div></div><div><span>        </span><span># 使用套接字连接</span></div></div><div><div><div>20</div></div><div><span>        </span><span># fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;</span></div></div><div><div><div>21</div></div><div><span>        </span><span># 使用ip连接</span></div></div><div><div><div>22</div></div><div><span>        </span><span>fastcgi_pass</span><span>  </span><span>127.0.0.1:9000</span></div></div><div><div><div>23</div></div><div><span>        </span><span>fastcgi_index</span><span>  </span><span>index.php</span><span>;</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>        </span><span>fastcgi_param</span><span>  </span><span>SCRIPT_FILENAME</span><span>  </span><span>$document_root$fastcgi_script_name</span><span>;</span></div></div><div><div><div>26</div></div><div>
</div></div><div><div><div>27</div></div><div><span>        </span><span>include</span><span>        </span><span>fastcgi_params</span><span>;</span></div></div><div><div><div>28</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>29</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>复制源码中的ui目录到<code>/var/nginx/html/</code>中</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cp</span><span> </span><span>-r</span><span> </span><span>/usr/local/src/zabbix-7.4.8/ui</span><span> </span><span>/var/nginx/html/</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>1.9.2 修改php配置<a href="#192-修改php配置"><span>#</span></a></h3><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vim</span><span> </span><span>/etc/php/8.1/fpm/pool.d/www.conf</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 将监听的套接字连接修改为ip连接</span></div></div><div><div><div>4</div></div><div><span>listen</span><span> </span><span>=</span><span> </span><span>/var/run/php/php8.1-fpm.sock</span></div></div><div><div><div>5</div></div><div><span># 修改为</span></div></div><div><div><div>6</div></div><div><span>listen</span><span> </span><span>=</span><span> </span><span>127.0.0.1:9000</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span># 启动后可查看端口是否开启</span></div></div><div><div><div>9</div></div><div><span>netstat</span><span> </span><span>-tlnp</span><span> | </span><span>grep</span><span> </span><span>9000</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>修改php.ini，因为zabbix对于<code>post_max_size、max_execution_time、max_input_time</code>有要求</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vim</span><span> </span><span>/etc/php/8.1/fpm/php.ini</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 搜索 post_max_size</span></div></div><div><div><div>4</div></div><div><span>post_max_size</span><span> </span><span>=</span><span> </span><span>100M</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span># 搜索 max_execution_time</span></div></div><div><div><div>7</div></div><div><span>max_execution_time</span><span> </span><span>=</span><span> </span><span>300</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span># 搜索 max_input_time</span></div></div><div><div><div>10</div></div><div><span>max_input_time</span><span> </span><span>=</span><span> </span><span>300</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># 若要求开启 bcmath 和 ldap，则需要安装php扩展</span></div></div><div><div><div>13</div></div><div><span># 安装 bcmath 和 ldap 扩展</span></div></div><div><div><div>14</div></div><div><span>apt</span><span> </span><span>install</span><span> </span><span>php-bcmath</span><span> </span><span>php-ldap</span><span> </span><span>-y</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span># 连接数据库时需要的扩展</span></div></div><div><div><div>17</div></div><div><span>apt</span><span> </span><span>install</span><span>  </span><span>php-pgsql</span><span> </span><span>php-mysql</span><span> </span><span>-y</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section><section><h2>1.10 启动nginx和php<a href="#110-启动nginx和php"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 启动nginx和php</span></div></div><div><div><div>2</div></div><div><span>systemctl</span><span> </span><span>start</span><span> </span><span>nginx</span><span> </span><span>php-fpm</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>启动后访问ip加端口进入网页配置界面</p></section></section>
<section><h1>二、源码编译安装zabbix agent<a href="#二源码编译安装zabbix-agent"><span>#</span></a></h1><section><h2>2.1 编译agent<a href="#21-编译agent"><span>#</span></a></h2><p>server端的服务器上面在编译安装时顺带安装了agent（<code>--enable-agent</code>）</p><p>对于其他监控服务器只需要使用源码安装编译agent即可</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 先安装依赖</span></div></div><div><div><div>2</div></div><div><span>apt</span><span> </span><span>install</span><span> </span><span>-y</span><span> </span><span>libpcre2-dev</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span> </span><span>./configure</span><span> </span><span>--prefix=/usr/local/zabbix/</span><span> </span><span>--enable-agent</span></div></div><div><div><div>2</div></div><div><span> </span><span>make</span></div></div><div><div><div>3</div></div><div><span> </span><span>make</span><span> </span><span>install</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>2.2 修改agent配置文件<a href="#22-修改agent配置文件"><span>#</span></a></h2><p>修改zabbix_agent.conf配置文件</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vim</span><span> </span><span>/usr/local/zabbix/etc/zabbix_agent.conf</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># 修改以下内容</span></div></div><div><div><div>4</div></div><div><span># agent监听端口</span></div></div><div><div><div>5</div></div><div><span>ListenPort</span><span>=</span><span>10050</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span># zabbix服务端ip</span></div></div><div><div><div>8</div></div><div><span>Server</span><span>=</span><span>your_zabbix_server_ip</span><span> </span><span>#</span></div></div><div><div><div>9</div></div><div><span>ServerActive</span><span>=</span><span>your_zabbix_server_ip</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>2.3 启动agent<a href="#23-启动agent"><span>#</span></a></h2><p>监控主机没有zabbix用户，先创建用户和用户组</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>addgroup</span><span> </span><span>--system</span><span> </span><span>--quiet</span><span> </span><span>zabbix</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>adduser</span><span> </span><span>--quiet</span><span> </span><span>--system</span><span> </span><span>--disabled-login</span><span> </span><span>--ingroup</span><span> </span><span>zabbix</span><span> </span><span>--home</span><span> </span><span>/var/lib/zabbix</span><span> </span><span>--no-create-home</span><span> </span><span>zabbix</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 启动zabbix agent</span></div></div><div><div><div>2</div></div><div><span>/usr/local/zabbix/sbin/zabbix_agentd</span><span> </span><span>-c</span><span> </span><span>/usr/local/zabbix/etc/zabbix_agentd.conf</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>2.4 使用zabbix_get测试<a href="#24-使用zabbix_get测试"><span>#</span></a></h2><p>使用zabbix_get进行测试，查看是否可以进行通信</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># -s 指定监控主机、-k 使用指定key</span></div></div><div><div><div>2</div></div><div><span>[root@localhost /usr/local/zabbix/bin]# ./zabbix_get -s 10.22.51.91 -k agent.ping</span></div></div><div><div><div>3</div></div><div><span>1</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 1 则代表server与agent监控机通信没问题</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>]]></content>
    </entry>
</feed>
