8

我正在尝试在同一台机器上的两个不同端口上运行两个 Minecraft 服务器。我想根据子域引用它们:

one.example.com -> <minecraft>:25500
two.example.com -> <minecraft>:25501

我以前用过 nginx 做类似的事情,但它不适用于 Minecraft。它以 http 状态 400 响应。这是我日志中的示例:

192.168.0.1 - - [21/Apr/2013:17:25:40 -0700] "\x02<\x00\x0E\x00t\x00h\x00e\x00s\x00a\x00n\x00d\x00y\x00m\x00a\x00n\x001\x002\x003\x00\x1C\x00t\x00e\x00s\x00t\x00.\x00r\x00y\x00a\x00n\x00s\x00a\x00n\x00d\x00y\x00.\x00i\x00s\x00-\x00a\x00-\x00g\x00e\x00e\x00k\x00.\x00c\x00o\x00m\x00\x00c\xDD" 400 173 "-" "-"

这是我的 nginx 配置:

upstream mine1 {
  server 127.0.0.1:25500;
}
upstream mine2 {
  server 127.0.0.1:25501;
}

server {
  listen 25565;
  server_name one.example.com;

  access_log /var/log/nginx/one.access;
  error_log /var/log/nginx/one.error;

  location / {
    proxy_pass http://mine1;
  }
}
server {
  listen 25565;
  server_name two.example.com;

  access_log /var/log/nginx/two.access;
  error_log /var/log/nginx/two.error;

  location / {
    proxy_pass http://mine2;
  }
}

如果我没看错,nginx 会以 400 响应。我的猜测是 Minecraft 客户端没有发送有效的 HTTP 标头,而 Nginx 正在抛出请求。但我完全不知所措。任何帮助,将不胜感激。

4

4 回答 4

11

在您的 DNS 记录中尝试此操作

一个记录

Name     one.example.com
Value    <server_ip>
TTL  86400

Name     two.example.com
Value    <server_ip>
TTL  86400

服务记录

Name     _minecraft._tcp.one.example.com
Port     25500
Value    one.example.com

Name     _minecraft._tcp.two.example.com
Port     25501
Value    two.example.com
于 2013-05-03T16:31:44.543 回答
4

正如 Dag Nabbit 所说,Minecraft 服务器不使用 http。您通常会通过 NAT 执行此操作。代理服务器需要知道协议,因为顾名思义,它代表客户端行事。Nginx 知道各种协议,不仅仅是 http,Minecraft 不是其中之一。但是,您可以为此协议编写代理模块并使用现有的 nginx 基础设施。由于我不熟悉该协议,因此我无法评论这比 NAT 有任何优势。

于 2013-04-23T06:36:44.283 回答
0

未来读者需要注意的一件事,是的,nginx 确实将连接作为“代理”传递给任何服务器:端口列表,该列表是通过 socks 代理连接样式中的上游定义定义的。当 nginx 本身正在侦听 HTTP 通信时,这不起作用。这仅仅是因为 nginx 被默认设计为一个死的简单静态 http 服务器。

任何类型的 TCP/UDP 连接的反向代理在较低的 OSI 级别(即第 3 层或第 2 层而不是 nginx 正在运行的第 6/7 层)都具有更高的可扩展性。这就是源和目标 NAT 发挥作用的地方,最好由边缘设备的防火墙或路由策略指令处理。

DNS-RR 不是最好的解决方案,虽然是较低级别的 OSI 分层,但只有在最终应用程序(第 7 层 OSI)理解该方法时才可行。Minecraft(或几乎任何游戏服务器)在最后一次检查中没有将此内置到游戏的网络代码中。

现在我确实研究了这一点,我的世界本身有一些解决方案应该进一步研究:

  • 转运插件
  • 蹦极绳索

请务必阅读所有文档,因为这些文档的配置和安装非常复杂。支持仅使用 NAT-ed 网络拓扑的建议。

于 2014-12-14T23:43:08.753 回答
-1

我尝试使用 SRV 设置我的多个 minecraft 实例,但这也不起作用 nslookup 我的 srv 记录显示:

C:\Users\Administrator>nslookup -type=SRV _minecraft._tcp.xxx.net 服务器:mijnmodem.kpn 地址:192.168.1.1

非权威答案:

  1. _minecraft._tcp.xxx.net SRV服务位置:

      priority       = 5
      weight         = 5
      port           = 25565
      svr hostname   = camelot.xxx.net
    
  2. _minecraft._tcp.xxx.net SRV服务位置:

      priority       = 5
      weight         = 5
      port           = 25566
      svr hostname   = cityworld.xxx.net
    

在我的路由器(中兴 H369)上,端口 25565 和 25566 直接转发(TCP 和 UDP)到实例运行的 IP。访问 url(在 Minecraft 中)给出 io.netty.channel.Abstart$AnnotatedConnectException

任何建议如何进一步调查?

于 2021-03-22T21:08:08.397 回答