HMCL-docs/modpack/serverpack3.html
2026-03-15 12:44:04 +00:00

150 lines
34 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html><html lang="zh" class="no-js"><head><meta charset="utf-8"><title>配置客户端自动更新 (Nginx) - HMCL 文档</title><meta name="description" content="本文介绍了如何使用 Nginx 服务器配置客户端自动更新"><meta property="og:type" content="article"><meta property="og:locale" content="zh"><meta property="og:site_name" content="HMCL 文档"><meta property="og:title" content="配置客户端自动更新 (Nginx)"><meta property="og:url" content="https://docs.hmcl.net/modpack/serverpack3.html"><meta property="og:description" content="本文介绍了如何使用 Nginx 服务器配置客户端自动更新"><meta property="article:published_time" content="2023-01-11T14:13:45+08:00"><link rel="canonical" href="https://docs.hmcl.net/modpack/serverpack3.html"><link href="/feed.xml" type="application/atom+xml" rel="alternate" title="HMCL 文档 Feed"><meta name="viewport" content="width=device-width, initial-scale=1.0"> <script> document.documentElement.className = document.documentElement.className.replace(/\bno-js\b/g, '') + ' js '; window.enable_copy_code_button = true; </script><link rel="stylesheet" href="/assets/css/main.css"><link rel="stylesheet" href="/assets/lib/fontawesome/css/all.min.css"> <noscript><link rel="stylesheet" href="/assets/lib/fontawesome/css/all.min.css"></noscript> <script src="/assets/js/settings.js"></script> <script src="/assets/js/theme.js"></script><link rel="shortcut icon" href="/favicon.ico"><link rel="stylesheet" id="skin"></head><body class="layout--document" dir="ltr"><nav class="skip-links"><ul><li><a href="#site-nav" class="screen-reader-shortcut">转到主导航栏</a></li><li><a href="#main" class="screen-reader-shortcut">转到内容</a></li><li><a href="#footer" class="screen-reader-shortcut">转到底部</a></li></ul></nav><div class="masthead"><div class="masthead__inner-wrap"><div class="masthead__menu"><nav id="site-nav" class="greedy-nav"> <a class="site-logo" href="/"><img src="/assets/img/hmcl.png" alt="HMCL 文档"></a> <a class="site-title" href="/"> HMCL 文档 </a><ul class="visible-links"><li class="masthead__menu-item"> <a href="/settings.html" >设置</a></li></ul><button class="greedy-nav__toggle hidden" type="button"> <span class="visually-hidden">切换菜单</span><div class="navicon"></div></button><ul class="hidden-links hidden"></ul></nav></div></div></div><div class="initial-content"><div id="main" role="main"><div class="sidebar sticky"><nav class="nav__list"> <input id="ac-toc" name="accordion-toc" type="checkbox" /> <label for="ac-toc">切换菜单</label><ul class="nav__items"><li> <span class="nav__sub-title">问题集合</span><ul><li><a href="/faq.html">常见问题</a></li><li><a href="/launcher/">启动器使用相关</a></li><li><a href="/modpack/">整合包帮助</a></li><li><a href="/multiplayer/">多人联机帮助</a></li></ul></li><li> <span class="nav__sub-title">使用者帮助</span><ul><li><a href="/launcher/isolation.html">版本隔离</a></li><li><a href="/launcher/offline-skin.html">设置离线皮肤</a></li><li><a href="/launcher/auto-installing.html">HMCL 的自动安装使用教程</a></li><li><a href="/launcher/shader.html">安装光影</a></li><li><a href="/launcher/set-item-details.html">设置项详解</a></li></ul></li><li> <span class="nav__sub-title">开发者帮助</span><ul><li><a href="/launcher/datapack.html">制作 HMCL 格式的数据包</a></li><li><a href="/modpack/serverpack.html">制作整合包</a></li><li><a href="/launcher/authlib-injector.html">添加默认 authlib-injector 验证服务器</a></li></ul></li><li> <span class="nav__sub-title">更新日志</span><ul><li><a href="/changelog/stable.html">稳定版</a></li><li><a href="/changelog/dev.html">开发版</a></li></ul></li><li> <span class="nav__sub-title">其他</span><ul><li><a href="/eula/hmcl.html">用户协议</a></li><li><a href="/contribution.html">贡献指南</a></li><li><a href="https://hmcl.huangyuhui.net">项目官网</a></li><li><a href="https://github.com/HMCL-dev/HMCL">项目仓库</a></li><li><a href="https://github.com/HMCL-dev/HMCL-docs">文档仓库</a></li></ul></li></ul></nav></div><article class="page" itemscope itemtype="https://schema.org/CreativeWork"><meta itemprop="headline" content="配置客户端自动更新 (Nginx)"><meta itemprop="description" content="本文介绍了如何使用 Nginx 服务器配置客户端自动更新"><meta itemprop="datePublished" content="2023-01-11T14:13:45+08:00"><div class="page__inner-wrap"><header><h1 id="page-title" class="page__title" itemprop="headline"> <a href="https://docs.hmcl.net/modpack/serverpack3.html" itemprop="url">配置客户端自动更新 (Nginx) </a></h1></header><section class="page__content" itemprop="text"><aside class="sidebar__right sticky"><nav class="toc"><header><h4 class="nav__title"><i class="fas fa-file-alt"></i> 目录</h4></header><ul class="toc__menu"><li><a href="#前置知识">前置知识</a></li><li><a href="#nginx-安装">Nginx 安装</a></li><li><a href="#新建静态资源文件夹">新建静态资源文件夹</a></li><li><a href="#分配次级域名可选">分配次级域名(可选)</a></li><li><a href="#配置-nginxconf">配置 nginx.conf</a></li><li><a href="#导出整合包">导出整合包</a></li><li><a href="#上传整合包到静态资源服务器">上传整合包到静态资源服务器</a></li><li><a href="#客户端初始化">客户端初始化</a></li><li><a href="#更新客户端">更新客户端</a></li><li><a href="#参考资料">参考资料</a></li></ul></nav></aside><img src="https://hits.zkitefly.eu.org/?tag=https%3A%2F%2Fdocs.hmcl.net%2Fmodpack%2Fserverpack3.html" alt="Hits" decoding="async"><div class="notice--info"><p>本文由 buggzd 创建。</p></div><blockquote><p>阅读本文前,请先阅读<a href="/modpack/serverpack.html">此文章</a></p></blockquote><h1 id="前置知识">前置知识</h1><p>阅读本文你需要具有以下知识储备:</p><ol><li>掌握基础本的 <code class="language-plaintext highlighter-rouge">linux</code> 命令操作,比如 <code class="language-plaintext highlighter-rouge">cd</code> <code class="language-plaintext highlighter-rouge">ls</code></li><li>拥有一个 <code class="language-plaintext highlighter-rouge">linux</code> 服务器(好像不算知识)</li></ol><h1 id="nginx-安装">Nginx 安装</h1><p>这里很基础(但是坑比较多)略过,可以看以下参考文档。</p><blockquote><p>https://zhuanlan.zhihu.com/p/515069497</p></blockquote><h1 id="新建静态资源文件夹">新建静态资源文件夹</h1><p>我为了省事直接在/根目录下新建了一个 <code class="language-plaintext highlighter-rouge">MinecraftClientStatic</code> 文件夹,以后需要作为静态资源的文件都丢这里面。</p><p>命令:</p><div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 到更目录</span>
<span class="nb">cd</span> /
<span class="c"># 新建文件夹</span>
<span class="nb">mkdir </span>MinecraftClientStatic
<span class="c"># 防止nginx无法访问配置文件夹访问权限</span>
<span class="nb">chmod </span>777 MinecraftClientStatic
<span class="c"># 进入文件夹</span>
<span class="nb">cd </span>MinecraftClientStatic
<span class="c"># 新建一个测试用的文件</span>
<span class="nb">touch </span>helloMC.html
<span class="c"># 给文件权限</span>
<span class="nb">chmod </span>777 helloMC.html
<span class="c"># 编辑html内容</span>
vim helloMC.html
</code></pre></div></div><p>这里为了测试静态资源是否配置成功,需要新建一个 <code class="language-plaintext highlighter-rouge">helloMC.html</code> 的静态测试文件,可以在这个文件内随意写两行字。</p><p>例如:</p><div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">&lt;!-- helloMC.html --&gt;</span>
<span class="nt">&lt;h1&gt;</span>hello static!<span class="nt">&lt;/h1&gt;</span>
</code></pre></div></div><p>也可以整点炫的(可选)</p><div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">&lt;!-- helloMC.html --&gt;</span>
<span class="cp">&lt;!DOCTYPE html&gt;</span>
<span class="nt">&lt;html&gt;</span>
<span class="nt">&lt;head&gt;</span>
<span class="nt">&lt;meta</span> <span class="na">charset=</span><span class="s">"UTF-8"</span><span class="nt">&gt;</span>
<span class="nt">&lt;title&gt;</span>MC客户端静态资源<span class="nt">&lt;/title&gt;</span>
<span class="nt">&lt;meta</span> <span class="na">name=</span><span class="s">"viewport"</span> <span class="na">content=</span><span class="s">"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"</span> <span class="nt">/&gt;</span>
<span class="nt">&lt;style&gt;</span>
<span class="k">@font-face</span><span class="p">{</span>
<span class="nl">font-family</span><span class="p">:</span><span class="s2">'calligraffittiregular'</span><span class="p">;</span>
<span class="nl">src</span><span class="p">:</span><span class="nf">url</span><span class="p">(</span><span class="s1">"fonts/calligraffitti-regular-webfont.ttf"</span><span class="p">)</span>
<span class="p">}</span>
<span class="o">*</span> <span class="p">{</span>
<span class="nl">margin</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span>
<span class="nl">padding</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">body</span> <span class="p">{</span>
<span class="nl">overflow</span><span class="p">:</span> <span class="nb">hidden</span><span class="p">;</span>
<span class="p">}</span>
<span class="nf">#content</span><span class="p">{</span>
<span class="nl">position</span><span class="p">:</span> <span class="nb">absolute</span><span class="p">;</span>
<span class="nl">color</span><span class="p">:</span> <span class="nx">white</span><span class="p">;</span>
<span class="nl">top</span><span class="p">:</span> <span class="m">30%</span><span class="p">;</span>
<span class="nl">left</span><span class="p">:</span> <span class="m">50%</span><span class="p">;</span>
<span class="nl">margin-left</span><span class="p">:</span> <span class="m">-121px</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">p</span><span class="p">{</span>
<span class="nl">font-family</span><span class="p">:</span> <span class="n">calligraffittiregular</span>
<span class="p">}</span>
<span class="nt">&lt;/style&gt;</span>
<span class="nt">&lt;/head&gt;</span>
<span class="nt">&lt;body&gt;</span>
<span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">"content"</span><span class="nt">&gt;</span>
<span class="nt">&lt;p</span> <span class="na">style=</span><span class="s">"font-size: 40px;font-weight: 1000;"</span><span class="nt">&gt;</span>MinecraftClientStatic<span class="nt">&lt;/p&gt;</span>
<span class="nt">&lt;/div&gt;</span>
<span class="nt">&lt;canvas</span> <span class="na">id=</span><span class="s">"hacker"</span> <span class="na">style=</span><span class="s">"width:100%;height:100%;"</span><span class="nt">&gt;</span>请使用最新的浏览器<span class="nt">&lt;/canvas&gt;</span>
<span class="nt">&lt;/body&gt;</span>
<span class="nt">&lt;/html&gt;</span>
<span class="nt">&lt;script </span><span class="na">type=</span><span class="s">"text/javascript"</span><span class="nt">&gt;</span>
<span class="nb">window</span><span class="p">.</span><span class="nx">onload</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">color_array</span> <span class="o">=</span> <span class="p">[</span><span class="dl">'</span><span class="s1">#00FF00</span><span class="dl">'</span><span class="p">,</span><span class="dl">'</span><span class="s1">#00FF99</span><span class="dl">'</span><span class="p">,</span><span class="dl">'</span><span class="s1">#00FFCC</span><span class="dl">'</span><span class="p">,</span><span class="dl">'</span><span class="s1">#00FFFF</span><span class="dl">'</span><span class="p">,</span><span class="dl">'</span><span class="s1">#00BBFF</span><span class="dl">'</span><span class="p">,</span><span class="dl">'</span><span class="s1">#0066FF</span><span class="dl">'</span><span class="p">,</span><span class="dl">'</span><span class="s1">#0000FF</span><span class="dl">'</span><span class="p">,</span><span class="dl">'</span><span class="s1">#5500FF</span><span class="dl">'</span><span class="p">,</span><span class="dl">'</span><span class="s1">#7700FF</span><span class="dl">'</span><span class="p">,</span><span class="dl">'</span><span class="s1">#9900FF</span><span class="dl">'</span><span class="p">,</span><span class="dl">'</span><span class="s1">#CC00FF</span><span class="dl">'</span><span class="p">,</span><span class="dl">'</span><span class="s1">#FF00FF</span><span class="dl">'</span><span class="p">];</span>
<span class="kd">var</span> <span class="nx">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">color</span><span class="p">;</span>
<span class="kd">function</span> <span class="nf">changColor</span><span class="p">()</span> <span class="p">{</span>
<span class="nx">color</span> <span class="o">=</span> <span class="nx">color_array</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">i</span><span class="o">++</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">color</span><span class="p">);</span>
<span class="k">if</span><span class="p">(</span><span class="nx">i</span><span class="o">&gt;</span><span class="nx">color_array</span><span class="p">.</span><span class="nx">length</span><span class="o">-</span><span class="mi">1</span><span class="p">){</span>
<span class="nx">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
<span class="nf">setTimeout</span><span class="p">(</span><span class="nx">changColor</span><span class="p">,</span> <span class="mi">2000</span><span class="p">);</span>
<span class="p">}</span>
<span class="kd">var</span> <span class="nx">hacker</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">hacker</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">width</span> <span class="o">=</span> <span class="nx">hacker</span><span class="p">.</span><span class="nx">width</span> <span class="o">=</span> <span class="nx">screen</span><span class="p">.</span><span class="nx">width</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">height</span> <span class="o">=</span> <span class="nx">hacker</span><span class="p">.</span><span class="nx">height</span> <span class="o">=</span> <span class="nx">screen</span><span class="p">.</span><span class="nx">height</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">ctx</span> <span class="o">=</span> <span class="nx">hacker</span><span class="p">.</span><span class="nf">getContext</span><span class="p">(</span><span class="dl">'</span><span class="s1">2d</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">num</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">ceil</span><span class="p">(</span><span class="nx">width</span> <span class="o">/</span> <span class="mi">12</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">y</span> <span class="o">=</span> <span class="nc">Array</span><span class="p">(</span><span class="nx">num</span><span class="p">).</span><span class="nf">join</span><span class="p">(</span><span class="mi">0</span><span class="p">).</span><span class="nf">split</span><span class="p">(</span><span class="dl">''</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">draw</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="nx">ctx</span><span class="p">.</span><span class="nx">fillStyle</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">rgba(0,0,0,.05)</span><span class="dl">'</span><span class="p">;</span>
<span class="nx">ctx</span><span class="p">.</span><span class="nf">fillRect</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">width</span><span class="p">,</span> <span class="nx">height</span><span class="p">);</span>
<span class="nx">ctx</span><span class="p">.</span><span class="nx">fillStyle</span> <span class="o">=</span> <span class="nx">color</span><span class="p">;</span>
<span class="nx">ctx</span><span class="p">.</span><span class="nx">font</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">12px Microsoft YaHei</span><span class="dl">'</span><span class="p">;</span>
<span class="nx">y</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">y1</span><span class="p">,</span><span class="nx">i</span><span class="p">){</span>
<span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="nb">String</span><span class="p">.</span><span class="nf">fromCharCode</span><span class="p">(</span><span class="mi">65</span> <span class="o">+</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">62</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">x</span> <span class="o">=</span> <span class="nx">i</span> <span class="o">*</span> <span class="mi">12</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">y1</span> <span class="o">=</span> <span class="nx">y</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
<span class="nx">ctx</span><span class="p">.</span><span class="nf">fillText</span><span class="p">(</span><span class="nx">text</span><span class="p">,</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">y1</span><span class="p">);</span>
<span class="nx">y</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span> <span class="nx">y1</span> <span class="o">&gt;</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">*</span> <span class="nx">height</span> <span class="p">?</span> <span class="mi">0</span> <span class="p">:</span> <span class="nf">parseInt</span><span class="p">(</span><span class="nx">y</span><span class="p">[</span><span class="nx">i</span><span class="p">])</span> <span class="o">+</span> <span class="mi">12</span> <span class="p">);</span>
<span class="p">})</span>
<span class="p">}</span>
<span class="nc">Run</span><span class="p">();</span>
<span class="kd">function</span> <span class="nf">Run</span><span class="p">()</span> <span class="p">{</span>
<span class="nf">changColor</span><span class="p">();</span>
<span class="nx">Game_Interval</span> <span class="o">=</span> <span class="nf">setInterval</span><span class="p">(</span><span class="nx">draw</span><span class="p">,</span> <span class="mi">50</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="nt">&lt;/script&gt;</span>
</code></pre></div></div><h1 id="分配次级域名可选">分配次级域名(可选)</h1><blockquote><p>如果你没有域名那么这里可以跳过后面需要域名的地方直接使用服务器ip地址</p></blockquote><p><strong>假设我们的域名是</strong> <code class="language-plaintext highlighter-rouge">buggzd.com</code></p><p>在域名解析新建一个 <code class="language-plaintext highlighter-rouge">A</code> 记录(地址为 <code class="language-plaintext highlighter-rouge">ipv6</code> 时应使用 <code class="language-plaintext highlighter-rouge">AAAA</code> 记录),此处以 <code class="language-plaintext highlighter-rouge">minecraft.buggzd.com</code> 为例,配置记录名称为 <code class="language-plaintext highlighter-rouge">minecraft</code> 配置记录地址为服务器地址,如下图所示。</p><p><img src="https://s2.loli.net/2023/01/11/8V1thbsZWgd6qxp.png" alt="image.png"></p><p>这是我们就有了一个子域名 <code class="language-plaintext highlighter-rouge">minecraft.buggzd.com</code> 添加完成后可以使用 <code class="language-plaintext highlighter-rouge">cmd</code><code class="language-plaintext highlighter-rouge">ping</code> 一下这个域名<code class="language-plaintext highlighter-rouge">minecraft.buggzd.com</code> 如果返回了正确的ip地址就是已经分配成功了。</p><div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ping minecraft.buggzd.com
</code></pre></div></div><h1 id="配置-nginxconf">配置 nginx.conf</h1><p>查找 <code class="language-plaintext highlighter-rouge">nginx</code> 配置文件目录:(如果这里没有 <code class="language-plaintext highlighter-rouge">nginx</code> 指令,那么说明你 <code class="language-plaintext highlighter-rouge">nginx</code> 安装没有成功)</p><div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nginx <span class="nt">-t</span>
</code></pre></div></div><p>输出</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
</code></pre></div></div><p>这里 <code class="language-plaintext highlighter-rouge">/etc/nginx/nginx.conf</code> 就是 <code class="language-plaintext highlighter-rouge">Nginx</code> 配置文件的路径,然后 <code class="language-plaintext highlighter-rouge">cd</code><code class="language-plaintext highlighter-rouge">nginx</code> 配置目录。</p><div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> /etc/nginx
<span class="c"># 编写配置文件</span>
vim nginx.conf
</code></pre></div></div><p>因为之前配置过博客反向代理 <code class="language-plaintext highlighter-rouge">nginx.conf</code> 会带有之前的配置记录不要把他们搞乱,<strong>理清层级关系很重要</strong></p><div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 这是 nginx.conf 的层级目录
# 每个 nginx.conf 配置文件都只有一个 http 块,所以如果之前配置过 nginx
# 就只需要粘贴 server 块里的内容,把 server 块放到 http 块内部。
</span><span class="n">http</span> {
<span class="n">server</span> { ... }
<span class="n">server</span> { ... }
<span class="n">server</span> { ... }
}
</code></pre></div></div><p>需要填写的配置:</p><div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">http</span> {
<span class="n">server</span> {
<span class="c"># 需要监听的端口号,可以不动
</span> <span class="n">listen</span> <span class="m">80</span>;
<span class="c"># 这里需要把localhost改为上面分配好的域名
</span> <span class="n">server_name</span> <span class="n">minecraft</span>.<span class="n">buggzd</span>.<span class="n">com</span>;
<span class="n">location</span> / {
<span class="c"># root后面是对应的静态资源文件夹的位置
</span> <span class="n">root</span> /<span class="n">MinecraftClientStatic</span>;
<span class="c"># 这里是默认加载的首页 html ,这里放的是刚刚新建的测试文件
</span> <span class="c"># 它是从 root 目录文件夹内开始查找的,所以不要写 /MinecraftClientStatic/helloMC.html
</span> <span class="n">index</span> <span class="n">helloMC</span>.<span class="n">html</span>;
}
}
}
</code></pre></div></div><blockquote><p>Q:上面的配置干了什么事?<br> A:比如你访问 <code class="language-plaintext highlighter-rouge">http://minecraft.buggzd.com/test.png</code> 时,<code class="language-plaintext highlighter-rouge">nginx</code> 会访问本地的 <code class="language-plaintext highlighter-rouge">/MinecraftClientStatic/test.png</code> 然后返回。</p></blockquote><p>当正确编写完 <code class="language-plaintext highlighter-rouge">nginx.conf</code> 需要让 <code class="language-plaintext highlighter-rouge">nginx</code> 重新加载一下配置文件。</p><div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nginx <span class="nt">-s</span> reload
</code></pre></div></div><p>然后直接访问刚刚配置的域名 <code class="language-plaintext highlighter-rouge">minecraft.buggzd.com</code> 默认会跳转到编写好的 <code class="language-plaintext highlighter-rouge">helloMC.html</code> 页面,你也可以访问 <code class="language-plaintext highlighter-rouge">http://minecraft.buggzd.com/helloMC.html</code></p><p><img src="https://s2.loli.net/2023/01/11/oAx4X1aDE3J6sup.png" alt="image.png"></p><p>当页面出现 <code class="language-plaintext highlighter-rouge">helloMC.html</code> 的内容时,说明已经配置成功了! 放张图片到静态资源文件夹试试。</p><p><img src="https://s2.loli.net/2023/01/11/UCdr8tgq2EVDnP7.png" alt="image.png"></p><p>访问成功,没问题!</p><h1 id="导出整合包">导出整合包</h1><p><img src="https://s2.loli.net/2023/01/11/JwLryPXjdU8HEKo.png" alt="image.png"></p><p>选择服务器自动更新整合包</p><p><img src="https://s2.loli.net/2023/01/11/Yr2e5N1qXAuMiIx.png" alt="image.png"></p><p><strong>整合包下载链接前缀</strong>:填静态资源服务器的地址。 我们需要先去静态资源文件夹下新建一个 <code class="language-plaintext highlighter-rouge">modepack</code> 文件夹(也就是 <code class="language-plaintext highlighter-rouge">/MinecraftClientStatic/modepack</code></p><div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> /MinecraftClientStatic
<span class="nb">mkdir </span>modepack
</code></pre></div></div><p>然后整合包下载链接前缀这里填写 <code class="language-plaintext highlighter-rouge">http://minecraft.buggzd.com/modepack</code></p><p><img src="https://s2.loli.net/2023/01/11/PQfCEkdVAoqm1Ru.png" alt="image.png"></p><h1 id="上传整合包到静态资源服务器">上传整合包到静态资源服务器</h1><p>假设我们刚刚打包的整合包名称为 <code class="language-plaintext highlighter-rouge">client1.0.zip</code> 我们把 <code class="language-plaintext highlighter-rouge">client1.0.zip</code> 通过 <code class="language-plaintext highlighter-rouge">ftp</code> 上传到服务器中,然后使用解压命令将这个整合包解压到 <code class="language-plaintext highlighter-rouge">/MinecraftClientStatic/modepack</code> 文件夹中。</p><div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 假设我们把client1.0.zip上传到了/home/ftp文件夹中</span>
<span class="c"># 把 /home/ftp/client1.0.zip 解压到 /minecraftClientStatic/modepack</span>
unzip /home/ftp/client1.0.zip <span class="nt">-d</span> /minecraftClientStatic/modepack
</code></pre></div></div><p>解压完以后我们查看一下</p><div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">ls</span> /minecraftClientStatic/modepack
</code></pre></div></div><p>服务器返回:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>overrides server-manifest.json
</code></pre></div></div><p>其中 <code class="language-plaintext highlighter-rouge">overrides</code> 是一个文件夹 <code class="language-plaintext highlighter-rouge">server-manifest.json</code> 是整合包配置文件。</p><h1 id="客户端初始化">客户端初始化</h1><p>第一次使用客户端需要在一个空文件夹以 <code class="language-plaintext highlighter-rouge">newClientPackage</code> 为例,在文件夹中放一个 <code class="language-plaintext highlighter-rouge">hmcl</code> 启动器,打开 <code class="language-plaintext highlighter-rouge">hmcl</code> 导入刚刚做好的 <code class="language-plaintext highlighter-rouge">client1.0.zip</code> 整合包。 然后就可以把这个文件夹 <code class="language-plaintext highlighter-rouge">newClientPackage</code> 打包成一个 <code class="language-plaintext highlighter-rouge">zip</code> 发给玩家了,以后玩家每次打开 <code class="language-plaintext highlighter-rouge">hmcl</code> 登录时,启动器就会自动向静态资源服务器中查询整合包配置信息,当发现更新时会自动下载。 当缺少 <code class="language-plaintext highlighter-rouge">mod</code> 时会自动下载静态资源服务器上的 <code class="language-plaintext highlighter-rouge">mod</code></p><p><img src="https://s2.loli.net/2023/01/11/WpD4Xm7i561YbIj.png" alt="image.png"></p><h1 id="更新客户端">更新客户端</h1><p>目前HMCL版本更新的步骤是这样的</p><ol><li>启动器对比本地的 <code class="language-plaintext highlighter-rouge">mod</code> 和服务器的 <code class="language-plaintext highlighter-rouge">mod</code> 名称,如发现本地不存在的 <code class="language-plaintext highlighter-rouge">mod</code> 则会从服务器上下载。</li><li><code class="language-plaintext highlighter-rouge">mod</code> 的名称相同时,启动器会继续对比文件 <code class="language-plaintext highlighter-rouge">MD5</code> 哈希值,如果不匹配则重新下载。</li><li>在获得更新的时启动器会对比一次本地的文件,如果旧版本的模组在新版本中消失了,启动器会自动将本地的这个模组删除。</li><li>非远端服务器更新资源不会被更新删除,换句话说就是如果是玩家自己魔改整合包,往里面放的 <code class="language-plaintext highlighter-rouge">mod</code> 是不会被删除的。</li></ol><p>当想要添加新的 <code class="language-plaintext highlighter-rouge">mod</code> 时需要在添加之后重新导出整合包如 <code class="language-plaintext highlighter-rouge">client2.0.zip</code> 导出的整合包版本号增加,然后重新上传整合包到静态资源服务器。</p><div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> /minecraftClientStatic
<span class="c"># 建议直接删除该目录然后重新新建</span>
<span class="nb">rm </span>modepack <span class="nt">-R</span>
<span class="c"># 重新新建modepack文件夹</span>
<span class="nb">mkdir </span>modepack
<span class="c"># 解压新的客户端整合包</span>
unzip /home/ftp/client2.0.zip <span class="nt">-d</span> /minecraftClientStatic/modepack
</code></pre></div></div><p>玩家启动 <code class="language-plaintext highlighter-rouge">hmcl</code> 后,启动器会检测到版本更新并自动更新模组。</p><h1 id="参考资料">参考资料</h1><ul><li><a href="https://blog.csdn.net/pibuliao8626/article/details/110449349">nginx配置文件结构</a></li><li><a href="https://www.muzhuangnet.com/show/86630.html">使用nginx如何部署静态资源</a></li><li><a href="https://zhuanlan.zhihu.com/p/514547633">Nginx 作为静态资源服务器</a></li><li><a href="https://cloud.tencent.com/developer/article/2028983">nginx配置静态静态资源服务器</a></li><li><a href="https://hmcl.huangyuhui.net/help/launcher/serverpack.html">HMCL官方文章</a></li><li><a href="https://www.kdocs.cn/l/ck0hwms5llq8">使用Gitee作为静态资源服务器</a></li><li><a href="https://buggzd.github.io/2023/01/11/Nginx%E9%9D%99%E6%80%81%E8%B5%84%E6%BA%90%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BD%BF%E7%94%A8/">Nginx配置静态资源服务器</a></li></ul></section><footer class="page__meta"><p class="page__date"><strong><i class="fas fa-fw fa-calendar-alt" aria-hidden="true"></i> 更新时间:</strong> <time class="dt-published" datetime="2023-01-11T14:13:45+08:00">2023-01-11</time></p></footer><nav class="pagination"> <a href="/modpack/bundled-java.html" class="pagination--pager" title="整合包自带 Java 教程">上一页</a> <a href="/modpack/error-handbook.html" class="pagination--pager" title="模组包报错排查手册">下一页</a></nav></div></article></div></div><div id="footer" class="page__footer"><footer><div class="page__footer-follow"><ul class="social-icons"><li><strong>关注:</strong></li><li><a href="https://github.com/HMCL-dev/HMCL" rel="nofollow noopener noreferrer"><i class="fab fa-fw fa-github" aria-hidden="true"></i> Github</a></li><li><a href="https://beian.miit.gov.cn" rel="nofollow noopener noreferrer"><i class="fas fa-link" aria-hidden="true"></i> 粤ICP备18071565号</a></li><li><a href="/feed.xml"><i class="fas fa-fw fa-rss-square" aria-hidden="true"></i> Feed</a></li></ul></div><div class="page__footer-copyright">&copy; 2026 <a href="mailto:hmcl@huangyuhui.net">huanghongxun</a>. 技术来自于 <a href="https://jekyllrb.com" rel="nofollow">Jekyll</a> &amp; <a href="https://mademistakes.com/work/jekyll-themes/minimal-mistakes/" rel="nofollow">Minimal Mistakes</a>.</div></footer></div><script src="/assets/js/main.min.js"></script> <script src="/assets/js/plugins/jquery.auto-redirect.js"></script></body></html>