我有一个名为“ARI”的 Java Servlet,它从存档数据库检索数据并返回包含该数据库中行的 XML 有效负载。
我们在一个盒子里的虚拟服务器上运行着这个 servlet 的多个实例,可以通过不同的端口号访问,如下所示:
testserver.co.uk:61061/aricp/ari
testserver.co.uk:61062/aricp/ari
这两个 servlet 都可以直接从客户端成功访问,这里是通过数据包捕获获取的客户端和服务器之间的示例对话。
成功的 HTTP 请求:
POST /aricp/ari HTTP/1.1 接受字符集: UTF-8
内容类型:application/x-www-form-urlencoded;charset=UTF-8
用户代理:Java/1.6.0_25
主机:testserver.co.uk:61061
接受:text/html、image/gif、image/jpeg、*;q=.2,/;q=.2
连接:保持连接
内容长度:11
id=1-134ISR
注意请求中的 POST 变量“id”
成功响应
HTTP/1.1 200 正常
服务器:Sun-ONE-Web-Server/6.1
日期:2013 年 1 月 8 日星期二 17:48:49 GMT
内容类型:text/html
传输编码:分块
03a6
*成功的 HTTP 请求服务器日志 *
[09/Jan/2013:10:25:33] 正常 (16359): 对于尝试 GET /aricp/ari 的主机 10.232.191.87,ntrans-j2ee 报告: 将上下文“/aricp”中的 uri“/ari”映射到资源“ARI”
因此,直接向我们的 servlet 发送请求是可以的,但是如果我们使用 ZEUS ZXTM 间接处理从客户端到我们 servlet 的所有实例的请求,那就行不通了。
这是一个失败的 HTTP 请求,请注意 HOST 地址的差异,因为 ZEUS 是中介。
ZEUS 失败的 HTTP 请求
POST /aricp/ari HTTP/1.1 接受字符集: UTF-8
内容类型:application/x-www-form-urlencoded;charset=UTF-8
用户代理:Java/1.6.0_25
主机:zeus.co.uk:61061
接受:text/html、image/gif、image/jpeg、*;q=.2,/;q=.2
连接:保持连接
内容长度:11
id=1-PUZK7D
ZEUS 失败 HTTP 响应
HTTP/1.1 404 未找到
服务器:Sun-ONE-Web-Server/6.1
日期:2013 年 1 月 8 日星期二 18:05:45 GMT
内容长度:292
内容类型:text/html
当使用 ZEUS 时,Web 服务器无法将来自 ZEUS 的请求解释为 servlet 请求,而是将请求 URI 解释为文件路径,因此我们收到 404 未找到错误。
ZEUS 失败 HTTP 请求服务器日志
[09/Jan/2013:10:50:45] 警告(16886):对于主机 10.232.184.53 尝试 GET /aricp/ari,发送文件报告:HTTP4142:找不到 /u02/SunONE61060/docs/aricp/ari(未找到文件)
如您所见,它将 uri 视为目录路径而不是应用程序路径。
这是一个非常奇怪的问题。
我尝试过的事情
- 删除访问控制列表以确保没有访问受到限制
- 刷新 servlet 和虚拟服务器
- 刷新 ZEUS
- 重新启动 Sun One Web 服务器
- 在虚拟服务器上重新安装 servlet
总的来说,它运行良好,如下所示:
客户端-->服务器
但是这样做却不起作用:
客户端--ZEUS-->服务器
我正要去刷新安装一个新的虚拟服务器并看看会发生什么。
欢迎任何想法或理论。
答案1
我不确定为什么您只有一个后端服务器,也许这只是一个测试设置。ZXTM
是一个强大的负载平衡器,看来您目前或多或少将其用作反向代理。
无论如何,您通常设置类似这样的方式:
- 创建一个 DNS 记录并将myapp.example.com
其指向 ZXTM 集群的流量 IP
- 设置您的后端应用程序以监听myapp.example.com
- 在使用流量 IP 的 ZXTM 集群中创建一个虚拟服务器
- 在 ZXTM 集群中创建一个新池并添加testserver.co.uk:61061
到它
- 将新池分配给创建的虚拟服务器
然后,您可以通过 访问您的应用程序myapp.example.com
。
您仍然可以直接在后端节点上访问应用程序(例如,出于监控目的),但根据应用程序的工作方式,您可能需要为此调整 Host-header。