为了更好地研究HTTP2的一些新特性,或者有小伙伴想让自己的站点支持HTTP2的请求,以提升访问性能……无论出于什么目的,我们都有必要尝试将HTTP2部署使用。

而刚好,我们前一段时间在做HTTP2的性能测试,使用Nginx搭建了Web服务器,所以这里再次做下总结。

HTTP2的支持了解

在部署之前,我们先来了解一下支持HTTP2的客户端和服务端,这里也简单地列举一些比较知名和常用的实现:

HTTP2 Server

name Language Negotiations protocol
Nginx C ALPN, NPN, direct h2, h2c
Apache Tomcat 8.5+ Java ALPN, Upgrade, direct h2, h2c
H2O C ALPN, NPN, direct, Upgrade h2
ngHttp2 C ALPN, NPN, direct, Upgrade h2, h2c
Netty Java ALPN, NPN, direct, Upgrade h2, h2c

HTTP2 Client

name Language Negotiations protocol
OKHttp Android, Java ALPN, NPN h2
NSURLSession(>iOS9) OC ALPN h2
Netty Java ALPN, NPN, direct, Upgrade h2, h2c
Chromium Net C++ ALPN h2
Curl and libCurl C ALPN, NPN, Upgrade h2, h2c

我们选择了Nginx来搭建HTTP2的服务器,可以用Chrome浏览器来作为HTTP2的访问入口,或者是使用如Chromium net、Curl\libCurl等这些支持HTTP2的网络库来实现一个简易的客户端,作为iOS开发,也不得不提下NSURLSession自iOS9.0之后也开始持HTTP2。接下来,我们重点介绍如何用Nginx来搭建HTTP2的服务器。

使用Nginx搭建HTTP2服务器

Nginx是在2015年底开始支持HTTP2,Announcing an Early Alpha Patch for HTTP/2,官网上这篇文章也详细介绍了如何让我们的nginx服务器支持HTTP2。这里结合最新的版本,对如何搭建HTTP2服务器进行详细的解析。

安装必要组件

nginx-ct

nginx-ct用于启用Certificate Transparency功能。

wget -O nginx-ct.zip -c https://github.com/grahamedgecombe/nginx-ct/archive/v1.3.1.zipunzip nginx-ct.zip

OpenSSL

一般的系统都会自带OpenSSL,但是由于不够新,所以并不推荐使用。所以推荐下载最新的OpenSSl库,并在编译Nginx时指定新下载的OpenSSL源码的目录,而不是系统自带版本。

wget -O openssl.tar.gz -c https://www.openssl.org/source/openssl-1.1.0c.tar.gztar zxf openssl.tar.gz
mv openssl-1.1.0c/ /root/hehui_workbench/openssl

Nginx

下载最新Nginx源码并编译安装。

wget -c https://nginx.org/download/nginx-1.11.6.tar.gztar zxf nginx-1.11.6.tar.gz
cd nginx-1.11.6/
./configure --add-module=../nginx-ct-1.3.1 --with-openssl=/root/hehui_workbench/openssl --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module make
sudo make install

至此,Nginx会默认安装到/usr/local/nginx/目录下,如需要更改路径,可以在configure是指定。

管理脚本和自启动nginx

我们可以通过脚本来管理nginx服务,首先创建一个管理脚本:

vim /etc/init.d/nginx

脚本内容:

#! /bin/sh### BEGIN INIT INFO# Provides:          nginx# Required-Start:    $all# Required-Stop:     $all# Default-Start:     2 3 4 5# Default-Stop:      0 1 6# Short-Description: starts the nginx web server# Description:       starts nginx using start-stop-daemon### END INIT INFOPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/nginx/sbin/nginx
NAME=nginx
DESC=nginx test -x $DAEMON || exit 0# Include nginx defaults if availableif [ -f /etc/default/nginx ] ; then
  . /etc/default/nginxfiset -e. /lib/lsb/init-functionscase "$1" in
  start)    echo -n "Starting $DESC: "
    start-stop-daemon --start --quiet --pidfile /usr/local/nginx/logs/$NAME.pid \
        --exec $DAEMON -- $DAEMON_OPTS || true
    echo "$NAME."
    ;;
  stop)    echo -n "Stopping $DESC: "
    start-stop-daemon --stop --quiet --pidfile /usr/local/nginx/logs/$NAME.pid \
        --exec $DAEMON || true
    echo "$NAME."
    ;;
  restart|force-reload)    echo -n "Restarting $DESC: "
    start-stop-daemon --stop --quiet --pidfile \
        /usr/local/nginx/logs/$NAME.pid --exec $DAEMON || true
    sleep 1
    start-stop-daemon --start --quiet --pidfile \
        /usr/local/nginx/logs/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS || true
    echo "$NAME."
    ;;
  reload)    echo -n "Reloading $DESC configuration: "
    start-stop-daemon --stop --signal HUP --quiet --pidfile /usr/local/nginx/logs/$NAME.pid \
        --exec $DAEMON || true
    echo "$NAME."
    ;;
  status)
    status_of_proc -p /usr/local/nginx/logs/$NAME.pid "$DAEMON" nginx && exit 0 || exit $?
    ;;
  *)
    N=/etc/init.d/$NAME
    echo "Usage: $N {start|stop|restart|reload|force-reload|status}" >&2
    exit 1
    ;;esacexit 0

