最近要实现一个需求,根据查询mysql数据库返回的内容,插入到网页底部。目前前端是用varnish作的缓存,刚开始想从varnish下手,但官方varnish不支持修改网页内容,要支持的话还需要自己修改源码实现,这个有点难度放弃了,于是想在varnish的后端架设一台nginx的反向代理服务器获取网页内容,然后通过nginx_lua模块实现查询mysql数据库动态修改网页的功能。下面是使用nginx_lua模块的方法,记录一下方便下次查询。
安装luajit2.0
git的安装可以参考:https://www.centos.bz/2012/09/centos-install-git/
- cd /tmp/
- git clone http://luajit.org/git/luajit-2.0.git
- cd luajit-2.0/
- make && make install
- ln -sf luajit-2.0.0-beta10 /usr/local/bin/luajit
- ln -sf /usr/local/lib/libluajit-5.1.so.2 /usr/lib/
下载ngx_devel_kit、lua-nginx-module和nginx
- cd /tmp
- git clone http://github.com/simpl/ngx_devel_kit.git
- git clone http://github.com/chaoslawful/lua-nginx-module.git
- wget http://nginx.org/download/nginx-1.2.3.tar.gz
安装nginx
- tar xzf nginx-1.2.3.tar.gz
- cd nginx-1.2.3
- export LUAJIT_LIB=/usr/local/lib
- export LUAJIT_INC=/usr/local/include/luajit-2.0
- ./configure --prefix=/usr/local/nginx --add-module=/tmp/ngx_devel_kit --add-module=/tmp/lua-nginx-module
- make && make install
安装lua-resty-mysql
- cd /tmp
- git clone http://github.com/agentzh/lua-resty-mysql.git
- cd lua-resty-mysql/
- make install
nginx配置文件
- server {
- ......
- ......
- resolver 8.8.8.8;
- location / {
- default_type text/html;
- content_by_lua_file "/usr/local/nginx/conf/lua";
- }
- location /proxy {
- internal;
- proxy_pass $scheme://$http_host$request_uri;
- proxy_set_header Accept-Encoding '';
- proxy_redirect off;
- }
- ......
- ......
- }
lua内容
- if (ngx.req.get_method()=="GET") then
- data=ngx.location.capture("/proxy")
- if data.status == 200 then
- if data.header["Content-Type"] and string.find(data.header["Content-Type"],"html") then
-
- --mysql connect begin
- local mysql = require "resty.mysql"
- local db, err = mysql:new()
- if not db then
- ngx.say("failed to instantiate mysql: ", err)
- return
- end
- db:set_timeout(1000) -- 1 sec
- ok, err, errno, sqlstate = db:connect{
- host = "127.0.0.1",
- port = 3306,
- database = "proxy",
- user = "root",
- password = "537817",
- compact_arrays=true,
- max_packet_size = 1024 * 1024 }
- if not ok then
- ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)
- return
- end
- host=ngx.req.get_headers()["Host"]
- "..host.."'"
- res, err, errno, sqlstate = db:query(sql)
- if not res then
- ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".")
- return
- end
- --mysql connect end
-
- if table.getn(res)==0 then
- for k,v in pairs(data.header) do
- ngx.header[k]=v
- end
- ngx.say(data.body)
- else
- for k,v in pairs(data.header) do
- if (k=="Content-Length") then
- ngx.header["Content-Length"]=""
- else
- ngx.header[k]=v
- end
- end
- body,_=string.gsub(data.body,"</body>",res[1][1].."</body>")
- ngx.say(body)
- end
- else
- for k,v in pairs(data.header) do
- ngx.header[k]=v
- end
- ngx.say(data.body)
- end;
- else
- ngx.exec("/proxy")
- end;
- else
- ngx.exec("/proxy");
- end;
模块地址:http://wiki.nginx.org/HttpLuaModule