源: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 写博客,具体没仔细看

有小伙伴可能会问了,那 Nginx、Apache 这俩是否支持 QUIC 呢?这个嘛…… 短时间之内应该还不会支持。毕竟这改动要好大的。GitHub 上有个 libquic,目前只有实验性质的 goquic 能用这个库,别的还是等等吧。等到支持的时候,重新编译下就好啦。

支持 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 的我不拦着哟!

  1. wget https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz
  2. sudo tar -C /usr/local -xzf go1.8.linux-amd64.tar.gz
  3. #编辑bashrc
  4. vim ~/.bashrc
  5. #文件最后加入这么一行,保存退出
  6. export PATH=$PATH:/usr/local/go/bin
  7. #重新载入
  8. source ~/.bashrc
  9. 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了、并且你已经切换到这个目录啦。

  1. export GOPATH=/home/test
  2. go get github.com/mholt/caddy/caddy
  3. cd $GOPATH/src/github.com/mholt/caddy/caddy
  4. ./build.bash

我估计大家会在第二步的时候失败或者是太慢(尤其是当你的服务器在境内的时候),那么请跟我一起艹 GFW 吧;

可以考虑使用下面这一堆命令

  1. export GOPATH=/home/test
  2. wget http://7xvwrt.com1.z0.glb.clouddn.com/caddy170406.tar.bz2
  3. tar xf caddy170406.tar.bz2
  4. cd $GOPATH/src/github.com/mholt/caddy/caddy
  5. ./build.bash

在执行完最后一句的时候,咱应该会在当前目录下发现一个名为caddy的二进制程序。当然如果咱就想要个性,咱用./build.bash fuckGFW那生成的二进制就叫fuckGFW了。那些./build.bash candy.exe的人还是让我去撞墙吧 \(^o^)/~

配置 CaddyFile

假设咱把 caddy 放在了/home/caddy,反正放哪都行,随便啦。

咱就大概编辑个这么模样的文件,名为 Caddyfile

  1. :443 www.shemissed.me {
  2. root /home/wwwroot/www.shemissed.me
  3. fastcgi / /tmp/php-cgi.sock php
  4. log /home/wwwlogs/caddy.www.shemissed.me.log
  5. tls /etc/letsencrypt/live/www.shemissed.me/fullchain.pem /etc/letsencrypt/live/www.shemissed.me/privkey.pem
  6. }

假如要是有多个虚拟主机(vhost),就接着写

  1. memory.shemissed.me {
  2. root /home/wwwroot/memory.shemissed.me
  3. fastcgi / /tmp/php-cgi.sock php
  4. log /home/wwwlogs/caddy.memory.shemissed.me.log
  5. tls /etc/letsencrypt/live/memory.shemissed.me/fullchain.pem /etc/letsencrypt/live/memory.shemissed.me/privkey.pem
  6. }

类似这样的就行了。

大家伙看着改咯。其中:

如果你想开启 HSTS,那就加个

  1. 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 快感的人,不妨试试吧!走在世界的最前端~

最新文章

  1. js中二维数组的初始化
  2. 安卓,支付宝app登录时,提示 服务器安全证书已过期或不可信任,请问怎么解决
  3. WCF Windows Service Using TopShelf and ServiceModelEx z
  4. 由浅入深了解Thrift之客户端连接池化续
  5. 【蛙蛙推荐】Lucene.net试用
  6. 从python的yield说起
  7. Oracle查看用户所在表空间
  8. mac svn命令
  9. 分享一个SQLSERVER脚本
  10. 使用rem来做响应式布局(js动态加载)
  11. centos 打包RPM包 ntopng
  12. Yii2 日志处理
  13. WEB通知和React Native之即时通讯(iOS Android)
  14. 12C配置EM Express的https端口
  15. Golang并发编程中select简单了解
  16. Google AdSense怎么在新窗口打开
  17. Android中创建PopupMenu弹出式菜单
  18. kvm虚拟机中virbr0虚拟网络接口的删除与恢复
  19. centos6.5 设置ssh无密码登录
  20. neo4j 查询

热门文章

  1. C# DataTable To Entities
  2. EF 1
  3. opencv对手写数字进行无黏连切割
  4. Java中for循环中的的try-catch
  5. Excel 整个列数字转换成文本
  6. vue样式绑定
  7. Brainwashing
  8. Mybatis多个in查询
  9. 最小齐套回写MO工单组件数量错误 SQL
  10. IN_ORDER_PLANNING、IN_BOM_CHANGE