【mod_proxy】使用mod_proxy让Dynmap通过https进行查看
我想做的事情
我希望能以HTTPS方式查看Dynmap。
前提-只需要一个选项
Dynmap是Minecraft的服务器插件,它是一款受欢迎的插件,允许从浏览器中查看游戏的内部情况。


这是一个概略的图表,大致上是这样的关系。端口号是默认值。
问题是Dynmap。Dynmap内部集成了一个独立的Web服务器,但为了避免与Apache的冲突,它使用8123端口。因此,服务器除了80、443和25565端口外,还必须开放8123端口。
除了需要开放其他端口之外,我不想开放Dynmap的端口。
更具体地说,我想要使用https进行通信。
好吧,我们该怎么办呢?
使用反向代理(Reverse Proxy)。
通过使用反向代理可以解决这个问题。反向代理是指对外部网络连接进行某种处理,并将其传递到内部服务器的设备,可以说是中继功能。
有一张非常清晰易懂的图,我借过来了。

可以看出反向代理作为外部接待员。虽然这次硬件上只有一个服务器,但要做的事情都是一样的。
通过将对Apache的请求分配给Apache,将对Dynmap的请求分配给Dynmap,可以减少开放端口。
应用反向代理

反向代理是Apache的一个功能,所以反向代理位于Apache内部。
反向代理接收到的与Dynmap相关的请求将被发送到8123端口。
Dynmap的响应将通过反向代理发送到外部。
使用反向代理可以隐藏内部服务器,防止不必要的端口开放。
反向代理的实现
如果你在使用Apache的话,可以通过使用mod_proxy来轻松实现。本次的实现针对https通信,因此我们将使用VirtualHost。(https已经配置好了)
...
# スラッシュ補完(後述)
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_URI} /dynmap$
RewriteRule /* %{REQUEST_URI}/ [R=301,L]
</IfModule>
# リバースプロキシ
<VirtualHost *:443>
ServerName sample.com:443
<IfModule mod_proxy.c>
ProxyRequests Off
ProxyPass /dynmap http://localhost:8123
</IfModule>
...
</VirtualHost>
这里的ProxyRequests是用来决定是否启用正向代理的设置,我们将其设为off。
ProxyPass的用法是
请将来自外部请求的流量代理到内部服务器。
是的,非常简单呢。
我们将对sample.com:443/dynmap的请求投向内部的localhost:8123。
这样,当您访问https://sample.com/dynmap时,将会显示Dynmap的界面。
只需使用https从外部访问Dynmap,而不需要打开端口。
补充说明:斜杠补全
在使用反向代理之前,使用mod_rewrite模块进行斜杠补全。
也就是说,将https://sample.com/dynmap 替换为 https://sample.com/dynmap/。
如果不进行斜杠补全,将会显示空白页面。而若是https://sample.com/dynmap/或https://sample.com/dynmap/#,则会正确显示。
为什么需要保存斜杠/呢?
我猜想可能是因为需要指定Dynmap Web服务器的根目录。
通常情况下,当只输入域名访问时,浏览器会自动添加斜杠并向服务器发送请求。即使URL栏显示为https://sample.com,实际上会发送https:/sample.com/的请求。最后的斜杠表示根目录。
但是,由于在本次情况中经过了反向代理,所以没有进行斜杠补全。
没有指定任何目录的Web服务器可能会遇到困难,返回一个完全空白的页面,不是吗?
如果有任何详细信息,请告诉我。
Minecraft服务器的端口也无法通过反向代理进行吗?
我认为这是非常正确的。
但是,Minecraft所使用的协议是游戏独有的。
mod_proxy模块无法处理这种特殊的协议,所以不能像这个例子那样操作。
因此,我决定只对Dynmap应用反向代理。
总结起来
请问感觉如何?
除了其他多台服务器之外,我找到了一些正在通过http://xxxxxx:8123访问的内容,所以我将其写成了一篇文章。
要关闭端口,或者为了使用HTTPS进行通信,您可以考虑使用反向代理。