我正在尝试使用子域重定向在非标准端口上设置 Minecraft 服务器,当通过 Minecraft 导航到该服务器时将转到其正确的端口,或者如果通过 Web 浏览器导航到该服务器将显示一个网页。即:
**Minecraft**
minecraft.example.com:25565 -> example.com:25465
**Web Browser**
minecraft.example.com:80 -> Displays HTML Page
我尝试使用 Apache 中的以下 VirtualHosts 来执行此操作:
Listen 25565
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName minecraft.example.com
DocumentRoot /var/www/example.com/minecraft
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/example.com/minecraft/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
</VirtualHost>
<VirtualHost *:25565>
ServerAdmin [email protected]
ServerName minecraft.example.com
ProxyPass / http://localhost:25465 retry=1 acquire=3000 timeout=6$
ProxyPassReverse / http://localhost:25465
</VirtualHost>
运行此配置,当我浏览 minecraft.example.com 时,我能够看到 /var/www/example.com/minecraft/ 文件夹中的文件,但是如果我尝试在 minecraft 中连接,我会收到异常,并且在浏览器中我得到一个包含以下信息的页面:
minecraft.example.com:25565 ->
Proxy Error
The proxy server received an invalid response from an upstream server.
The proxy server could not handle the request GET /.
Reason: Error reading from remote server
有人可以分享一些我可能做错的事情以及解决这个问题的最佳解决方案吗?
答案1
Minecraft 服务器协议不是 HTTP,因此您无法像那样代理请求。
假设您使用的是 Linux,请使用 iptables 转发 TCP 端口。您仍然可以在同一个 IP 上的端口 80 上运行 Apache,但要删除那里的配置中的 Listen 指令和相应的 vhost。
IPTables 规则应如下所示:
iptables -t nat -A PREROUTING -p tcp -d --dport 25565 -j DNAT --to 127.0.0.1:25465
当然,请记住实际上也要允许 INPUT/OUTPUT 链中有一个条目的流量。
答案2
iptables -t nat -A PREROUTING -p tcp -d 12.13.14.15 --dport 25565 -j DNAT --to 127.0.0.1:25465
12.13.14.15
的 IP 地址在哪里minecraft.example.com
?
请注意,您不能为此使用虚拟主机。如果你想在同一个公共 IP 上托管 server1.example.com 和 minecraft.example.com,同时进行这种端口级重定向……抱歉,这不会发生。这种事情会发生前HTTP 层,因此虚拟主机与它无关。:)