Typecho使用Nginx FastCGI缓存

网站使用缓存后可以显著提高网页加载速度,降低服务器压力,Typecho的缓存插件TpCache是使用memcached或redis进行缓存的,实际上还是要通过PHP来获取,实际请求需要经过Nginx+PHP,还不够快。那么可不可以直接使用Nginx进行缓存,缓存命中之后直接返回缓存资源呢?用FastCGI_Cache吧!

配置

下面是我的配置。

Nginx配置代码:

fastcgi_cache_path /tmp/fastcgi_cache_dir levels=1:2 keys_zone=xxvv:500m inactive=1h max_size=1g;
fastcgi_temp_path /www/server/nginx/fastcgi_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;

网站配置代码:

#使用缓存
set $skip_cache 0;
#post请求不使用缓存
if ($request_method = POST) {
  set $skip_cache 1;
}
#url包含参数不使用缓存
if ($query_string != "") {
  set $skip_cache 1;
}
#指定url不使用缓存
if ($request_uri ~* ^(/admin/|/action/|/rss.php)) {
  set $skip_cache 1;
}
#url包涵关键词不使用缓存
if ($request_uri ~* (comment-page)) {
  set $skip_cache 1;
}
#登录/评论用户不使用缓存
if ($http_cookie ~* (typecho_authCode|typecho_remember)) {
  set $skip_cache 1;
}
    location ~ [^/]\.php(/|$)
    {
        try_files $uri =404;
        fastcgi_pass  unix:/tmp/php-cgi-82.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
        include pathinfo.conf;
        
  add_header Cache-Status $upstream_cache_status;
  add_header Strict-Transport-Security "max-age=31536000";
        if ($request_uri ~* ^(/archives/)) {
            add_header Cache-Control "max-age=3600";
            add_header Cache-Status $upstream_cache_status;
            add_header Strict-Transport-Security "max-age=31536000";
        }
  fastcgi_cache_bypass $skip_cache;
  fastcgi_no_cache $skip_cache;
  fastcgi_cache xxvv;
  fastcgi_cache_valid any 3h;
 
  header_filter_by_lua_block {
    --if ngx.status == ngx.HTTP_OK then
      --ngx.header['Cache-Status'] = ngx.var.upstream_cache_status
    --end
    if ngx.var.upstream_cache_status == "HIT" then
      ngx.header['Set-Cookie'] = nil
    end
  }
    }

访问响应值Cache-Status:HIT就大功告成了,即可享受飞一般的速度!

评论者信息被缓存修复

Typecho主题一般使用PHP的函数获取cookies来填充评论者信息,导致了如果用户评论了文章,就会缓存评论者的信息,使用JS获取就不存在此问题。

在评论模板文件comments.php删除以下代码:

<?php $this->remember('author'); ?>
<?php $this->remember('mail'); ?>
<?php $this->remember('url'); ?>
<?php $this->remember("text"); ?>

同时,在合适位置添加以下代码:

<?php if(!$this->user->hasLogin()){ ?>
<script>
function getCookie(name){
    var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
    if(arr=document.cookie.match(reg))
        return unescape(decodeURI(arr[2]));
    else
        return null;
    }
function adduser(){
    document.getElementById('author').value = getCookie('<?php echo md5($this->request->getUrlPrefix()); ?>__typecho_remember_author');
    document.getElementById('mail').value = getCookie('<?php echo md5($this->request->getUrlPrefix()); ?>__typecho_remember_mail');
    document.getElementById('url').value = getCookie('<?php echo md5($this->request->getUrlPrefix()); ?>__typecho_remember_url');
}
adduser();
</script>
<?php } ?>

> 快来说说你的想法吧~