如何在一个 IP/端口组合上运行多个 Web 服务器?

如何在一个 IP/端口组合上运行多个 Web 服务器?

我买了一个 Slicehost VPS(最便宜的 256MB,运行 Ubuntu),因为我有兴趣在课堂之外扩展我的 Web 开发经验/理解。我希望 Slicehost 能够运行 (1) 博客、(2) 可用于私人组织目的(我自己和几个朋友)的 wiki 和 (3) 多种语言(Ruby、PHP、python)的开发。我意识到这样做有很多缺点。首先,我将为每个访问者启动一个巨大而丑陋的 Apache 进程(我并不期望有),其次,这将使配置成为一场噩梦。

有没有办法让我运行单独的 Apache 进程来处理每个程序,但以 URL 透明的方式进行?我希望能够让 blog.mywebsite.com 只加载 Movable Type 的相关模块和配置内容,同时让 pydev.mywebsite.com 只加载运行 python 的 Apache 的模块/配置,让 railsdev.mywebsite.com 在 Apache/Passenger 或任何其他服务器上运行。如果我愿意让 URL 为 mywebsite.com:8081/、mywebsite.com:8082/ 等,我知道如何做到这一点,但有没有办法让一台服务器监听 *.mywebsite.com:80 并让它将请求传递给适当的服务器(监听端口 8081-8084 左右)?

答案1

你想要的是反向代理配置。是的,这是可行的。本质上,反向代理假装是客户端的 Web 服务器。然后,根据请求的域名,它可以将连接代理到指定的后端 Web 服务器。

因此,您可以让不同的 Web 服务器监听 127.0.0.1 上的不同端口,并让您的反向代理重定向到它们。

流行的轻量级反向代理包括。但是,即使 apache 也可以通过 mod_proxy 配置为代理。lighttpd 和 nginx 也是如此。

答案2

您需要一个反向代理,但请记住,由于您刚刚开始,您不应该太担心开发服务器的 apache 进程,或者解决方案有多丑陋,如果您的目标是学习 MT、Django 和 RoR,您最好使用单独的虚拟主机,或者在不同的端口上运行多个实例。设置反向代理会起作用,但调试问题将花费更长时间,因为您不知道代理是否在运行,或者您实际上是否发送了错误的请求。记住这个免责声明,您需要执行以下操作:apt-get install libapache2-mod-proxy-html a2enmod proxy_http

然后将默认 vhost 配置为类似...

    ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://localhost:8090/
    ProxyPassReverse / http://localhost:8090/

其中 localhost:8090 指向您的 MT 实例,并针对不同的 vhost 重复该过程。

无论哪种方式,您都将有一个丑陋的 Apache 进程设置:)。

答案3

扩展 sybreon 的答案:

反向代理是 Web 服务器(在您的情况下是 Apache)的一个插件,它可以将 URL 转换到您选择的不同服务器上。

例如,如果有请求发来/Wiki/,Apache 将看到它并将您的请求转发到example.com:81(或您指定的任何内容 - 您可以使用 RegEx 仅转发部分或全部请求、重新排列它等等),并且将转发它收到的任何内容。

这种方法的优点在于,您还可以混合使用各种技术。我们有一个 IIS 网站,它在两个完全不同的机器上执行 Subversion 和 Apache 的反向代理,但使用一个公共地址空间。

答案4

mod_proxy就是您要找的答案。不过,您需要为每个网站设置一个 Apache 进程。如果您只是加载所有需要的模块并根据需要为每个虚拟主机启用它们,则可能会更节省内存。

只需注意异常情况即可。某些程序在运行时可能会出现此类问题。

相关内容