转载请注明文章出处: https://tlanyan.me/nginx-conf...
在尝试Ghost中提到过托管博客的VPS因为内存不足致使服务宕机。今天意识到能够经过Nginx缓存避免请求落到PHP和MySQL端,提高总体性能。此外博客发布后不多改动,读多写少,是使用缓存(或静态化)的好场景。php
Nginx提供了基于代理(proxy)和基于fastcgi的两种缓存方式,二者指令集十分类似,使用上差异不大。因为本站博客采用Nginx+PHP-FPM架构,故而使用基于fastcgi的缓存,即fastcgi cache。html
fastcgi cache的机制是将后端CGI服务返回的页面缓存起来,后续请求到来时直接返回页面,省去与后端服务通讯及生成页面的消耗。fastcgi cache与squid、varnish、CDN等原理相似,因为减小了后端请求,原则上性能会比WordPress的各类缓存插件高出许多。nginx
fastcgi cache隶属于fastcgi模块,而fastcgi模块又归属于http模块,因此与缓存相关的配置应当都出如今这两个及下属配置块中(主要是http, server和location)。后端
根据官方文档,博客站点采用的缓存配置以下:缓存
http { ... fastcgi_connect_timeout 30s; # 全局设置, fastcgi_cache_path只能出如今http配置块中 # fastcgi_cache_path设置全局的缓存路径、文件大小等,可屡次出现设置不一样的缓存池 fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=WORDPRESS:10m inactive=10m max_size=500m; fastcgi_cache_key $scheme$request_method$host$request_uri; # 设置使用过时缓存的情形:后端错误、超时等 fastcgi_cache_use_stale error timeout invalid_header http_500 http_503; ... server { ... # 缓存策略指示变量 set $skip_cache 0; # 缓存策略 if ($query_string != "") { set $skip_cache 1; } if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|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$ { ... # 使用的keyzone,这里使用http中定义的WORDPRESS fastcgi_cache WORDPRESS; # 是否跳过缓存 fastcgi_cache_bypass $skip_cache; fastcgi_no_cache $skip_cache; # 后端返回成功的状况下缓存10分钟 fastcgi_cache_valid 200 10m; # 添加header字段,指示缓存命中状态(调试使用) add_header X-Cache $upstream_cache_status; } } }
上述配置作了如下工做:cookie
重启Nginx,而后访问页面,查看页面的header状态和响应时间。能够看到,请求一次事后(次数可经过fastcgi_cache_min_uses
设置),后续请求都从缓存请求(X-Cache值为HIT),速度提高很是明显。对于管理后台页面,x-cache
的值为BYPASS
,正是咱们须要的。架构
开源版的Nginx不能自动清除缓存,当文章变更或者有新评论时不能当即更新页面。要达到此目的,可以使用商业版Nginx或者经过开源插件解决,详情查看此文。wordpress