高并发网站架构的核心原则其实就一句话"把所有的用户访问请求都尽量往前推",即:能缓存在用户电脑本地的,就不要让他去访问CDN。 能缓存CDN服务器上的,就不要让CDN去访问源(静态服务器)了。能访问静态服务器的,就不要去访问动态服务器。以此类推:能不访问数据库和存储就一定不要去访问数据库和存储。
WordPress最好的优化方式就是尽量不安装插件,之前有分享过《wordpress启动Redis缓存加速》,Wordpress是典型的PHP-MySQL应用,去做数据库缓存,倒不如让轻量级的Nginx直接去缓存WordPress内容。
Nginx内置FastCgi缓存,但是不支持自动清除缓存。当你在Wordpress里面新建/修改一篇文章,或者访客提交评论的时候,自动清空相关的缓存是必要的!Nginx需要安装ngx_cache_purg+量身定做的WordPress缓存清理插件:Nginx Helper。
1. 安装Nginx ngx_cache_purge模块
1)查看ngx_cache_purge是否安装
- nginx -V 2>&1 | grep -o ngx_cache_purge
显示ngx_cache_purge表示已经安装
2)安装ngx_cache_purge模块
《OneinStack》和《lnmp一键安装包》下安装ngx_cache_purge模块
- cd /root/oneinstack/src
- wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
- wget http://nginx.org/download/nginx-1.9.10.tar.gz
- tar xzf ngx_cache_purge-2.3.tar.gz
- tar xzf nginx-1.9.10.tar.gz
- cd nginx-1.9.10
- nginx -V #查看nginx编译参数,最后加上--add-module=../ngx_cache_purge-2.3
- ./configure --prefix=/usr/local/nginx --user=www --group=www \
- --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module \
- --with-ipv6 --with-http_gzip_static_module --with-http_realip_module \
- --with-http_flv_module --with-ld-opt=-ljemalloc \
- --add-module=../ngx_cache_purge-2.3
- make #编译
- mv /usr/local/nginx/sbin/nginx{,_`date +%F`} #备份nginx
- cp objs/nginx /usr/local/nginx/sbin
- nginx -V 2>&1 | grep -o ngx_cache_purge
- # 显示ngx_cache_purge表示已经安装成功
2. Nginx配置
建议将fastcgi_cache_path设置tmpfs内存中,操作系统不同tmpfs路径也不同,如下:
CentOS:/dev/shm
Ubuntu和Debian:/run/shm
修改nginx虚拟主机配置文件/usr/local/nginx/conf/vhost/linuxeye.com.conf:
- fastcgi_cache_path /dev/shm/nginx-cache levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;
- fastcgi_cache_key "$scheme$request_method$host$request_uri";
- fastcgi_cache_use_stale error timeout invalid_header http_500;
- fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
- server {
- listen 443 ssl http2;
- ssl_certificate /usr/local/nginx/conf/vhost/linuxeye_blog.crt;
- ssl_certificate_key /usr/local/nginx/conf/vhost/linuxeye_blog.key;
- ssl_ciphers "CHACHA20:GCM:HIGH:!DH:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS";
- ssl_session_cache shared:SSL:10m;
- ssl_session_timeout 10m;
- #ssl_stapling on;
- #ssl_stapling_verify on;
- resolver 8.8.8.8 8.8.4.4 valid=300s;
- resolver_timeout 5s;
- server_name linuxeye.com;
- access_log /home/wwwlogs/blog_nginx.log combined;
- index index.html index.htm index.php;
- include wordpress.conf;
- root /home/wwwroot/blog;
- set $skip_cache 0;
- 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;
- }
- location ~ [^/]\.php(/|$) {
- #fastcgi_pass remote_php_ip:9000;
- fastcgi_pass unix:/dev/shm/php-cgi.sock;
- fastcgi_index index.php;
- include fastcgi.conf;
- fastcgi_cache_bypass $skip_cache;
- fastcgi_no_cache $skip_cache;
- fastcgi_cache WORDPRESS;
- fastcgi_cache_valid 60m;
- }
- location ~ /purge(/.*) {
- allow 127.0.0.1;
- deny all;
- fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
- }
- location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ {
- expires 30d;
- access_log off;
- }
- location ~ .*\.(js|css)?$ {
- expires 7d;
- access_log off;
- }
- }
使nginx配置生效
- service nginx reload
重启系统后shm内存中nginx-cache文件夹会丢失,为了使重启生效(自动创建文件夹),修改/etc/init.d/nginx的make_dirs下一行(大概52行)添加:
- [ ! -d '/dev/shm/nginx-cache' ] && { mkdir /dev/shm/nginx-cache; chown -R ${user}.$user /dev/shm/nginx-cache; }
3. WordPress安装Nginx Helper插件
WordPress后台【插件】—【安装插件】搜索【Nginx Helper】安装即可。如下设置:
修改wordpress网站根目录wp-config.php添加如下行:
- define('RT_WP_NGINX_HELPER_CACHE_PATH','/dev/shm/nginx-cache');
4. 测试
测试时候勾选Enable Logging(记录日志)、Enable Nginx Timestamp in HTML(插入缓存信息)
查看网页源代码:
查看Nginx Helper是否刷新日志:
Wed Jan 27 11:34:35 CST 2016
1F
请问,多个vhost能用?
B1
@ 刘sun 参考:http://serverfault.com/questions/539125/is-it-possible-to-have-a-fastcgi-cache-path-for-each-website-virtual-host
2F
按照上面的 conf 设定,一个网站是没问题的,
但在多设定一个网站后,nginx -t 会出错,
nginx: [emerg] the same path name “/dev/shm/nginx-cache” used in /usr/local/nginx/conf/vhost/demo.1798.in.conf:1 and in /usr/local/nginx/conf/vhost/gtour.info.conf:1
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
B1
@ miming 文件夹已经被占用了,多站点建议看yeho的回复
B1
@ miming 多站点我博客之前分享过:https://zhangge.net/5067.html
可以参考参考
B2
@ 张戈博客 加个友情链接哈
B3
@ yeho 你这评论回复没有邮件通知吧,我才看到。。。
B2
@ 张戈博客 感谢分享,以参考配置 OK
3F
应该加个多站点配置,因为单keys_zone多站点缓存会冲突
4F
用了这个是不是就可以停用redis之类的缓存了?
还是说都可以并存?
B1
@ kamin 可以停止了,数据库可以用缓存
B2
@ yeho 这么说Oneinstack里把Redis还有Mencache都装上是白装咯?看来只用这个就行啦?
目前我就是照的安装过程,以及使用的Cloudflare的Rule,全站(包括伪静态HTML)都缓存,所以访问到的都是CloudFlare上的Edge Cache,这样子即使板瓦工很慢也不会影响访问速度了。
那么是不是这个就显然没有必要了呢?
B3
@ BabyBichu 只用这个即可
B4
@ yeho 我在想
有时候板瓦工(BandWagonHost)也是会抽风的 所以在CloudFlare的Page Rule也给全站的伪静态html加上了缓存 有时服务器抽风进不去后台 但是前台网页都还能进去
也不知道这种情况是否还有使用Nginx fastcgi_cache的必要呢?不过抽风时 访问自己VPS的IP也是能进得去OneinStack的主页的
5F
老大我来给你解决个问题:
Nginx helper的自定义清理路径需要在wp-config.php加入define( ‘RT_WP_NGINX_HELPER_CACHE_PATH’,’/tmp/wpcache’); #这个路径做好是二级路径。
然后选择 文件路径 的方式来清理缓存,而不是请求的方式,因为这样手动清理缓存并不能清理。
关于目录的问题,就像mkdir创建文件夹,如果是二级目录不需要加-p参数就可以了,二级以上的文件夹必须加-p参数。为什么说到文件夹呢?因为Nginx helper插件的清理功能是类似于这样的,他不带-p参数来创建缓存路径,这样做的后果是清理了缓存之后不重载Nginx前台就会GG。。
B1
@ 颜羽夕。 这个现象我好像没有遇到,上面代码没有加-P参数不是也能正常创建文件夹了。不过我遇到的是按了清楚全部缓存Purging entire cache ”按钮后,首页会GG,这个应该是因为Nginx helper插件不能重启nginx导致的 ,解决参照张戈博客:http://zhangge.net/5061.html
B1
@ 颜羽夕。 好吧我错了 ,张戈文卓后面也写了,但是如果换成二级路劲的话….不是没法用到博主推荐的tmpfs内存了吗…毕竟硬盘比内存速度差远了
6F
安装上面的操作,缓存目录下没有文件生成,header显示cache-control:nocache ,max-age=0,请问是什么原因啊,fastcgi_ignore_headers Cache-Control Expires Set-Cookie;这句加了还是这样
B1
@ 后知后觉 把页面缓存下面两个comment去掉
7F
大神,昨晚上照你的办法用了插件,结果发现:Nginx Helper这个鬼一开启,前端有评论时,鸟哥主题里的/begin/inc/functions/comment-ajax.php?ver=2016.1.28这个鬼东西就加载卡住!~这是要死的节奏啊!~禁用插件就不会卡了!~这是什么原因啊!~?
8F
这篇博文被N多人转载了,“把所有的用户访问请求都尽量往前推”这句话不知道出处是这里吗?好多地方看到,很精髓!
9F
用了这个以后登录状态会被缓存,导致无法评论啊,有什么好的解决方案吗
10F
需要进入openresty源码目录
11F
装这个还需要自动清空缓存吗
B1
@ 林大壮 后台有自动缓存策略
12F
请问博主,用了这个Nginx fastcgi_cache优化 还需要装Jemalloc来优化数据库吗
B1
@ 林大壮 可以用
13F
看了看,这个上头的nginx还是1.9的,现在上了1.10 还能使么?
B1
@ ITYOY 可以的
14F
typecho能实现这种缓存吗
B1
@ Orso 不清楚有没有这类插件。
15F
nice 收藏一下
16F
使用了Opcache可以用么,是不是可以更快
B1
@ 鲜果咖啡 可以使用
17F
我的网站也是用wordpress系统,使用了最新的php7,没有开启Opcache,但是有人建议用php7一定要开启Opcache,说是php会更快,但是我的内存只有1G,不敢开启Opcache,怕占用更多的内存,不知道如何是好,请教博主一下?
B1
@ 美剧天堂 建议安装。
B2
@ yeho 那开启Opcache会不会占用更多内存还是会降低物理内存的使用呢?
B3
@ 美剧天堂 放心开吧,占用不了多少!博主也是1G,我也是1G,wordpress个人站1G一般够用的。除非你服务器环境搭建不当或者没有优化,现在内存就所剩不多了。
B4
@ 采觅博主 我去,我用oneinstack搭建的,我不知道有没有优化,也不知道怎么优化
B3
@ 美剧天堂 那你开启就是了,放心!它缓存PHP,你网站程序才多大。
B4
@ 采觅随记 网站不到200M,开启opcache内存会高吗
18F
噢 才发现啊,yeho太不厚道了,自己偷偷启用cache 20
19F
什么时候写一个openresty 编译ngx_cache_purge 的试一下。
编译了半天 都没有成功。
gmake 之后 就提示错误
make
错误
B1
@ 咱们结婚吧 安装前修改options.conf nginx_modules_options=’–add-module=../ngx_cache_purge’
20F
请问怎么解决缓存后评论异常情况