OpenResty
OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
安装及使用请参阅OpenResty官网
Nginx配置
1 2 3 4 5 6 7 8 9
| server { listen 80; server_name yourdomain;
location /webhook { default_type 'text/plain'; content_by_lua_file /your/lua/path/webhook.lua; } }
|
webhook.lua 源码
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
| local GITHUB_WEBHOOK_SECRET = "your github webhook secret"
local request_method = ngx.var.request_method if "POST" ~= request_method then ngx.exit(404) end
local signature = ngx.req.get_headers()["X-Hub-Signature"] if signature == nil then return ngx.exit(404) end
ngx.req.read_body() local req_body = ngx.req.get_body_data() if not req_body then return ngx.exit(404) end
local dt = {} for k, v in string.gmatch(signature, "(%w+)=(%w+)") do dt[k] = v end
local str = require "resty.string"
local digest = ngx.hmac_sha1(GITHUB_WEBHOOK_SECRET, req_body)
if not str.to_hex(digest) == dt["sha1"] then ngx.log(ngx.ERR, "signature error") return ngx.exit(404) end
os.execute("cd /your/blog/repositorie/path/ && git pull"); ngx.say("OK")
|