目录索引
阅读本文大约需要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