我有一个 Web 服务器,该服务器在端口 80 上有一个 tomcat6 服务器,可以从 domain1.com 访问。我想使用 sinatra (ruby) 服务器在同一台机器上打开另一个网站,并能够从 domain2.com 访问它。
我应该怎么做才能实现这一目标?我想首先将 tomcat6 从 80 移动到另一个端口,然后在 80 上放置一些本地内容,通过使用请求来自哪个域来隧道连接到不同的 Web 服务器。
但我真的不知道该怎么做...
提前致谢
答案1
是的,使用 apache 的 mod_proxy 很容易做到这一点。正如您所建议的,我将 tomcat 移至端口 8080 或类似端口,然后让 apache 监听 80。同样,假设您将 sinatra 设置为监听端口 8888。然后在 apache 中,您可以执行以下操作:
<Virtualhost *:80>
ServerName domain1.com
# Proxy through to tomcat, listening on port 8080
<Location />
ProxyPass http://localhost:8080/
ProxyPassReverse http://localhost:8080/
Order allow,deny
Allow from all
</Location>
</VirtualHost>
<VirtualHost *:80>
ServerName domain2.com
# Proxy through to sintra, listening on port 8888
<Location />
ProxyPass http://localhost:8888/
ProxyPassReverse http://localhost:8888/
Order allow,deny
Allow from all
</Location>
</VirtualHost>
(确保 mod_proxy 已安装并启用)
完成后,您应该能够在浏览器中输入 domain1.com(假设您已经有指向您服务器的 DNS 记录),并且 apache 将通过代理到在 8080 上监听的 tomcat。同样,domain2.com 将通过代理到 sinatra。
我确信这可以通过 nginx、haproxy 或其他东西轻松完成。不过,我没有使用过这些,所以如果你想朝这个方向发展,你必须另寻他处。
答案2
您还可以使用iptables
它来获得类似于使用 mod_proxy 的结果(正如 ErikA 向您展示的那样)。基本上,您根据源 IP 将数据包重定向到不同的端口,例如:
sudo iptables -t nat -A PREROUTING -p tcp -s domain1.com --dport 80 -j REDIRECT --to-ports 8080
sudo iptables -t nat -A PREROUTING -p tcp -s domain2.com --dport 80 -j REDIRECT --to-ports 8081
这里 tomcat 监听 8080 端口,sinatra 监听 8081 端口。
(你可能需要使用 Shorewall 或其他防火墙管理工具,而不是iptables
直接操作)
答案3
通常只有一个进程可以拥有一个端口,因此您需要某种形式的 HTTP 代理来实际监听端口 80,该代理可以根据主机名(或任何其他条件,如 URL 路径)智能地将请求转发到 Tomcat 或 sinatra。虽然 Apache mod_proxy 可以做到这一点,但它有一些限制,而且 Apache 可能很重。我建议使用专门构建的代理,如 nginx 或 lighthttpd。如果您需要的话,它们占用的内存要小得多,并且在高负载下速度更快。
答案4
您正在寻找的是“虚拟主机”。谷歌一下,您会找到很多 HOWTO。