Назад | Перейти на главную страницу

Nginx с http2 и ios WKWebView

Мы запускаем nginx в системе Debian в качестве балансировщика нагрузки.

nginx version: nginx/1.9.10
built with OpenSSL 1.0.2e 3 Dec 2015 (running with OpenSSL 1.0.2g  1 Mar 2016)

У нас на сервере активирован http2 следующим образом:

server {
   listen 443 ssl http2;
   ....
}

Все запросы передаются на наш сервер приложений. Мы регистрируем request_time и upstream_time из nginx.

Недавно мы переключили наше гибридное приложение iOS с UIWebView на WKWebView на 13 неделе, посмотрим, что произошло:

Upstream_time остался прежним, но время нашего запроса внезапно увеличилось, так как все больше и больше пользователей обновляли свое приложение до новой версии.

Сегодня мы решили попробовать отключить http2. Мы только удалили слово «http2» из конфигурации нашего сервера:

server {
   listen 443 ssl;
   ....
}

Посмотрите, что произошло:

Похоже, http2 не готов к производству. Я не знаю, на стороне сервера или на стороне клиента. Возможно, даже request_time неправильно зарегистрирован внутри nginx.

Есть ли у кого-нибудь больше информации об использовании http2 с nginx и / или WKWebView?

Исследования предполагают в пакете Ubuntu / Debian nginx есть ошибка, которая приводит к низкой производительности http2, тебе надо использовать альтернативное распространение/самостоятельно скомпилировать nginx из исходного кода (это действительно просто и займет около 5 минут вашего времени).

Для debian вам, возможно, придется заменить эту строку конфигурации в этом руководстве по строительству с чем-то вроде:

 ./configure --with-cc-opt='-march=native -O2 -pipe' --prefix=/usr --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-pcre-jit --with-ipv6 --with-file-aio --with-ipv6 --with-http_v2_module --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gzip_static_module -with-http_v2_module --with-http_image_filter_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-mail --with-mail_ssl_module --user=www-data --group=www-data --with-openssl=../openssl-1.0.2h --add-module=../nginx-http-auth-digest --add-module=../ngx_cache_purge --add-module=../ngx_pagespeed-release-1.11.33.2-beta

Или просто воспользуйтесь любым недавним руководством в Интернете. Он должен иметь сборку с версией OpenSSL 1.0.2h или выше, иначе он просто недостаточно свежий. Вот что нужно делать: https://ethitter.com/2016/06/nginx-openssl-1-0-2-http-2-alpn/

Ожидается, что среднее время ответа будет больше с HTTP / 2, потому что он имеет большие накладные расходы из-за другого уровня мультиплексирования.

Команда IETF отслеживает поддержку клиентов и серверов здесь: https://github.com/http2/http2-spec/wiki/Implementations

WKWebView еще не отмечен как поддерживаемый. Однако он отлично работает в других мобильных браузерах.