博客迁移部署那些事

发表于2023年05月09日 11:48:15 • 阅读214

目录索引

阅读本文大约需要5分钟。


博客迁移部署那些事

5月7日将博客迁移到自己魔改后的sonic,但是整个迁移过程实际持续了到5月8日。

虽然中途有穿插其他事情,但仍觉得这个有点儿漫长的迁移过程值得整理记录。

服务器环境

  • 1h1g centos
  • 宝塔面板
  • nginx
  • mysql

二进制文件部署

sonic是用go编写,go的部署比较方便,打包二进制文件部署即可。

然而,事情并不是想象中那么顺利,本地开发环境用的docker,服务器配置不太能支撑docker部署。

打包时用的alpine镜像,所以部署到centos运行立马遇到第一个问题。

报错
-bash: ./app-alpine: /lib/ld-musl-x86_64.so.1: bad ELF interpreter: No such file or directory

原因
服务器运行环境(CentOS)提供的是glibc, 而 Alpine Linux 却是musl libc. 因而使用 golang的alpine 这个镜像编译出来的程序如果依赖于 musl libc, 则会在程序加载的时候找不到所需的动态库。

解决方案

1.替换开发环境golang镜像重新打包,不要选择alpine镜像即可。
2.安装musl libc

curl https://forensics.cert.org/cert-forensics-tools-release-el7.rpm -o cert-forensics-tools-release-el7.rpm 
rpm -Uvh cert-forensics-tools-release*rpm
yum --enablerepo=forensics install -y musl-libc-static

最终还是选择了方案二。

数据库迁移

开发docker环境用的mysql5.7,服务器用的mysql5.6。

线上导入sql报错,刚开始是使用宝塔的导入,报错的表自动忽略,而且不会主动显示报错信息。

打开网站后发现内容缺失,遂排查数据库。

报错

Specified key was too long; max key length is 767 bytes

报错是因为表的字段索引长度限制。

解决方案

1.升级线上mysql到5.7,但是宝塔提示内存不够。
2.设置MySQL的全局参数innodb_large_prefix=ON,将InnoDB表的索引长度上限扩大到3072个字节。指定innodb文件格式为Barracuda。

set global innodb_large_prefix = ON;
set global innodb_file_format=Barracuda;
set global innodb_file_format_max=Barracuda;

后台运行

直接在终端运行博客程序,关闭终端会导致程序直接中止。

所以使用nohup命令来在系统后台不挂断,这样即使关闭终端也不会影响程序运行。

nohup ./app ./conf.yaml $

终止在后台运行的程序。

# 查找pid
ps aux | grep "app"
kill -9 PID

伪静态

因为sonic的部署完成后,虽然后台可以设置访问路径的后缀,例如https://xxx.com/links可以设置为https://xxx.com/links.html

但是设置完成之后,你直接https://xxx.com/links.html是会404的,由于没有找到sonic的相关文档和教程,加上自己水平有限。

所以没办法,只好自己写了伪静态规则。

###伪静态化rewrite法则
# 首页
rewrite ^/index.html$ / last;
rewrite ^/sitemap.html$ /sitemap.html last;
# 处理下面被重写的自定义错误页面
rewrite ^/404.html$ /404.html last;
rewrite ^/50x.html$ /50x.html last;
# 匹配最后的/*.html后缀路径 相当于替换
rewrite ^/(.*).html$ /$1 last;

自定义宝塔nginx错误页面

因为觉得nginx自带的404、500等错误页面比较单调,所以决定替换为自定义的错误页面。

然而,感觉宝塔下的nginx自定义错误页面和一般的nginx还是略有差异。

正常来说,nginx自定义错误页面可以如下设置。

http {
    # 开启自定义错误页面设置 省略上下其他的配置项
    proxy_intercept_errors on;
    server {
        listen       80;
        server_name xxx.com;
        
        location / {
            proxy_pass http://127.0.0.1:5555;
        }
 
        #设置自定义错误页面
        error_page 404 =200 /404.html;
        error_page 500 502 503 504  =200 /50x.html;
 
        location = /404.html {
           root /dir/html;
        }
 
        location = /50x.html {
            root   /dir/html;
        }
 
        #当页面发生异常的时候可以指定跳转到location中,也可以指定跳转到指定的URL地址上面
        #error_page 404 http://xxxx.com/;
    }
}

在宝塔中其实也类似,只是 location = /404.html这两个指定错误页目录的块需要放置到伪静态规则之后,当然也可以放伪静态里面。

因为用了nginx反代+伪静态规则,而且伪静态规则有点冲突,所以我选择放在伪静态之后,并且在伪静态规则上也做了特殊处理。

静态资源压缩

为了提升访问速度,对主题的静态资源进行一些特殊处理。

图片压缩、js、字体走cdn。

原本是准备自己精简压缩字体,但是最终还是选择cdn会比较稳定香。

大致思路如下:

使用python取子集再压缩成woff2格式 效果很棒

pip install fonttools
# 取子集 简单来说就是精简保留自己想要的字 需要一个txt文件 已经有很多前人整理好了中文常用的几千字
fonttools subset "$input_file" --text-file="$text_file" --output-file="$output_file"
# 压缩成 WOFF2 格式
fonttools ttLib.woff2 compress "$input_file" -o "$output_file"

定时备份shell脚本

虽然不是啥特别重要的程序,但是最终还是决定给博客上一个定时备份数据库+网站文件脚本。

方便出现意外情况可以恢复,避免数据丢失。

故先写了一个shell脚本,使用mysqldump备份数据库,但遇警告虽不影响使用。

警告
1.[Warning] Using a password on the command line interface can be insecure
2.Warning: Using unique option prefix database instead of databases is deprecated and will be removed in a future release. Please use the full name instead.

解决方案
1.该警告是因为图方便将账号密码写到shell中直接执行导致,只需要到mysql配置文件中更改即可。

[mysqldump]
user=user
password=password

2.该警告是因为使用mysqldump命令时的参数--database少了个s导致,直接添加上s即可。

解决完警告之后,就使用crontab -e添加定时任务,每天凌晨执行。

45 3 * * * root /dir/test.sh

然而测试时发现不会执行,使用tail -10 /var/log/cron没有发现异常。

去掉root后即可正常执行。

总结

每次被环境折磨的时候,愈发觉得docker香。至少开发、测试、线上环境保持一致,也许就能省很多事。


所属分类: 运维

文章标签: #linux

文章标题:博客迁移部署那些事

文章作者:大古

文章链接:https://blog.8wkj.com/archives/things-to-when-migrating-and-deploying-a-blog.html

版权声明:本站原创内容均采用《署名 - 非商业性使用 - 相同方式共享 4.0 国际》进行许可,转载请注明出处。

温馨提示:请注意文章发表时间,某些文章所述内容可能具有时效性,文章描述可能已经失效。

添加新评论
暂未有人评论
快来抢沙发