HTTP/2部署使用
为了更好地研究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流量。
参考
转至 https://www.cnblogs.com/163yun/p/9511032.html
HTTP/2部署使用的更多相关文章
- [原]CentOS7.2部署node-mapnik
转载请注明表作者think8848及出处(http://think8848.cnblogs.com) node-mapnik依赖项中要求g++ >= 5, toolchain (>= GL ...
- 使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus
最新的Mono 4.4已经支持运行asp.net mvc5项目,有的同学听了这句话就兴高采烈的拿起Visual Studio 2015创建了一个mvc 5的项目,然后部署到Mono上,浏览下发现一堆错 ...
- 通过Jexus 部署 dotnetcore版本MusicStore 示例程序
ASPNET Music Store application 是一个展示最新的.NET 平台(包括.NET Core/Mono等)上使用MVC 和Entity Framework的示例程序,本文将展示 ...
- 结合Jexus + Kestrel 部署 asp.net core 生产环境
ASP.NET Core 是微软的全新的框架.这一框架的目标 ︰ 跨平台 针对云应用优化 解除 System.Web 的依赖. 获得下面三个方面的优势,你可以把它认为是一个C# 版本的NodeJS: ...
- 4.Windows Server2012 R2里面部署 MVC 的网站
网站部署之~Windows Server | 本地部署:http://www.cnblogs.com/dunitian/p/4822808.html#iis 后期会在博客首发更新:http://dnt ...
- Win10 IIS本地部署MVC网站时不能运行?
异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 部署后出现这个错误: 打开文件目录后发现是可以看见目录的,静态页面也是可以打开的 ...
- 再部署一个 instance 和 Local Network - 每天5分钟玩转 OpenStack(131)
上一节部署了 cirros-vm1 到 first_local_net,今天我们将再部署 cirros-vm2 到同一网络,并创建 second_local_net. 连接第二个 instance 到 ...
- 将 instance 部署到 OVS Local Network - 每天5分钟玩转 OpenStack(130)
上一节创建了 OVS 本地网络 first_local_net,今天我们会部署一个 instance 到该网络并分析网络结构.launch 一个 instance,选择 first_local_net ...
- 从零开始编写自己的C#框架(25)——网站部署
导航 1.关掉访问保护 2.发布网站 3.复制网站到服务器 4.添加新网站 5.设置网站访问权限 6.设置文件夹访问权限 7.控制可更新文件夹执行权限 8.设置“应用程序池”.net版本与模式 9.附 ...
- Oracle安装部署,版本升级,应用补丁快速参考
一.Oracle安装部署 1.1 单机环境 1.2 Oracle RAC环境 1.3 Oracle DataGuard环境 1.4 主机双机 1.5 客户端部署 二.Oracle版本升级 2.1 单机 ...
随机推荐
- mkdir(): Permission denied
记录下,凡是遇到此类问题都是无权限导致. 根据不同场景,需要在不同的文件夹设置不同的权限. 例如,图片相关, 在php中,首先看下 配置php.ini的文件上传是否开启(file_uploads = ...
- 1.7分布式工具配置及安装(仅供学习Xshell,VMware)
前言 最近因为换工作以及其他的一些琐事,耽误了更博时间,再加上分布式的这几个软件之前没撸过....这学习这几个工具上也花了点时间 本篇博客为后续分布式的学习提供基础的安装和配置. 首先,系统为Cent ...
- python的多线程
1.多线程的例子 import threading #首先导入threading模块,这是使用多线程的前提 from time import ctime,sleep def music(func): ...
- P1074 靶形数独题解
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶 ...
- Spring-Boot配置文件web性能(服务器)配置项
参数 介绍server.address 服务器应绑定到的网络地址server.compression.enabled = false 如果启用响应压缩server.compression.exclud ...
- hibernate之HQL,Criteria与SQL
HQL是针对封装好的对象. HQL :hibernate自己用的sql语句 -------HQL不能出现表中的任何内容 ---------不经常使用开发中 基本查询:String hql = &q ...
- 2018-2019-2 20165221『网络对抗技术』Exp4:恶意代码分析
2018-2019-2 20165221『网络对抗技术』Exp4:恶意代码分析 实验要求: 是监控你自己系统的运行状态,看有没有可疑的程序在运行. 是分析一个恶意软件,就分析Exp2或Exp3中生成后 ...
- 2018-2019-2 《网络对抗技术》 Exp0 Kali安装 20165221 Week1
2018-2019-2 <网络对抗技术> Exp0 Kali安装 20165221 Week1 安装Vmware 上学期已经安装过,不再赘述. 如需安装,可参考如何安装vmware 下载v ...
- 关于/tmp/ 目录自动清理文件
问题:今天开发人员给我说了一个错误:The temporary upload location [/tmp/tomcat.1337767218595042057.80/work/Tomcat/loca ...
- Java中int和String类型之间转换
int –> String int i=123; String s=""; 第一种方法:s=i+""; //会产生两个String对象 第二种方法:s=S ...