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でも、同じ手順でいけると思います。

isd必要なソフトウェア

僕が調べた限り、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/

isd現在のソフトウェアバージョンを確認

必要なソフトウェアをアップデート、インストールする前に、それぞれの現在のバージョンを確認します。

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を使用していることがわかります。

isdアップデート、インストール

  • 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

 

isd動作確認

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

 

Follow me!