如何在支持 http2 的 CentOS 7 上建構 Apache httpd 2.4.20?
我花了將近一天的時間嘗試為我的公司和社會使用 ALPN 和 http2 支持 EL6 和 EL7 建構 Apache httpd,就像我之前為 NGINX 所做的那樣(針對 OpenSSL 1.0.2h 靜態建構)。
首先,我嘗試使用從 Fedora 獲取的 OpenSSL 1.0.2h 重建 src rpms 並安裝生成的 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” rpm,下載了最新的穩定版 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 over SSL 和 h2c 請求被正確記錄和處理。
我的配置文件現在幾乎是一個庫存文件(來自未修改的 httpd-2.4.20),但啟用了 mod_ssl、mod_http2 和“Protocols 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 over plain http)它與 curl 和“101 Switching protocols”回复完美配合。 因此,我嘗試使用不同的 lib 版本靜態、動態地建構它,最後我為 nghttp2、openssl、apr、apr-util、配置文件使用了乾淨的、未修改的源,但沒有任何運氣,但是 HTTP/2 和 ALPN 分別正常工作。
請指教。
我注意到您正在使用此密碼套件:TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
然而,該密碼被列入 HTTP/2 的黑名單:https ://www.rfc-editor.org/rfc/rfc7540
預設情況下,mod_http2 不允許您與列入黑名單的密碼進行協商:https ://httpd.apache.org/docs/2.4/mod/mod_http2.html#h2moderntlsonly
所以我想知道這是否是唯一的問題,您只需要啟用更現代的密碼套件嗎?特別是帶有 GCM 的 ECDHE,而不是像 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA25 這樣的 CBC 套件。您總是可以為您的 curl 測試關閉上述標誌,但 Chrome 類似地使用此黑名單,因此您無論如何都需要啟用其他密碼(為什麼您不想這樣做,因為您已經為此經歷了升級 openssl 的麻煩)。
如果這不是問題,那麼您可以查看我在此處給出的關於如何從原始碼建構的分步說明:https ://www.tunetheweb.com/performance/http2/ 。我使用 Centos 7,這些步驟對我有用。