登录
  • 人们都希望被别人需要 却往往事与愿违
  • 中国人最悲哀的就是: 刚被历史的车轮碾过, 还没来得及爬起来, 发现历史在倒车...

前卫一下:给你的网站开启QUIC

Linux Benny小土豆 10392次浏览 4463字 4个评论
文章目录[显示]

今天在推上偶然发现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的支持

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

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

有的时候死活不出来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内核里,我还是没开 :arrow: 

所以,那些想要折腾的、体验一下QUIC快感的人,不妨试试吧!走在世界的最前端~


文章版权归原作者所有丨本站默认采用CC-BY-NC-SA 4.0协议进行授权|
转载必须包含本声明,并以超链接形式注明原作者和本文原始地址:
https://dmesg.app/quic.html
喜欢 (13)
分享:-)
关于作者:
If you have any further questions, feel free to contact me in English or Chinese.
发表我的评论(代码和日志请使用Pastebin或Gist)
取消评论

                     

去你妹的实名制!

  • 昵称 (必填)
  • 邮箱 (必填,不要邮件提醒可以随便写)
  • 网址 (选填)
(4)个小伙伴在吐槽
  1. 有时候死活不出来quic,是因为chrome版本不够高吧。使用最新版本的caddy+52版本的chrome,虽然可以启用quic,可是就如答主所说,就是用不了quic.纠结,后来换成58版本的chrome就好了。 估计呀,是web和chrome的quic版本不一致导致的。
    青色竹简2017-05-16 10:48 回复
    • 嗯,我猜可能还有更多原因,很奇怪,毕竟这东西还是实验性的
      Benny小土豆2017-05-16 13:11 回复
      • QUIC看起来很美好. 可惜在墙国,ISP早已封锁 用户在国外的话有加速作用,某国就呵呵
        匿名2017-12-28 20:27 回复
        • 只是实验性…
          Benny小土豆2017-12-28 22:17