前段时间开始,公司各项业务开始陆续接入http2,关于http2的优点与所适用的场景网上有很多的文档可以查阅,这里我主要是总结分享一下如何从0到1搭建http2服务。

  这里先说明一下,要完成http2的请求需要客户端和服务端同时支持,如下表格可以看出,只要客户端或服务端任意一端不支持http2,都会自动降级到http1.1

  

  一、以下为客户端(各浏览器)支持情况

  

  目前除了Opera Mini以及UC Browser for Android 以外,其他浏览器支持情况还算不错,可是这些支持http2的浏览器也是有条件的,可以看到下图中下面的1、2、4,主要是2和4:必须是https以及服务端要支持ALPN(应用层协议协商);详细一点的服务端要求,请看下面。

  二、以下为服务端要求:

  google开发SPDY时提出了NPN(下一代协议协商),但随着SPDY被HTTP/2取代,google渐渐放弃了NPN,而改为ALPN(应用层协议协商);从chrome51开始就移除了对NPN的支持,只保留了支持ALPN(因此服务端必须要支持ALPN)

    1)OpenSSL 需要>=1.0.2的版本,因为也只有1.0.2或以上版本的OpenSSL才支持ALPN,而遗憾的是一般的Linux默认内置的OpenSSL(<1.0.2)都是不支持ALPN的;

    2)nginx 需要 >= 1.9.5,但据说在nginx 1.9.15 ~ 1.10.x有POST bug,然后在1.11.0才修复了这个BUG(详情请参阅:https://imququ.com/post/nginx-http2-post-bug.html

  三、让网站支持HTTP/2:

  好的,上面一和二说明了服务端与客户端的要求,只要满足了这些要求,就可以顺利搭建http2的服务;

  1、升级服务端:

    1)升级OpenSSL

下载openssl 1.1.0(https://www.openssl.org/source/openssl-1.1.0c.tar.gz)

解压:

[root@weixin-static-mwrhc ~]# tar -zvxf openssl-1.1.0c.tar.gz

安装:

[root@weixin-static-mwrhc ~]# cd openssl-1.1.0c

[root@weixin-static-mwrhc openssl-1.1.0c]# ./config shared zlib

[root@weixin-static-mwrhc openssl-1.1.0c]# make

[root@weixin-static-mwrhc openssl-1.1.0c]# make install

备份原有的openssl:

[root@weixin-static-mwrhc openssl-1.1.0c]# mv /usr/bin/openssl /usr/bin/openssl.back

[root@weixin-static-mwrhc openssl-1.1.0c]# mv /usr/include/openssl /usr/include/openssl.back

建立软链:

[root@weixin-static-mwrhc openssl-1.1.0c]# ln -s /usr/local/bin/openssl /usr/bin/openssl

[root@weixin-static-mwrhc openssl-1.1.0c]# ln -s /usr/local/include/openssl /usr/include/openssl

配置动态连接库:

[root@weixin-static-mwrhc openssl-1.1.0c]# echo "/usr/local/lib64/" >> /etc/ld.so.conf

[root@weixin-static-mwrhc openssl-1.1.0c]# ldconfig

升级完成,查看openssl版本:

[root@weixin-static-mwrhc openssl-1.1.0c]# openssl version

OpenSSL 1.1.0c  10 Nov 2016

2)安装新版Nginx

安装pcre的devel依赖包:

[root@weixin-static-mwrhc nginx-1.13.9]# yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel

