我想在同一个虚拟机中安装许多运行在不同端口上的 Apache 和 php 服务器,因为我想将 N 个不同的网站托管到同一个虚拟机中,以避免创建 N 个虚拟机来托管 N 个网站。
是否有任何简单的 DNS 配置可以将不同的域重定向到不同端口的相同 IP?
例子:
- www.example1.com
答案1
据我所知,通过 DNS 记录实现您想要做的事情是无法做到的。
阿帕奇
Apache,通过命名基本虚拟主机块并配置 Apache 来监听所需的端口。
# Listens on all IP Addresses and ports 80 - 83
Listen 80
Listen 81
Listen 82
Listen 83
使用基于名称的虚拟主机允许您根据主机值中传递的名称捕获每个请求;
<virtualhost example1.com:80>
# all your configuration for example1.com
</virtualhost>
<virtualhost example2.com:81>
# all your configuration for example2.com
</virtualhost>
端口
要求用户输入端口并不是一个好的解决方案,从长远来看很可能会失败。我们不能指望用户知道如何添加端口,甚至记得他们需要添加端口。
Nginx 反向代理
更好的解决方案是将 Nginx 作为您的前端,它接收请求并使用您需要的端口结构将该请求传递给 Apache。
Server {
listen 80;
server_name example1.com www.example1.com
# other stuff as required
proxy_pass http://192.168.100:80;
}
Server {
listen 81;
server_name example2.com www.example2.com
# other stuff as required
proxy_pass http://192.168.100:81;
}
通过使用 Nginx,客户端输入 example2.com(不带端口),Nginx 接收它、处理它并从监听端口 81 的 Apache 获取结果。
Nginx 也能提高你的性能。虽然需要学习,并且需要进行一些配置微调,但从长远来看,这是一个更好的解决方案。
有数百个使用 Nginx 的反向代理示例。谷歌是你的朋友。
答案2
这无法通过 DNS 实现。所需的机制和 srv 记录不属于 http(s) 规范。
我们不清楚您为什么认为多个网站需要多个端口。您可以在一台机器上使用 1 个端口和 1 个地址来拥有多个网站。这里的技术称为基于名称的虚拟主机,是无处不在的 http 1.1 规范的一部分。如果您使用的是 Apache,则只需为每个域创建虚拟主机容器。自从 Windows XP 被宣布死亡以来,您就可以对 https 主机执行相同的操作(该技术称为 sni - 服务器名称指示器)
如果多个端口无法协商,则需要设置反向代理。您可以在 Apache 中适当的 Virtualhost 容器中使用 mod_proxy 和 ProxyPass/ProxypassReverse 对来“环回”到本地主机上的其他端口。