Tag Archives: Wordpress

用gzip 1.7+配合rsync实现备份的快速传输

Backround

定期备份VPS的特定目录是一个常见的需求。一般来说,备份分为如下步骤:

  1. 会用tar来打包
  2. 用压缩工具(如gzip/bzip2/xz)压缩
  3. rsync来传输备份文件

比如说我定期备份博客目录的命令如下:

tar -cf - --exclude=/srv/www/wordpress/logs --exclude=/srv/www/wordpress/wp-content/cache /srv/www/wordpress/ | gzip - > ~/backup/wordpresss.bak.tar.gz

然后有另外的rsync脚本传输wordpresss.bak.tar.gz

Problem

只要wordpress里的任何一个文件/目录有任何改动,比如说时间戳变了,每次备份产生的tar.gz都完全不一样,这样rsync传输文件的时候每次都需要完整传输几乎所有的内容,即浪费时间也浪费流量。
比如说,我的博客备份的一次完整的传输在网络条件一般的情况下可能需要几十分钟!

Solution

gzip1.7开始正式提供 --rsyncable选项,使产生的压缩包对rsync更友好,方便rsync作delta传输。
虽然VPS上只有1.6版本,但是开源的好处就是大家可以自己编译:

  1. 到 https://ftp.gnu.org/gnu/gzip/ 下载1.7版本的gzip(最新的已经是1.8了)
  2. configure, make and install
  3. 添加--rsyncable选项到备份的命令里:
    tar -cf - --exclude=/srv/www/wordpress/logs --exclude=/srv/www/wordpress/wp-content/cache /srv/www/wordpress/ | gzip --rsyncable - > ~/backup/wordpresss.bak.tar.gz
    

Result

效果很明显,rsync的传输时间从几(十)分钟减少到几十秒钟,speedup大约在700左右。
节省了时间和流量 🙂

Share

Enable HTTP2 for WordPress on nginx Ubuntu 14.04

HTTP2 is enabled on mainline version of nginx (v1.9.x), while Ubuntu 14.04 is using nginx 1.4.6.
To enable HTTP2, the simplest way is to upgrade nginx to the mainline version.
But I met several issues during the upgrade, and here’re the steps, the issues and solutions.

Upgrade to mainline nginx

Let’s use nginx’s official pre-built packages.

  • Add below lines into /etc/apt/sources.list.d/nginx.list
    sudo sh -c 'echo deb http://nginx.org/packages/mainline/ubuntu/ trusty nginx >> /etc/apt/sources.list.d/nginx.list'
    sudo sh -c 'echo deb-src http://nginx.org/packages/mainline/ubuntu/ trusty nginx >> /etc/apt/sources.list.d/nginx.list'
    
  • Add nginx apt key
    wget -q -O- http://nginx.org/keys/nginx_signing.key | sudo apt-key add -
    
  • Update ans install nginx
    sudo apt-get update
    sudo apt-get install nginx
    

However, it fails with error that it tries to overwrite nginx-common’s file:

dpkg: error processing archive /var/cache/apt/archives/nginx_1.9.11-1~trusty_amd64.deb (--unpack):
 trying to overwrite '/usr/share/nginx/html/index.html'

The solution is to remove old nginx on Ubuntu and re-install mainline nginx.

sudo apt-get remove nginx-common
sudo apt-get install nginx

Now nginx is upgraded to 1.9.11

