Nginx HTTP/2.0安装(装逼)指南

  HTTP2.0作为新版本的网络协议肯定需要一段时间去普及,但HTTP本身属于应用层协议,和当年的网络层协议IPV6不同,离底层协议越远,对网络基础硬件设施的影响就越小。HTTP2.0甚至还特意的考虑了与HTTP1.x的兼容问题,只是在HTTP1.x的下面做了一层framing layer,更使得其普及的阻力变小。所以不出意外,HTTP2.0的普及速度可能会远超大部分人的预期。

升级 OpenSSL

  CENTOS自带OpenSSL版本较低,要想nginx支持HTTP/2就有必要升级openssl(版本至少是1.0.2)。

  nginx官方文档原文:

Note that accepting HTTP/2 connections over TLS requires the “Application-Layer Protocol Negotiation” (ALPN) TLS extension support,which is available only since OpenSSL version 1.0.2.

1.首先安装依耐环境
yum install pcre-devel zlib  
//查看 当前gcc版本
gcc --version  
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-17)  
//删除低版本gcc
yum remove gcc gcc-c++  
//升级gcc
wget http://people.centos.org/tru/devtools-2/devtools-2.repo -O /etc/yum.repos.d/devtools-2.repo  
yum install devtoolset-2-gcc devtoolset-2-binutils devtoolset-2-gcc-c++  
ln -s /opt/rh/devtoolset-2/root/usr/bin/gcc /usr/bin/gcc  
ln -s /opt/rh/devtoolset-2/root/usr/bin/gcc /usr/bin/cc  
//新版本gcc
gcc --version  
gcc (GCC) 4.8.2 20140120 (Red Hat 4.8.2-15)  
2.当前的 OpenSSL 版本
openssl version  
OpenSSL 1.0.1e-fips 11 Feb 2013  
3.下载 OpenSSL 的最新版
wget https://www.openssl.org/source/openssl-1.0.2-latest.tar.gz  
tar -zxf openssl-1.0.2j-latest.tar.gz  

  当前的版本为openssl-1.0.2j。

4.编译安装
cd openssl-1.0.2j  
./config
make depend  
make  
make install  
ln -sf /usr/local/ssl/bin/openssl `which openssl`  
5.检查安装
openssl version  
OpenSSL 1.0.2j  26 Sep 2016  

更新 Nginx

  原为官方源yum安装的nginx。

nginx -V  
nginx version: nginx/1.10.2  
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC)  
built with OpenSSL 1.0.1e-fips 11 Feb 2013  
TLS SNI support enabled  

   可以看到nginx 是在 OpenSSL 1.0.1e 上编译而成的,而 OpenSSL 的这个版本不支持 ALPN,所以无法开启 HTTP/2,所以要去 nginx 官网下载最新稳定版本自行编译安装。

1.下载最新稳定版源码:
wget http://nginx.org/download/nginx-1.10.2.tar.gz  
tar -zxf nginx-1.10.2.tar.gz  
cd nginx-1.10.2/  
2.开始编译前的准备

  修改~nginx-1.10.2/auto/lib/openssl/conf文件,否则编译会报错。31-34行:

CORE_INCS="$CORE_INCS $OPENSSL/.openssl/include"  
CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h"  
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a"  
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a"  

改为:

CORE_INCS="$CORE_INCS $OPENSSL/include"  
CORE_DEPS="$CORE_DEPS $OPENSSL/include/openssl/ssl.h"  
CORE_LIBS="$CORE_LIBS $OPENSSL/libssl.a"  
CORE_LIBS="$CORE_LIBS $OPENSSL/libcrypto.a"  
3.开始编译 Nginx

  这里直接用的官方的编译参数,这样make install后可以直接用service nginx start启动服务。

./configure --prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-http_auth_request_module \
--with-threads \
--with-stream \
--with-stream_ssl_module \
--with-http_slice_module \
--with-mail \
--with-mail_ssl_module \
--with-file-aio \
--with-http_v2_module \
--with-ipv6 \
--with-openssl=/mnt/openssl-1.0.2j

  这里的最后一行--with-openssl=/mnt/openssl-1.0.2j所指的路径,为上一步opemssl源码的路径,不加该参数编译会出错。

make && make install  
4.现在查看nginx的信息
nginx -V  
nginx version: nginx/1.10.2  
built by gcc 4.8.2 20140120 (Red Hat 4.8.2-15) (GCC)  
built with OpenSSL 1.0.2j  26 Sep 2016  
TLS SNI support enabled  
5.修改 Nginx 配置文件
server {  
listen 443 ssl http2 default_server;  
//只需在原有基础上加入 http2 default_server
ssl_certificate server.crt;  
ssl_certificate_key server.key;  
...
}
6.启动服务
service nginx start  
7.最终效果

nginx-http-2