又一次迁移服务

由于阿里云续费价格太坑,老用户不如狗,于是就又买了一个,这回直接买了 3 年。

虽然可以备份镜像后直接恢复服务,但还是想更新一下系统,之前系统是 Ubuntu 16.04,也该换 18.04 了。

为了便于以后再迁移(虽然短时间内不可能了),就把所有服务都搞进了 docker,比如你现在看到的这个博客,就运行于 docker 中,并且可以打包带走、一键部署。


整体架构是这样:

在宿主机单独跑一个 nginx 反代,监听 80 和 443,把 80 都重定向到 443 上去,在宿主机部署 https 证书;

要运行的实际服务都在 docker 里,暂时我有 4 个服务要跑,每个服务都通过 docker-compose 管理,包含若干个容器,最终只对外暴露一个 http 端口;

由于每个服务有各自不同的二级域名,宿主机的 nginx 就根据域名把请求反代给对应的容器。


设想很美好,实现起来各种问题。

一是 wordpress 跳转错误,无法识别到实际请求来自 https,仍然跳转到默认的 http。按以往的经验,为反代 nginx 增加了 X-Forwarded-Proto 头,但这并没有什么卵用。最终搜索到,还需要给容器内的 nginx 设置 fastcgi 参数,增加 fastcgi_param HTTPS on;

第二个问题,容器内 nginx 的 gzip 设置不生效,这虽然可以直接为宿主机的 nginx 设置 gzip,但考虑到所有权的问题,每个服务应该自己控制自己的运行,最好不要外部干涉,所以还是尝试在容器内解决。最终 google 到(百度不到任何有价值的内容)问题原因,nginx 反代时默认是以 http 1.0 协议请求的,但 nginx 的 gzip 又默认为 http 1.0 禁用压缩,解决方法有两种,一是设置宿主机 nginx 以 http 1.1 协议请求,二是设置容器内的 nginx 为 http 1.0 开启压缩,最终我选择了前者。

第三个问题,其实这也不算问题,我有一个 go 语言写的服务,想基于 docker scratch 镜像来运行,然后提示找不到指定的时区,问题在于 scratch 镜像太简单了,它不包含任何额外的文件,而时区数据是要从系统中读取的。所以这也好办,换个完整点的基础镜像,或者手动复制进去一份时区数据,也就是 /usr/share/zoneinfo 目录。

最后一个问题,到现在没有解决,但也并不是不能解决,麻烦一点而已,以后再说。之前 wordpress 直接跑在宿主机的时候,我用了 fail2ban 来自动 ban 掉恶意登录行为,现在 wordpress 跑在了 docker 里,fail2ban 想读取到登录日志就有点困难。初步想法是写一个简易的 wordpress 插件,为宿主机的 fail2ban 输出必要的日志。


服务运行一天后,又发现了新的问题,docker 这个打包运行环境,环境中也包含时区信息,默认所有镜像的时区都是 UTC,这不受宿主机影响,然后 mysql 读取就出问题了,差了 8 个小时。所以说啊,不能依赖默认值,关键配置最好都自己手动搞一下,不然就像这样,不同环境中的默认值是不同的。 ​​​​

You may also like...

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

扫码去手机上看