本身動手開啓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 也是挺有前景的!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 的支持

支持 QUIC 的 Web 服務器

目前支持 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

有小夥伴可能會問了,那 Nginx、Apache 這倆是否支持 QUIC 呢?這個嘛…… 短期以內應該還不會支持。畢竟這改動要好大的。GitHub 上有個 libquic,目前只有實驗性質的  goquic 能用這個庫,別的仍是等等吧。等到支持的時候,從新編譯下就好啦。

支持 QUIC 的瀏覽器

吶……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

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

相關文章
相關標籤/搜索