Config file changes

  1.   Previously the site config files are stored in /etc/nginx/site-available, and the enabled sites are soft-linked in /etc/nginx/site-enabled/.
    But mainline nginx only load config files in /etc/nginx/conf.d/*.conf.
    So either copy the old config files to conf.d, or add include /etc/nginx/sites-enabled/ in nginx.conf.
  2. Mainline nginx’s user is nginx, but Ubuntu uses www-data, so change it in nginx.conf.
    #user nginx;
    user www-data;
    
  3. Change spdy to http2 in site config.

Reload nginx, and now the site’s HTTP2 is working.
However, try to open any page of WordPress, it just shows a blank page without any error. The log shows HTTP 200 OK.

Blank page issue

After googling the issue, it’s found that a missing FastCGI param is the root cause.
Add below line in /etc/nginx/fastcgi_params:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Reload nginx again, and now everything works fine.

Share

自家网络的连接与设备

以前介绍过在一根网线上承载两路网络,用了近两年,感觉不错。现在家里的网络设备越来越多,所以分享一下我家的网络连接和设备情况。

先上图
家庭网络设备

稍微详细的介绍:

  • 电信的光猫,4个LAN口中其中一个是IPTV的VLAN,其余的3个可以当LAN来使用;
    用admin帐户登录,删除自带的PPPoE拨号,因为我要用自己的路由器拨号(注意记住原来的VLAN ID)
  • 路由器是Netgear的WNDR3700,UpLink接光猫的LAN口来PPPoE拨号;
    DHCP为PC、RaspberryPi、Laptop设置静态IP,设置DMZ主机为RaspberryPi;
    自带DDNS功能,不过Dyndns的免费服务没了,没用。。。
  • 树莓派用来24*7不间断工作(当然,时不时重启时例外^_^),上面装的主要服务有:
    WorkdPress (nginx + php + mysql)
    Samba Server
    DDNS(dyn.dns.he.net)
    接个老式硬盘当NAS(注意最好格式化成ext4,比NTFS快多了)
    Crontab里用几个脚本把Wordpress和一些重要文件备份到PC
    同时把PC上的Download文件夹rsync到老硬盘上
  • 台式机一般只有晚上才开,所以crontab是晚上备份,备份到Dropbox的文件夹,所以自动同步到Dropbox上;
    下载的电影、美剧都放在Download文件夹里,以便让RPi同步到老硬盘上,这样就算PC关机,一样能看;
    当然,更多的时候是开着PS3 Media Server当DMS,然后在PS3上看高清电影~
    不过台式机放在小房间,没铺网线,只能用电力线适配器来接,网速大概只能到90M左右,有待改善(如果有好建议,一定告诉我!)
  • PS3,不用说,高清的游戏机+播放器,画质、音效最佳;
    客厅的电视机还接着一个山寨的机顶盒,能看Samba上的内容。
  • 在卧室里放一个OTT的机顶盒(比如说小米盒子),既可以看在线的,也可以看PC和RPi上的内容。
    当然,还有AirPlay和Miracast的功能,偶尔会用,也挺不错的。

其它手机、Pad、笔记本,都是wifi连接,做该做的事情,就不多说了。

总之,因为路由器和树莓派是不关机的,而且树莓派的硬盘上的内容基本上和PC是同步的,所以我觉得这样最大的好处是:

  1. 免费的(喂,电费呢!)个人博客,以及Dropbox的备份
  2. 无论何时(不管PC是不是开着),都能在pad或者电视上看片~

Q.E.D.

Share

迁移博客到Raspberry Pi上

之前博客host在amazon的服务器上,每个月15~16刀的支出着实不小。

现在有了Raspberry Pi了,基本上24小时开机,可以当一个小server用,所以想着把博客迁移到Pi上,反正访问量不大,肯定能承受得住。

Apache有点大,想想还是用nginx来跑wordpress吧。google一下,找到这篇文章:http://www.cnx-software.com/2012/08/03/wordpress-for-raspberry-pi-using-nginx-and-mysql/
基本上把在Pi上安装http server和部署wordpress的要点写清楚了。

不过我要的不是一个新的wordpress,而是迁移原来的博客,所以也在这里记录一下。因为是事后记录,可能有遗漏或者错误,仅供参考。

1. 安装nginx, php,mysql等

sudo apt-get update
sudo apt-get install nginx php5-fpm php5-cli php5-curl php5-gd php5-mcrypt php5-mysql php5-cgi mysql-server

2. 参考上面的link,把nginx和php的配置文件配好,因为我还要用https(防GFW),所以相比那篇文章里的配置,多了ssl的配置

# Upstream to abstract backend connection(s) for php
upstream php {
server unix:/var/run/php5-fpm.sock;
}
server {
## Your only path reference.
root /srv/www/wordpress;
listen          80;
listen          443 default_server ssl;
## Your website name goes here. Change to domain.ltd in VPS
server_name     mine260309.me;

ssl_certificate     /home/pi/cacert/mine260309.me.StartCom.cert;
ssl_certificate_key /home/pi/cacert/mine260309.me.key.pem;
ssl_protocols       SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers         HIGH:!aNULL:!MD5;
access_log      /srv/www/wordpress/logs/access.log;
error_log       /srv/www/wordpress/logs/error.log;

## This should be in your http block and if it is, it's not needed here.
index index.php;

location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location / {
# This is cool because no php is touched for static content
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
#NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
include fastcgi_params;
fastcgi_intercept_errors on;
fastcgi_pass php;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}

记得创建对应的文件夹,否则nginx会访问失败:

sudo mkdir -p /srv/www/wordpress/
sudo mkdir -p /srv/www/wordpress/logs

3. 把备份的文件拷过来,恢复wordpress文件夹和数据库。

3.1 我的备份是这样的一个脚本,crontab每周跑一次,备份过的文件会自动被dropbox同步。(注意用户名和密码是自己设的mysql的用户名、密码)

#!/bin/sh
# Back my web with clear password!
mysqldump --add-drop-table -h localhost -u  --password= minewpdb | bzip2 -c > ~/Dropbox/MyWebs/blog.bak.sql.bz2
tar -czf ~/Dropbox/MyWebs/blog.bak.html.tar.gz /var/www/html

3.2 恢复的过程是:
a) 恢复mysql数据库

$ mysql -u root -p
mysql> CREATE DATABASE minewpdb;  #创建database,注意名字和之前用的一样
mysql> GRANT ALL ON minewpdb.* TO @localhost IDENTIFIED BY '';  # 创建一个myssql用户,方便起见,也和以前一样好了
$ mysql -u ec2-user -p minewpdb < /media/ent/blog.bak.sql # 恢复数据库

b) 恢复html文件夹,这个很简单,就是把blog.bak.html.tar.gz解压出来,放到/srv/www/wordpress目录就行了
然后就可以先在本地测试了,确认wordpress没有问题之后,就是域名了。

4. 域名DDNS

这一块还没玩过,只能做尝试了。

先测试了url forwarding,在dyndns.org有个免费域名mine260309.dyndns-at-home.com,这个是可以DDNS的,然后在GoDaddy里设置了forwarding,然而无论是设置成http://的还是https://的,ssl都有问题(我的博客用了WordPress HTTPS),上推去问,@wzyboy同学说可以用he.net的服务,去google了一下,果然是个好东西。参考http://www.bidon.ca/en/random/2011-06-16-using-dynamic-dns-feature-dnshenet

4.1 上dns.he.net,注册后,可以免费设置50个域名。
1) 添加mine260309.me;
2) Edit Zone -> New A -> Enable entry for dynamic dns
3) 点击”refresh”图标 -> Generate Key,记住这个key,以后给ddclient用
4.2 然后在pi上下载ddclient

apt-get install ddclient

#安装的过程中会有preconfig:

remote server: dyn.dns.he.net
username: mine260309.me
password:
domain: mine260309.me

service ddclient status

确认ddclient工作正常。

4.3 在GoDaddy的设置里把Forwarding关掉,然后手动设置Nameserver为ns1.he.net, ns2.he.net, …

最后测试,一切正常!

不过因为在墙内了,发完博客自动发推的功能木有了,当然这个可以用别的服务搞定就是了,以后再说~

Share