nginx_lua模块基于mysql数据库动态修改网页内容

最近要实现一个需求,根据查询mysql数据库返回的内容,插入到网页底部。目前前端是用varnish作的缓存,刚开始想从varnish下手,但官方varnish不支持修改网页内容,要支持的话还需要自己修改源码实现,这个有点难度放弃了,于是想在varnish的后端架设一台nginx的反向代理服务器获取网页内容,然后通过nginx_lua模块实现查询mysql数据库动态修改网页的功能。下面是使用nginx_lua模块的方法,记录一下方便下次查询。

安装luajit2.0

git的安装可以参考:https://www.centos.bz/2012/09/centos-install-git/

  1. cd /tmp/
  2. git clone http://luajit.org/git/luajit-2.0.git
  3. cd luajit-2.0/
  4. make && make install
  5. ln -sf luajit-2.0.0-beta10 /usr/local/bin/luajit
  6. ln -sf /usr/local/lib/libluajit-5.1.so.2 /usr/lib/

下载ngx_devel_kit、lua-nginx-module和nginx

  1. cd /tmp
  2. git clone http://github.com/simpl/ngx_devel_kit.git
  3. git clone http://github.com/chaoslawful/lua-nginx-module.git
  4. wget http://nginx.org/download/nginx-1.2.3.tar.gz

安装nginx

  1. tar xzf nginx-1.2.3.tar.gz
  2. cd nginx-1.2.3
  3. export LUAJIT_LIB=/usr/local/lib
  4. export LUAJIT_INC=/usr/local/include/luajit-2.0
  5. ./configure --prefix=/usr/local/nginx --add-module=/tmp/ngx_devel_kit --add-module=/tmp/lua-nginx-module
  6. make && make install

安装lua-resty-mysql

  1. cd /tmp
  2. git clone http://github.com/agentzh/lua-resty-mysql.git
  3. cd lua-resty-mysql/
  4. make install

nginx配置文件

  1. server {
  2.         ......
  3.         ......
  4.                resolver 8.8.8.8;
  5.     location / {
  6.         default_type  text/html;
  7.         content_by_lua_file "/usr/local/nginx/conf/lua";
  8. }
  9.     location /proxy {
  10.                 internal;
  11.                 proxy_pass $scheme://$http_host$request_uri;
  12.                 proxy_set_header Accept-Encoding '';
  13.                  proxy_redirect          off;
  14.     }
  15.        ......
  16.        ......
  17.          }

lua内容

  1. if (ngx.req.get_method()=="GET") then
  2.         data=ngx.location.capture("/proxy")
  3.         if data.status == 200 then
  4.                 if data.header["Content-Type"] and string.find(data.header["Content-Type"],"html") then
  5.  
  6.                         --mysql connect begin
  7.                         local mysql = require "resty.mysql"
  8.                         local db, err = mysql:new()
  9.                         if not db then
  10.                                 ngx.say("failed to instantiate mysql: ", err)
  11.                                 return
  12.                         end
  13.                         db:set_timeout(1000) -- 1 sec
  14.                         ok, err, errno, sqlstate = db:connect{
  15.                                 host = "127.0.0.1",
  16.                                 port = 3306,
  17.                                 database = "proxy",
  18.                                 user = "root",
  19.                                 password = "537817",
  20.                                 compact_arrays=true,
  21.                                 max_packet_size = 1024 * 1024 }
  22.                         if not ok then
  23.                                 ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)
  24.                                 return
  25.                         end
  26.                         host=ngx.req.get_headers()["Host"]
  27.                        "..host.."'"
  28.                         res, err, errno, sqlstate = db:query(sql)
  29.                         if not res then
  30.                                 ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")
  31.                                 return
  32.                         end
  33.                         --mysql connect end
  34.  
  35.                         if table.getn(res)==0 then
  36.                                 for k,v in pairs(data.header) do
  37.                                 ngx.header[k]=v
  38.                                 end
  39.                                 ngx.say(data.body)
  40.                         else
  41.                                 for k,v in pairs(data.header) do
  42.                                         if (k=="Content-Length") then
  43.                                                 ngx.header["Content-Length"]=""
  44.                                         else
  45.                                                 ngx.header[k]=v
  46.                                         end
  47.                                 end
  48.                                 body,_=string.gsub(data.body,"</body>",res[1][1].."</body>")
  49.                                 ngx.say(body)
  50.                         end
  51.                 else
  52.                         for k,v in pairs(data.header) do
  53.                                 ngx.header[k]=v
  54.                         end
  55.                         ngx.say(data.body)
  56.                 end;
  57.         else
  58.                 ngx.exec("/proxy")
  59.         end;
  60. else
  61.                 ngx.exec("/proxy");
  62. end;

模块地址:http://wiki.nginx.org/HttpLuaModule

标签:LUANginxMySQL 发布于:2019-11-23 00:48:54