我正在尝试在同一计算机上的两个不同端口上运行两个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则发出了请求。但是我完全茫然。任何帮助,将不胜感激。
如Dag Nabbit所述,Minecraft服务器不会使用http。通常,您将通过NAT进行此操作。代理服务器需要知道协议,因为顾名思义,它代表客户端运行。 Nginx知道各种协议,不仅是http,而且Minecraft也不是其中之一。但是,您可以为此协议编写代理模块,并使用现有的nginx基础结构。由于我不熟悉该协议,因此我无法对此进行评论,因为它比NAT具有任何优势。
在您的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
有待将来的读者注意的一件事,虽然是的,nginx确实将连接作为“代理”传递给通过袜子代理连接方式的上游定义定义的任何server:port列表。当nginx本身正在侦听HTTP通信时,这将不起作用。这仅仅是因为nginx默认情况下被设计为已死的简单静态http服务器。
TCP / UDP连接的任何类型的反向传播都可以在较低的OSI级别(即,在nginx进行操作时,第3层或第2层而不是第6/7层)进行扩展。这是源和目标NAT发挥作用的地方,边缘设备的防火墙或路由策略指令可以更好地处理它。
DNS-RR并不是最好的解决方案,因为只有低端OSI分层才是可行的,只有在最终应用程序(第7层OSI)理解该方法的情况下才可行。我的世界(或几乎所有游戏服务器)在最后检查时并未将此内容内置到游戏的网络代码中。
现在,我确实对此进行了调查,对于Minecraft本身,有一些解决方案应该进一步研究:
请务必阅读所有文档,因为这些文档的配置和安装非常复杂。建议不要使用NAT版本的网络拓扑。
嗯...现在我们有了BungeeCord。它完全满足您的需求。