下载 nginx-1.13.9.tar.gz(http://nginx.org/download/nginx-1.13.9.tar.gz)并解压:

[root@weixin-static-mwrhc ~]# tar -zvxf nginx-1.13.9.tar.gz

编绎:

[root@weixin-static-mwrhc ~]# cd nginx-1.13.9

[root@weixin-static-mwrhc nginx-1.13.9]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_flv_module --with-http_gzip_static_module --with-pcre --with-stream --with-openssl=/root/openssl-1.1.0c【openssl的源码路径】

[root@weixin-static-mwrhc nginx-1.13.9]# make

如果出现以下错误:

cc: /root/openssl-1.1.0c/lib/libssl.a: No such file or directory

cc: /root/openssl-1.1.0c/lib/libcrypto.a: No such file or directory

make[1]: *** [objs/nginx] Error 1

make[1]: Leaving directory `/root/nginx-1.13.9'

make: *** [build] Error 2

则:

[root@weixin-static-mwrhc nginx-1.13.9]# ln -s /usr/local/lib64/libssl.a /root/openssl-1.1.0c/lib/libssl.a

[root@weixin-static-mwrhc nginx-1.13.9]# ln -s /usr/local/lib64/libcrypto.a /root/openssl-1.1.0c/lib/libcrypto.a

然后再次执行:

[root@weixin-static-mwrhc nginx-1.13.9]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_flv_module --with-http_gzip_static_module --with-pcre --with-stream --with-openssl=/root/openssl-1.1.0c【openssl的源码路径】

[root@weixin-static-mwrhc nginx-1.13.9]# make

安装:

[root@weixin-static-mwrhc nginx-1.13.9]# make install

安装完成,查看安装信息:

[root@weixin-static-mwrhc nginx-1.13.9]# /usr/local/nginx/sbin/nginx -V

nginx version: nginx/1.13.9

built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)

built with OpenSSL 1.1.0c  10 Nov 2016

TLS SNI support enabled

configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_flv_module --with-http_gzip_static_module --with-pcre --with-stream --with-openssl=/root/openssl-1.1.0c

3)配置Nginx

server {

listen                         443 ssl http2;

server_name            h2.vipstatic.com;

root                           /apps/dat/web/working/h2.vipstatic.com;

index                        index.html;

#SSL配置

ssl                            on;

ssl_certificate           /usr/local/nginx/conf.d/server.crt;

ssl_certificate_key   /usr/local/nginx/conf.d/server.key;

}

2、访问站点(成功):

  

  四、前端调试工具:

1、新版chrome支持HTTP/2,如果想做启动HTTP2的前后对比,可以退出chrome浏览器后,使用如下命令启动Chrome,就可以禁用http2,这样就会自动降级成HTTP/1.1:

以mac为例,使用命令行工具,找到chrome的安装位置,然后:/Applications/Google Chrome.app/Contents/MacOS/Google Chrome --disable-http2

2、抓包:

目前feddler不支持http2,使用feddler进行抓包,浏览器会自动降级为http1.1

而charles支持http2

  

从零开始搭建支持http2的web服务的更多相关文章

  1. 15分钟从零开始搭建支持10w+用户的生产环境(三)

    上一篇文章介绍了这个架构中,选择MongoDB做为数据库的原因,及相关的安装操作. 原文地址:15分钟从零开始搭建支持10w+用户的生产环境(二)   三.WebServer 在SOA和gRPC大行其 ...

  2. 15分钟从零开始搭建支持10w+用户的生产环境(四)

    上一篇文章,介绍了这个架构中,WebServer的选择,以及整个架构中扩展时的思路. 原文地址:15分钟从零开始搭建支持10w+用户的生产环境(三)   五.架构实践 前边用了三篇文章,详细介绍了这个 ...

  3. 一、搭建简单的axis web服务

    转: 一.搭建简单的axis web服务 1.在官方网站下载axis的工程(这个等下就有用的)和源码.jar包等,下载地址是: http://labs.renren.com/apache-mirror ...

  4. 15分钟从零开始搭建支持10w+用户的生产环境(二)

    上一篇文章,把这个架构的起因,和操作系统的选择进行了详细说明. 原文地址:15分钟从零开始搭建支持10w+用户的生产环境(一)   二.数据库的选择 对于一个10W+用户的系统,数据库选择很重要. 一 ...

  5. Linux上搭建文件浏览的web服务(创建软件仓库)(一)

    软件仓库的创建方式有很多,这是一种很简单的创建方式: python -m SimpleHTTPServer 快速搭建一个http服务,提供一个文件浏览的web服务. 使用:Python SimpleH ...

  6. 从零开始搭建etcd分布式存储系统+web管理界面

    什么是ETCD 随着CoreOS和Kubernetes等项目在开源社区日益火热,它们项目中都用到的etcd组件作为一个高可用.强一致性的服务发现存储仓库,渐渐为开发人员所关注. 在云计算时代,如何让服 ...

  7. 用一个下午从零开始搭建一个基础lbs查询服务

    背景 现在做一个sns如果没有附近的功能,那就是残缺的.网上也有很多现成的lbs服务,封装的很完整了. 我首先用了下百度lbs云,但是有点不适合自己的需要,因此考虑用mongodb建一个简单的lbs服 ...

  8. Windows下搭建Apache+Django+Python Web服务环境

    最近在学Django,想用Apache搭建一个服务器环境,因此在网上看了好多资料,很多都是用Python2.6和Apache2.2搭建的环境,不过我还是想用Python35和Apache24来搭建,具 ...

  9. 15分钟从零开始搭建支持10w+用户的生产环境(一)

    前言 这是一个基于中小型企业或团队的架构设计. 不考虑大厂.有充分的理由相信,大厂有绝对的实力来搭建一个相当复杂的环境. 中小型企业或团队是个什么样子? 开发团队人员配置不全,部分人员身兼开发过程上下 ...

随机推荐

  1. cookie session的共同点和区别

    由于HTTP协议是无状态的,在WEB系统中,怎么识别请求来自于哪里呢?是哪一个用户发起的请求呢? 为了解决这一个问题, HTTP协议引入了cookie和session这两个概念 cookie是服务器传 ...

  2. JaveScript对象(JS知识点归纳七)

    1.JS中的对象表示的是一个具体的事物. a)静态的特征=>对象的属性 b)动态的行为=>对象的方法=>保存的值==>函数 2.对象的创建方式 a)构造函数的创建方式 ``` ...

  3. 【R语言系列】R语言初识及安装

    一.R是什么 R语言是由新西兰奥克兰大学的Ross Ihaka和Robert Gentleman两个人共同发明. 其词法和语法分别源自Schema和S语言. R定义:一个能够自由幼小的用于统计计算和绘 ...

  4. Django restful-framework初步学习

    urls.py from django.conf.urls import include, url from django.contrib import admin from rest_framewo ...

  5. Linux学习--进程概念

    >>进程 说进程,感觉好空洞,来一张图,Linux下的进程: ps -eo pid,comm,cmd 说明:-e表示列出全部进程,-o pid,comm,cmd表示我们需要PID,COMM ...

  6. xcode修改代码目录结构出现clang:error:nosuchfileordirectory解决方法

    需要迁移一个开源工程的一部分内容到自己工程,迁移对方的工程到自己工程之后,因目录结构配置整理需要,对嵌入的工程目录进行了结构改变,编译后出现: clang: error: no such file o ...

  7. python性能分析--cProfile

    Python标准库中提供了三种用来分析程序性能的模块,分别是cProfile, profile和hotshot,另外还有一个辅助模块stats.这些模块提供了对Python程序的确定性分析功能,同时也 ...

  8. Python之旅.第三章.函数3.27

    一.形参与实参 1.形参与实参是什么? 形参(形式参数):指的是 在定义函数时,括号内定义的参数,形参其实就变量名 实参(实际参数),指的是 在调用函数时,括号内传入的值,实参其实就变量的值 x,y是 ...

  9. 25.C++- 泛型编程之函数模板(详解)

    本章学习: 1)初探函数模板 2)深入理解函数模板 3)多参函数模板 4)重载函数和函数模板 当我们想写个Swap()交换函数时,通常这样写: void Swap(int& a, int&am ...

  10. html5shiv.js和respond.min.js的作用

    html5shiv:解决ie9以下浏览器对html5新增标签的不识别,并导致CSS不起作用的问题. respond.min:让不支持css3 Media Query的浏览器包括IE6-IE8等其他浏览 ...