站点静态化——为网站启用Nginx缓存
生命不休,折腾不知。最近翻看张戈博客,看了很多站点优化提速的文章,学到了不少各种缓存的方法和技巧。
对于本站这样的博客小站,动态内容基本没有,所有最方便也最适合做全静态化。
当前使用WordPress插件WP Super Cache做静态缓存,用了一段时间也比较好,但是在这篇文章里看到了设置Nginx的fastcgi_cache缓存的方法,由于不依赖于php服务端,完全又nginx服务器相应HTML页面请求,性能应该更佳。而且这个做法实际上也是百度云加速、CloudFlare等CDN服务的实现方法,因此又开始折腾这种缓存方法,真正实现网站全静态化。
准备工作
nginx缓存依赖于ngx_cache_purge模块,如果使用军哥的lnmp一键包部署wordpress环境,这个模块是默认不安装的。因此需要下载ngx_cache_purge的源码重新编译安装nginx,具体过程记录在前一篇博文 无缝升级为nginx添加ngx_cache_purge模块
修改Nginx配置文件
打开Nginx的配置文件,对应本站的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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
[crayon-6007a731a8953362572058 inline="true" ]#################################################################################################### # Nginx开启fastcgi_cache-purge缓存加速,支持html伪静态页面 By 张戈博客 # 文章地址:http://zhangge.net/5042.html # 参 考 ①:http://jybb.me/nginx-wordpress-fastcgi_cache-purge # 参 考 ②:https://rtcamp.com/wordpress-nginx/tutorials/single-site/fastcgi-cache-with-purging/ # 转载本文请务必保留以上申明,谢谢合作! #################################################################################################### 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; fastcgi_ignore_headers Cache-Control Expires Set-Cookie; server { listen 443 default; server_name www.feiqy.com feiqy.com; index index.html index.htm index.php default.html default.htm default.php; root /home/wwwroot/www.feiqy.com; ssl on; ssl_certificate /etc/letsencrypt/live/feiqy.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/feiqy.com/privkey.pem; add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; 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(/|$) { 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; } 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 ~ .*\.(js|css)?$ { expires 12h; access_log off; } location ~ /.well-known { allow all; } location /xmlprc.php { deny all; } location = /robots.txt { access_log off; log_not_found off; } location ~ /\. { deny all; access_log off; log_not_found off; } access_log /home/wwwlogs/www.feiqy.com.log; } server { listen 80; server_name www.feiqy.com feiqy.com; rewrite ^(.*)$ https://$host$1 permanent; } |
[/crayon]
前两行定义了缓存存储的路径,位于 /tmp/wpcache和 /tmp/wpcache/temp,如果这个路径不存在的话,手动创建这两个目录,并且确保www用户有可写权限。
安装自动清除缓存插件
按照前面的设置,nginx缓存应该可以运行了。但是有些时候我们希望某些页面能在发生更新的时候自动清除缓存(比如文章内容更新,访客评论,阅读数刷新),不然网站一直显示的是缓存的内容,那就适得其反了。
针对fastcgi_cache的方式有一个专门的WordPress插件来完成自动清理缓存工作,叫做Nginx Helper
在WordPress后台安装这个插件,激活并按照下面所示配置其他选项
缓存清理的行为是直接删除本机上存储的缓存文件,这个路径名由变量RT_WP_NGINX_HELPER_CACHE_PATH定义,因此还需要在WordPress根目录下的wp-config.php中新增一行.
1 |
[crayon-6007a731a895b236499958 inline="true" class="php"]define("RT_WP_NGINX_HELPER_CACHE_PATH", "/tmp/wpcache"); |
[/crayon]
效果
设置完成后,重启php和nginx服务,然后在浏览器打开站点,F12调出调试栏。在页面的response header中会多出一个X-Cache标志。
– 如果状态为HIT,则表示命中缓存。
– 如果状态为MISS,表示没有命中缓存,缓存需要生成。
– 如果状态为BYPASS,表示根据nginx规则不生成缓存。
压力测试
经过这样的配置以后,再运行一次压力测试看看性能如何。
测试配置为每秒500个并发连接持续30秒,看看服务器响应速度和出错率。
– 并发数量最高能处理每秒1000个,测试后半段维持每秒500个,相应时间测试开始时超过3000ms,后来就维持在200ms以内。
– 出口速度大概14MB/s,对应带宽112Mbps,这速度让国内的云主机的小水管情何以堪。
总结
经过这次站点全静态化的配置,服务相应能力大幅提升,比WP Super Cache优化性能更好。
服务器端的全静态化,如果再搭配CloudFlare的CDN加速缓存,会带来一些副作用,导致源主机的更新不能及时体现到CDN镜像上,这一点还需要进一步研究。
本文出自扉启博客,转载时请注明出处及相应链接。
本文永久链接: https://www.feiqy.com/fastcgi_cache/
近期评论