编译安装nghttp2(启用apps)

众所周知,HTTP/1.1是一个文本协议,而HTTP/2除Header外皆使用无法直接阅读的二进制编码。在一些情况下,我们需要将HTTP/2HTTP/1.1相互转换(下简称:翻译)。

nghttp2是一个用C编写的HTTP/2实现,其提供的nghttpx可实现这种翻译。


20180609.UPDATE:添加在CentOS上编译的相关内容


1.安装依赖

Nghttp2在启用应用程序(h2load|nghttp|nghttpd|nghttpx)时,需要如下依赖:

  • cython >= 0.19
  • python >= 2.7
  • python-setuptools
  • jemalloc
  • libevent >= 2.0.8
  • jansson >= 2.5
  • libsystemd-dev >= 209(可选)
  • libxml2 >= 2.6.26
  • libc-ares >= 1.7.5
  • zlib >= 1.2.3
  • libev >= 4.11
  • OpenSSL >= 1.0.1(注:需要1.0.2以上版本,才能通过ALPN协商HTTP/2)
  • pkg-config >= 0.20
  • cunit >= 2.1

根据官方的Manual,在Debian GNU/Linux 8+或Ubuntu 14.04+上可用如下命令安装编译器和所有依赖:

# apt install g++ make binutils libtool pkg-config zlib1g-dev libcunit1-dev libssl-dev libxml2-dev libev-dev libevent-dev libjansson-dev libc-ares-dev libjemalloc-dev cython python3-dev python-setuptools

而在CentOS 7(Red Hat Enterprise Linux 7或Fedora 20)上,则需要添加EPEL源并用如下命令安装:

# yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# yum update
// 安装编译工具
# yum install gcc gcc-c++ libtool pkgconfig
// 安装依赖包
# yum install c-ares-devel CUnit-devel expat-devel jansson-devel jemalloc-devel libev-devel libevent-devel libxml2-devel python-devel zlib-devel

2.编译

注:

  • 以下所有命令以root用户执行。如用非root用户,需具有sudo权限,并在每条命令前添加sudo
  • 出于一些原因,我使用了自己编译的OpenSSL(libssl),而非包管理器所提供的
  • 安装路径为/opt/nghttp2
$ wget https://github.com/nghttp2/nghttp2/releases/download/v1.32.0/nghttp2-1.32.0.tar.gz
$ tar -zxvf nghttp2-1.32.0.tar.gz

$ cd nghttp2-1.32.0/
$ ./configure --prefix=/opt/nghttp2 --enable-app \
OPENSSL_CFLAGS="-I/opt/openssl-1.1.0/include" \
OPENSSL_LIBS="-L/opt/openssl-1.1.0/lib -lssl -lcrypto" \
LDFLAGS="-Wl,--rpath=/opt/nghttp2/lib:/opt/openssl-1.1.0/lib"

# export PYTHONPATH=/opt/nghttp2/lib/python2.7/site-packages/
$ make
# make install

至此安装完成


3.配置nghttpx

T.B.C.