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和数据库

两种方法:

  1. 直接把整个html的文件夹压缩donwload下来,这是Wordpess的备份;然后把Mysql的数据库通过Phpmyadmin导出备份;
  2. 通过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服务器教程

简而言之就是:

  1. 安装“Active Backup For Business”;
  2. 打开APP,在“文件服务器”中“添加服务器”,选择“rsync服务器”,选择ssh shell 模式(linux可不用启动rsync);
  3. 选择文件和计划就可以了;

迁移Domain

这个VPS可以提供独立IP,我需要把原来的域名从Hostgator指向这个地址,进入我的域名 -> 管理DNS -> 在域名服务器中移除原来的配置并使用默认配置 -> 在记录里,设置A记录,指向IP就可以了。完成这样的设置后,你在用nslookup查看域名时,对应的地址就会是这个了

Server的基本配置

  1. 为了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
  1. 安装必要的软件和配置,可以参考这篇文章: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,下面是总结,另外你也可以参考我在 stackoverflowdocker forums

  1. 安装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
  1. 注意关于docker里的“-p”参数

如果不配置端口映射,那么意思是不向外暴露端口,那么只能container自己用,即使你的宿主主机也不能用,这点一定要注意。另外如“-p 8080:80”,前面的8080是container的,也就是宿主主机要想访问container的80端口,要用8080来替代

  1. 安装Wordpress,Mysql和Phpmyadmin

这些都可以在Compose的配置文件里列出,详细可以参考官方文档 Quickstart: Compose and WordPressDocker 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:
  1. 注意Wordpress的配置

官方install guide中是没有“WORDPRESS_DB_NAME”的,为什么我要加一个这个参数,那是应为wordpress默认会找叫“wordpress”的数据库,如果你的数据库名字不是“wordpress”,那么一定要在这里指定

  1. 在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
  1. 关于Container的操作

由于我对container的文件做了映射,所以通过“docker-compose down” 是不能删除这些映射文件的,可以通过“docker-compose down –volumes”来移除这些信息。如果你用down来关闭container,那么除了映射文件不会丢失外,你对container进行的所有变更都会重置,所有你可以用stop

  1. 对Container进行troubleshooting

这个很简单,启动如上所说,用“docker-compose up -d”,去掉“-d”,你就会看到所有container的启动过程及服务状态

恢复Wordpress

通过docker部署,环境已经就绪,那么接下来就是要恢复wordpress和mysql了。这个过程很简单,根据“./wordpress_data:/var/www/html”,直接删掉wordpress_data中的所有文件,然后把原有的wordpress系统文件解压到这个目录下,就可以了。对于mysql,可以用phpmyadmin来管理并导入恢复数据库,这个操作就不在这里阐述了。但有一点需要在这里强调下,当你恢复完后,游览没有任何问题,但更新插件和升级主题时遇到了下面的问题:

  1. 升级插件需要zip和ftp,zip前面我们装过了,那么把ftp装上并设置下就可以了,下面是主要vsftp的配置信息
anonymous_enable=NO # 匿名和ftp账号都不能用,本地账号默认允许
local_root=/opt/my_wordpress/wordpress_data/ #根目录
  1. 按照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');
  1. 文件夹的权限和用户组的问题,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参考文档:

本文出自 Frank's Blog

版权声明:


本文链接:Blog顺利完成搬家之Bandwagonhost VPS
版权声明:本文为原创文章,仅代表个人观点,版权归 Frank Zhao 所有,转载时请注明本文出处及文章链接
你可以留言,或者trackback 从你的网站

评论关闭

blonde teen swallows load.xxx videos