Nginx fastcgi_cache缓存加速WordPress站,支持html伪静态页面
本教程采用军哥lnmp1.4
按军哥lnmp的安装教程安装lnmp环境
环境:
Mysql5.5.56
php5.5.38
TCmalloc
安装Nginx ngx_cache_purge模块
查看ngx_cache_purge是否安装
1 | nginx -V 2>&1 | grep -o ngx_cache_purge |
显示ngx_cache_purge表示已经安装了ngx_cache_purge模块
安装ngx_cache_purge模块
1 | cd /usr/local/src |
#下载
1 | wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz |
#解压
1 | tar zxvf ngx_cache_purge-2.3.tar.gz |
#下载Nginx(版本可以跟lnmp的一样或更高,选更高版本相当于升级了,版本在http://nginx.org/download/查看)
1 | wget http://nginx.org/download/nginx-1.12.0.tar.gz |
#解压
1 | tar zxvf nginx-1.12.0.tar.gz |
#进入刚才解压的Nginx目录
1 | cd nginx-1.12.0 |
#查看当前系统中原来nginx编译参数
1 | nginx -V |
显示以下信息
1 2 3 4 5 | nginx version: nginx/1.12.0 built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) built with OpenSSL 1.0.2l 25 May 2017 TLS SNI support enabled configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module --with-openssl=/root/lnmp1.4/src/openssl-1.0.2l --with-google_perftools_module |
这是lnmp安装时编译的Nginx模块信息和Nginx版本信息
#可看到上面参数中,没有ngx_cache_purge模块
#还是在当前目录中,nginx-1.8.1目录,输入下面命令
1 | ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module --with-openssl=/root/lnmp1.4/src/openssl-1.0.2l --with-google_perftools_module --add-module=../ngx_cache_purge-2.3 |
#没有报错就编译,注意不要&&makeinstall
1 | make |
#备份系统中原nginx,原文件加上日期,此过程中Nginx不会停止服务的
1 2 | mv /usr/local/nginx/sbin/nginx{,_`date +%F`} #备份nginx cp objs/nginx /usr/local/nginx/sbin |
1 | nginx -V 2>&1 | grep -o ngx_cache_purge |
# 显示ngx_cache_purge表示已经安装成功
lnmp环境下,新建网站aaa,域名为www.aaa.com
修改vhost配置文件
1 | vi /usr/local/nginx/conf/vhost/www.aaa.conf |
在其server前增加以下内容
1 2 3 4 5 6 7 8 | #下面各个参数的含义请自行百度,我就不赘述了 #下面2行的中的wpcache路径请自行提前创建,否则可能会路径不存在而无法启动nginx,max_size请根据分区大小自行设置 fastcgi_cache_path /tmp/wpcache levels=1:2 keys_zone=WORDPRESS:250m inactive=1d max_size=1G; fastcgi_temp_path /tmp/wpcache/temp; fastcgi_cache_key "$scheme$request_method$host$request_uri"; fastcgi_cache_use_stale error timeout invalid_header http_500; #忽略一切nocache申明,避免不缓存伪静态等 fastcgi_ignore_headers Cache-Control Expires Set-Cookie; |
替换server段内容为以下部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | server { listen 80; #请修改为自己的域名 server_name www.aaa.com; index index.html index.htm index.php default.html default.htm default.php; #请修改为自己网站的存放路径 root /home/wwwroot/www.aaa.com; set $skip_cache 0; #post访问不缓存 if ($request_method = POST) { set $skip_cache 1; } #动态查询不缓存 if ($query_string != "") { set $skip_cache 1; } #后台等特定页面不缓存(其他需求请自行添加即可) if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") { set $skip_cache 1; } #对登录用户、评论过的用户不展示缓存(这个规则张戈博客并没有使用,所有人看到的都是缓存) if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") { set $skip_cache 1; } #这里请参考你网站之前的配置,特别是sock的路径,弄错了就502了! location ~ [^/]\.php(/|$) { try_files $uri =404; fastcgi_pass unix:/tmp/php-cgi.sock; fastcgi_index index.php; include fastcgi.conf; #新增的缓存规则 fastcgi_cache_bypass $skip_cache; fastcgi_no_cache $skip_cache; add_header X-Cache "$upstream_cache_status From $host"; fastcgi_cache WORDPRESS; fastcgi_cache_valid 200 301 302 1d; } location / { #此处可以添加自定义的伪静态规则(之前你新增的伪静态规则可以添加到这,没有就不用了) try_files $uri $uri/ /index.php?$args; rewrite /wp-admin$ $scheme://$host$uri/ permanent; } #缓存清理配置(可选模块,以下第二个xxx.xxx.xxx.xx ip填写主机公网ip) location ~ /purge(/.*) { allow 127.0.0.1; allow "xxx.xxx.xxx.xx"; deny all; fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1"; } location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ { access_log off; log_not_found off; expires max; } location = /robots.txt { access_log off; log_not_found off; } location ~ /\. { deny all; access_log off; log_not_found off; } #请注意修改日志路径,不记录日志设置OFF access_log /home/wwwlogs/www.aaa.com.log; } server { server_name aaa.com; return 301 $scheme://www.aaa.com$request_uri; } |
然后:wq保存www.aaa.com.conf配置文件
重启lnmp
1 | lnmp restart |
下一步,安装缓存清理插件:Nginx Helper,在WordPress后台安装即可,然后设置好
wp-config.php中新增如下代码
1 2 | //定义缓存的存放路径 define( 'RT_WP_NGINX_HELPER_CACHE_PATH','/tmp/wpcache'); |
大功告成
若不想用插件,也可以使用以下代码版的缓存清理代码,放入function.php文件即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | /** * WordPress Nginx FastCGI缓存清理代码(Nginx-Helper纯代码版) By 张戈博客 */ //初始化配置 $logSwitch = 0; //配置日志开关,1为开启,0为关闭 $logFile = '/tmp/purge.log'; //配置日志路径 $cache_path = '/tmp/wpcache'; //配置缓存路径 //清理所有缓存(仅管理员) 范例:http://www.domain.com/?purge=all if ($_GET['purge'] == 'all' && is_user_logged_in()) { if( current_user_can( 'manage_options' )) { delDirAndFile($cache_path, 0); } } //缓存清理选项 add_action('publish_post', 'Clean_By_Publish', 99); //文章发布、更新清理缓存 add_action('comment_post', 'Clean_By_Comments',99); //评论提交清理缓存(不需要可注释) add_action('comment_unapproved_to_approved', 'Clean_By_Approved',99); //评论审核清理缓存(不需要可注释) //文章发布清理缓存函数 function Clean_By_Publish($post_ID){ $url = get_permalink($post_ID); cleanFastCGIcache($url); //清理当前文章缓存 cleanFastCGIcache(home_url().'/'); //清理首页缓存(不需要可注释此行) //清理文章所在分类缓存(不需要可注释以下5行) if ( $categories = wp_get_post_categories( $post_ID ) ) { foreach ( $categories as $category_id ) { cleanFastCGIcache(get_category_link( $category_id )); } } //清理文章相关标签页面缓存(不需要可注释以下5行) if ( $tags = get_the_tags( $post_ID ) ) { foreach ( $tags as $tag ) { cleanFastCGIcache( get_tag_link( $tag->term_id )); } } } // 评论发布清理文章缓存 function Clean_By_Comments($comment_id){ $comment = get_comment($comment_id); $url = get_permalink($comment->comment_post_ID); cleanFastCGIcache($url); } // 评论审核通过清理文章缓存 function Clean_By_Approved($comment) { $url = get_permalink($comment->comment_post_ID); cleanFastCGIcache($url); } //日志记录 function purgeLog($msg) { global $logFile, $logSwitch; if ($logSwitch == 0 ) return; date_default_timezone_set('Asia/Shanghai'); file_put_contents($logFile, date('[Y-m-d H:i:s]: ') . $msg . PHP_EOL, FILE_APPEND); return $msg; } // 缓存文件删除函数 function cleanFastCGIcache($url) { $url_data = parse_url($url); global $cache_path; if(!$url_data) { return purgeLog($url.' is a bad url!' ); } $hash = md5($url_data['scheme'].'GET'.$url_data['host'].$url_data['path']); $cache_path = (substr($cache_path, -1) == '/') ? $cache_path : $cache_path.'/'; $cached_file = $cache_path . substr($hash, -1) . '/' . substr($hash,-3,2) . '/' . $hash; if (!file_exists($cached_file)) { return purgeLog($url . " is currently not cached (checked for file: $cached_file)" ); } else if (unlink($cached_file)) { return purgeLog( $url." *** CLeanUP *** (cache file: $cached_file)"); } else { return purgeLog("- - An error occurred deleting the cache file. Check the server logs for a PHP warning." ); } } /** * 删除目录及目录下所有文件或删除指定文件 * 代码出自ThinkPHP:http://www.thinkphp.cn/code/1470.html * @param str $path 待删除目录路径 * @param int $delDir 是否删除目录,1或true删除目录,0或false则只删除文件保留目录(包含子目录) * @return bool 返回删除状态 */ function delDirAndFile($path, $delDir = FALSE) { $handle = opendir($path); if ($handle) { while (false !== ( $item = readdir($handle) )) { if ($item != "." && $item != "..") is_dir("$path/$item") ? delDirAndFile("$path/$item", $delDir) : unlink("$path/$item"); } closedir($handle); if ($delDir) return rmdir($path); }else { if (file_exists($path)) { return unlink($path); } else { return FALSE; } } } |
另外,如果想清理全部缓存,可在管理员登陆状态下访问首页+?purge=all参数,比如:http://zhangge.net/?purge=all ,其他用户或访客访问这个地址则没有任何作用,如果还不放心也可以自行更改代码中的参数判断字符串。
1 | ?purge=all |
经过测试,这种带参数的路径同样会被Nginx缓存,也就说?purge=all只能用一次,第二次刷新就没效果了,因为被Nginx缓存了,要解决也很简单,在fastcgi缓存配置中排除这个路径即可:
1 2 3 4 | #后台等特定页面不缓存(其他需求请自行添加即可) if ($request_uri ~* "purge=all|/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") { set $skip_cache 1; } |
实际使用中,老牛还用了memcached进行数据库查询缓存、opcache进行php优化、加速执行
注意:可以选memcached或者memcache,两者使用的WordPress插件不一样,相关内容详见:
https://xiaohost.com/1708.html WordPress用memcache还是memcached好?配套插件选哪个?
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。
安装memcached进行数据库sql查询优化
进入lnmp解压后的目录,执行:
1 | ./addons.sh install memcached |
可以根据自己的需求选择php-memcache或php-memcached扩展,目前discuz x以及WordPress使用的是前者,功能上php-memcached更强大一些。
输入对应的序号,回车,再次确认回车开始安装。
卸载memcached方法:
执行:
1 | ./addons.sh uninstall memcached |
安装完memcached后,并不会自动对wordpress的查询进行缓存,还需要安装一个插件,注意memcached和memcache的插件不同,不能相互替换,否则出现前后台502错误
Memcached pluging for wordpress插件下载地址wordpress-pecl-memcached-object-cache
下载后,解压zip压缩包,将object-cache.php文件放入你的wordpress网站的wp-content目录下即可(注意不是放入plugins目录内)
安装opcache进行php执行优化
opcache是 Zend 开发的闭源但可以免费使用的 PHP 优化加速组件。LNMP 1.2下安装的PHP 5.5或更高版本的PHP不需要额外安装OPcache,默认已经安装上。
1.3上默认已安装但未启用执行:
1 | ./addons.sh install opcache |
进行开启。
安装
进入lnmp解压后的目录,执行:
1 | ./addons.sh install opcache |
Opcache和eAccelerator是冲突的,脚本会卸载eAccelerator后再安装Opcache,回车确认后就会自动安装opcache。
卸载
执行:
1 | ./addons.sh uninstall opcache |
评论0