Blog顺利完成搬家之Bandwagonhost VPS
搬家之前的一些感受
在Hostgator上顺利用了6年了,我是3年一续费,每次续费都贵一大截,这是欺负老客户么?!太蛋疼了,而且动态ip,什么功能都没有,真是心灰意冷:
痛定思痛,弃用Hostgator!经同事推荐,Bandwagonhost 速度不错,便宜,稳定,而且还是VPS,自由度很大,最好的是每年续费不涨钱:-) 所以我买了他们比较便宜的那款,年费在29美金/year(CN2),比 Hostgator便宜,速度还快!
Basic VPS - Self-managed - SPECIAL 10G KVM PROMO V3 - LOS ANGELES - CN2
SSD: 10 GB RAID-10
RAM: 512 MB
CPU: 1x Intel Xeon
Transfer: 500 GB/mo
Link speed: 1 Gigabit
Location: Los Angeles
Direct route via CN2 and China Unicom
VPS technology: KVM/KiwiVM
OS: 32 or 64 bit Centos, Debian, Ubuntu
Instant OS reload
IPv4: 1 dedicated address
IPv6 support: **No**
Full root access
Instant RDNS update from control panel
No contract, anytime cancellation
Strictly self-managed, no support
99.9% uptime guarantee
这是我第一次用VPS,整体感觉很酷,跟我自己搭建Server没什么区别,想装什么装什么!为了方便日后查阅,在这片文章里总结下整个搬家过程以及注意事项
备份WP和数据库
两种方法:
- 直接把整个html的文件夹压缩donwload下来,这是Wordpess的备份;然后把Mysql的数据库通过Phpmyadmin导出备份;
- 通过Wordpress的插件来备份,BackUpWordPress,这个备份会包含Wordpress和Mysql,它只能备份,不会恢复,需要手动恢复;
2017-11-22 更新:迁移成功后的docker环境的备份
迁移成成功后,环境是由两个docker构成,一个是mysql,另一个是wp。在这种环境下,原有的“BackUpWordPress”无法检查到mysql,所以就没法完成备份,这点很不爽。。。也许有特殊配置吧,anyway了,还是自己写一个脚本来备份吧,也不是很难,如下shell脚本:
[root@xxxxx-vps opt]# more wpbackup.sh
#!/bin/bash
#variable
Now=$(date +"%Y-%m-%d-%H%M")
File="zhaocs.info.$Now.zip"
Backup_DIR="/opt/wp-backup"
WWW_DIR="/opt/my_wordpress/wordpress_data/*"
#backup mysql database in docker
docker exec [container] sh -c 'exec mysqldump --all-databases -u [user] -p"[pass]"' > $Backup_DIR/zhaocs.info.database.$Now.sql
#backup wordpress in docker
zip -rq $Backup_DIR/$File $WWW_DIR
#remove older file and only remain 5 backup
ReservedNum=5
cd $Backup_DIR
FileNum=$(ls -l |grep database | grep ^- | wc -l)
while(($FileNum>$ReservedNum))
do
OldFile_mysql=$(ls -rt *.sql | head -1)
OldFile_wordpress=$(ls -rt *.zip | head -1)
rm -f $Backup_DIR/$OldFile_mysql
rm -f $Backup_DIR/$OldFile_wordpress
let "FileNum--"
done
设置crontab自动执行脚本:
[root@xxxxx-vps opt]# crontab -l
0 0 * * * /opt/wpbackup.sh
Crontab 范例:
*/5 * * * * 每五分钟执行
0 * * * * 整点执行,如果你59分写的cron,那么1分钟后立即执行;如果你想让程序在写cron后1小时执行,那么用*/60
0 0 * * * 整天执行,同上
0 0 * * 0 整周执行,同上
0 0 1 * * 整月执行,同上
0 0 1 1 * 整年执行,同上
2020-07-20 更新:用群辉备份
用群辉“Active backup for business”直接对Linux中的“wp-backup” 进行文件备份,详细看群晖Active Backup for Business套件备份Linux服务器教程:
简而言之就是:
- 安装“Active Backup For Business”;
- 打开APP,在“文件服务器”中“添加服务器”,选择“rsync服务器”,选择ssh shell 模式(linux可不用启动rsync);
- 选择文件和计划就可以了;
迁移Domain
这个VPS可以提供独立IP,我需要把原来的域名从Hostgator指向这个地址,进入我的域名 -> 管理DNS -> 在域名服务器中移除原来的配置并使用默认配置 -> 在记录里,设置A记录,指向IP就可以了。完成这样的设置后,你在用nslookup查看域名时,对应的地址就会是这个了
Server的基本配置
- 为了SSH管理方便,可以把私钥导出来,然后在MacOS上安装,这样以后登录可以免认证,可以参考这篇文章:为VPS设置SSH Key并修改SSH端口
[root@host ~]# ssh-keygen -t rsa
......
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
[root@host:~root@host ~]# mv /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
[root@host:~root@host ~]# chmod 600 /root/.ssh/authorized_keys
-----copy id_rsa to macos and install-----
xxxx-M-Q4TL:xxxx$ ssh-add id_rsa
- 安装必要的软件和配置,可以参考这篇文章:Add Existing SSH Key To OSX
[root@host ~]# hostnamectl set-hostname xxxxxxx
[root@host ~]# yum install net-tools #-> include ifconfig cmd
[root@host ~]# yum install bind-utils #-> include nslookup cmd
[root@host ~]# yum install vsftpd
[root@host ~]# yum install zip
[root@host ~]# yum install unzip
[root@host ~]# yum install nano
[root@host ~]# systemctl start vsftpd.service
[root@host ~]# systemctl enable vsftpd.service
通过Docker部署Wordpress
由于这个VPS是全新的,什么也没有,所以我需要自己安装Wordpress和Mysql。那么采用什么方法比较方便?按常规来说可以通过安装LAMP,但要安装一堆东西,既然VPS比较自由,又加上我之前用Docker安装过OpenBMP,所以索性就选择了Docker,下面是总结,另外你也可以参考我在 stackoverflow和docker forums
- 安装docker和docker-compose
不推荐独立用docker run xxx来部署了,由于我们需要多个docker,如wordpress,mysql和phpmyadmin,因此用docker-compose,这个工具可以方便的对多个docker进行管理,可以参考这边官方文档 Install Docker Compose
[root@xxxxxxx ~]# yum install docker-engine
[root@xxxxxxx ~]# curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
[root@xxxxxxx ~]# chmod +x /usr/local/bin/docker-compose
[root@xxxxxxx ~]# systemctl start docker && systemctl enable docker <<< auto enable after reboot
[root@xxxxxxx ~]# cd /opt
[root@xxxxx opt]# mkdir my_wordpress
[root@xxxxx opt]# ls
docker-compose.yml my_wordpress
[root@xxxxx opt]# mv docker-compose.yml my_wordpress/
[root@xxxxx opt]# cd my_wordpress/
[root@xxxxx my_wordpress]# ls
docker-compose.yml
[root@xxxxx my_wordpress]# docker-compose up -d
- 注意关于docker里的“-p”参数
如果不配置端口映射,那么意思是不向外暴露端口,那么只能container自己用,即使你的宿主主机也不能用,这点一定要注意。另外如“-p 8080:80”,前面的8080是container的,也就是宿主主机要想访问container的80端口,要用8080来替代
- 安装Wordpress,Mysql和Phpmyadmin
这些都可以在Compose的配置文件里列出,详细可以参考官方文档 Quickstart: Compose and WordPress 和 Docker Hub Phpmyadmin,你可以看到我把mysql的数据库文件和wordpress的根目录都mapping到了宿主主机上,这样方便我后期维护
[root@xxxxxxx my_wordpress]# more docker-compose.yml
version: '3'
services:
db:
image: mysql:5.7
volumes:
- ./mysql_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: xxxx
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- ./wordpress_data:/var/www/html
ports:
- "80:80"
dns:
- 1.0.0.1
- 8.8.8.8
restart: always
environment:
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
# phpmyadmin:
# depends_on:
# - db
# image: phpmyadmin/phpmyadmin
# ports:
# - "8080:80"
# restart: always
# environment:
# PMA_HOST: db
# PMA_USER: wordpress
# PMA_PASSWORD: wordpress
volumes:
db_data:
- 注意Wordpress的配置
官方install guide中是没有“WORDPRESS_DB_NAME”的,为什么我要加一个这个参数,那是应为wordpress默认会找叫“wordpress”的数据库,如果你的数据库名字不是“wordpress”,那么一定要在这里指定
- 在wordpress的container中装软件
不同container安装方法不同(因为不同的container可能用不同的linux),官方出的wordpress docker可以通过下面方法安装软件,zip(安装插件用)和mail(恢复密码用)功能
[root@xxxxxxx my_wordpress]# docker exec -it xxxxxxx bash
[root@xxxxxxx:/var/www/html# apt-get update
[root@xxxxxxx:/var/www/html# apt-get install zip
[root@xxxxxxx:/var/www/html# apt-get install mailutils
- 关于Container的操作
由于我对container的文件做了映射,所以通过“docker-compose down” 是不能删除这些映射文件的,可以通过“docker-compose down –volumes”来移除这些信息。如果你用down来关闭container,那么除了映射文件不会丢失外,你对container进行的所有变更都会重置,所有你可以用stop
- 对Container进行troubleshooting
这个很简单,启动如上所说,用“docker-compose up -d”,去掉“-d”,你就会看到所有container的启动过程及服务状态
恢复Wordpress
通过docker部署,环境已经就绪,那么接下来就是要恢复wordpress和mysql了。这个过程很简单,根据“./wordpress_data:/var/www/html”,直接删掉wordpress_data中的所有文件,然后把原有的wordpress系统文件解压到这个目录下,就可以了。对于mysql,可以用phpmyadmin来管理并导入恢复数据库,这个操作就不在这里阐述了。但有一点需要在这里强调下,当你恢复完后,游览没有任何问题,但更新插件和升级主题时遇到了下面的问题:
- 升级插件需要zip和ftp,zip前面我们装过了,那么把ftp装上并设置下就可以了,下面是主要vsftp的配置信息
anonymous_enable=NO # 匿名和ftp账号都不能用,本地账号默认允许
local_root=/opt/my_wordpress/wordpress_data/ #根目录
- 按照ftp后,需要告诉wp,他要找的目录在哪里,可以把下面这段配置放到“wp-config.php”的末尾,具体也可以参考这篇文章:
define('FTP_BASE', '.');
define('FTP_CONTENT_DIR', './wp-content');
define('FTP_PLUGIN_DIR', './wp-content/plugins/');
define('FTP_THEMES_DIR', './wp-content/themes/');
define('FS_METHOD', 'direct');
- 文件夹的权限和用户组的问题,Wordpress的权限不是随便设置的,文件和文件夹的权限是不同的,具体可以参考 WordPress 安装,文件夹权限设置,用docker安装后,我们可以看到docker里的用户和组是33:
root@xxxxxx:/var/www/html# ls -l
total 157864
drwxr-xr-x 2 www-data www-data 4096 Oct 10 2011 cgi-bin
-rw-r--r-- 1 www-data www-data 27640326 Oct 17 10:19 database-zhaocs-info-1508235393.sql
-rw-r--r-- 1 www-data www-data 1449522 Dec 8 2016 error_log
......
root@xxxxxx:/var/www/html# cat /etc/passwd |grep www-data
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
所以在mapping后的文件和文件夹中,最好也是这个,通过下面命令来改变所有者
chown -R 33:33 wordpress_data
所有者改后,我们需要纠正文件和文件夹的权限
chmod 755 wordpress_data
find wordpress_data -type d -exec chmod 755 {} \;
find wordpress_data -iname “*.php” -exec chmod 644 {} \;
2018-10-20 更新:恢复数据库
原始文件没有包含如何恢复数据库,由于地址变更,所以重新安装了wordpress,又经历了一遍操作。。。主要步骤如下(注意“<” 是特定字符,不是注释):
另外注意的就是,恢复完数据库后,当exec到wordpress的shell里时,可能会遇到“sh: 0: getcwd() failed: No such file or directory” ,此时重启下docker就可以恢复了;另外也可能会遇到主页可以打开,但文章都打不开,报“The requested URL /xxxx.html was not found on this server.”,很多文章说Apache问题,或是“.htaccess”问题,我查了下wordpress的固定链接设置,啥都没做,就自动恢复了!
[root@host my_wordpress]# docker cp xxx.sql my_wordpress_db_1:/root/
[root@host my_wordpress]# docker exec -it my_wordpress_db_1 sh
# cd /root
# ls
xxx.sql
#
# mysql --one-database -u root -p database-name < xxx.sql
Enter password:
在VPS上搭建VPN
2019-6-28 更新:
SSR被封了,基本不能用了,所以就没总结;最近装了一个OpenVPN,搞到最后,发现又被封了,厉害了我的国。。。不过好歹折腾过,总结道这里了:Deploy OpenVPN on OpenWRT
改变VPS默认的SWAP分区
我买的VPS默认是512M的内存,大小还可以,但是开了SSR后,就发现SWAP经常满,然后我的blog就废了,只能重启才能恢复。默认SWAP是128m,非常小,经过google,发现这个是可以调整的,非常赞,所以经过下面操作,我把SWAP调整到了1G的大小,默认是两倍的memory:
调整前的memory信息:
调整后的memory信息:
调整步骤:
[root@xxxxxx ~]# free -m
total used free shared buff/cache available
Mem: 503 309 11 30 182 122
Swap: 131 131 0
[root@xxxxxx ~]# dd if=/dev/zero of=/home/swap bs=1024 count=1024000
1024000+0 records in
1024000+0 records out
1048576000 bytes (1.0 GB) copied, 4.72083 s, 222 MB/s
[root@xxxxxx ~]# du -ah /home/ |grep swap
1001M /home/swap
[root@xxxxxx ~]# mkswap -f /home/swap
Setting up swapspace version 1, size = 1023996 KiB
no label, UUID=0a2a6b18-e441-442c-9cab-a765537bb1a5
[root@xxxxxx ~]#
[root@xxxxxx ~]# swapon -f /home/swap
swapon: /home/swap: insecure permissions 0644, 0600 suggested.
[root@xxxxxxx ~]# free -m
total used free shared buff/cache available
Mem: 503 309 9 30 184 123
Swap: 1131 132 999
[root@xxxxxx ~]# echo "/home/swap swap swap defaults 0 0" >> /etc/fstab
[root@xxxxxx ~]# more /etc/fstab |grep swap
/swap none swap sw 0 0
/home/swap swap swap defaults 0 0
扩容步骤:
[root@xxxxxx ~]# swapoff -a
swapoff: /swap: swapoff failed: Cannot allocate memory
[root@xxxxxx ~]# free -m
total used free shared buff/cache available
Mem: 503 354 7 43 141 65
Swap: 131 131 0
[root@xxxxxx ~]# dd if=/dev/zero of=/home/swap bs=1024 count=2048000
2048000+0 records in
2048000+0 records out
2097152000 bytes (2.1 GB) copied, 23.3747 s, 89.7 MB/s
[root@xxxxxx ~]#
[root@xxxxxx ~]# du -ah /home/ |grep swap
2.0G /home/swap
[root@xxxxxx ~]# mkswap -f /home/swap
Setting up swapspace version 1, size = 2047996 KiB
no label, UUID=5aa1294a-6784-4dbd-807b-428b51094ab0
[root@xxxxxx ~]# swapon -f /home/swap
swapon: /home/swap: insecure permissions 0644, 0600 suggested.
[root@xxxxxx ~]# free -m
total used free shared buff/cache available
Mem: 503 341 5 43 156 78
Swap: 2131 133 1998
VPS 安全策略
本想使用Iptables,但发现维护太复杂,所以打算使用firewalld来设置安全策略,如下实例,允许http,https和ssh服务通信,其他均drop。但经过多次测试发现,这个配置只能限制宿主机流量,无法限制docker的流量,限制docker可以参考修订记录(最后还是使用的iptables ?):https://www.zhaocs.info/blog-revision-record#ftoc-heading-28,下面firewall命令可以作为参考:
[root@xxxxx ~]# systemctl disable iptables
[root@xxxxx ~]# systemctl stop iptables
[root@xxxxx ~]# iptables -F
[root@xxxxx ~]# systemctl start firewalld
[root@xxxxx ~]# systemctl enable firewalld
[root@xxxxx ~]# firewall-cmd --zone=external --change-interface=eth0 --permanent #把端口放入external zone
[root@xxxxx ~]# firewall-cmd --zone=external --add-service=http --add-service=https --permanent
[root@xxxxx ~]# firewall-cmd --zone=public --remove-service=http --remove-service=https --permanent #删除默认zone里http和https
[root@xxxxx ~]# firewall-cmd --zone=public --remove-port=80/tcp --remove-port=443/tcp --permanent #删除默认zone里对应的端口
[root@xxxxx ~]# firewall-cmd --reload
[root@xxxxx ~]# reboot # 从iptable切换到firewalld时可能会有些问题,建议配置完后重启再验证是否生效
[root@xxxxx ~]# firewall-cmd --zone=external --list-all
external
target: default
icmp-block-inversion: no
interfaces:
sources:
services: http https ssh
ports: 443/tcp xxxx/tcp
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@xxxxx ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth1
sources:
services: dhcpv6-client ssh
ports: xxxx/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Firewalld参考文档: