从零开始搭建支持http2的web服务
前段时间开始,公司各项业务开始陆续接入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服务的更多相关文章
- 15分钟从零开始搭建支持10w+用户的生产环境(三)
上一篇文章介绍了这个架构中,选择MongoDB做为数据库的原因,及相关的安装操作. 原文地址:15分钟从零开始搭建支持10w+用户的生产环境(二) 三.WebServer 在SOA和gRPC大行其 ...
- 15分钟从零开始搭建支持10w+用户的生产环境(四)
上一篇文章,介绍了这个架构中,WebServer的选择,以及整个架构中扩展时的思路. 原文地址:15分钟从零开始搭建支持10w+用户的生产环境(三) 五.架构实践 前边用了三篇文章,详细介绍了这个 ...
- 一、搭建简单的axis web服务
转: 一.搭建简单的axis web服务 1.在官方网站下载axis的工程(这个等下就有用的)和源码.jar包等,下载地址是: http://labs.renren.com/apache-mirror ...
- 15分钟从零开始搭建支持10w+用户的生产环境(二)
上一篇文章,把这个架构的起因,和操作系统的选择进行了详细说明. 原文地址:15分钟从零开始搭建支持10w+用户的生产环境(一) 二.数据库的选择 对于一个10W+用户的系统,数据库选择很重要. 一 ...
- Linux上搭建文件浏览的web服务(创建软件仓库)(一)
软件仓库的创建方式有很多,这是一种很简单的创建方式: python -m SimpleHTTPServer 快速搭建一个http服务,提供一个文件浏览的web服务. 使用:Python SimpleH ...
- 从零开始搭建etcd分布式存储系统+web管理界面
什么是ETCD 随着CoreOS和Kubernetes等项目在开源社区日益火热,它们项目中都用到的etcd组件作为一个高可用.强一致性的服务发现存储仓库,渐渐为开发人员所关注. 在云计算时代,如何让服 ...
- 用一个下午从零开始搭建一个基础lbs查询服务
背景 现在做一个sns如果没有附近的功能,那就是残缺的.网上也有很多现成的lbs服务,封装的很完整了. 我首先用了下百度lbs云,但是有点不适合自己的需要,因此考虑用mongodb建一个简单的lbs服 ...
- Windows下搭建Apache+Django+Python Web服务环境
最近在学Django,想用Apache搭建一个服务器环境,因此在网上看了好多资料,很多都是用Python2.6和Apache2.2搭建的环境,不过我还是想用Python35和Apache24来搭建,具 ...
- 15分钟从零开始搭建支持10w+用户的生产环境(一)
前言 这是一个基于中小型企业或团队的架构设计. 不考虑大厂.有充分的理由相信,大厂有绝对的实力来搭建一个相当复杂的环境. 中小型企业或团队是个什么样子? 开发团队人员配置不全,部分人员身兼开发过程上下 ...
随机推荐
- 程序猿媛 九:Adroid zxing 二维码3.1集成(源码无删减)
Adroid zxing 二维码3.1集成 声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段. 转载请保留原文出处“http://my.oschina.net/gluoyer/blog”, ...
- linq分组求和_实体类和datatable
1.数据分组求合,分别用的实体类以及datatable来分组求合,还有分组求和之后的如何取值 //实体类版本 List<ProgramTimeModel> TotalAllList = G ...
- Alpha第十天
Alpha第十天 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.前言 任务分配是VV.ZQ. ...
- 掌握SQLServer锁的相关概念
一.为什么要引入锁 当多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: ◆丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 ◆脏读 ...
- 【Alpha版本】冲刺阶段 - Day5 - 破浪
今日进展 袁逸灏:解决音乐播放问题以及跳转问题.(5h) 刘伟康:大致检查了测试规范,参考了其他 alpha 阶段的博客.(1h) 刘先润:解决了敌车与障碍物溢出边界的代码问题,给用户车辆增加了火焰喷 ...
- 201621123040《Java程序设计》第12周学习总结
1.本周学习总结 2.面向系统综合设计-图书馆管理系统或购物车 2.1简述如何使用流与文件改造你的系统.文件中数据的格式如何? 将书目信息写入文件,查阅图书馆书目信息时,实现文件的读取 2.2简述系统 ...
- 20145237 《Java程序设计》第九周学习总结
20145237 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令 ...
- 2017 清北济南考前刷题Day 3 afternoon
期望得分:100+40+100=240 实际得分:100+40+100=240 将每个联通块的贡献乘起来就是答案 如果一个联通块的边数>点数 ,那么无解 如果边数=点数,那么贡献是 2 如果边数 ...
- 08-TypeScript中的类
类的概念通常是在后端开发中实现的思想,比如C#.C++或Java,传统的JavaScript开发通过使用原型模式来模拟类的功能.在TypeScript中,天生就是支持类 的,可以让前端的开发更加具有面 ...
- AngularJS1.X学习笔记8-自定义指令(上)
AngulaJS的指令是一种非常强大的特性,一个ng-repeat就能让我们非常方便的展示一个数据列表,指令相当于是一个组件,为我们将一些东西封装起来了,提供了复用的可能性.个人认为自定义指令还是比较 ...