透明地在一个地址提供多个 Web 应用程序

cku*_*jer 4 linux reverse-proxy ruby-on-rails cherrypy

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

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

dav*_*ams 5

您正在寻找的称为“反向代理”。有许多具有此功能的 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>
Run Code Online (Sandbox Code Playgroud)

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

致智者的话语

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

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

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