今天在推上偶然发现 Google 在本身的服务器上启用了 QUIC,QUIC 这东西嘛(发音同 quick),就是 Quick UDP Internet Connection,Google 制定的一种基于 UDP 的低时延的互联网传输层协议。我以为吧,Google 率先在自家鼓捣部署的东西,那都是比较有前景的,好比说 spdy(基本上成了 http/2 的前身),好比说 bbr,反正大概都是一些很牛的东西,我有信心般盲目的相信 QUIC 也是挺有前景的!php
一般呐,我们在访问一些 HTTPS 网站的时候,Chrome 会告诉咱们该链接使用 TLS1.2(好像 Google 也在自家的一些服务部署了 TLS1.3,TLS1.3 仍是草案呢吧),使用 XXX 加密和身份验证,使用 XXX 做为密钥交换机制。咱都知道 HTTP 是基于 TCP 的应用层协议,而 TLS 就好似套在了应用层和传输层之间的东西同样。盗用别人的话,之前的 HTTP 就是塑料管,一捅就漏(被篡改、劫持等),可是 TLS 就像是个金属外壳,这么一包上啊,就没那么容易漏水了。html
而 QUIC 这玩意就更好玩了,它没管 TCP 的事,反而奇葩选择了 UDP 作为下一层协议,而且 QUIC 协议内置了 TLS 栈,实现了本身的传输加密层,等等等等我是说不明白了,反正我也不懂装懂呢嘛,盗用网上的图,QUIC 的地位看起来是这样的:前端
反正嘛,这玩意就是看起来很厉害的样子,鉴于还没看到相似的中文教程,我就本身折腾下分享出来吧!请注意,这整篇文章都是实验性质的,想好了再折腾啊!出事了别怪我就好哦。linux
目前支持 QUIC 的服务器不是那么多,在 Chromium 的源码中有一个测试服务器,GitHub 上有几个从 Chromium 抠下来的项目,还有 go quic,大概都是属于 pre-alpha 阶段。可是几经搜寻,我找到了一个名为 caddy 的、用 go 写的 Web 服务器,这家伙提供实验性质的 quic 支持。git
话说这 caddy 有啥新特性呢?我去官网看了眼文档,给个人感受是,caddy 的目的是让网站变得更简单更易用,抢 Nginx 和 Apache 的饭碗并非它的追求。并且这家伙配置文件很简洁,也没啥依赖,大概随用随走的意思!固然可能它也是为数很少的、开源的支持 quic 的 Web 服务器吧!github
最使人眼睛一亮的是,这家伙本身就支持 https,能签证书、续期咱就输个邮箱啥的,它就能帮咱去 Let's Encrypt 搞个证书回来,并且去 SSLLabs 还会得 A,简直是神奇啊!并且这家伙还能直接从 git push 写博客,具体没仔细看golang
呐……Chrome、Chromium 都没问题的!只要你的版本比较新,基本上就已经支持并默认开启 QUIC 啦。咱能够到chrome://net-internals/#quic
里看下,开头就会告知咱们是否启用了 QUIC 的支持。若是没开启的话,就到chrome://flags
开启下chrome
这么一看,那就是服务端的支持了,那咱咋开启啊…… 固然是去 caddy 官网下载,而后启动就行了。话说想要成功有挺多条件的,有一片不深不浅的水域,有一块不大不小的坑…… 啊不对,反正就是否是想象中的那么简单啦。shell
咱来谈谈准备条件吧。vim
首先,咱得有个域名,有个服务器,要是 WordPress 啥的还得准备好 PHP、MySQL(MariaDB)啥的,对,最好再把证书也搞好(这一步不是必须的,由于 Caddy 能够为咱申请证书,可是我就当你们都搞好了)。个人运行环境是 Ubuntu 16.04 64Bit,别的环境不敢保证。
好,今天有点废话,那咱正式开始踩坑吧……
咦?都有什么坑呀?我会告诉你,caddy 官网下载的二进制若是开启 quic 会报错退出哟;我还会说,须要 go1.8,包管理器的 go1.6 是不行滴!
若是你太懒,懒得本身弄,而且相信个人话,那就戳我下载我编译好的吧!
这 golang 啊,是 C 语言他爹、玩了 Thompson Hack 的汤普森老爷子在 Google 搞的语言,听说很牛。怎奈 Ubuntu 16.04 的源里的 go 是 1.6,然而 caddy 须要 1.8,因此咱只能本身从官网搞个 go 回来了。为了偷懒,咱们就不从源码编译了,直接下二进制就行了。想从源码编译 golang 的我不拦着哟!
显示为 go version go1.8 linux/amd64 就能够了
注意:若是你安装了 1.8 如下的 golang,须要卸载,包管理器的就用相似apt remove golang-go
之类的命令卸载,编译的就直接sudo rm –rf /usr/local/go
便可
啥 gcc 啊,make 啊,源码啊啥的都得准备好,gcc 之类的就不说了,包管理器就够了。咱从源码开始,咱们就假设工做目录为/home/test
了、而且你已经切换到这个目录啦。
我估计你们会在第二步的时候失败或者是太慢(尤为是当你的服务器在境内的时候),那么请跟我一块儿艹 GFW 吧;
能够考虑使用下面这一堆命令
在执行完最后一句的时候,咱应该会在当前目录下发现一个名为caddy
的二进制程序。固然若是咱就想要个性,咱用./build.bash fuckGFW
那生成的二进制就叫fuckGFW
了。那些./build.bash candy.exe
的人仍是让我去撞墙吧 \(^o^)/~
假设咱把 caddy 放在了/home/caddy
,反正放哪都行,随便啦。
咱就大概编辑个这么模样的文件,名为 Caddyfile
假如要是有多个虚拟主机(vhost),就接着写
相似这样的就好了。
你们伙看着改咯。其中:
若是你想开启 HSTS,那就加个
若是想本身设定 cipher suite,那就看官网文档去,剩下的更多的特性,什么 rewrite 就本身发挥吧。
/tmp/php-cgi.sock
是 php-fpm 的监听地址,去
php-fpm.conf
里看下 listen 写的是啥就好了,有的人可能会是
127.0.0.1:9000
。若是你后端使用的是 jsp,也这样照猫画虎的改。
咱把上上一部编译出来的二进制拷贝到/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 快感的人,不妨试试吧!走在世界的最前端~