我有多个Web应用程序在自己的http服务器上运行,例如端口8080上的
ruby / rails应用程序和8081上的
python / cherrypy应用程序.
是否可以通过单端口地址透明地提供这些?也许通过添加第三个http服务器来转换所有请求(例如http://localhost/app1& http://localhost/app2).我选择的平台是Linux
解决方法
您正在寻找的是“反向代理”.有许多具有此功能的Web服务器,包括Apache httpd,lighttpd和Nginx,以及专为反向代理设计的更多精简Web服务器.
由于Apache最有可能为您提供和/或最容易部署,因此,如果安装了mod_proxy_http,那么包含在Apache配置文件相关部分中的这段代码应该为您提供所需的最小配置.并启用:
# ... [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>
更新:以下是各种服务器的一些链接(有时是密集的):
> Apache mod_proxy
> Nginx HttpProxyModule
> Lighttpd mod_proxy_core
说到智者
还要考虑使用反向代理,后端应用程序将不再接收来自发起请求的客户端的IP的请求.相反,所有请求似乎都来自localhost(127.0.0.1).因此任何与客户端IP相关的逻辑都将停止运行.如果您的应用程序需要此请求元数据,则需要遵循依赖于反向代理HTTP服务器的过程.
在Apache中,mod_proxy自动向请求添加X-Forwarded-For标头,其值是进入Apache的请求的IP地址(或者已转发请求的IP列表,如果您有多个反向代理的链) ).对于Nginx,我相信您可能必须指示服务器发送此类标头(详细信息在上面的链接中).
如果您的后端应用程序关注原始客户端请求中的Host:头,则您需要修改该代码以查找(在Apache中)X-Forwarded-Host头.