Я настроил nginx для работы в качестве обратного SSL-прокси для серверной части экземпляров Tomcat, обслуживающих внутреннее приложение Flex. Цель состоит в том, чтобы получить пару актив / защитник. Конфигурация выглядит так:
|----- serverb:8080 (10.0.0.1:8080) (http)
servera:443 (ssl) ------|
|----- serverc:8080 (10.0.0.2:8080) (http) (backup)
Эта конфигурация, похоже, хорошо работает для статического html (я вижу текстовый файл «check.txt» в корневом веб-каталоге serverb, и когда я убиваю эти экземпляры tomcat, я могу обновить и увидеть «check.txt» на serverc. Итак, 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>
В этой конфигурации была проблема?
Я испытал нечто подобное, но не знал Flex, поэтому не уверен, что использую правильную терминологию ниже. Если это та же проблема, что и у меня, такой инструмент, как HTTPFox, покажет ваши запросы amf, идущие на веб-сайт с использованием http (а не https) на порт 443.
Исправление было на стороне Flex, где необходимо было настроить клиентскую конфигурацию для использования защищенных конечных точек или каналов (или и того, и другого). Это сообщает приложению flash / flex, что для запросов amf следует установить https вместо http по умолчанию.