每一个可以努力的日子,都是一份厚礼。
Ngnix 配置完美支持 WordPress Super Cache 插件
WordPress 大概是这个星球上使用得最多的博客程序了,甚至很多资讯、社区等非博客网站也在使用 WordPress。据统计,在全球排名 100 万以内的网站中,约有 14.7% 是利用 WordPress 程序搭建。令人震惊的是,维护整个 WordPress 运营和升级的团队核心成员,不足 20 人。大量的志愿者在为这个生态系统贡献精美的主题、实用的插件。
然而,为了保证灵活的可扩展性,Wordpress 牺牲了性能,它因为速度低下而广受诟病,很多空间商也为此头疼 —— 当访问量很大的时候,臃肿的 WordPress 站点消耗了服务器太多CPU和内存资源。我曾经总结过提高网站性能的方法,其中最有效的手段就是静态化了。
使用 WP Super Cache 插件可以帮助 WordPress 网站实现页面静态化,可惜的是 supercache 默认没有提供对 Ngnix 服务器的支持。
按照插件作者的说法,每当他尝试为他的网站使用 Nginx 替代 Apache 时总会出现稀奇古怪的问题,最终他放弃了……不管怎样,他还是好心地提供了一份 Nginx 服务器的参考配置,让 Super Cache 插件可以工作。但是各位看官请注意,这篇文章发布于 2009 年,到现在插件已经升级 N 多版本,增加支持 wp-touch 手机版等 N 多新功能了,这个配置文件已经过时。
不过不用担心,经过研究,老衲已经将插件生成的 .htaccess 配置文件彻底翻译为 Nginx rewrite 规则了!完美支持 WP Super Cache 的配置文件闪亮登场 ——
location / { # 如果请求的文件已存在,直接返回 if (-f $request_filename) { break; } set $supercache_file ''; set $supercache_uri $request_uri; set $supercache 1; set $ihttp_host ''; if ($request_method = POST) { set $supercache 0; } # 仅在访问文章永久链接时使用静态文件,请求中带参数则不使用静态缓存 set $qs 0; if ($query_string) { set $qs 1; } # 不过从 twitter, facebook, feedburner 链接点过来的,总是带参数,这些访问仍然可以使用静态文件 if ($query_string ~* "^utm_source=([^&]+)&utm_medium([^&]+)&utm_campaign=([^&]+)(&utm_content=([^&]+))?$") { set $qs 0; set $supercache_uri $document_uri; } #deactivate on high load if ($qs = 1) { set $supercache 0; } # 针对已登录用户(发表过评论),可以不静态化。在访问量高峰时可注释掉 if ($http_cookie ~* "comment_author_|wordpress|wp-postpass_" ) { set $supercache 0; } # 支持移动设备,访问移动版本的网页缓存 if ($http_user_agent ~* '(iphone|ipod|aspen|incognito|webmate|android|dream|cupcake|froyo|blackberry9500|blackberry9520|blackberry9530|blackberry9550|blackberry 9800|webos|s8000|bada)') { set $ihttp_host '-mobile'; } # 指定静态缓存文件的路径 if ($supercache = 0) { set $supercache_uri ''; } if ($supercache_uri ~ ^(.+)$) { set $supercache_file /wp-content/cache/supercache/$http_host$1/index${ihttp_host}.html; } # 只有当缓存文件存在时,才进行 rewrite if (-f $document_root$supercache_file) { #rewrite ^(.*)$ $supercache_file break; rewrite ^ $supercache_file last; } # 所有其他请求,转给 wordpress 处理 if (!-e $request_filename) { rewrite . /index.php last; } } |
需要注意的是 set $supercache_file 这一行,指定静态缓存文件的路径。这里的路径是 wp-super-cache 生成的静态文件目录,如果这个路径不对的话,最终还是交给了 index.php,静态缓存就不起作用了。因为每个网站的永久链接设置都不太一样,插件生成的缓存目录也不一样,需要仔细调试一下。
在生成了静态页面后,通过上面的规则直接让 Nginx 读取静态文件,完全不经过 PHP,可以很大的提高博客的页面性能。www.lovelucy.info博客实测,停掉 php-fpm 后台后,网站仍然可以访问,除了不能添加评论,其他一切正常。再也不怕抓站的爬虫把网站搞挂了……
这篇文章由lovelucy于2012-09-01 16:23发表在Linux。你可以订阅RSS 2.0 也可以发表评论或引用到你的网站。除特殊说明外文章均为本人原创,并遵从署名-非商业性使用-相同方式共享创作协议,转载或使用请注明作者和来源,尊重知识分享。 |
批评不自由
则赞美无意义
Google Chrome 50.0.2661.102 Windows NT 大约7年前
博主,网站开启https后WP Super Cache的这个模式好像失效了!
Google Chrome 21.0.1180.89 Windows 7 大约10年前
最近wp搬家到 VPS 上头,装的是军哥的LNMP1.0一件安装包,也装了WP super cache,用你提供的方法,确实能正常用Mod_rewrite方式生成静态页面。
但是同时也遇到一个问题,分类页面在有更新后,无法rebuild cache,主页能够正常rebuild。
请问,怎么解决这个问题?
Google Chrome 30.0.1599.101 Windows 7 大约10年前
你手动删除该分类页的缓存,再访问一下该页,能 rebuild 吗?
Google Chrome 32.0.1685.0 Mac OS X 10_9_0 大约10年前
问个问题,用这个方案我已经是能生成出index文件了
但是我想用memcached来缓存数据,那这样nginx的规则该怎么写呢?
还有就是,怎么顺便让他支持wp-touch这个插件呢。。
求赐教
Google Chrome 30.0.1599.101 Windows 7 大约10年前
在 Super Cache 插件高级设置里勾上“移动设备支持”,然后在“插件兼容” tab 下面应该会有启动 WPTouch 兼容的设置。
memcached 没有研究过,Ngnix 应该有相关模块支持
Mozilla Firefox 24.0 Windows 7 大约11年前
为啥首页始终不行呢
Google Chrome 29.0.1547.65 Linux 大约11年前
检查下你的 wp-content/cache/supercache/$http_host/ 目录下有 index.html 和 index.html.gz 文件吗?
Mozilla Firefox 24.0 Windows 7 大约11年前
你好,没有index.html.gz,只有index.html
当手动删除index.html,用手机访问的时候会生成index-mobile.html
,电脑版的也正常
当更新缓存,电脑访问生成index.html后手机访问不能生成index-mobile.html
Google Chrome 29.0.1547.57 Windows 7 大约11年前
为什么我复制进去后提示location后面的斜杠出错呢
Google Chrome 23.0.1271.26 Windows 7 大约11年前
Mod rewrite 模块可能未安装
后台出现这个错误提示,是不是可以忽略?
Google Chrome 22.0.1229.94 Windows 7 大约11年前
嗯,可以忽略
Google Chrome 22.0.1229.94 Windows 7 大约11年前
请问这个文件里没有需要改路径的地方了吧·····我的好像总是没法成功运行,
Google Chrome 22.0.1229.94 Windows 7 大约11年前
你可以先去 /wp-content/cache/supercache/ 目录检查一下那些缓存文件有没有生成,配置文件中 $supercache_file 这个变量比较关键
Google Chrome 22.0.1229.79 Windows 7 大约12年前
还有,测试静态缓存的办法只有停用了php-fpm 看看还能不能访问么?
Safari 7534.48.3 iPad OS 5_0_1 like Mac OS X) AppleWebKit 大约12年前
或者查看网页源代码,最下面有supercache字样即可。
需注意的是不要登陆了博客,因为supercache默认对已登陆用户不启用缓存。
Google Chrome 22.0.1229.79 Windows 7 大约12年前
你好,有几个问题想请教一下
1.你是WP-SUPER-CACHE开启的是这个么Use mod_rewrite to serve cache files. (Recommended)??
2. 如果我们用nginx,根目录下的.htaccess 配置文件我们是完全不用理会了对吧,就算写进了很多新规则,但我们没有Mod rewrite。
3.你修改的这一段东西,改的应该是nginx下面的vhost里的配置文件对不对。本身 就有 location括号符的东西的,我是把你重一段复制到下面去还是放在原来的location ~ .*\.(php|php5)?$ 下面。
4.你的这段代码最后少了一个终止括号符 “ }”
Safari 7534.48.3 iPad OS 5_0_1 like Mac OS X) AppleWebKit 大约12年前
1、是的。
2、是的。
3、如果你的网站有单独的vhost,那就是改vhost文件。复制到location ~ .*\.(php|php5)?$一段的上面。
4、确实,谢谢提醒。
Google Chrome 22.0.1229.79 Windows 7 大约12年前
我的问题已经解决了,谢谢!
Google Chrome 22.0.1201.0 Ubuntu Linux 大约12年前
我说呢,我表妹的博客用的新浪的云商店主机,就能用这个插件,也是ngnix服务器。
Google Chrome 21.0.1180.89 Windows 7 大约12年前
Ngnix 并发能力要好些,优化后能达到 10 万以上,所以国内很多大的网站包括网易新浪水木豆瓣,都在用它。
我这个小博客访问量没那么大,只是折腾着玩罢了~
Google Chrome 21.0.1180.89 Windows 7 大约12年前
你这个折腾起来越费劲,看来WP使用起来也有局限性。
Google Chrome 21.0.1180.89 Windows 7 大约12年前
我用的 VPS 主机,所以可以随便折腾。 😈
如果用共享虚拟空间就没必要了,运维的工作主机商会搞定。
Google Chrome 22.0.1229.79 Windows 7 大约12年前
坛子,我在这个搜索到的博客也发现你的身影了,哈 😈