用nginx的XSendfile特性,加速wordpress MU的附件访问速度,其中每个博客的附件地


昨天发布了多人博客站点——博出位(bochuwei.com)。其中每个博客的附件地址,都是类似于这样的:http://shen2.cn/files/2010/10/xxx.jpg。

这样的附件地址,好处在于隐藏了实际路径中,wp-content/blogs.dir/?/的路径信息,缺点是原本直接通过Nginx就能够返回文件,现在必须通过PHP。

更要命的是,php的readfile()函数效率不高,对于大文件来说,在返回结果之前,由php读取文件的全部内容,显然是没有必要的。

在ms-files.php的代码中,我找到了这样一段代码:

if ( WPMU_ACCEL_REDIRECT ) {
header( 'X-Accel-Redirect: ' . str_replace( WP_CONTENT_DIR, '', $file ) );
exit;
} elseif ( WPMU_SENDFILE ) {
header( 'X-Sendfile: ' . $file );
exit;
}

于是引发了我无限遐想。这个传说中X-Accel-Redirect是不是能够实现高速的文件重定向呢?

google了之后发现果然如此,可惜找不到任何的相关文档,仅有的一篇中文博客(http://tremblefrog.org/blog/2009/04/03/a_wpmu_hack_to_substitute_php_for_nginx_processing_static_files/),写得也不是很详细。

摸索了一下,原来是nginx提供了一个高级特性,叫XSendfile,用来读取header信息中的X-Accel-Redirect值,将X-Accel-Redirect所指定的文件内容,作为输出。
这样一来,php就不需要读取文件的正文,只需要输出X-Accel-Redirect值,就可以让nginx负责静态文件的传输了。

1. 在nginx的server配置中增加设置:

rewrite ^/files/(.+) /wp-includes/ms-files.php?file=$1;
location /blogs.dir/ {
internal;
root /wordpress/wp-content;
expires 30d;
}

2.在wp-config.php文件的尾部,增加:

define( 'WPMU_ACCEL_REDIRECT', true);

重启nginx之后,就生效了,是不是很酷?

相关内容