'WordPress' 标签

Varnish 不应该是你的选择

发现使用 Varnish 会有个很糟糕的问题,就是新版中的Varnish总是会带来VCL的变化或者一些其它规则的变化,开发者似乎并没考虑旧版的存在。如果你升级到新版本,你必须重写VCL规则~而这不是个容易的过程。没有人愿意折腾!

特别是Varnish的社区或官方支持是很糟糕的,关于Varnish的实际应用相关资料也没有多少,Google上也搜不到多少有用的相关文章,官方论坛更是做看的。

Varnish 是走商业和开源2条路线,所以开源的免费版没有多少支持可能是理所当然。但是,我在它们提供商业服务的网站Varnish-software.com上看到一篇它们直接转载别的网站的关于适用于WordPress 的Varnish 4.x VCL的文章,里面有些Varnish 4.x VCL是错误的,它们也没有改正,直到现在。~这简直太扯了。就算是varnish-cache.org上的一些样例也是错误百出。

选择Varnish,需注意,小玩玩即可。

适合于Varnish 4的WordPress应用场景

花了点时间把原本基于Varnish 3的WordPress应用场景翻新到Varnish 4版本上来。因为VCL的语法规则有不少变化,有些VCl已经停用,并更改到新的VCL。具体的变化请看这个官方文档:Upgrading to Varnish 4

下面这个样例是我根据Varnish网站上提供的基于Varnish 3的一个WordPress真实应用场景VCL更新到适用于Varnish 4上。放到Github上,希望有人来参与继续完善。

适用于WordPress的Varnish实际应用场景

场景一,来源Varnish官方网站给的一个实际应用样例,不过它们给出的代码有2处错误。下面我给出的这个版本以经改正了原本的2处错误。


sub vcl_recv {
  if (req.http.Accept-Encoding) {
#revisit this list
    if (req.url ~ "\.(gif|jpg|jpeg|swf|flv|mp3|mp4|pdf|ico|png|gz|tgz|bz2)(\?.*|)$") {
      remove req.http.Accept-Encoding;
    } elsif (req.http.Accept-Encoding ~ "gzip") {
      set req.http.Accept-Encoding = "gzip";
    } elsif (req.http.Accept-Encoding ~ "deflate") {
      set req.http.Accept-Encoding = "deflate";
    } else {
      remove req.http.Accept-Encoding;
    }
  }
  if (req.url ~ "\.(gif|jpg|jpeg|swf|css|js|flv|mp3|mp4|pdf|ico|png)(\?.*|)$") {
    unset req.http.cookie;
    set req.url = regsub(req.url, "\?.*$", "");
  }
  if (req.url ~ "\?(utm_(campaign|medium|source|term)|adParams|client|cx|eid|fbid|feed|ref(id|src)?|v(er|iew))=") {
    set req.url = regsub(req.url, "\?.*$", "");
  }
  if (req.http.cookie) {
    if (req.http.cookie ~ "(wordpress_|wp-settings-)") {
      return(pass);
    } else {
      unset req.http.cookie;
    }
  }
}

sub vcl_fetch {
  if (req.url ~ "wp-(login|admin)" || req.url ~ "preview=true" || req.url ~ "xmlrpc.php") {
    return (hit_for_pass);
  }
  if ( (!(req.url ~ "(wp-(login|admin)|login)")) || (req.request == "GET") ) {
    unset beresp.http.set-cookie;
  }
  if (req.url ~ "\.(gif|jpg|jpeg|swf|css|js|flv|mp3|mp4|pdf|ico|png)(\?.*|)$") {
    set beresp.ttl = 365d;
  }
}

sub vcl_deliver {
# multi-server webfarm? set a variable here so you can check
# the headers to see which frontend served the request
#   set resp.http.X-Server = "server-01";
   if (obj.hits > 0) {
     set resp.http.X-Cache = "HIT";
   } else {
     set resp.http.X-Cache = "MISS";
   }
}

Nginx 结合 GeoIP 来减少WordPress的垃圾评论

这个方法的效果还是比较理想的。新版的Nginx 一般默认支持GeoIP了,否则须编译支持之。

检查是否支持GeoIP

执行 nginx -V

输出的结果如果看到有“http_geoip_module” 则表示Nginx 已支持 GeoIP

接下来执行

wget -N http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
gunzip GeoIP.dat.gz
mv GeoIP.dat /usr/share/GeoIP/

这样一来就可以用上最新的IP数据库

