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

Apache - http / 2 включен, но по-прежнему используется http / 1.1

Запуск Apache / 2.4.38 (Unix) OpenSSL / 1.0.2k-fips на CentOS 7, PHP 7.2.14, я установил и включил http / 2, следуя инструкциям на https://www.tunetheweb.com/performance/http2/. Об ошибках не сообщается, и модуль загружается, но страницы продолжают обслуживаться через http / 1.1.

Это не из-за использования prefork mpm (используется событие).

Это не проблема с кешем браузера (инструменты разработчика Chrome открыты, а кеш отключен; я также использовал https://tools.keycdn.com/http2-test).

Сервер перезагружался несколько раз.

Файлы conf включают следующую директиву несколько раз в основном теле и в разделах VirtualHost:

Protocols h2 http/1.1

Директива протокола SSL:

SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1

Вывод журнала ошибок (установлен на уровень отладки):

[Sun Feb 03 08:14:28.563204 2019] [ssl:warn] [pid 15944:tid 140617433143168] AH02292: Init: Name-based SSL virtual hosts only work for clients with TLS server name indication support (RFC 4366)
[Sun Feb 03 08:14:28.563263 2019] [http2:info] [pid 15944:tid 140617433143168] AH03090: mod_http2 (v1.11.4, feats=CHPRIO+SHA256+INVHD+DWINS, nghttp2 1.36.0), initializing...
[Sun Feb 03 08:14:28.567088 2019] [mpm_event:notice] [pid 15944:tid 140617433143168] AH00489: Apache/2.4.38 (Unix) OpenSSL/1.0.2k-fips configured -- resuming normal operations

Вывод httpd -V:

Server version: Apache/2.4.38 (Unix)
Server built:   Jan 31 2019 09:55:17
Server's Module Magic Number: 20120211:83
Server loaded:  APR 1.6.5, APR-UTIL 1.6.1
Compiled using: APR 1.6.5, APR-UTIL 1.6.1
Architecture:   64-bit
Server MPM:     event
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/usr/local/apache2"
 -D SUEXEC_BIN="/usr/local/apache2/bin/suexec"
 -D DEFAULT_PIDLOG="logs/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

Вывод apachectl -M:

Loaded Modules:
 core_module (static)
 so_module (static)
 http_module (static)
 mpm_event_module (static)
 xsendfile_module (shared)
 access_compat_module (shared)
 actions_module (shared)
 alias_module (shared)
 allowmethods_module (shared)
 auth_basic_module (shared)
 auth_digest_module (shared)
 authn_anon_module (shared)
 authn_core_module (shared)
 authn_dbd_module (shared)
 authn_dbm_module (shared)
 authn_file_module (shared)
 authn_socache_module (shared)
 authz_core_module (shared)
 authz_dbd_module (shared)
 authz_dbm_module (shared)
 authz_groupfile_module (shared)
 authz_host_module (shared)
 authz_owner_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 cache_module (shared)
 cache_disk_module (shared)
 data_module (shared)
 dbd_module (shared)
 deflate_module (shared)
 dir_module (shared)
 dumpio_module (shared)
 echo_module (shared)
 env_module (shared)
 expires_module (shared)
 ext_filter_module (shared)
 filter_module (shared)
 headers_module (shared)
 include_module (shared)
 info_module (shared)
 log_config_module (shared)
 logio_module (shared)
 mime_magic_module (shared)
 mime_module (shared)
 negotiation_module (shared)
 remoteip_module (shared)
 reqtimeout_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 slotmem_plain_module (shared)
 slotmem_shm_module (shared)
 socache_dbm_module (shared)
 socache_memcache_module (shared)
 socache_shmcb_module (shared)
 status_module (shared)
 substitute_module (shared)
 suexec_module (shared)
 unique_id_module (shared)
 unixd_module (shared)
 userdir_module (shared)
 version_module (shared)
 vhost_alias_module (shared)
 dav_module (shared)
 dav_fs_module (shared)
 dav_lock_module (shared)
 http2_module (shared)
 lua_module (shared)
 proxy_module (shared)
 lbmethod_bybusyness_module (shared)
 lbmethod_byrequests_module (shared)
 lbmethod_bytraffic_module (shared)
 lbmethod_heartbeat_module (shared)
 proxy_ajp_module (shared)
 proxy_balancer_module (shared)
 proxy_connect_module (shared)
 proxy_express_module (shared)
 proxy_fcgi_module (shared)
 proxy_fdpass_module (shared)
 proxy_ftp_module (shared)
 proxy_http_module (shared)
 proxy_scgi_module (shared)
 proxy_wstunnel_module (shared)
 ssl_module (shared)
 systemd_module (shared)
 cgid_module (shared)

Скриншот выдержки из phpinfo ():

phpinfo

Буду признателен за любые дальнейшие идеи.

Благодаря Барри Поллард для того, чтобы направить меня на правильный путь, это была проблема ALPN. У нас нет балансировщика нагрузки, но ssl нужно скомпилировать в Apache как статическую библиотеку, а не общий модуль для поддержки ALPN. Перекомпилировав Apache, у меня теперь http / 2

Кажется, что со стороны Apache все настроено нормально, и вы можете видеть, что вы возвращаете предложение об обновлении в своих заголовках HTTP. Я могу только предложить вам что-то еще перед Apache (например, LoadBalancer?), Которое выполняет завершение SSL без ALPN и, таким образом, предотвращает HTTP / 2.

Самый простой способ проверить это - запустить со своего сервера следующее:

openssl s_client -alpn h2 -connect 127.0.0.1:443 -status

И посмотрите, поддерживается ли ALPN при подключении к localhost.

В таком случае попробуйте еще раз с вашим доменом и посмотрите, не поддерживается ли ALPN при подключении к вашему домену. Это говорит о том, что перед вашим экземпляром Apache находится балансировщик нагрузки или что-то в этом роде и завершает работу SSL, и он не поддерживает ALPN.