自己动手开启QUIC(转载)
源:https://www.bennythink.com/quic.html#title-0
今天在推上偶然发现 Google 在自己的服务器上启用了 QUIC,QUIC 这东西嘛(发音同 quick),就是 Quick UDP Internet Connection,Google 制定的一种基于 UDP 的低时延的互联网传输层协议。我觉得吧,Google 率先在自家鼓捣部署的东西,那都是比较有前景的,比如说 spdy(基本上成了 http/2 的前身),比如说 bbr,反正大概都是一些很牛的东西,我有信心般盲目的相信 QUIC 也是挺有前景的!
通常呐,咱们在访问一些 HTTPS 网站的时候,Chrome 会告诉我们该连接使用 TLS1.2(好像 Google 也在自家的一些服务部署了 TLS1.3,TLS1.3 还是草案呢吧),使用 XXX 加密和身份验证,使用 XXX 作为密钥交换机制。咱都知道 HTTP 是基于 TCP 的应用层协议,而 TLS 就好似套在了应用层和传输层之间的东西一样。盗用别人的话,以前的 HTTP 就是塑料管,一捅就漏(被篡改、劫持等),但是 TLS 就像是个金属外壳,这么一包上啊,就没那么容易漏水了。
而 QUIC 这玩意就更好玩了,它没管 TCP 的事,反而奇葩选择了 UDP 做为下一层协议,并且 QUIC 协议内置了 TLS 栈,实现了自己的传输加密层,等等等等我是说不明白了,反正我也不懂装懂呢嘛,盗用网上的图,QUIC 的地位看起来是这样的:
反正嘛,这玩意就是看起来很厉害的样子,鉴于还没看到类似的中文教程,我就自己折腾下分享出来吧!请注意,这整篇文章都是实验性质的,想好了再折腾啊!出事了别怪我就好哦。
对 QUIC 的支持
支持 QUIC 的 Web 服务器
目前支持 QUIC 的服务器不是那么多,在 Chromium 的源码中有一个测试服务器,GitHub 上有几个从 Chromium 抠下来的项目,还有 go quic,大概都是属于 pre-alpha 阶段。但是几经搜寻,我找到了一个名为 caddy 的、用 go 写的 Web 服务器,这家伙提供实验性质的 quic 支持。
话说这 caddy 有啥新特性呢?我去官网看了眼文档,给我的感觉是,caddy 的目的是让网站变得更简单更易用,抢 Nginx 和 Apache 的饭碗并不是它的追求。而且这家伙配置文件很简洁,也没啥依赖,大概随用随走的意思!当然可能它也是为数不多的、开源的支持 quic 的 Web 服务器吧!
最令人眼睛一亮的是,这家伙自己就支持 https,能签证书、续期咱就输个邮箱啥的,它就能帮咱去 Let's Encrypt 搞个证书回来,而且去 SSLLabs 还会得 A,简直是神奇啊!而且这家伙还能直接从 git push 写博客,具体没仔细看
支持 QUIC 的浏览器
呐……Chrome、Chromium 都没问题的!只要你的版本比较新,基本上就已经支持并默认开启 QUIC 啦。咱可以到chrome://net-internals/#quic
里看下,开头就会告知我们是否启用了 QUIC 的支持。如果没开启的话,就到chrome://flags
开启下
这么一看,那就是服务端的支持了,那咱咋开启啊…… 当然是去 caddy 官网下载,然后启动就好了。话说想要成功有挺多条件的,有一片不深不浅的水域,有一块不大不小的坑…… 啊不对,反正就是不是想象中的那么简单啦。
咱来谈谈准备条件吧。
首先,咱得有个域名,有个服务器,要是 WordPress 啥的还得准备好 PHP、MySQL(MariaDB)啥的,对,最好再把证书也搞好(这一步不是必须的,因为 Caddy 可以为咱申请证书,但是我就当大家都搞好了)。我的运行环境是 Ubuntu 16.04 64Bit,别的环境不敢保证。
好,今天有点废话,那咱正式开始踩坑吧……
咦?都有什么坑呀?我会告诉你,caddy 官网下载的二进制如果开启 quic 会报错退出哟;我还会说,需要 go1.8,包管理器的 go1.6 是不行滴!
如果你太懒,懒得自己弄,并且相信我的话,那就戳我下载我编译好的吧!
安装 golang
这 golang 啊,是 C 语言他爹、玩了 Thompson Hack 的汤普森老爷子在 Google 搞的语言,据说很牛。怎奈 Ubuntu 16.04 的源里的 go 是 1.6,然而 caddy 需要 1.8,所以咱只能自己从官网搞个 go 回来了。为了偷懒,我们就不从源码编译了,直接下二进制就好了。想从源码编译 golang 的我不拦着哟!
- wget https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz
- sudo tar -C /usr/local -xzf go1.8.linux-amd64.tar.gz
- #编辑bashrc
- vim ~/.bashrc
- #文件最后加入这么一行,保存退出
- export PATH=$PATH:/usr/local/go/bin
- #重新载入
- source ~/.bashrc
- go version
显示为 go version go1.8 linux/amd64 就可以了
注意:如果你安装了 1.8 以下的 golang,需要卸载,包管理器的就用类似apt remove golang-go
之类的命令卸载,编译的就直接sudo rm –rf /usr/local/go
即可
准备并编译 caddy
啥 gcc 啊,make 啊,源码啊啥的都得准备好,gcc 之类的就不说了,包管理器就够了。咱从源码开始,我们就假设工作目录为/home/test
了、并且你已经切换到这个目录啦。
- export GOPATH=/home/test
- go get github.com/mholt/caddy/caddy
- cd $GOPATH/src/github.com/mholt/caddy/caddy
- ./build.bash
我估计大家会在第二步的时候失败或者是太慢(尤其是当你的服务器在境内的时候),那么请跟我一起艹 GFW 吧;
可以考虑使用下面这一堆命令
- export GOPATH=/home/test
- wget http://7xvwrt.com1.z0.glb.clouddn.com/caddy170406.tar.bz2
- tar xf caddy170406.tar.bz2
- cd $GOPATH/src/github.com/mholt/caddy/caddy
- ./build.bash
在执行完最后一句的时候,咱应该会在当前目录下发现一个名为caddy
的二进制程序。当然如果咱就想要个性,咱用./build.bash fuckGFW
那生成的二进制就叫fuckGFW
了。那些./build.bash candy.exe
的人还是让我去撞墙吧 \(^o^)/~
配置 CaddyFile
假设咱把 caddy 放在了/home/caddy
,反正放哪都行,随便啦。
咱就大概编辑个这么模样的文件,名为 Caddyfile
- :443 www.shemissed.me {
- root /home/wwwroot/www.shemissed.me
- fastcgi / /tmp/php-cgi.sock php
- log /home/wwwlogs/caddy.www.shemissed.me.log
- tls /etc/letsencrypt/live/www.shemissed.me/fullchain.pem /etc/letsencrypt/live/www.shemissed.me/privkey.pem
- }
假如要是有多个虚拟主机(vhost),就接着写
- memory.shemissed.me {
- root /home/wwwroot/memory.shemissed.me
- fastcgi / /tmp/php-cgi.sock php
- log /home/wwwlogs/caddy.memory.shemissed.me.log
- tls /etc/letsencrypt/live/memory.shemissed.me/fullchain.pem /etc/letsencrypt/live/memory.shemissed.me/privkey.pem
- }
类似这样的就行了。
大家伙看着改咯。其中:
如果你想开启 HSTS,那就加个
- Strict-Transport-Security "max-age=63072000; includeSubDomains; preload;"
如果想自己设定 cipher suite,那就看官网文档去,剩下的更多的特性,什么 rewrite 就自己发挥吧。
/tmp/php-cgi.sock
是 php-fpm 的监听地址,去php-fpm.conf
里看下 listen 写的是啥就行了,有的人可能会是127.0.0.1:9000
。如果你后端使用的是 jsp,也这样照猫画虎的改。运行 caddy
咱把上上一部编译出来的二进制拷贝到/home/caddy
下,然后把这个路径加入到 Path 之中(export PATH=$PATH:/home/caddy
),之后咱caddy -conf /home/caddy/Caddyfile -port 443 -http2 –quic
,再去浏览器刷新几下看 F12,就应该能看到 QUIC 了吧?
有的时候死活不出来 QUIC(尤其是 PC 版哦),俺也不知道是为啥……PS,此网站不适合访问……!
等等,这就结束了吗?
当然不是,其实这坑还是非常多的,假如终端关掉了,那 caddy 不就被 kill 了嘛。咱可以加个 & 给丢后台,再用 pidof 写个脚本加入 crontab 检查运行状态。尽管如此,这样用也不是最佳实践。
那正确的应该咋用呢?
把二进制放在/usr/local/bin/caddy
把 SysV 风格的启动脚本放在/etc/init.d/caddy
(这个脚本可以在官网的二进制包里找到)
配置文件目录放这/etc/caddy
证书放在子目录 ssl 并且属主是 www 啥的
创建配置文件/etc/caddy/Caddyfile
用service caddy start|stop|restart|reload|status
管理服务(/etc/init.d/candy restart
)
还有啥,比如说
别用 root 运行
用 non-login shell 运行
提高 ulimit 文件描述符限制(ulimit -n 8192
,或者在/etc/profile
中)
反正一堆咯,自己读 readme 咯
最后的注意事项
我没把这玩意部署在本站上,因为我目前也暂时把它当做 experimental features & I'm just boring,所以就搞到了马甲站上,也没做什么更多的测试…… 等个几年,等到 TLS1.3 正式公布、QUIC 被更多的 Web 服务器支持,我再开…… 当然了,现在 TCP_BBR 已经在 4.9 内核里,我还是没开
所以,那些想要折腾的、体验一下 QUIC 快感的人,不妨试试吧!走在世界的最前端~
自己动手开启QUIC(转载)的更多相关文章
- fluent中隐藏模型的开启【转载】
转载自:http://blog.sina.com.cn/s/blog_5fd791530100d5ic.html fluent中设置了一些隐藏模型,普通的用户界面是没有相关选项的,必须用相关命令开启. ...
- 新一代互联网传输协议QUIC浅析
QUIC(Quick UDP Internet Connection)是谷歌制定的一种互联网传输层协议,它基于UDP传输层协议,同时兼具TCP.TLS.HTTP/2等协议的可靠性与安全性,可以有效减少 ...
- 硬件笔记之MacMini开启HiDPI
0x00 概述 先科普一下,有关retina和HiDPI那点事 ,Macmini在2k显示器的显示太小了,看起来费眼,没办法,苹果原生HiDPI是支持4k显示器的,所以以后买显示器,直接买4k的一步到 ...
- Google Quic协议
0x01 Quic QUIC协议于2012年实现,2015年提交RFC草案,它是Goolge为了解决当今WEB应用常见的传输层和应用层问题而提出的,从分层结构上可以看做是TCP+TLS+HTTP2的集 ...
- SQL SERVER 2012数据库:开启防火墙导致外部无法连接数据库解决办法
SQL SERVER 2012数据库:开启防火墙导致外部无法连接数据库解决办法 将以下代码存为OpenSqlServerPort.bat文件: netsh advfirewall firewall a ...
- 让子弹飞,零成本让你的网站更快一点,boxopened http/3 (QUIC) 协议实战
最近HTTP-over-QUIC 协议被正式命名为 HTTP/3,协议带来的最大改变是协议底层将采用UDP协议,而不再是TCP协议,这样的好处吗,就是更低时延,更好的拥塞控制,更精确的RTT时间,更高 ...
- AM335x(TQ335x)学习笔记——USB驱动移植
对于AM335x来讲,TI维护的USB驱动已经非常完善了,本文称之为移植,实际上仅仅是配置内核选项使能USB HOST/OTG功能.废话少说,直接动手开启AM335x的USB驱动配置项. Step1. ...
- SQL注入不简单?那是你没有懂它的原理~
我们真的了解SQL注入吗? 不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动.在网络中,数据库驱动的Web应用随处可见,由此而存在的SQL注入是影响企业运营且最具破坏 ...
- Firefox 下载、附加组件、Flash插件、缓存位置(附加Chrome下载和Opera下载)
Firefox 下载的FTP页面: http://ftp.mozilla.org/pub/firefox/releases/ Firefox下载官方页面: https://www.mozilla.or ...
随机推荐
- unity 数学公式
Mathf.Abs绝对值 计算并返回指定参数 f 绝对值. Mathf.Acos反余弦 static function Acos (f : float) : float 以弧度为单位计算并返回参数 f ...
- Zabbix监控系统配置
1.Zabbix是一个基于WEB界面的提供分布式系统监控的企业级的开源解决方案 Zabbix能监视各种网络参数,保证服务器系统的安全稳定的运行,并提供灵活的通知机制以让SA快速定位并解决存在的各种问题 ...
- tensorflow serving 中 No module named tensorflow_serving.apis,找不到predict_pb2问题
最近在学习tensorflow serving,但是运行官网例子,不使用bazel时,发现运行mnist_client.py的时候出错, 在api文件中也没找到predict_pb2,因此,后面在网上 ...
- XML 可扩展标记语言
因 为XML实在是太重要了,而且被广泛应用!不论是数据存储,还是其他方面,如配置文件等.XML是一种对独立于任何编程语言的数据进行编码的机制.在数据 交换领域,正在变得非常流行!因为他的基于节点的存储 ...
- pandas 读取大文件 read_table C-engine CParserError: Error tokenizing data
解决办法: pd_data = pd.read_table(comment_file,header=None,encoding='utf-8', engine='python') 官网解析: engi ...
- java工程师基础笔试题(一)-参考答案
一.选择和填空 (不定项哦!) 1,如下是一份文件名为Test2.java的源文件,请问,编译该文件之后会生成几份字节码文件 class Test{ class Inner{} static cla ...
- spring学习第一课:spring的jar包下载
感谢作者: http://yanln.iteye.com/blog/2191312 ---------------------------------------------------------- ...
- python 常用模块(一): random , time , sys , os模块部分知识.
1.常用模块:(1)collectiaons模块 (2)与时间相关 time模块 (3)random模块 (4)os模块 (5)sys模块 (6) 序列化模块: json , pickle 2 ...
- wordpress smtp发送邮件
准备工作 进入qq邮箱 点击设置 邮箱设置 账户选项 下拉 找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 开启 点击开启后发送短信内容 配置邮件客户端 到 ...
- yaml文件 *.yml 写法简介
YAML(Yet Another Markup Language)(发音 /ˈjæməl/ ) 一种基于Unicode容易阅读,容易和脚本语言交互的,用来表达资料序列的编程语言. 适应场景 脚本语言: ...