(Artwork from @kato_roku on Twitter)
編譯新的TCP擁塞控制算法-BBR
最近Google新出的玩物,大家都很開心的在玩,這邊在回國之後也坐下來玩了一下。
本文章基於本人在Linode運行的服務器,系統為CentOS 7。
這裡有一個問題就是大家都以為Linode上了4.9.0內核,理所當然內置BBR了,但Linode官方其實沒有編譯進去,我們還是得自己編譯內核。
本文大部分參考了 https://blog.linuxeye.com/452.html ,Please check them out。
-
安裝ELRepo源
cat > /etc/yum.repos.d/elrepo.repo << EOF
[elrepo-kernel]
name=ELRepo.org Community Enterprise Linux Kernel Repository - el7
baseurl=http://elrepo.org/linux/kernel/el7/\$basearch/
http://mirrors.coreix.net/elrepo/kernel/el7/\$basearch/
http://jur-linux.org/download/elrepo/kernel/el7/\$basearch/
http://repos.lax-noc.com/elrepo/kernel/el7/\$basearch/
http://mirror.ventraip.net.au/elrepo/kernel/el7/\$basearch/
enabled=1
gpgcheck=0
EOF
-
平行安裝帶有BBR的4.9內核以及GRUB2
注意:GRUB2只是給KVM用的,Xen用戶請照常使用 /boot/grub/menu.lst 來引導啟動。
yum -y install kernel-ml grub2
-
檢查內核是否安裝成功
[root@localhost ~]# ls -l /boot/vmlinuz*
-rwxr-xr-x 1 root root 6037696 Dec 29 12:47 /boot/vmlinuz-0-rescue-72863e389b584a4dab36fae7f3bffda2
-rwxr-xr-x 1 root root 6037696 Dec 11 21:37 /boot/vmlinuz-4.9.0-1.el7.elrepo.x86_64
-
設置內核(Linode-KVM篇):
[root@localhost ~]# mkdir /boot/grub
[root@localhost ~]# grub2-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.9.0-1.el7.elrepo.x86_64
Found initrd image: /boot/initramfs-4.9.0-1.el7.elrepo.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-72863e389b584a4dab36fae7f3bffda2
Found initrd image: /boot/initramfs-0-rescue-72863e389b584a4dab36fae7f3bffda2.img
done
之後在Linode的面板配置文件中選擇使用 GRUB 2 啟動即可。
-
設置內核(非Linode-KVM篇):
[root@localhost ~]# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
CentOS Linux (4.9.0-1.el7.elrepo.x86_64) 7 (Core)
CentOS Linux (3.10.0-327.36.3.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-153a217486fe4be8a8dbd28db67ed581) 7 (Core)
[root@localhost ~]# grub2-set-default 0
-
設置內核(Linode-Xen篇):
編輯 /boot/grub/menu.lst :
timeout 5
title CentOS (4.9.0-1.el7.elrepo.x86_64)
root (hd0)
kernel /boot/vmlinuz-4.9.0-1.el7.elrepo.x86_64 root=/dev/xvda
initrd /boot/initramfs-4.9.0-1.el7.elrepo.x86_64.img
然後在Linode的面板配置文件中選擇 pv-grub-x86_64 啟動方式。
注意:以上更換內核方式均需重啟。
最後,配置使用BBR:
cat >>/etc/sysctl.conf << EOF
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
EOF
sysctl -p
查看BBR是否生效:
[root@localhost ~]# sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = bbr cubic reno
[root@localhost ~]# lsmod | grep bbr
tcp_bbr 16384 16
增加 HTTP/2 支持
曾經的我天真的以為只要在 Nginx 配置文件中寫上 ssl http2 就是在用 HTTP/2 了…
經過 Maxsum 的提醒,我錯了…我錯在低估了 CentOS 的軟件版本落後程度。
Maxsum 在跟我說 ALPN 時,我還在圖樣的想著 ALPN 是什麼,而去問 Google 。很明顯,如果系統上的 OpenSSL 版本太舊,或者說使用了 Nginx 官方提前編譯好的安裝包,基本都是不支持 ALPN (HTTP/2 所需特性)的 1.0.1e 版本。
於是,幹活吧。
從官網上拖下最新的 OpenSSL 1.1.0c 壓縮包,重新編譯一次 Nginx 。
Welcome to HTTP/2 now.
好久不見,初次見面。
你好,歡迎來到白翼的服務器運維博客,但又已經不是你熟知的那個博客。
曾經的內容,今後會在某個二級域名上線,至於是哪個二級域名,我也不想公開,就讓那些內容成為古老的寶藏,等待探險人的發現吧。
好了,我們迴歸本質,談談技術。
這次為何重啟博客,有幾個理由:
- Typecho太久沒有人維護。
- 我想要重新寫點乾貨。
- 老博客的主題厭倦了。
還有就是,對於我這種懶癌晚期患者來說,能夠動手做這麼大改裝,一定是服務器環境也煥然一新了。
That’s right,歡迎體驗這個由 PHP 7.1 + Percona 5.7 + Nginx 1.11 驅動的服務器,部署了 Let’s Encrypt (Certbot),而且,每一個部署細節都用 Shell 腳本寫了下來,再也無需手動輸入命令肝到天亮。
Check them out:
https://github.com/richardevs/Self-written-bash-script
這次的服務器環境配置可以說是我第一次挑戰全部靠自己,之前因為網站數量過多,一直都依賴著 Virtualmin 的幫助,而 Virtualmin 的臃腫安裝步驟也實在很吃資源,於是,每一點的不滿都成為推動人類進步的動力(?)
總結一下這次遇到的困難,其實比起以前,這次可以說是很暢通無阻了:
- PHP 7.1 存在部分函數變更,比如 Typecho 用的 utf8_decode() 刪除了。
- 靠自己,就有Bug。php-xml, php-gd, php-mcrypt 等都沒有裝,導致初期測試時很多網站空白輸出。沒錯,我只裝了 php 和 php-mysqlnd 。
- 這次把服務器的安全性提升了一個檔次,所有 80 端口的請求都會被 301 至 HTTPS 。雖然大部分網站都能夠自動根據 HSTS 引導文件訪問 HTTPS ,然而部分上古世紀的代碼沒能做到,這個時候就需要 Content-Security-Policy : upgrade-insecure-requests 出場了。
最後,再次歡迎你到來/回來。