利用NJet 持久化能力,为Web server增加访问计数

🙈 By 单雷 2024-03-05

利用NJet 持久化能力,为Web server增加访问计数

1. 前言

在一些blog/文档网站中,常常需要增加一些访问留言、访问计数。由于很多网站是静态的,所以需要增加这些动态内容时有些挑战,常常需要在页面中埋点,增加对某些外部公共服务的引入。但实际上NJet具备数据的持久化能力,内置了高性能的KV存储。详见https://njet.org.cn/cases/opennjet_kv_store/,基于这个特性,可以在不依赖任何外部系统(无论是公有云服务,还是企业额外部署的外部数据存储系统)的情况下,使得静态网站增加数据能力,变得动态化。下面就通过为NJet官网本身增加访问计数,来看下如何使用NJet的KV存储能力的。

1. NJet官网介绍

NJet官网是由hugo构建的静态网站,利用hugo,NJet的开发人员可以编写markdown格式的文件,hugo可以把该文件render成blog(hugo的使用请参考https://gohugo.io, 在此不在赘述)。总之,产生的页面如下图所显示,

img

为了对NJet网站的访问者的兴趣点有更好的关注,NJet的社区运维人员想在blog的页面中增加访问计数,比如在作者前面增加。修改目前的“BY {xxx} {date}” 为 “ reading count:{} BY {xxx} {date}”

1.1 修改前端展示:

NJet官网的blog页面模板为themes/universal/layouts/_default/single.html. 所以不需要逐个修改单独的页面,仅仅修改该页面就可以生效。因为我们要在作者前面增加访问计数,所以在该文件中,

{{ if isset .Params "authors" }}
                  {{ i18n "authorBy" }} {{ range $index, 
                  author := .Params.authors }}{{ if  index }}, {{ end }}<a href="{{ (printf "%s/%s" ("authors" | relLangURL) ($author |      
  urlize)) }}">{{ $author }}</a>{{ end }}

上述代码片段前增加:

{{ partial "partials/visit-counter.html" .  }}

并编写:themes/universal/layouts/partials/visit-counter.html,其内容为:

<b id="{{ .File.UniqueID }}" >visit-counter holder </b>
<script>
    var r = new XMLHttpRequest();
    r.addEventListener('load', function() {
        outTxt='reading count:'
        if (this.status== 200) {
            outTxt= outTxt+ parseInt(this.responseText)
        } else 
            outTxt= outTxt+ 'error'
        document.getElementById('{{ .File.UniqueID }}').innerText = outTxt
    })
    r.open('GET', '/counter/?page_id=' + {{ .File.UniqueID }} )
    r.send()
  </script>

这样前端内容就修改完成了。 注:以上的前端修改是基于hugo的某个特定主题的。 如果某个网站是维护的静态页面,则仅仅需要把以上的visit-counter的内容,嵌入到需要展示访问计数的地方。

1.2 后端配置:

•打开njet中lua的支持,在配置文件的主配置节添加:

load_module /usr/local/njet/modules/njt_http_lua_module.so;

•增加对/count的处理,在http->server块内增加location:counter,其内容如下:

location /counter {
     content_by_lua_block {
              local kv = require("njt.kv")
              local args, err = njt.req.get_uri_args()
              local key = args["page_id"]
          local counter=0;
              local rc,msg = kv.db_kv_get(key)
              if rc == 0 then
                 counter= msg
              end
        counter= counter+1
          kv.db_kv_set(key,counter)
          njt.say(counter)
      }
     }


以上代码中,根据传入的查询参数page_id, 更新NJet内置的KV存储中的对应内容,并返回更新的数据。在NJet重起后,可以通过curl http://yourwebsite/counter?page_id=xxx进行测试。可以看到每调用一次返回值从1开始,一直累加。

1.3 展示:

部署新的网站前端后,再次访问,可以看到如下的效果,访问计数展示出来了 img

2. 参考

•NJet kv lua接口,需要NJet2.0以上版本。

•NJet kv能力相信介绍,请参考: https://njet.org.cn/cases/opennjet_kv_store/

•NJet 官网, 基于hugo universal主题构建,由NJet作为web server