修改执行权限:

chmod a+x /etc/init.d/nginx

管理Nginx服务(start、stop、restart、reload conf):

service nginx start|stop|restart|reload

配置Nginx服务器

全局配置

打开/usr/local/nginx/conf/nginx.conf,修改全局配置文件。通常会将自己的站点配置写在单独的配置文件中,以include的方式引入,这里对于站点的配置文件我会单独放在对应的站点目录里面:/root/hehui_workbench/www/xxxx/website.conf

http {    include       mime.types;    default_type  application/octet-stream;    charset       UTF-8;    sendfile        on;    #tcp_nopush     on;

    keepalive_timeout  65;    gzip               on;    gzip_vary          on;    gzip_comp_level    6;    gzip_buffers       16 8k;    gzip_min_length    1000;    gzip_proxied       any;    gzip_disable       "msie6";    gzip_http_version  1.0;    gzip_types         text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;   # 加载其他配置文件
   include                /root/hehui_workbench/www/xxxx/website.conf
}

至此,我们已经可以部署支持HTTP1.x的请求服务了。但是,要想对应域名(站点)的请求支持HTTP2(这里指HTTP2 over TLS),我们需要先部署HTTPS,所以必须提供域名的合法证书。使用Let's Encrypt免费证书一文介绍了如何申请Let's Encrypt的免费证书。

WEB站点配置

在获取服务器证书后,对站点进行如下配置:

server {    listen 443 ssl http2 fastopen=3 reuseport;    server_name www.lovelyhui.cc
    server_tokens off;    include /root/hehui_workbench/www/nginx_conf/ip.blacklist;    #ssl_ct             on;
    #ssl_ct_static_scts     /root/hehui_workbench/www/scts;     # 中间证书 + 站点证书
    ssl_certificate     /root/hehui_workbench/ssl/chained.pem;    # 创建 CSR 文件时用的密钥
    ssl_certificate_key  /root/hehui_workbench/ssl/domain.key;    # openssl dhparam -out dhparams.pem 2048
    # https://weakdh.org/sysadmin.html
    # ssl_dhparam          /root/hehui_workbench/www/ssl/dhparams.pem;      # https://github.com/cloudflare/sslconfig/blob/master/conf
    ssl_ciphers                EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;ssl_prefer_server_ciphers  on;    ssl_protocols              TLSv1 TLSv1.1 TLSv1.2;    ssl_session_cache          shared:SSL:50m;    ssl_session_timeout        1d;    ssl_session_tickets        on;    ssl_stapling               on;    ssl_stapling_verify        on;    # 根证书 + 中间证书
    # https://imququ.com/post/why-can-not-turn-on-ocsp-stapling.html
    # ssl_trusted_certificate    /root/hehui_workbench/ssl/full_chained.pem;     resolver                   114.114.114.114 valid=300s;    resolver_timeout           10s;    access_log                 /root/hehui_workbench/www/nginx_log/lovelyhui_cc.log;    if ($request_method !~ ^(GET|HEAD|POST|OPTIONS)$ ) {        return           444;
     }    if ($host != 'www.lovelyhui.cc'){    rewrite ^/(.*)$  https://www.lovelyhui.cc/$1 permanent;
    }    location ^~/api/testApi1 {    default_type application/json;    return 200 '{"code":"50","msg":"This is test for Api1, This is test for Api1"}';
  }

此时,我们已经配置好我们的HTTP2.0服务器,我们可以直接浏览器访问https://www.lovelyhui.cc访问此站点了。

简单测试

在 Chrome 地址栏输入 chrome://net-internals/#http2 即可进入及具体的请求通信过程:

我们可以继续选择其中的一个HTTP2 Session,点击具体的Session ID,便可以看到全部帧信息:

但是,Chrome的工具仅局限于Chrome浏览器,对于FireFox或者自实现App完成的H2请求,就无法派上用场了。所以,对于HTTP2流量的测试以及性能分析,我们更推荐使用WireShark去完成。可以移步我们HTTP2系列之HTTP/2流量调试一文,了解如何使用WireShark调试HTTP/2流量。

参考

Nginx 配置之完整篇

转至 https://www.cnblogs.com/163yun/p/9511032.html

