开服时各种疑难杂症合集
本文最后更新于 2024年8月23日 晚上
开服时所遇到的各种奇奇怪怪的大小问题
序
就像我在关于博客里所说的,内容以分享经验为主
当了那么久腐竹,一定会遇到不少疑难杂症,但不少都是些奇奇怪怪的小问题并且年代久远,久而久之就忘了该如何解决
所以这个合集的目的就是做一个收录,把遇到的情况和解决方案留下来,下次遇到同样的就不用再花时间去慢慢 debug
系统信息
可惜,咱服务器上因为种种原因跑的不是 Linux, 而是 Windows Server
版本为 Windows Server 2022
无法使用 KMS 或者 OEM 激活 Windows Server
Windows Server 系统安装完成后,尝试 KMS 或者 OEM 均无法激活
激活工具:HEU_KMS_Activator
成因
选择 Windows Server 镜像的时候选择了 Evaluation 版本,这个不容易发现
使用 Eval 版本的 Windows Server 都无法被激活
修复
使用 MAS 修改版本
-
启动 Powershell,输入
1
irm https://massgrave.dev/get | iex
-
在弹出来的窗口选择第 7 项,再在新页面选择第一项修改版本
-
修改成 Standard 而并非 Eval
-
重启电脑,现在再次尝试使用 KMS 或 OEM 都能激活
完成
顺带一提,修改完版本后可以任意选择使用 MAS 或者 HEU 激活,都一样的,无所谓
MAS 和 HEU 都是非常好用的激活工具 ┗|`O′|┛
安装 Windows Terminal 报错
根据 github 上的这个教程在 Windows Server 上安装 Windows Terminal
在 Powershell 安装 VCLibs 没问题,但是安装 Windows Terminal 的时候就报错
内容如下
1 |
|
成因
如果仔细看报错信息,会发现这个错误是指缺失了 Microsoft.UI.Xaml.2.7
这个软件包
修复
有俩种方法修复,一种就是直接 ignore 掉这个 dependency,另外一种就是安装这个所需的包
Ignore dependency
1 |
|
问题解决,或
安装 Microsoft.UI.Xaml
-
下载一个 NuGetPackage:https://www.nuget.org/packages/Microsoft.UI.Xaml/
-
解压这个包(可以把文件扩展名改成 zip)
-
前往
.\tools\AppX\{arch}\Release\Microsoft.UI.Xaml.2.7.appx
并将这个文件提取出来 -
启动 Powershell,执行
1 |
|
问题解决
服务器控制台以及日志无法正确显示中文
控制台以及日志可以正确显示中文,但是某些时候还是会变成 ?
或者其他错误字符
这个图片中发送的是 测试
,但在控制台中却显示为 ??
同时,上面的字段证明了控制台是可以显示中文
成因
其实这是 Windows 系统默认编码造成的
在上面那个示例中,系统是 Windows Server,安装语言为英文
安装系统语言是英文的话默认编码就不是 utf-8
,而是其他的编码
不过在截图中能看到,上方程序的编码解码已经设置为 utf-8
,但是为何下面的中文仍然无法正确显示
其实这是一个误解
上方的输出属于 MCDR ,而最下面那行是 mc 服务器的输出,二者并非同一程序,编码规则当然毫无关联
只是 MCDR 的编码设置为 utf-8
,而 mc 服务器的话并没有指定,当调用系统默认编码时不是 unicode 的话自然就无法正确显示中文
修复
前往 控制面板
-> 更改日期,时间或数字格式
-> 管理
-> 更改系统区域设置...
勾取 Beta版:使用 Unicode UTF-8 提供全球语言支持
英文系统也是对应的:
Control Panel
-> Change date, time, or number formats
-> Administrative
-> Change system locale...
勾取 Beta: Use Unicode UTF-8 for worldwide language support
重启系统
问题解决
现在控制台应该能正常显示中文或者其他语言了 q(≧▽≦q)
无法连接本地服务器
在和服务器同一个网络下,无论如何都无法连接
服务器防火墙已经全部关闭,无任何杀毒软件阻碍
使用其他方式(例如 Bungeecord)却能够连接
成因
其实问题很简单,但是非常容易被忽略
在服务器 server.properties
里有一项叫做 server-ip
的选项,很多时候填不填写并无大碍,通常会写上 127.0.0.1
,合情合理
但是在 Minecraft 的机制里,server-ip
是指将服务器与这个 ip 绑定,填写完后服务器将只会监听来自这个 ip 的连接
所以,在填写 127.0.0.1
之后,服务器就只会回应来自本地的连接(恍然大悟
但是,为什么使用 Bungeecord 却能够连接呢?
因为我是原版服务端,所以在 Bungeecord config 里 ip_forward
是设为 false
,细心留意的话会发现通过 Bungeecord 建立的连接在服务端里显示的都是 127.0.0.1
,因此通过 Bungeecord 来连接服务器的并不会因为 server.properties
的 server-ip
选项阻挠
修复
按照建议将 server.properties
里的 server-ip
留空
重启服务器
某个机器的 Python 程序无法 import 所需库
在正常 import 了所有 library 情况下却报 ImportError
注意,是
ImportError
而不是ModuleNotFoundError
这种情况下用 pip list
能够看到所需的 library,但是无论如何 pip uninstall
再 pip install
都无法解决
还有,这种情况是在某个程序出现的,其他 python 程序没问题
另外,只有「干净」,没乱装东西的 Server 环境才有这个问题,Desktop 开发环境使用同样的步骤 pip install
安装却无法复现相关问题
最多也只是卸载了所需的库导致 ModuleNotFoundError
,而并非 ImportError
完整报错:
1ImportError: DLL load failed while importing ujson: The specified module could not be found.
成因
其实具体成因我目前阶段无法给出答案
但是如果仔细看报错的话,是 DLL 相关的问题
况且上面背景也交代了若是缺失所需库的话应该是 ModuleNotFoundError
,表示问题不在 library 上面
Windows 上 DLL 相关的问题也几乎只有一个解决方案,装个 Microsoft Visucal C++ Redist 即可
这也解释了为什么我的 Desktop 开发环境无法复现问题,因为在开发途中装了太多乱七八糟的玩意,而在检查 windows 安装软件里雀食是已经有 MS Visual C++ Redist
反而干净的 Server 里啥也没有,所以导致了缺失 DLL 的问题
修复
安装最新的 Microsoft Visucal C++ Redist 即可
无法成功设置 Nginx Docker Image
以前我是直接 bare metal 跑 Nginx 反代,用系统服务设置开机自启动,但是某次在重装之后有些手贱想试试用 Docker container 的形式来跑 Nginx,~~(我 tm 真的想杀掉那会的自己
按照 bare metal 的形式设置 nginx,但是一直无法建立连接,config 确认没有问题,直接用服务器 ip + 端口访问其他 container 服务均无问题
部分 nginx config 如下
1 |
|
某个 docker container 的服务暴露在 8080 端口,假设服务器 ip 为 192.168.68.2
,使用 192.168.68.2:8080
可以正常访问
这个设置在之前直接把 nginx 注册为 windows server 系统服务时可用,访问 example.lazycraft.top 没有问题
但是现在在 docker 里的 nginx 这样设置就无法访问
成因
十分简单,只要了解 container 的本质即可
按照 docs.docker.com 所述
Docker provides the ability to package and run an application in a loosely isolated environment called a container. The isolation and security lets you run many containers simultaneously on a given host. Containers are lightweight and contain everything needed to run the application, so you don’t need to rely on what’s installed on the host. You can share containers while you work, and be sure that everyone you share with gets the same container that works in the same way.
所有 container 在 docker 里都是被某种程度上隔离的,包括网络层
用户可以自己去管理 docker 上的网络,但是在很多时候下 image 来跑的时候并不会专门设置网络,而且 docker 也会自动帮你管理网络,这一点很多时候就被忽略掉了
在隔离的状态下,一个 container 的网络无法访问另外一个
例如,A 软件跑在 A container 里,而 B 软件跑在 B 的container 里
这种情况下 A 软件无法访问 B,反过来也一样
那该如何解决这个隔离问题呢?
修复
同样引用官网所述,这些环境是 loosely isolated,用户在某种程度上来说是可以让这些软件去调用读取 host 的文件或者信息的
例如文件,用户可以在 deploy images 的时候或者在 docker-compose.yml
里建立文件映射,把某个本地的文件目录映射到 container 里的目录
网络也同理,用户可以通过手动管理 docker 网络来达到不同的 container 相互访问
-
建立 docker 网络
1
docker network create homeserver_network
-
把不同的 container 添加到这个网络里
检查 container 名称
1
docker ps
添加 container
1
2
3docker network connect homeserver_network <container1>
docker network connect homeserver_network <container2>
...<container1>
和<container2>
可以是 container name 或者 ID -
添加完成后,设置 Nginx config
举个例子,我想透过 docker1.lazycraft.top 来访问位于 container1 的服务
container1 的端口映射为 8000(container 的) -> 8080(host 暴露的)
config 内容应为如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16events{}
http {
server {
listen 80; # 尝龟监听端口
location / {
# 注意这里
proxy_pass http://container1:8000;
# ip/地址 栏就填 container 名字,也就是第 2 步添加的名字
# 端口栏填写的**不是** host 所暴露的端口,而是 container 本身的端口
# 因为这一切都还在 docker 的虚拟机里
# 按照例子,这里要填的是 8000,而不是 8080
}
}
}
修改完成,保存设置,并重启 Nginx 服务
类似的反代理服务例如 Nginx Proxy Manager 也是同样的道理,通过建立 docker 网络来解决读取的问题
目前就先更到这里,如果后续还发现了一些新的问题和解决方案的话会持续更新的 (●’◡’●)