找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 107|回复: 0

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

[复制链接]

205

主题

172

回帖

6921

积分

论坛元老

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


安装luajit2.0

git的安装可以参考:http://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



安装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



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"]
  •                         sql="select content from cache_modify where domain='"..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
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 03:38 , Processed in 0.102112 second(s), 20 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表