之前的文章《本网站将进入每夜维护模式(已结束)》就是为了此次升级,
现在网站已经升级到 HTTP/2 + TLS1.3 + PHP7.3,博客也已经升级到 WordPress 5.2。
当然,我依旧是坚持 Apache2 不动摇的。
一、升级理由
1. TLS 的安全因素
首先考虑的是安全问题,HTTPS 协议本身的局限性很大,而其依赖的加密和传输协议也并不是 100% 健壮的。只有正确的选用加密协议才谈得上安全。很多使用了 HTTPS 就以为高枕无忧但却使用 AES_CBC 加密的 HTTPS 网站(多数还都是机关网站)被劫持我也是亲眼所见。
另一方面,TLS 协议本身的 SNI 扩展本身就是一个巨大且无解的漏洞。
未来可依靠 ESNI 才能解决,那就必须先把 TLS1.3 准备好了。
2. HTTP/2 的性能因素
HTTP/2 都吼了多少年了,天天看着 SF 上一堆人问 HTTP 1.1 的 Keep-Alive 怎么配置最好,看得真烦。更别说还有人捧出 HTTP 1.0 在那高谈阔论。这些破玩意我 2012 年的时候就烦了,这都 7 年过去了,中国的技术就这么止步不前。
虽说国内多数门户网站都是 1.1 版本的,但我又不是他们。
趁着更新 TLS1.3 ,妥妥的也把 HTTP/2 上了。
二、升级过程
本站原本是跑在传统的 Apache2 Perfork MPM 下,以 module 方式载入 libphp 并执行 PHP。如果想上 HTTP/2 的话, Perfork MPM 是完全不可取的,一定要换成更先进的 MPM,而这就意味着以 module 方式载入 libphp 来运行 PHP 的方式也要成为历史,继续用 PHP 需要改为 PHP-FPM 。
而 TLS1.3 貌似也跟操作系统和 OpenSSL 挂钩。不知为何使用 apt 方式在 Ubuntu 16.04 中的 Apache2 并不能直接启用 TLS1.3。
看来是非得大改不成了。
1. 准备维护页面
首先,得准备一个维护页面。把所有请求都用这个维护页面替代。维护期间的 HTTP 状态码必须是 503 才行,不然即使人类不误会,搜索引擎也会误会。
所以纯的 HTML 是不行的,不过我们有 Apache2 的 .htaccess 和 PHP,方便得很。
2. 项目 DAMP
什么?你想让我自己编译?门都没有!
你又不改源码,你又不添加任何特殊的编译选项,那还有什么理由自己编译?
编译安装部署最辉煌的时代是何时?未知的目的机环境时代吗?
而 Docker ,就是现在了。
DAMP 是我个人的一个开源项目,致力于快速搭建基于 Docker + Apache2 + MySQL + PHP 的运行环境。
地址:https://github.com/catscarlet/damp/
项目基本已可以运行,但还差很多优化项和文档。而且这个项目目前看来只方便于新环境搭建,旧项目迁移麻烦得很,这也是我花了几个晚上才搞定的原因。
目前看来基本可用,TLS1.3 和 HTTP/2 都没有问题。
3. 升级 WordPress
因为更新了 MySQL ,所以最安全的办法还是手动导出旧的数据库再导入到新的数据库中。
而 WordPress,由于我之前一直在用 WP4.3 版本,虽然一直在手动打安全补丁,但是这个旧版本是不支持 PHP7.3 的。PHP7.3 去掉了之前版本的一些不安全用法,且对代码质量要求也很高,导致 WP4.3 不能工作,很多年久失修的插件也由于代码质量不过关,疯狂报错。
首先按照官方的方法升级到 WP5.2 ,之后 WP 能够正常跑起来,之后禁用掉报错的插件,检查一下他们的代码。
像这种代码,你根本没法说他们是聪明,还是傻逼。
升级完成之后,检查下 WP5.2 和之前 WP4.3 的区别。我之所以不愿意升级,就是因为自 WP4.4 起,WordPress 就带着缺陷发布,而且汉化也变得相当糟糕。我没能坚持到 4.4 版本修复这些功能,回退到了 4.3 。现在升级到 WP5.2 ,呵呵,当时的缺陷现在依旧是缺陷不说,更多更傻的东西也登场了。
首先就是这傻逼透顶的编辑器,我有个27寸1920×1080的显示器,可用编辑区域宽度只有 600 像素?感觉就逼是一个四肢健全的人只能用嘴叼着笔写字,而这破编辑器有块级编辑区,但是 Ctrl + A 则是全文全选,而那个来回遮挡的工具栏更是像在嘴里叼笔还必须套一个耻辱罩一样,这设计者可能用不起显示器还被熊挠过。
更别提他还有两个代码编辑模式,一个全文的,一个块级的,反正都不好用。
而固定链接功能和 WP4.4 一样,依旧是残废的。
而这个编辑器还需要载入相当大量的 js 文件,速度特别慢。
还好有插件可以继续回退到传统编辑器。只不过固定链接功能还是残废的。
而添加图片还会添加无用的 class。
我明明装了 5.2.2,但仍然提示需要更新到 5.2.2。妥妥的把自动更新关掉,以后手工 Merge 。
WordPress 的代码质量真心下滑的恐怖。如果有 WP4.3 支持 PHP7.3 的方法就好了,可惜不兼容的代码太多,没有办法。
三、结果
1. 基本协议
全部搞定,跑起来之后,检查一下。
HTTP/2 OK
TLS 1.3,X25519,AES_256_GCM OK。
不过由于 DAMP 的配置还没做到最优,移动端的 ChaCha20-poly1305 还没有支持。
接下来看 ESNI。
2. ESNI
看 ESNI 之前首先要搞定浏览器,现在默认浏览器是不支持的。
所以我研究了一下,发现 Firefox 需要手动改一些参数。
改完之后,虽然可以支持 ESNI 了,但是网站支持 ESNI 还需要 DNSSEC 才行,这是必需项。
很可惜国内不论是 114 还是 223 都不支持,所以开启 ESNI 是没戏。
唉。
四、其他
HTTP/2 的一大优点,就是其传输控制的锅甩给了 TCP。理论上 TCP 层可以更好地管理传输,速度应该会快很多。然而大陆网络诡异得很,从很多在国际上毫无问题但进了国内就怨声载道的 HTTP 库就知道(比如这篇:https://www.cnblogs.com/zhengyun_ustc/p/OKHTTP.html),国内链路上很多奇葩的设备都会劫持并自作多情的进行 优化 。
网站升级到 HTTP/2 后感觉请求快了很多,但是经常会出现卡住没反应的状况,即 TCP 被干掉了但是两端不知情。
TLS1.3 在表面上看不出名堂,因为没法开启 ESNI 所以也只能先这样了。
14 comments
Skip to comment form ↓
静水流深
2019 年 8 月 19 日 在 上午 9:54 (UTC 8) Link to this comment
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
感觉网站比之前快一些了,不知道是不是错觉
石樱灯笼
2019 年 8 月 20 日 在 下午 6:30 (UTC 8) Link to this comment
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36
我估计应该是 HTTP/2 的功劳吧。但是有时候点链接的时候会卡住超时,这是个难受的地方。
心灵博客
2019 年 8 月 22 日 在 上午 8:00 (UTC 8) Link to this comment
Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7
页面打开速度确实快了。以前打开速度慢以为是国外主机的问题。
很早前我也https了,但后来还是换回http了。
灰狼
2019 年 8 月 26 日 在 上午 9:27 (UTC 8) Link to this comment
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
看了下那段代码,写得真的太难读了,是为了彰显水平么
石樱灯笼
2019 年 8 月 26 日 在 下午 1:55 (UTC 8) Link to this comment
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36
水平?那段代码在 PHP7.3 下根本运行不了。
大致
2019 年 8 月 26 日 在 下午 2:38 (UTC 8) Link to this comment
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0
为啥要把后台设成中文啊。WP中文包太恶心了。
那段代码是把时分秒分别存着,然后往一块凑吧。可根本没必要分着存,是这意思吧?或是key在别的地方有用?
石樱灯笼
2019 年 8 月 26 日 在 下午 3:30 (UTC 8) Link to this comment
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36
因为 2008 年的时候我英文没有现在这么好,直接读英文有困难,后来也一直没有变过。而且当年翻译的挺好的。
如果是语法错误,我就只关心代码的语法错误。至于原作者怎么想的,我不想去关心,不然会有 brain damage 。
Sam.Z
2019 年 8 月 28 日 在 上午 11:21 (UTC 8) Link to this comment
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0
访问速度确实感觉有快些,Gutenberg反正我是不习惯,块模式适合营销号,其实一直不支持Markdown也是蛮无语的,支持一下要死哦 =。= 等11月续费到期我也要搞个主机玩玩,你的DAMP让我想到了XAMPP
石樱灯笼
2019 年 8 月 28 日 在 下午 5:13 (UTC 8) Link to this comment
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36
WordPress 在国际市场上的定位一直是营销工具。
某亚瑟
2020 年 2 月 3 日 在 上午 2:18 (UTC 8) Link to this comment
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
以前一直用Wordpress,毕竟生态还不错,但是后来真的是越来越来越来越难用,最后只好找了个很好用的静态博客玩了……
石樱灯笼
2020 年 2 月 3 日 在 下午 6:28 (UTC 8) Link to this comment
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
是够静态的,连评论功能都没有。
某亚瑟
2020 年 2 月 3 日 在 下午 6:52 (UTC 8) Link to this comment
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
评论功能一直没空去配置……配好了就有了XD
1sixth
2020 年 12 月 6 日 在 下午 2:33 (UTC 8) Link to this comment
Mozilla/5.0 (X11; Linux x86_64; rv:83.0) Gecko/20100101 Firefox/83.0
文章开头有个 typo,「ESIN」应为「ESNI」。
说到 ESNI,现在的 GFW 会阻断 ESNI 连接,详见 https://gfw.report/blog/gfw_esni_blocking/zh/ 。
石樱灯笼
2020 年 12 月 6 日 在 下午 4:37 (UTC 8) Link to this comment
Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:83.0) Gecko/20100101 Firefox/83.0
感谢指正,已修复。