NGINX + LUA实现复杂的控制

时间:16-01-19 来源: 作者: 点击:

安装lua_nginx_module 模块

lua_nginx_module 可以一步步的安装,也可以直接用淘宝的OpenResty

Linux学习, linux.it.net.cn

Centos和debian的安装就简单了。。

Linux学习, linux.it.net.cn

这里说下freebsd的安装:

IT网,

tar zxvf luagz cd lua make freebsd make install cd .. fetch https://github.com/chaoslawful/lua-nginx-module/zipball/v0.1.6rc2 fetch https://github.com/simpl/ngx_devel_kit/zipball/v0.2.17rc2 tar zxvf v0.1.6rc2 mv chaoslawfulccaf132 lua_nginx_module tar zxvf v0.2.17rc2 mv simplbc97eea ngx_devel_kit tar zxvf pcregz tar zxvf nginxgz cd nginxlua_nginx_module make && make install

IT网,

安装完成后,我们体验一下lua

IT网,

第一个lua脚本

ngx.say 是打印的打印输出的意思。。。 Linux学习, linux.it.net.cn

default_type text echo hello lua;} location default_type text content_by_lua

Linux学习, linux.it.net.cn

用lua脚本做nginx的访问的限制... proxy_pass http location default_type text content_by_lua 'ngx.say("this is ruifengyun.com!")'; access_by_lua ' if ngx.var.remote_addr == "10.2.20.110" then ngx.exit(ngx.HTTP_FORBIDDEN) end if ngx.var.remote_addr == "10.2.20.112" then ngx.exec("@client") end ';}

Linux学习, linux.it.net.cn

控制经过判断之后,才能访问 IT网,

access_by_lua ' local res = ngx.location.capture("/auth") if res.status == ngx.HTTP_OK then return end if res.status == ngx.HTTP_FORBIDDEN then ngx.exit(res.status) end ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) 'Linux学习, linux.it.net.cn 使用lua做nginx的rewrite跳转

这个是先判断 check-pam接口的return的内容是不是spam,是的话,转跳到其他的页面 Linux学习, linux.it.net.cn

rewrite_by_lua ' local res = ngx.location.capture("/check-spam") if res.body == "spam" then ngx.redirect("/terms-of-use.html") end '} IT网, 根据ip做不同的响应 content_by_lua ' myIP = ngx.req.get_headers()["X-Real-IP"] if myIP == nil then myIP = ngx.req.get_headers()["x_forwarded_for"] end if myIP == nil then myIP = ngx.var.remote_addr end if myIP == "" then ngx.exec("@client") else ngx.exec("@client_test") end ';}

IT网,

redirect的使用 IT网,

返回302临时重定向 地址栏会显示跳转后的地址

IT网,

lua过滤post过来的参数 content_by_lua ' ngx.req.read_body() local args = ngx.req.get_post_args() for key, val in pairs(args) do if type(val) == "table" then ngx.say(key, ": ", table.concat(val, ", ")) else ngx.say(key, ": ", val) end end '

一个Lua的例子: Linux学习, linux.it.net.cn

#!/usr/bin/env lua ngxuri ngx ngx ngx ngx ngx ngx ngx lua 调用mysql的例子 error_log logs events { worker_connections http { upstream backend { drizzle_server mysql dbname drizzle_keepalive max} server { listen 8080; location set_unescape_uri $name $arg_name; set_quote_sql_str $name; drizzle_query 'select * from cats where name=$name'; drizzle_pass backend; rds_json on;} location set_quote_sql_str $id $arg_id; drizzle_query 'select * from cats where id=$id'; drizzle_pass backend; rds_json on;} location access_by_lua ' if ngx.var.arg_name then return ngx.exec("@cats-by-name") end if ngx.var.arg_id then return ngx.exec("@cats-by-id") end '; rds_json_ret

改改密码就能用啦~

Linux学习, linux.it.net.cn

lua获取url中的参数 set_by_lua $res " local a = tonumber(ngx.arg[1]) local b = tonumber(ngx.arg[2]) return a + b" $arg_a $arg_b; echo $res

ngx.req.set_uri Linux学习, linux.it.net.cn

nginx里面的配置是:

IT网,

rewrite proxy_pass http

Linux学习, linux.it.net.cn

声明:本文转载于网络,文章链接:http://www.nd9p.com/758.html