在本站两岁生日即将来临之际,我终于下定决心,把整个网站搬迁至新的 VPS 上.过程刺激而有趣,不妨写写.
大概是两年前,我建立了这个网站.当时所使用的是 GoDaddy 最便宜一档的主机,另外域名也在 GoDaddy. 主要是因为 GoDaddy 是当时鲜有的支持支付宝付款的商家,而且当时还搞了个活动,经济型主机 1 美元 1 月,送一个指定后缀的域名(当然,我没要它的域名),非常诱人.其实 GoDaddy 的主机也还不错,一个独立 IP, 附带 GoDaddy 深度定制的 cPanel 控制面板,易用性很好,国内访问速度也尚可忍受.当时我还根本没有一点 Linux 下服务器维护的经验,(仅有的一些建站经历都是 BAE/SAE 这种 PaaS 平台上的),因此这个主机还挺适合我.再加上它比较丰富的功能,比如提供了邮局服务,提供了界面还挺好看的一个在线文件浏览器,提供了应用一键安装功能,等等,我还是比较满意的.
不过后来,应该没过多久,我就萌生了迁移到 VPS 的想法. GoDaddy 的这个主机,我能控制的地方太少了,系统貌似是古色古香的 Red Hat 4, 没有 root 权限,没有包管理器,整个操作系统几乎是半残的.续费价格不算便宜,而且,最开始偶尔还能找到续费优惠码,到后来能用的优惠码完全绝迹, GoDaddy 邪恶的圈钱本性暴露无遗.那时候 DigitalOcean 凭借全 SSD 和 5 美元每月的价格声名鹊起,我关注的一些个人网站都在用 DigitalOcean/Vultr 这类性价比超高的 VPS, 搞得我也眼红得不行.不过,虽然有了想法,但苦于 VPS 难以支付,只能作罢.一方面, DigitalOcean/Vultr 不支持支付宝,另一方面, 用我的银行卡通过 PayPal 付款没一次成功过.当时还研究了很长一阵子的虚拟信用卡,最后也没有成功.还尝试过申请 GitHub Student Pack (毕竟有 DigitalOcean 的 100 美元礼券)(现在好像只有 50), 以失败告终,看来还是要考个大学才行那时候甚至于想把这个网站搬去搬瓦工,也是实属无奈了,毕竟搬瓦工还是支持支付宝的.
那时候其实已经想好迁移之后要干的事情了.比如使用 CloudXNS, 此前一直用 GoDaddy 的 DNS, 略蛋疼;比如吃上 Shadowsocks; 比如用 Let's Encrypt! 的 SSL 证书,用充满信仰的 CHACHA20 加密算法(在 GoDaddy 的服务器上配置 Let's Encrypt! 证书有些奇怪的问题);比如使用锐速,用 TCP fastopen; 比如尝试 Docker; 比如用 Ubuntu 做服务器操作系统,用 nginx 来 host 站点,还要用 PHP7...然而受制于有钱花不出的悲剧中,我不得不继续用 GoDaddy 主机,这些设想也一直停留在备忘录里.其实,当时想尝试 Docker 只是因为觉得用了 Docker 之后方便迁移,一个容器扔到哪都能跑,后来等我真正完成迁移后才发现完全没必要;当时想用锐速/ net-speeder 现在想来也是喜闻乐见(现在我使用的服务器端加速方案是 TCP-BBR,后文会说).不管怎么说,这些都是一年前曾经写下的计划了.
于是又忍受了一年.大概是去年 (2016) 年底的时候,下定决心,这回必须要迁移出去了.当时了解到 Vultr 可以用比特币支付,又在贴吧看到一篇贴子,内容大概是用支付宝买比特币,然后用比特币在 Steam 上消费,作为 Steam 暂时取消支付宝支持的曲线救国方案.我大喜过望,感觉也可以依葫芦画瓢,用比特币买 Vultr VPS.
当时对比了一下 DigitalOcean 和 Vultr 两家. DigitalOcean 似乎不支持比特币,而且用官方提供的 speedtest 测试,不管是美国西海岸还是日本的机房都慢得感人,而且最低一档 VPS 内存只有 512MB. Vultr 这边,支持比特币,日本机房快如闪电 (speedtest 的结果我简直不敢相信,那速度就像是访问国内网站一样,真的很惊人),最低一档 VPS 和 DigitalOcean 一个价但提供 768MB 内存,最关键的是, Vultr 当时正进行充多少送多少的活动,卧槽?!天上掉馅饼了?此等好事居然被我遇到了,不买能忍?于是注册账号,充值,顿时被震惊了:新用户初次充值不能使用比特币. WTF? 你他妈在逗我?潸然泪下.
(Vultr 的那个充多少送多少的活动,虽然写的是 available for a limited time, 但这几个月过去了居然还在: https://www.vultr.com/match/)
于是最后我选择了 ConoHa. ConoHa 费用更高(同时配置也更好),口碑不怎么样,不过好在中文支持好,可以用支付宝.(等我付完款才得知目前 ConoHa 邀请注册的新用户不会有奖励了,差评.) 1 月 19 号入手,选的最低一档配置,双核 E5 处理器, 1GB RAM, 50GB SSD. 服务器在东京,访问速度还不错(不过跟 Vultr 的东京机房还是有些差距),国内 ping 值 100~200ms 的样子.操作系统我用的 Fedora 25, 只是因为在笔记本上用习惯了(为什么不用 CentOS? CentOS 总是给我一种陈旧的感觉).拿到新服务器,一阵折腾,发现不管是 web 服务还是 Shadowsock 都连不上,想起过去看到有人说 ConoHa 有部分 IP 被墙了,于是删掉服务器,重新建立,然而问题依旧,方才想起这是 firewalld 造成的问题.(这个坑我已经踩过一次了,见局域网内可以 ping 通但不能访问网页的解决办法)
Web 服务方面,我选择 Caddy + PHP 7 + MariaDB 的组合.后两者不必多说,而前者是我在某大神的博客里偶然见到一篇安利文才知道的.目前本站在新服务器上已经运行大概两个月了, Caddy 的表现令我无比满意.使用 Caddy 完全是一种享受:一方面,默认 HTTP/2, 全自动 SSL 证书签发,大量的插件支持,另一方面,极度简约的配置文件写法,不俗的性能,各种奇妙的黑科技,以及活跃的社区.和 Caddy 相比, Apache 和 Nginx 的配置文件复杂繁琐,简直不堪入目. Caddy 非常让我省心,过去很多要靠人力完成的操作(像定时续期 SSL 证书)它全都能自动完成,同时学习成本也极低,官方给出的文档简明易懂,浏览后即可掌握使用方法.此外,最重要的一点, Caddy 由 Go 语言写成!(对 Go 语言的盲目崇拜)
在这里可以分享一下我的 Caddyfile
:
nota.moe { #用于 WordPress 站点的配置 root /var/www/wordpress #网站根目录 fastcgi / 127.0.0.1:9000 php #PHP-FPM 监听地址 gzip #开启压缩 log /var/www/log/nota.moe.log #日志 errors /var/www/log/nota.moe.log #日志 basicauth /*** *** *** rewrite { #这些 rewrite 规则用于支持 WordPress 的"固定链接"功能 if {path} not_match ^\/wp-admin to {path} {path}/ /index.php?_url={uri} } header / { #增强安全性的 HTTP 头.注意,当网站还在测试阶段时不要开启 HSTS # Enable HTTP Strict Transport Security (HSTS) to force clients to always # connect via HTTPS (do not use if only testing) Strict-Transport-Security "max-age=31536000;" # Enable cross-site filter (XSS) and tell browser to block detected attacks X-XSS-Protection "1; mode=block" # Prevent some browsers from MIME-sniffing a response away from the declared Content-Type X-Content-Type-Options "nosniff" # Disallow the site to be rendered within a frame (clickjacking protection) X-Frame-Options "SAMEORIGIN" } }
www.nota.moe, next.nota.moe { redir https://nota.moe{uri} #用于 www 跳转主域名.是的,跳转就是这么简单 }
dl.nota.moe { #用于私人网盘的配置(见 https://nota.moe/2017/personal-cloud-storage-with-caddy-ariang/) root /var/www/dl log /var/www/log/dl.nota.moe.log errors /var/www/log/dl.nota.moe.log filemanager / { #提供在线文件管理器.需要 filemanager 插件 show /var/www/dl #网盘文件的根目录 allow_new true allow_edit true allow_commands true } # browse #也可使用自带的 browse 目录浏览代替 filemanager basicauth /*** *** *** timeouts none #避免下载时出现网络错误 header / { # Enable HTTP Strict Transport Security (HSTS) to force clients to always # connect via HTTPS (do not use if only testing) Strict-Transport-Security "max-age=31536000;" # Enable cross-site filter (XSS) and tell browser to block detected attacks X-XSS-Protection "1; mode=block" # Prevent some browsers from MIME-sniffing a response away from the declared Content-Type X-Content-Type-Options "nosniff" # Disallow the site to be rendered within a frame (clickjacking protection) X-Frame-Options "SAMEORIGIN" } }
Caddy 号称是 "The HTTP/2 web server with automatic HTTPS", 确实,它会帮你把 OCSP stapling, ALPN/NPN, HTTP 跳转 HTTPS 这些东西统统设置好,只允许 TLS 1.1/1.2 (是的,抛弃了 1.0), 屏蔽了大量安全性较差的 Cipher Suites. 这样,你除了运行 Caddy 外不需要做任何事情,就可以在 SSL Labs 里拿到 A 评级.如果你像上述配置文件那样设置了 HSTS, 那么 A+ 评级轻而易举.
另外, Caddy 对新技术的支持也很及时.例如,目前只需要在启动 Caddy 时加一个 -quic
参数即可启用 QUIC 协议,非常简单.(不过,目前好像还没有很好地支持 CHACHA20 加密算法)
好吧,或许 Caddy 也没有那么省心.刚开始用的时候还是遇到了不少麻烦,也是折腾得够呛,踩了不少坑.自己处理得了的问题就瞎 jb 搞两下,要是不行就查文档, Google, 实在解决不了的就去 Caddy 社区发贴求助,大概就是这样,能解决的问题解决了,不能解决的问题回避了(大概吧),也不知道有没有埋下什么定时炸弹(当时 PHP session 无法正常工作,应该是权限问题,我研究几天后仍然无法解决,真的心累,一怒之下把 PHP 相关进程设为 root 用户运行,问题是解决了,但也许留下了安全隐患.好在 PHP 7.0.16 版本升级后我发现使用低权限用户运行 PHP 不会再引起 session 方面的问题了).
然后就迫不及待地上了 Shadowsocks-go (对 Go 语言的盲目崇拜!).人生中的第一个自建翻墙服务,还是有点小激动的.我用的是这里的自动安装脚本.喜闻乐见的 CHACHA20 加密.用 YouTube 的视频测速,移动小水管可以稳定在 11000Kbps 左右, 2K 视频播放流畅.此前得知了 Google 的黑科技 TCP-BBR, 于是将其启用;又参考 Optimizing Shadowsocks 进行了一些优化,并开启 TCP fastopen, 再次测速,可以达到 17000Kbps, 这个速度我已经很满意了.(感觉比国内有些视频网站的缓冲速度还要快)
Caddy 会默认使用 HTTP/2, 此外我也启用了 QUIC. 总的来说,相较于迁移之前,本网站的访问速度有了一次飞跃,虽然我也不知道主要因素是什么:从虚拟主机迁移到主流配置的 VPS, 从 PHP5 升到 PHP7, 开启 TCP-BBR, 使用 HTTP/2+QUIC, 等等.当然,其代价就是兼容性的牺牲——毕竟 HTTP/2 在浏览器中还未大量普及.
(Caddy 0.9.5 版本的 QUIC 实现存在 bug, 所以我暂时地关掉了)
最重要的一步是迁移整个 WordPress 网站.还算顺利.我用 BackWPup 进行备份,备份文件中包含了几乎所有有用的或没用的东西.先在 VPS 上全新安装一个 WordPress, 然后导入数据库的 .sql 备份文件,再把旧站的 /wp-content
目录上传上去,差不多就完成了.然后做了一些修缮工作,比如更换了站点验证码,干掉了 lazy load 和 Google 公共库加速(因为觉得已经没有必要了).迁移到 CloudXNS 的时候也遇到了点麻烦, GoDaddy DNS 导出的 zone 文件 CloudXNS 识别不了,简直气得不行,最后只能自己手写解析记录.
然后是搭建私人网盘.过去在旧主机上我也弄了个类似的玩意,很简陋,只是把 Apache 的目录浏览打开,然后就当成网盘用了.这次我本来想用 ownCloud, 无奈那玩意实在操蛋,后来尝试 Pydio 又不满意,最后干脆用 Caddy 的 filemanager 插件做网盘,外加 aria2+AriaNg 离线下载,还挺好用的.不得不说,离线下载 Dropbox 上的文件速度简直辣眼睛,几十 MB/s. 此外用这玩意下种子也很不错,很多资源国内下不动的都可以达到令人满意的速度.特别值得一提的是,此前一直听说 P2P 下载是去中心化的,宣扬"人人为我,我为人人"的共享精神的,心向往之,但受制于国内糟糕的环境(守序的下载器没速度,速度快的下载器只知道吸血,光下载不上传,整个 BT 网络乌烟瘴气),从来没有体验过"真正的 BT 下载".所以当我看到 aria2 高速上传——甚至下载完成后还在上传时,我一下子又惊又喜.或许是在局域网内呆久了,习惯了这里边的思维方式,看到我自己的服务器在无私地向整个 BT 网络贡献流量,真的感受到一种久违的,分享的快乐.虽然呈现在我眼前的只是数字和速度曲线,但感觉自己就是互联网中的一份子,在参与着这样一种伟大的信息流动中.那种感觉真的很棒.这也算是意外收获了.
然后是建立域名邮箱,方案是 Zoho Mail+Gmail. 过去使用的是 GoDaddy 主机提供的邮局服务,可以导出 .mbox 格式的信件备份文件,导入 Zoho 还算顺利.
然后装上了 kk 大神的贴吧签到助手(同样,也是由 Go 语言写成!)和挂卡神器 ASF. ASF 提示我 .NET 版本太低,没法用,看来 Mono 还是比不上巨硬亲儿子.不过倒无所谓,近期内也不需要用到 ASF (去年圣诞特惠期间狠狠地挂了一波卡,现在没什么卡可以掉了).
嗯,大概我就做了这么一些事.这个过程中我遇到的一些问题,以及最终研究得出的解决办法,都已经记录在本站之前的几篇文章中了.(当然,要是在过去,我估计会把那几篇文章的内容都揉进这篇里面)这次我抑制住了自己想要炖一锅大杂烩的冲动,把这些内容分拆成七八篇比较短小的文章,应该会方便访客阅读,也利于搜索引擎索引.这些文章是:
Caddy + PHP-FPM 服务器报 getsockopt: connection refused 错误的解决方法
现在每周末回家,有空了就 SSH 到服务器上 dnf update
,也是件有意思的事.
挺有趣的一件事是,可能因为我在 Caddy 社区发贴的缘故,本站迎来了一位国际友人,他还告诉我我的网站非常快!开心~
说到 ConoHa 的客服.上文我提到 ConoHa 的口碑不算好,除了因为限流(我没有遇到),乱封号(还没遇到)以外,就是因为客服了.不过我觉得 ConoHa 的客服还不错嘛,我用英文写的反馈,客服用中文回复我,大吃一惊
下一步计划是: 加入 HSTS Preload List; 启用 HPKP; 加入 HTTPS Everywhere Ruleset.
(还有,我该给本站加几个友链辣)
最后奉上已经捂出汗的 ConoHa 邀请链接: https://www.conoha.jp/referral/?token=58c6TxkGHMgzE32oIoMwXZhmIXGmrs3KyYoKQ2dcC4MdnoJBhH0-ROG
(不愧为霓虹国企业,控制面板的背景图居然是自家看板娘)
以上.
caddy确实是个好东西,rewrite会写的话基本满足个人需求了