iOS Safari: случайная медленная загрузка изображений с помощью iisnode

У меня есть сайт на node.js. Я размещаю приложение с iisnode.

У меня есть страница, которая отображает большое количество фотографий в таком стиле, как Pinterest. Изображения загружаются как простые <img /> с соответствующим src добавляется в DOM. Изображения представляют собой простой статический ресурс на сервере.

Все изображения загружаются практически мгновенно на последних версиях Windows Chrome, Android Chrome и даже iOS Chrome.

Однако в iOS Safari для каждой сотни фотографий случайным образом одна или две фотографии не будут загружены мгновенно, вместо этого эти фотографии будут загружены примерно через 20-30 секунд. Отладчик Safari для разработчиков сообщает, что для этого запроса изображения существует задержка в 20-30 секунд.

Проблема не существует, если я не использую IISNode и использую node.exe в качестве веб-сервера напрямую. Я подозреваю, что существует некоторая странная проблема совместимости между IISnode и iOS Safari. Мне кажется, IISNode запускает что-то в iOS Safari, которое блокирует HTTP-соединение.

В чем причина этой проблемы?

1 ответ

Ситуация связана с HTTP заголовком Connection:keep-alive.

IIS разработан так, чтобы не включать заголовок ответа Connection:keep-alive, поэтому IISNode здесь не исключение. Такое поведение, по-видимому, хорошо для настольных браузеров и браузеров Android. Однако без Connection:keep-alive кажется, что iOS Safari столкнется с ситуацией, которую я бы назвал лишением TCP, когда старые соединения не используются повторно, и новое соединение не может быть создано, потому что старые соединения все еще открыты, и лимит общего количества открытых соединений был достиг. Я лично думаю, что эта теория объясняет, что 20-30 секунд латентного поведения. По истечении этих 20-30 секунд старые соединения окончательно закрываются и можно установить новое соединение.

Комбинация iOS Safari и IISNode вызвала проблему. Поскольку невозможно включить IIS Connection:keep-alive. Обслуживание всего этого внутри Node.exe напрямую без уровня прокси IISNode - решение этой проблемы.

Другие вопросы по тегам