服务器运维管理

Bolg已经几乎是年更了,但是想起来还是会写一下。

但后端服务器一直很繁忙,数十个服务还在跑,虽然前端是见不到的,主页只是顺带着跑的。

后端服务器一直用阿里云+CDN的方式,动态页面放在阿里云上面,静态内容通过阿里云的Tengine(nginx)跳转到CDN上。
上传带宽的负载就被均衡到另外的大带宽服务器上面了。

1
2
3
4
5
6
7
8
9
#download station
if ($request_uri ~ \.([0-9a-zA-Z]+)$){
rewrite ^/(.*) https://*******/$1 permanent;
access_log off;
}
location ~ /images/ {
rewrite ^/(.*) https://cdn*******/$1 permanent;
access_log off;
}

原始静态内容还是在阿里云上,通过lsyncd同步到后端CDN服务器上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cat /etc/lsyncd.conf 
settings {
statusFile = "/tmp/lsyncd.stat",
logfile = "/var/log/lsyncd/lsyncd.log",
statusInterval = 1
}
sync{
default.rsync,
source="/*******/www/",
target="***@*.*.*.*:/**********/",
exclude={"*.php","*.html","*.htm","*.xxx"},
rsync = {
rsh="/usr/bin/ssh -o StrictHostKeyChecking=no",
binary = "/usr/bin/rsync",
archive = true,
compress = true,
verbose = true
}
}

lsyncd直接通过scp协议进行传输,只需要将两个主机的密钥互相信任即可:

1
2
ssh-keygen
ssh-copy-id -i .ssh/id_rsa.pub user@yourip_address

服务运行

全面使用docker,考虑到需求不使用k8s,服务都在docker-compose的控制中,
docker内不存储数据,只负责运行,数据通过映射挂载进docker容器。
方便迁移,虽然服务器已经三年没有进行过迁移了,但经过一次意外宕机时整机通过备份,新系统启动只用了十分钟。
系统使用CentOS 7,定期yum update,主要升级kernel。

应用升级,只需要修改Dockerfile的版本号即可,通过docker-compose up -d 进行单个容器的升级,Recreate过程平滑,达到不停机更新。

服务器的备份机制

服务器备份脚本由shell编写,其主要内容如下:
1、小时级别对mongo、elasticsearch、mysql进行备份,增量导出。
2、天级别对docker容器、etc配置文件进行打包备份,打包使用tar、通过openssl加密。
3、数据备份在本地服务器一份,scp远程服务器一份,oss一份。

另外备份服务不需要全量备份docker images,只需要将Dockerfile、docker-compose.yml等配置,以及数据备份。
所以整个备份非常小,在阿里云oss服务上面以最新的14天进行存放。

  • 备份每月全量保留一份,多份全量备份通过7z压缩可达到单份备份大小的150%以内。
    7z的压缩率极高、并且能去除重复文件,使用如下参数进行打包。
    1
    7za a -r -t7z -m0=lzma2 -mx=9  -mqs=on -bt -bb3 bak.7z file
    使用该参数,80w碎片文件的100G+数据,使用E5-2代12核,在两小时内可把数据被压缩到9gb以内。

以上备份均通过shell脚本实现,数年时间故障率极低,不需要人为干预。

安全管理

  • 1、服务器只对外暴露80/443的web端口,各服务也通过80/443进行访问,对应不同域名。
    方便进行nginx日志审计,敏感行为通过邮件报警。
  • 2、对于web安全使用主动式应用防火墙OpenRASP,对于敏感应用行为可拦截或记录报警。
  • 3、备份数据使用openssl进行aes加密,加密保存。
  • 4、服务器负载过高、内存异常、硬盘异常、以及web down均使用zabbix+grafana进行监控报警,报警同时脚本尝试恢复。