用nginx的XSendfile特性,加速wordpress MU的附件访问速度,xsendfilewordpress其中每个博客的附件地
用nginx的XSendfile特性,加速wordpress MU的附件访问速度,xsendfilewordpress其中每个博客的附件地
昨天发布了多人博客站点——博出位(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之后,就生效了,是不是很酷?
评论暂时关闭