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

Как собрать Apache httpd 2.4.20 на CentOS 7 с поддержкой http2?

Я потратил почти день, пытаясь сделать сборки Apache httpd с поддержкой ALPN и http2 для EL6 и EL7 для моей компании и общества, как я ранее сделал для NGINX (Построен статически против OpenSSL 1.0.2h).

Сначала я попытался перестроить rpms src с OpenSSL 1.0.2h, взятым из Fedora, и установить полученные rpms (openssl-devel-1.0.2h-1.el7.centos.x86_64.rpm, openssl-1.0.2h-1.el7.centos .x86_64.rpm) на замену системному. Да, я знаю, это не лучший способ для публичных сборок, но мне нужно знать, будет ли вообще работать.

Затем я перестроил nghttp2-1.7.1-1.fc24.src.rpm и установил в результате libnghttp2-devel-1.7.1-1.el7.centos.x86_64.rpm и libnghttp2-1.7.1-1.el7.centos .x86_64.rpm.

Наконец, после удаления некоторых патчей и взлома apr и apr-util мне удалось встроить httpd-2.4.18-1.fc23.src.rpm в httpd-2.4.18-1.el7.centos.x86_64.rpm.

Обычный HTTP / 1.1 работал у меня нормально, и поддержка ALPN также присутствовала, но HTTP / 2 не работал:

$ curl -v --insecure --http2 --tlsv1.2 https://192.168.1.148
* Rebuilt URL to: https://192.168.1.148/
*   Trying 192.168.1.148...
* Connected to 192.168.1.148 (192.168.1.148) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* skipping SSL peer certificate verification
* ALPN, server accepted to use h2
* SSL connection using TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
* Server certificate:
*       subject: E=root@centos7.dcodeit.net,CN=centos7.dcodeit.net,OU=SomeOrganizationalUnit,O=SomeOrganization,L=SomeCity,ST=SomeState,C=--
*       start date: май 25 13:11:19 2016 GMT
*       expire date: май 25 13:11:19 2017 GMT
*       common name: centos7.dcodeit.net
*       issuer: E=root@centos7.dcodeit.net,CN=centos7.dcodeit.net,OU=SomeOrganizationalUnit,O=SomeOrganization,L=SomeCity,ST=SomeState,C=--
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x55ccf55b44c0)
> GET / HTTP/1.1
> Host: 192.168.1.148
> User-Agent: curl/7.43.0
> Accept: */*
>
* http2_recv: 16384 bytes buffer at 0x55ccf55b4e08 (stream 1)
* http2_recv: 16384 bytes buffer at 0x55ccf55b4e08 (stream 1)
* Unexpected EOF
* Closing connection 0
curl: (56) Unexpected EOF

Я подумал, что с некоторыми патчами Fedora могут быть проблемы, и попытался пересобрать некоторые другие части, но безуспешно. Наконец, я удалил все "devel" rpms, загрузил последнюю стабильную версию httpd-2.4.20, поместил неизмененные последние исходные коды apr и apr-util в каталог srclib и попытался выполнить сборку с помощью:

CFLAGS="-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic"; export CFLAGS
LDFLAGS="-Wl,-z,relro,-z,now"; export LDFLAGS
"./configure" \
"--prefix=/etc/httpd" \
"--exec-prefix=/usr" \
"--bindir=/usr/bin" \
"--sbindir=/usr/sbin" \
"--mandir=/usr/share/man" \
"--libdir=/usr/lib64" \
"--sysconfdir=/etc/httpd/conf" \
"--includedir=/usr/include/httpd" \
"--libexecdir=/usr/lib64/httpd/modules" \
"--datadir=/usr/share/httpd" \
"--enable-layout=Fedora" \
"--with-installbuilddir=/usr/lib64/httpd/build" \
"--enable-mpms-shared=all" \
"--enable-suexec" \
"--with-included-apr" \
"--with-suexec" \
"--enable-suexec-capabilities" \
"--with-suexec-caller=apache" \
"--with-suexec-docroot=/var/www" \
"--without-suexec-logfile" \
"--with-suexec-syslog" \
"--with-suexec-bin=/usr/sbin/suexec" \
"--with-suexec-uidmin=1000" \
"--with-suexec-gidmin=1000" \
"--enable-pie" \
"--with-pcre" \
"--enable-mods-shared=all" \
"--enable-ssl" \
"--with-ssl=/root/openssl-1.0.2h" \
"--enable-ssl-staticlib-deps" \
"--with-nghttp2=/root/nghttp2-1.11.0" \
"--enable-nghttp2-staticlib-deps" \
"LDFLAGS=-Wl,-z,relro,-z,now" \
"CFLAGS=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic"

Как видите, я пытаюсь создать mod_ssl и mod_http2 статически с использованием последних версий библиотек, но http2 по-прежнему не работает с точно таким же сообщением об ошибке: сервер разрывает соединение без какого-либо ответа. В журналах нет данных: запросы вообще не отображаются в журналах, тогда как запросы http / 1.1, http / 1.1 через SSL и h2c должным образом регистрируются и обрабатываются.

Мой файл конфигурации теперь почти стандартный (из немодифицированного httpd-2.4.20), но с включенными mod_ssl, mod_http2 и "Протоколами h2 http / 1.1".

Еще одна странная вещь: я попытался добавить «LogLevel http2: info» для отладки http2, но я не вижу никаких строк инициализации вроде «[http2: info] [pid XXXXX: tid numbers] mod_http2 (v1.0.0, nghttp2 1.3.4), инициализация ... ». Однако я считаю, что модуль http2 включен, так как для этого уровня журнала нет ошибки конфигурации. Также я проверил его с помощью h2c (http2 поверх обычного http), и он отлично работает с ответами curl и «101 Switching Protocol».

Итак, я попытался построить его статически, динамически, с разными версиями библиотеки, наконец, я использовал чистые, немодифицированные источники для файлов конфигурации nghttp2, openssl, apr, apr-util, файлы конфигурации безуспешно, однако HTTP / 2 и ALPN обычно работают отдельно.

Пожалуйста, порекомендуйте.

Я заметил, что вы используете этот набор шифров: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA

Однако этот шифр внесен в черный список для HTTP / 2: https://tools.ietf.org/html/rfc7540

И по умолчанию mod_http2 не позволит вам вести переговоры с шифрами из черного списка: https://httpd.apache.org/docs/2.4/mod/mod_http2.html#h2moderntlsonly

Так что мне интересно, это единственная проблема, и вам просто нужно включить более современные наборы шифров? В частности, ECDHE с GCM, а не набором CBC, например TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA25. Вы всегда можете отключить вышеупомянутый флаг для своего теста curl, но Chrome аналогично использует этот черный список, поэтому вам все равно нужно включить другие шифры (и почему бы вам не захотеть, поскольку вы прошли через проблемы с обновлением своего openssl для этого ).

Если проблема не в этом, вы можете ознакомиться с приведенными здесь пошаговыми инструкциями по сборке из исходных кодов: https://www.tunetheweb.com/performance/http2/. Я использую Centos 7, и эти шаги у меня работают.