我已将 nginx 配置为 Tomcat 实例后端的反向 SSL 代理,该实例为内部 Flex 应用程序提供服务。目的是获得主动/反向对。配置如下:
|----- serverb:8080 (10.0.0.1:8080) (http)
servera:443 (ssl) ------|
|----- serverc:8080 (10.0.0.2:8080) (http) (backup)
此配置似乎对静态 html 很有效(我可以在 serverb 的 webroot 上看到“check.txt”文本文件,当我终止该 tomcat 实例时,我可以刷新并在 serverc 上看到“check.txt”。所以 nginx 正在故障转移到备份服务器。一切都很好。
当我尝试登录 Flex 应用程序时,问题就开始出现了。AMF 通道出现故障,我在 tomcat 日志中看到以下内容:
SEVERE: Servlet.service() for servlet MessageBrokerServlet threw exception
flex.messaging.security.SecurityException: Secure endpoint '/messagebroker/amfsecure' must be contacted via a secure protocol.
在我的 ngnix 日志中我看到:
10.0.0.99 - - [17/Oct/2011:11:38:02 +0000] "POST /test/BalanceServlet HTTP/1.1" 200 71 "https://servera/test/MainApp.swf" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"
10.0.0.99 - - [17/Oct/2011:11:38:02 +0000] "POST /test/messagebroker/amfsecure HTTP/1.1" 404 1054 "https://servera/test/MainApp.swf" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"
10.0.0.99 - - [17/Oct/2011:11:38:02 +0000] "POST /test/messagebroker/amfsecure2 HTTP/1.1" 404 1057 "https://servera/test/MainApp.swf" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"
10.0.0.99 - - [17/Oct/2011:11:38:02 +0000] "POST /test/messagebroker/amfsecure3 HTTP/1.1" 404 1057 "https://servera/test/MainApp.swf" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"
开发人员建议下载到浏览器的代码基于它在 URL 栏中看到的内容来决定如何启动 AMF 通道。因此,浏览器到 ngnix 使用 SSL,而 ngnix 到 tomcat 实例使用 http。
查看 remote-config.xml,我有以下默认频道:
<default-channels>
<channel ref="my-amf"/>
<channel ref="my-amf2"/>
<channel ref="my-amf3"/>
<channel ref="ack-amf"/>
<channel ref="my-secure-amf"/>
<channel ref="my-secure-amf2"/>
<channel ref="my-secure-amf3"/>
<channel ref="sack-amf"/>
</default-channels>
问题是否出在这个配置上?
答案1
我遇到过类似的事情,但我不知道 Flex,所以我不确定下面我使用的术语是否正确。如果这是我遇到的相同问题,HTTPFox 等工具将显示您的 amf 请求使用 http(而不是 https)到端口 443 访问网站。
修复是在 Flex 端,必须设置客户端配置以利用安全端点或通道(或两者)。这会告诉 flash/flex 应用程序,amf 请求应设置为 https,而不是配置的默认 http。