透明地使多个 Web 应用程序可通过单个地址访问

透明地使多个 Web 应用程序可通过单个地址访问

我有多个在自己的 http 服务器上运行的 Web 应用程序,例如端口 8080 上的 ruby​​/rails 应用程序和 8081 上的 python/cherrypy 应用程序。

是否可以通过单个端口地址透明地提供这些服务?也许可以通过添加第三个 http 服务器来转换所有请求(例如http://localhost/app1&http://localhost/app2)我选择的平台是Linux

答案1

您正在寻找的是“反向代理”。许多 Web 服务器都具有此功能,包括 Apache httpd、lighttpd 和 nginx,以及专为反向代理设计的更精简的 Web 服务器。

由于 Apache 最有可能供您使用和/或最容易部署,因此将此代码片段包含在 Apache 配置文件的相关部分中,应该为您提供所需的最小配置,假设您已安装并启用 mod_proxy_http:

# ... [snip] ...
<VirtualHost *:80>
# ... [snip] ...

# This line prevents mod_proxy from acting as a forward proxy
# Yes it looks silly, but it's correct for reverse proxy configurations
ProxyRequests Off

# Rails app on port 8080
ProxyPass /app1 http://localhost:8080
ProxyPassReverse /app1 http://localhost:8080

# CherryPy app on port 8081
ProxyPass /app2 http://localhost:8081
ProxyPassReverse /app2 http://localhost:8081

# ... [snip] ...
</VirtualHost>

更新:这里有一些各种服务器的文档链接(有时很密集):

给智者的话

还请考虑,使用反向代理后,后端应用程序将不再从发起请求的客户端 IP 接收请求。相反,所有请求都将显示为来自本地主机 (127.0.0.1)。因此,任何与客户端 IP 相关的逻辑都将停止运行。如果您的应用程序需要此请求元数据,则需要遵循依赖于反向代理 HTTP 服务器的程序。

在 Apache 中,mod_proxy 会自动将 X-Forwarded-For 标头添加到请求中,其值是进入 Apache 的请求的 IP 地址(或者,如果您有多个反向代理链,则为转发请求的 IP 列表)。对于 Nginx,我相信您可能必须指示服务器发送这样的标头(详细信息请参见上面的链接)。

如果您的后端应用程序关心原始客户端请求的 Host: 标头,则您需要修改该代码以查找(在 Apache 中)X-Forwarded-Host 标头。

答案2

这称为反向代理。您可以使用阿帕奇以及其他 Web 服务器。您还可以使用专用的代理服务器。

答案3

是的,你可以在 APACHE 中使用以下命令执行类似操作mod_jk

详情请见此处:http://www.ruby-forum.com/topic/211503

基本上,APACHE 被用作 ruby​​ 流量的“路由器/代理”。这样,您不需要任何新服务器/ip。请记住,您不再依赖 Apache 来将流量引导到您的应用程序。

相关内容