Nginx proxy_pass到Minecraft服务器

时间:2013-04-22 01:48:49

标签: nginx minecraft

我正在尝试在两个不同端口上的同一台计算机上运行两台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 个答案:

答案 0 :(得分:6)

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

一个记录

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

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

SRV RECORD

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

Name     _minecraft._tcp.two.example.com
Port     25501
Value    two.example.com

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

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

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

现在我确实对此进行了调查,并且有一些解决方案可以让我自己进一步了解:

  • 转运插件
  • BungeeCord

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

答案 3 :(得分:-1)

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

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。访问网址(在 Minecraft 中)会出现 io.netty.channel.Abstart$AnnotatedConnectException

对如何进一步调查有什么建议吗?

相关问题