Обзор
Я пишу веб-приложение с использованием трехуровневой архитектуры. У меня три сервера Amazon EC2 ubuntu. Первый сервер обрабатывает представление приложения и включает в себя мой основной флэш-файл. Второй экземпляр EC2 представляет мой сервер приложений. Он содержит файлы AMFPHP и соответствующие веб-службы. Наконец, третий экземпляр обрабатывает постоянство и запускает базу данных MySQL. Серверы презентации и приложений работают под управлением веб-сервера apache. Я создал группы безопасности, специфичные для каждого уровня, так что уровень представления будет принимать весь входящий трафик на порт 80, в то время как уровень приложения будет принимать только входящий трафик от сервера представления. Это должно позволить кому-либо запрашивать мое веб-приложение с сервера презентаций, но запретить кому-либо доступ к веб-службам на моем сервере приложений.
Проблема
Мое флеш-приложение не может выполнять вызовы веб-службы на мой сервер приложений. Когда запрос отправляется, я никогда не получаю ответа от сервера и в конечном итоге получаю ошибку изолированной программной среды безопасности.
Пример:
Security.loadPolicyFile( "http://<EC2 internal IP or public DNS>/crossdomain.xml" );
gw = new NetConnection();
gw.objectEncoding = ObjectEncoding.AMF0;
// connect to the AMFPHP gateway so we can use the services
gw.connect( "http://<EC2 internal IP or public DNS>/gateway.php" );
res = new Responder( onResult, onFault );
gw.call( "Service.test", res );
Расследование
То, что я не получал ответа, казалось странным, поэтому я решил попробовать несколько вещей: 1. Я подключился к своему уровню презентации через ssh и попытался использовать lynx для подключения к gateway.php моего сервера приложений. Мне удалось подключиться без проблем. 2. Я использовал окно инструментов разработчика Chrome для наблюдения за сетевым трафиком при загрузке моего сайта. Я обнаружил, что он пытается загрузить файл crossdomain.xml (который находится в корне моего веб-сервера [/ var / www] на уровне приложения) с помощью запроса GET; но, как ни странно, оно выходит из строя. Вот где я запутался. Почему я могу использовать lynx на том же компьютере для подключения к веб-серверу на уровне приложения, но при этом приложение flash не может получить доступ к тому же файлу?
Другая полезная информация
Выполняя несколько тестов, я решил открыть брандмауэр экземпляра сервера приложений, чтобы он мог получать HTTP-запросы с моего IP-адреса. Как только я это сделал, приложение, размещенное на уровне представления, сразу же начало работать (получен ответ от веб-службы)! Однако это означает, что мне придется заставить уровень моего приложения принимать HTTP-запросы из Интернета, чтобы работать, а я не хочу этого делать. Я не понимаю, почему внесение этого изменения позволило бы приложению получить файл crossdomain.xml. Если группа безопасности сервера приложений настроена на прием входящих HTTP-запросов от группы безопасности презентации, у нее не должно возникнуть проблем с получением файла crossdomain.xml, находящегося в корне веб-сервера сервера приложений, верно?
Я потратил больше времени, чем хотелось бы, на изучение этой проблемы. Я действительно хотел бы настроить трехуровневую среду для своего приложения, в которой флэш-приложение сможет отправлять запросы веб-служб на мой уровень приложения. Самая запутанная часть этого заключается в том, что когда я добавляю IP-адрес своего компьютера к брандмауэру сервера приложений, все, кажется, волшебным образом работает так, как задумано. Пожалуйста, поправьте меня, если я неправильно настраиваю приложение. Я основываю свою архитектуру на следующем: http://media.amazonwebservices.com/AWS_Web_Hosting_Best_Practices.pdf а>
Спасибо за вашу помощь!
С уважением,
Воля