执行 vi /etc/nginx/nginx.conf
在http{}模块里加入
geoip_country /usr/share/GeoIP/GeoIP.dat;

然后到站点配置文件中加入下面的规则

set $cc "";
if ($request_uri = /wp-comments-post.php) {
        set $cc $geoip_country_code;
}
if ($cc ~ (CN|KR|RU|UA)) {
        return 444;
}

(CN|KR|RU|UA)) 这里可以根据实际需要屏蔽那些国家的IP

检查修改是否被正确修改
执行 nginx -t 或 service nginx configtest 或者 /etc/init.d/nginx configtest

检查无误,然后重启Nginx
nginx -s reload 或 service nginx reload 或 /etc/init.d/nginx reload

BoroMeke迁到DigitalOcean的SSD VPS

某个静夜里,将BoroMeke迁到了DigitalOcean,至于到现在才迁到目前为止从各种比来看最优秀的VPS上,或许早该迁过来了。原本用的主机优惠了12美元,48美元一年,所以懒得动手,只不过就要续费了,还有就是实在忍受不了哪速度,就赶紧迁到DigitalOcean上来。

DigitalOcean是目前最优秀的VPS估计没有人会有异议的,每个月花5美元就可以用上SSD级别的VPS其实对大家来说也是一种幸运吧。DigitalOcean 这简直是在闹革命啊,最近又融了一大笔资。花5美元就能用上VPS,独立IP,IPv6,SSD等先进的功能,这实在温暖了人间。虚拟主机比它的价格贵多了,都还是比VPS低一个级别的呢。

DigitalOcean 想起它中文名称,我总是不由自主地想到“电子海洋”一词,这是因为Buckethead的“Electronic Sea”。

这次也懒得去搭建后台环境了,而是直接用了DigitalOcean提供的应用“WordPress on 14.04” 也就是LAMP=Ubuntu+Apache+MySql+PHP。这样一来就可以省去搭建环境的时间。

创建好Droplet时需要注意不要选择哪个自动备份Droplet选项,这是收费的项目,Droplet费用的20%,此外我还是选择了旧金山的机房,回国的速度最快。

Droplet创建好后,服务器的Root信息已发到邮箱,然后在SSH中登录服务器,首次登录会提示修改Root密码,修改好后登录数据库

解决 The theme is missing the style.css stylesheet

好像新版的WordPress后,后台安装上传主题会遇到这个坑的错误。网上翻一遍后都说是FTP上传就OK,这个做法当然是知道啦,问题就是要在后台上传zip包安装才爽,因为我想找到问题所在。

下面这段错误提示估计会把大家折腾得一番的疼,不纳闷才怪。

Unpacking the package…

Installing the theme…

The package could not be installed. The theme is missing the style.css stylesheet.

Theme install failed.

The theme is missing the style.css stylesheet 这个问题其实是主题文件放在2个或以上文件夹导致的。把主题文件只放在一个文件夹内,压缩为zip上传就没有问题了。主题文件必须放在主题文件夹根目录下。

MySQL命令修改 WordPress URLS

在WordPress搬家的过程需要修改WordPress URLS。

mysql -u root -p

mysql> UPDATE wp_options SET option_value = replace(option_value, 'http://www.oldurl', 'http://www.newurl') WHERE option_name = 'home' OR option_name = 'siteurl';

mysql> UPDATE wp_posts SET guid = replace(guid, 'http://www.oldurl','http://www.newurl');

mysql> UPDATE wp_posts SET post_content = replace(post_content, 'http://www.oldurl', 'http://www.newurl');

mysql> UPDATE wp_postmeta SET meta_value = replace(meta_value,'http://www.oldurl','http://www.newurl');g

防止 WordPress 被利用DDoS攻击

Sucuri 公司发表了一篇blog 称,最近发生的一起至少16.2万家WordPress网站被利用来进行DDoS攻击目标网站的事件,文章称这次攻击利用了WordPress的XML-RPC协议,所以,如果中招的网站删除xmlrpc.php文件无法阻断被利用DDoS攻击,要想阻止网站利用与这次的DDoS攻击,可以按照以下方面来处理:

1.在WordPress管理设置里关闭/禁用 (pingbacks and trackbacks)通知
2.在主题的函数模板里加入
add_filter( ‘xmlrpc_methods’, function( $methods ) {
unset( $methods['pingback.ping'] );
return $methods;
} );

Sucuri 公司还提供一个用于检测你的网站是否被利用于本次DDoS攻击工具 :http://labs.sucuri.net/?is-my-wordpress-ddosing