PHP curlでHTTP/2リクエストを実行するための設定 on CentOS 6
ひとつ前の記事で、CentOS 7上で、PHP curlでHTTP/2リクエストを実行するための設定手順をまとめました。
この記事では、CentOS 6上での「PHP curlでHTTP/2リクエストを実行するための設定手順」をまとめます。
※Web HTTPサーバーのHTTP/2対応ではなく、HTTPクライアントのHTTP/2対応のお話です。
今回試したサーバー環境は、AWS EC2のCentOS 6.9で、RemiリポジトリのPHP 7.1がインストールされているものとします。
試していませんが、PHP 5.5, 5.6, 7.0でも、同じ手順でいけると思います。
必要なソフトウェア
僕が調べた限り、PHP curlでHTTP/2リクエストを実行するために必要なパッケージは以下です。
- openssl 1.0.2e以上
- nghttp2 1.0.0以上
- curl 7.43以上
- PHP 5.5.24以上またはPHP 5.6.8以上またはPHP7.0.7以上またはPHP7.1以上
情報ソースは以下。
・HTTP/2 with curl
https://curl.haxx.se/docs/http2.html
・PHP 定義済み定数
http://php.net/manual/ja/curl.constants.php
opensslについては、1.0.1でもよいのかもしれませんが、TLS接続でHTTP/2を利用する場合、使用するOpenSSLライブラリがALPNをサポートしている必要があるそうです。
ALPNをサポートするopensslが1.0.2以降のため、「openssl 1.0.2e以上」という条件が出てきたのだと思われます。
(参考)
・HTTP/2を実際に使用するためのサーバー設定
https://knowledge.sakura.ad.jp/7735/
現在のソフトウェアバージョンを確認
必要なソフトウェアをアップデート、インストールする前に、それぞれの現在のバージョンを確認します。
CentOS
# cat /etc/system-release CentOS release 6.9 (Final)
openssl
# openssl version OpenSSL 1.0.1e-fips 11 Feb 2013
PHP
# php --version PHP 7.1.10 (cli) (built: Sep 27 2017 08:42:15) ( NTS ) Copyright (c) 1997-2017 The PHP Group Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
curl
# curl --version curl 7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2 Protocols: tftp ftp telnet dict ldap ldaps http file https ftps scp sftp Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz
PHP curlモジュール
# php -r 'phpinfo();' | less ... curl cURL support => enabled cURL Information => 7.19.7 Age => 3 Features AsynchDNS => No CharConv => No Debug => No GSS-Negotiate => Yes IDN => Yes IPv6 => Yes krb4 => No Largefile => Yes libz => Yes NTLM => Yes SPNEGO => No SSL => Yes SSPI => No Protocols => tftp, ftp, telnet, dict, ldap, ldaps, http, file, https, ftps, scp, sftp Host => x86_64-redhat-linux-gnu SSL Version => NSS/3.27.1 ★ ZLib Version => 1.2.3 libSSH Version => libssh2/1.4.2
↑★の箇所から、curlのSSLは、OpenSSLではなく、NSSを使用していることがわかります。
アップデート、インストール
- ALPS対応opensslのインストール
- nghttp2ライブラリのインストール
- HTTP/2対応curlのインストール
を順に行います。
ALPS対応opensslのインストール
CentOS 6リポジトリの openssl はバージョン1.0.1です。
yum update しても、1.0.1ベースでのセキュリティアップデートにしかならないので、1.0.2系のソースをダウンロードして、ビルド、インストールします。
(ここがCentOS 7における手順との大きな違いです。)
(参考)
・OpenSSL(1.0.x)をインストールする(ソースからコンパイル)for CentOS 7.3
ttps://qiita.com/shadowhat/items/68fd55b532c04b13acf5
※ここで1.0.2をインストールしても、もともとサーバーに存在していたCentOS 6リポジトリの1.0.1はそのまま残っています。また Apache, Nginx, PHP opensslなどは、ここでインストールしたopensslライブラリやヘッダを参照してビルドしない限り、インストールした1.0.2は使用されません。
※gccなど、ビルドに必要なツールがインストールされていない場合は、
# yum groupinstall ‘Development Tools’
で、開発ツールをグループインストールしておくとよいでしょう。
OpenSSLオフィシャルサイトのソースダウンロードページ
https://www.openssl.org/source/
より、1.0.2系の最新バージョンのcurlのソースをダウンロード、展開します。
# cd /usr/local/src/ # wget https://www.openssl.org/source/openssl-1.0.2l.tar.gz # tar zxvf openssl-1.0.2l.tar.gz # cd openssl-1.0.2l/
curlのビルド時にOpenSSLの共有ライブラリが必要となるので、それを生成するようconfigureの実行時に shared オプションをつけます。
# ./config shared Operating system: x86_64-whatever-linux2 Configuring for linux-x86_64 Configuring for linux-x86_64 no-ec_nistp_64_gcc_128 [default] OPENSSL_NO_EC_NISTP_64_GCC_128 (skip dir) no-gmp [default] OPENSSL_NO_GMP (skip dir) no-jpake [experimental] OPENSSL_NO_JPAKE (skip dir) no-krb5 [krb5-flavor not specified] OPENSSL_NO_KRB5 no-libunbound [experimental] OPENSSL_NO_LIBUNBOUND (skip dir) no-md2 [default] OPENSSL_NO_MD2 (skip dir) no-rc5 [default] OPENSSL_NO_RC5 (skip dir) no-rfc3779 [default] OPENSSL_NO_RFC3779 (skip dir) no-sctp [default] OPENSSL_NO_SCTP (skip dir) no-ssl-trace [default] OPENSSL_NO_SSL_TRACE (skip dir) no-ssl2 [default] OPENSSL_NO_SSL2 (skip dir) no-store [experimental] OPENSSL_NO_STORE (skip dir) no-unit-test [default] OPENSSL_NO_UNIT_TEST (skip dir) no-weak-ssl-ciphers [default] OPENSSL_NO_WEAK_SSL_CIPHERS (skip dir) no-zlib [default] no-zlib-dynamic [default] ... Configured for linux-x86_64.
Configureが正しく終了したことを確認のうえ、ビルド、インストールします。
# make # make test ... OPENSSL_CONF=apps/openssl.cnf util/opensslwrap.sh version -a OpenSSL 1.0.2l 25 May 2017 built on: reproducible build, date unspecified platform: linux-x86_64 options: bn(64,64) rc4(16x,int) des(idx,cisc,16,int) idea(int) blowfish(idx) compiler: gcc -I. -I.. -I../include -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,--noexecstack -m64 -DL_ENDIAN -O3 -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DRC4_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM OPENSSLDIR: "/usr/local/ssl" # make install ... OpenSSL shared libraries have been installed in: /usr/local/ssl If this directory is not in a standard system path for dynamic/shared libraries, then you will have problems linking and executing applications that use OpenSSL libraries UNLESS: * you link with static (archive) libraries. If you are truly paranoid about security, you should use static libraries. * you use the GNU libtool code during linking (http://www.gnu.org/software/libtool/libtool.html) * you use pkg-config during linking (this requires that PKG_CONFIG_PATH includes the path to the OpenSSL shared library directory), and make use of -R or -rpath. (http://www.freedesktop.org/software/pkgconfig/) * you specify the system-wide link path via a command such as crle(1) on Solaris systems. * you add the OpenSSL shared library directory to /etc/ld.so.conf and run ldconfig(8) on Linux systems. * you define the LD_LIBRARY_PATH, LIBPATH, SHLIB_PATH (HP), DYLD_LIBRARY_PATH (MacOS X) or PATH (Cygwin and DJGPP) environment variable and add the OpenSSL shared library directory to it. One common tool to check the dynamic dependencies of an executable or dynamic library is ldd(1) on most UNIX systems. See any operating system documentation and manpages about shared libraries for your version of UNIX. The following manpages may be helpful: ld(1), ld.so(1), ld.so.1(1) [Solaris], dld.sl(1) [HP], ldd(1), crle(1) [Solaris], pldd(1) [Solaris], ldconfig(8) [Linux], chatr(1) [HP]. cp libcrypto.pc /usr/local/ssl/lib/pkgconfig chmod 644 /usr/local/ssl/lib/pkgconfig/libcrypto.pc cp libssl.pc /usr/local/ssl/lib/pkgconfig chmod 644 /usr/local/ssl/lib/pkgconfig/libssl.pc cp openssl.pc /usr/local/ssl/lib/pkgconfig chmod 644 /usr/local/ssl/lib/pkgconfig/openssl.pc
configureでprefixを指定しなかったので、デフォルトで、ライブラリは /usr/local/ssl/lib に、コマンドは /usr/local/ssl/bin にインストールされました。
メッセージ出力のとおり、ライブラリのディレクトリをライブラリパスに追加します。
# echo '/usr/local/ssl/lib' > /etc/ld.so.conf.d/custom-libs.conf # ldconfig
/usr/local/ssl/lib 配下のopensslライブラリが追加されたことを確認します。
# ldconfig -p | grep libssl libssl3.so (libc6,x86-64) => /usr/lib64/libssl3.so libssl.so.10 (libc6,x86-64) => /usr/lib64/libssl.so.10 libssl.so.1.0.0 (libc6,x86-64) => /usr/local/ssl/lib/libssl.so.1.0.0 libssl.so (libc6,x86-64) => /usr/local/ssl/lib/libssl.so
インストールしたopenssl 1.0.2のバージョンを確認します。
# /usr/local/ssl/bin/openssl version OpenSSL 1.0.2l 25 May 2017
nghttp2ライブラリのインストール
HTTP/2対応のcurlをビルドする際に、nghttp2が必要となるのでインストールします。
nghttp2のソースをダウンロードしてビルドしてもよいのですが、EPELリポジトリにパッケージがあるので、yumでインストールしたほうが簡単ですし、管理しやすいです。
nghttp2コマンドではなく、ライブラリと、pkgconfig向けファイルが必要なので、libnghttp2とlibnghttp2-develをインストールします。
# yum --enablerepo=epel install libnghttp2 libnghttp2-devel ... Installed: libnghttp2.x86_64 0:1.6.0-1.el6.1 libnghttp2-devel.x86_64 0:1.6.0-1.el6.1 # rpm -ql libnghttp2 /usr/lib64/libnghttp2.so.14 /usr/lib64/libnghttp2.so.14.4.0 ... # rpm -ql libnghttp2-devel /usr/include/nghttp2 /usr/include/nghttp2/nghttp2.h /usr/include/nghttp2/nghttp2ver.h /usr/lib64/libnghttp2.so /usr/lib64/pkgconfig/libnghttp2.pc ...
HTTP/2対応curlのインストール
CentOS 7に含まれるcurlは、バージョンが7.19.7と古いため、最新バージョンのソースからビルドしてインストールします。
、、、その前に、curlのビルド時にzlibを含めるため、zlib-develをインストールします。
※zlibがなくてもよいかもしれませんが、gzip圧縮でWebコンテンツをダウンロードできるようにしておいても損はないでしょう。
# yum install zlib-devel ... Installed: zlib-devel.x86_64 0:1.2.3-29.el6
curlオフィシャルサイトのダウンロードページ
https://curl.haxx.se/download.html
より、最新バージョンのcurlのソースをダウンロード、展開します。
# cd /usr/local/src/ # wget https://curl.haxx.se/download/curl-7.56.0.tar.gz # tar zxvf curl-7.56.0.tar.gz # cd curl-7.56.0/ # ./configure --help
configureの実行時は、以下のオプションをつけます。
SSLサポートのオプションは、1.0.2のライブラリファイルやヘッダ、pkgconfigファイルをインストールしたディレクトリを指定するのがポイントです。
- –with-ssl=/usr/local/ssl(SSLサポートを有効化)
- –with-nghttp2(HTTP/2サポートを有効化)
- –enable-libcurl-option(libcurlを生成する?デフォルトで有効のようですが念のため)
# ./configure --with-ssl=/usr/local/ssl --with-nghttp2 \ --enable-libcurl-option ... curl version: 7.56.0 Host setup: x86_64-pc-linux-gnu Install prefix: /usr/local Compiler: gcc SSL support: enabled (OpenSSL) ★ SSH support: no (--with-libssh2) zlib support: enabled ★ GSS-API support: no (--with-gssapi) TLS-SRP support: enabled resolver: POSIX threaded IPv6 support: enabled Unix sockets support: enabled IDN support: no (--with-{libidn2,winidn}) Build libcurl: Shared=yes, Static=yes Built-in manual: enabled --libcurl option: enabled (--disable-libcurl-option) ★ Verbose errors: enabled (--disable-verbose) SSPI support: no (--enable-sspi) ca cert bundle: /etc/pki/tls/certs/ca-bundle.crt ca cert path: no ca fallback: no LDAP support: no (--enable-ldap / --with-ldap-lib / --with-lber-lib) LDAPS support: no (--enable-ldaps) RTSP support: enabled RTMP support: no (--with-librtmp) metalink support: no (--with-libmetalink) PSL support: no (libpsl not found) HTTP2 support: enabled (nghttp2) ★ Protocols: DICT FILE FTP FTPS GOPHER HTTP HTTPS IMAP IMAPS POP3 POP3S RTSP SMB SMBS SMTP SMTPS TELNET TFTP
↑の★を付けた箇所について、
- SSL supportが enable で、OpenSSLを使用していること。
- –libcurl option が enable であること。
- zlib support が enable であること。
- HTTP2 support が enable で、nghttp2 を使用していること。
を確認します。
問題なければ、ビルド、インストールします。
# make # make install ... Libraries have been installed in: /usr/local/lib If you ever happen to want to link against installed libraries in a given directory, LIBDIR, you must either use libtool, and specify the full pathname of the library, or use the '-LLIBDIR' flag during linking and do at least one of the following: - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable during execution - add LIBDIR to the 'LD_RUN_PATH' environment variable during linking - use the '-Wl,-rpath -Wl,LIBDIR' linker flag - have your system administrator add LIBDIR to '/etc/ld.so.conf' ... /bin/sh ../libtool --mode=install /usr/bin/install -c curl '/usr/local/bin' libtool: install: /usr/bin/install -c .libs/curl /usr/local/bin/curl ...
configureでprefixを指定しなかったので、デフォルトで、ライブラリは /usr/local/lib に、コマンドは /usr/local/bin にインストールされました。
メッセージ出力のとおり、ライブラリのディレクトリをライブラリパスに追加します。
# echo '/usr/local/lib' >> /etc/ld.so.conf.d/custom-libs.conf # ldconfig
/usr/local/lib 配下のcurlライブラリが追加されたことを確認します。
# ldconfig -p | grep curl libcurl.so.4 (libc6,x86-64) => /usr/local/lib/libcurl.so.4 libcurl.so.4 (libc6,x86-64) => /usr/lib64/libcurl.so.4 libcurl.so (libc6,x86-64) => /usr/local/lib/libcurl.so
動作確認
curlコマンドの確認
# /usr/local/bin/curl --version curl 7.56.0 (x86_64-pc-linux-gnu) libcurl/7.56.0 OpenSSL/1.0.2l zlib/1.2.3 nghttp2/1.6.0 Release-Date: 2017-10-04 Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy
↑curlが、libcurl/7.56.0, OpenSSL/1.0.2l, zlib/1.2.3, nghttp2/1.6.0 を含んでいることがわかります。
また、Features に、HTTP2 があります。
curlコマンドで、HTTP/2リクエストで https://www.google.co.jp/ にアクセスしてみます。
# /usr/local/bin/curl -vso /dev/null --http2 https://www.google.co.jp/ * Trying 172.217.26.35... * TCP_NODELAY set * Connected to www.google.co.jp (172.217.26.35) port 443 (#0) * ALPN, offering h2 ★ * ALPN, offering http/1.1 * Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH * successfully set certificate verify locations: * CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none * TLSv1.2 (OUT), TLS header, Certificate Status (22): } [5 bytes data] * TLSv1.2 (OUT), TLS handshake, Client hello (1): } [512 bytes data] * TLSv1.2 (IN), TLS handshake, Server hello (2): { [96 bytes data] * TLSv1.2 (IN), TLS handshake, Certificate (11): { [3915 bytes data] * TLSv1.2 (IN), TLS handshake, Server key exchange (12): { [149 bytes data] * TLSv1.2 (IN), TLS handshake, Server finished (14): { [4 bytes data] * TLSv1.2 (OUT), TLS handshake, Client key exchange (16): } [70 bytes data] * TLSv1.2 (OUT), TLS change cipher, Client hello (1): } [1 bytes data] * TLSv1.2 (OUT), TLS handshake, Finished (20): } [16 bytes data] * TLSv1.2 (IN), TLS change cipher, Client hello (1): { [1 bytes data] * TLSv1.2 (IN), TLS handshake, Finished (20): ★ { [16 bytes data] * SSL connection using TLSv1.2 / ECDHE-ECDSA-AES128-GCM-SHA256 ★ * ALPN, server accepted to use h2 ★ * Server certificate: * subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=*.google.com * start date: Oct 3 17:45:20 2017 GMT * expire date: Dec 26 17:44:00 2017 GMT * subjectAltName: host "www.google.co.jp" matched cert's "*.google.co.jp" * issuer: C=US; O=Google Inc; CN=Google Internet Authority G2 * SSL certificate verify ok. * 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 } [5 bytes data] ★ * Using Stream ID: 1 (easy handle 0x21e9270) } [5 bytes data] > GET / HTTP/2 ★ > Host: www.google.co.jp > User-Agent: curl/7.56.0 > Accept: */* > { [5 bytes data] * Connection state changed (MAX_CONCURRENT_STREAMS updated)! } [5 bytes data] < HTTP/2 200 ★ < date: Tue, 17 Oct 2017 04:04:46 GMT < expires: -1 < cache-control: private, max-age=0 < content-type: text/html; charset=Shift_JIS < p3p: CP="This is not a P3P policy! See g.co/p3phelp for more info." < server: gws < x-xss-protection: 1; mode=block < x-frame-options: SAMEORIGIN < set-cookie: 1P_JAR=2017-10-17-04; expires=Tue, 24-Oct-2017 04:04:46 GMT; path=/; domain=.google.co.jp < set-cookie: NID=114=paKUVL2MfeNx6uY0XiPUo6XwvW41fPfwozqLU0ML7DbMmGlejniScdgu5Mr0tyrXRFXuJA-OhlfNDcsMVwLgQ1awKj3Ha_kiYUU_Ocw9Xz2FV0O4Y5loINqjzIE7cl3t; expires=Wed, 18-Apr-2018 04:04:46 GMT; path=/; domain=.google.co.jp; HttpOnly < alt-svc: quic=":443"; ma=2592000; v="39,38,37,35" < accept-ranges: none < vary: Accept-Encoding < { [5 bytes data] * Connection #0 to host www.google.co.jp left intact
↑★の箇所から、ALPN, TLS 1.2でネゴシエーションして、HTTP/2でアクセスしていることがわかります。
PHP curlの確認
PHP curlモジュールを確認します。
# php -r 'phpinfo();' | less ... curl cURL support => enabled cURL Information => 7.56.0 ★ Age => 3 Features AsynchDNS => Yes CharConv => No Debug => No GSS-Negotiate => No IDN => No IPv6 => Yes krb4 => No Largefile => Yes libz => Yes NTLM => Yes SPNEGO => No SSL => Yes SSPI => No Protocols => dict, file, ftp, ftps, gopher, http, https, imap, imaps, pop3, pop3s, rtsp, smb, smbs, smtp, smtps, telnet, tftp Host => x86_64-pc-linux-gnu SSL Version => OpenSSL/1.0.2l ★ ZLib Version => 1.2.3
↑★の箇所で、curlのバージョンが、7.56.0となり、SSLはNSSではなく、OpenSSL 1.0.2lを使用していることがわかります。
PHPテストスクリプトを作成して、HTTP/2リクエストで https://www.google.co.jp/ にアクセスしてみます。
(参考)
・curl エクステンションで HTTP/2 リクエストを送信する
https://qiita.com/masakielastic/items/f563437c44b0d4c04f87
# vi curl_test.php
<?php if (!defined('CURL_HTTP_VERSION_2_0')) { define('CURL_HTTP_VERSION_2_0', CURL_HTTP_VERSION_1_1 + 1); } $url = 'https://www.google.co.jp/'; $opts = [ CURLOPT_VERBOSE => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_SSL_VERIFYPEER => false ]; $ch = curl_init($url); curl_setopt_array($ch, $opts); curl_exec($ch); curl_close($ch); ?>
スクリプトを実行します。
# php curl_test.php * Trying 172.217.26.35... * TCP_NODELAY set * Connected to www.google.co.jp (172.217.26.35) port 443 (#0) * ALPN, offering h2 ★ * ALPN, offering http/1.1 * Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH * successfully set certificate verify locations: * CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none * SSL connection using TLSv1.2 / ECDHE-ECDSA-AES128-GCM-SHA256 ★ * ALPN, server accepted to use h2 ★ * Server certificate: * subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=*.google.com * start date: Oct 3 17:45:20 2017 GMT * expire date: Dec 26 17:44:00 2017 GMT * issuer: C=US; O=Google Inc; CN=Google Internet Authority G2 * SSL certificate verify ok. * 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 0x21c9f00) > GET / HTTP/2 ★ Host: www.google.co.jp Accept: */* * Connection state changed (MAX_CONCURRENT_STREAMS updated)! < HTTP/2 200 ★ < date: Tue, 17 Oct 2017 04:08:55 GMT < expires: -1 < cache-control: private, max-age=0 < content-type: text/html; charset=Shift_JIS < p3p: CP="This is not a P3P policy! See g.co/p3phelp for more info." < server: gws < x-xss-protection: 1; mode=block < x-frame-options: SAMEORIGIN < set-cookie: NID=114=JE6Mammtk0ut3CRfi-PcXkFUv3a9vNwCMM0TOO6Sr9BeSCr2N7ygsQdXUaBwN7HoEqhP1zb8NvpzVPixW90QnayOKurNgWe7Rh7DNK1IzvdLgWGditMwD2XiONGZm2MD; expires=Wed, 18-Apr-2018 04:08:55 GMT; path=/; domain=.google.co.jp; HttpOnly < alt-svc: quic=":443"; ma=2592000; v="39,38,37,35" < accept-ranges: none < vary: Accept-Encoding < <!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head><meta content="???E?????????????????c?[?????????????B???????????@?\??p????A???T??????????????????B" name="description"><meta content="noodp" name="robots"><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"><meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop="image"><title>Google</title> ...
↑★の箇所から、ALPN, TLS 1.2でネゴシエーションして、HTTP/2でアクセスしていることがわかります。
以上で、PHP curlでHTTP/2リクエストを実行する設定は完了です。
Webアプリケーション経由でPHP curlを使用する場合は、差し替えたPHP curlを使用するよう、ApacheやFastCGIなどのPHPモジュールを含むプロセスを再起動しましょう。
ここまであげた参考記事のほか、以下の記事も参考にさせていただきました。
ありがとうございます。
(参考)
・curl エクステンションで HTTP/2 リクエストを送信する
https://qiita.com/masakielastic/items/f563437c44b0d4c04f87
・nghttp2でhttp2を試してみる
https://qiita.com/sao_rio/items/e95e3989e08e0482be67
・[PHP]CurlでのSSL接続をOpenSSL方式に変更する
http://kayakuguri.github.io/blog/2016/07/07/curl-openssl-tls/
(関連記事)
・PHP curlでHTTP/2リクエストを実行するための設定 on CentOS 7
https://inaba-serverdesign.jp/blog/20171011/php_curl_http2_centos7.html