HTTP/2部署使用的更多相关文章

  1. [原]CentOS7.2部署node-mapnik

    转载请注明表作者think8848及出处(http://think8848.cnblogs.com) node-mapnik依赖项中要求g++ >= 5, toolchain (>= GL ...

  2. 使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus

    最新的Mono 4.4已经支持运行asp.net mvc5项目,有的同学听了这句话就兴高采烈的拿起Visual Studio 2015创建了一个mvc 5的项目,然后部署到Mono上,浏览下发现一堆错 ...

  3. 通过Jexus 部署 dotnetcore版本MusicStore 示例程序

    ASPNET Music Store application 是一个展示最新的.NET 平台(包括.NET Core/Mono等)上使用MVC 和Entity Framework的示例程序,本文将展示 ...

  4. 结合Jexus + Kestrel 部署 asp.net core 生产环境

    ASP.NET Core 是微软的全新的框架.这一框架的目标 ︰ 跨平台 针对云应用优化 解除 System.Web 的依赖. 获得下面三个方面的优势,你可以把它认为是一个C# 版本的NodeJS: ...

  5. 4.Windows Server2012 R2里面部署 MVC 的网站

    网站部署之~Windows Server | 本地部署:http://www.cnblogs.com/dunitian/p/4822808.html#iis 后期会在博客首发更新:http://dnt ...

  6. Win10 IIS本地部署MVC网站时不能运行?

    异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 部署后出现这个错误: 打开文件目录后发现是可以看见目录的,静态页面也是可以打开的 ...

  7. 再部署一个 instance 和 Local Network - 每天5分钟玩转 OpenStack(131)

    上一节部署了 cirros-vm1 到 first_local_net,今天我们将再部署 cirros-vm2 到同一网络,并创建 second_local_net. 连接第二个 instance 到 ...

  8. 将 instance 部署到 OVS Local Network - 每天5分钟玩转 OpenStack(130)

    上一节创建了 OVS 本地网络 first_local_net,今天我们会部署一个 instance 到该网络并分析网络结构.launch 一个 instance,选择 first_local_net ...

  9. 从零开始编写自己的C#框架(25)——网站部署

    导航 1.关掉访问保护 2.发布网站 3.复制网站到服务器 4.添加新网站 5.设置网站访问权限 6.设置文件夹访问权限 7.控制可更新文件夹执行权限 8.设置“应用程序池”.net版本与模式 9.附 ...

  10. Oracle安装部署,版本升级,应用补丁快速参考

    一.Oracle安装部署 1.1 单机环境 1.2 Oracle RAC环境 1.3 Oracle DataGuard环境 1.4 主机双机 1.5 客户端部署 二.Oracle版本升级 2.1 单机 ...

随机推荐

  1. 我的长大app开发教程第一弹:Fragment布局

    在接下来的一段时间里我会发布一个相对连续的Android教程,这个教程会讲述我是如何从零开始开发“我的长大”这个Android应用. 在开始之前,我先来介绍一下“我的长大”:这是一个校园社交app,准 ...

  2. Eclipse——如何设置代码字体大小

    eclipse默认字体太小,1920*1080下分辨不清楚,接下来介绍一下如何更改默认字体大小: 1.window-Preferences 2.General-Appearance-Colors an ...

  3. centos7.4下的python3.6的安装

    1.系统环境 :centos 7.4 最小化安装 2.安装过程 yum install wget      安装下载工具 wget https://www.python.org/ftp/python/ ...

  4. 常见JS写法

    1.在DIV中找某个CLASS $('.doc_input', 'div')

  5. SpringMVC+Apache Shiro+JPA(hibernate)案例教学(二)基于SpringMVC+Shiro的用户登录权限验证

    序: 在上一篇中,咱们已经对于项目已经做了基本的配置,这一篇文章开始学习Shiro如何对登录进行验证. 教学: 一.Shiro配置的简要说明. 有心人可能注意到了,在上一章的applicationCo ...

  6. python基础之文件操作和函数

    一.知识点 1.三元运算 a = 2 b = 3 val = 6 if a < b else 7 print(val) 2.文件读取 f = open(file='file.txt',mode= ...

  7. vue.js学习系列-第一篇

    VUE系列一 简介    vue是一个兴起的前端js库,是一个精简的MVVM.从技术角度讲,Vue.js专注于 MVVM 模型的 ViewModel 层.它通过双向数据绑定把 View 层和 Mode ...

  8. monkey日志解析

    bash arg: -p (打印monkey命令携带的参数) bash arg: com.dapp.testAPP123 bash arg: --throttle bash arg: 200 bash ...

  9. python 识别图片文字

    今天群里有兄弟问如何把图片的文字给识别出来 对于python来说这不是小菜一碟吗,于是乎让pupilheart狠狠的吹了一波(哈哈,竟然没懂),下面将整个实现过程给大家实现下: 方法一:自己搞定ORC ...

  10. pointer-events属性屏蔽鼠标事件(点击穿透上层元素)

    应用场景 我们在 HTML 开发时可能会遇到这样的情况:页面上有一些元素使用绝对定位布局,这些元素可能会遮盖住它们位置下方的某个元素的部分或者全部.默认情况下,下方元素被遮挡的部分是不会响应鼠标事件的 ...