Nginx中间件之Nginx + lua实战


-- /etc/nginx/conf.d/dep.lua
local clientIP = ngx.req.get_headers()["X-Real-IP"]
    or ngx.req.get_headers()["X-Forwarded-For"]
    or ngx.var.remote_addr

local memcached = require "resty.memcached"
local memc, err = memcached:new()
if not memc then
    ngx.log(ngx.ERR, "failed to new memcached: ", err)
    ngx.exit(500)
end

memc:set_timeout(200)

local ok, err = memc:connect("127.0.0.1", 11211)
if not ok then
    ngx.log(ngx.ERR, "memcached connect failed: ", err)
    ngx.exit(500)
end

local res, _, err = memc:get(clientIP)
if err then
    ngx.log(ngx.ERR, "memcached get failed: ", err)
    memc:set_keepalive(10000, 100)
    ngx.exit(500)
end

--ngx.log(ngx.ERR, "memcached connect failed: ", clientIP)

memc:set_keepalive(10000, 100)

if res == "1" then
    ngx.exec("@server_test")
else
    ngx.exec("@server")
end

test2026-06-16 15:57


nginx配置:

server {

    location /hello {
default_type 'text/plain';
content_by_lua 'ngx.say("hello,lua")';
}
location /myip {
default_type 'text/plain';
content_by_lua '
clientIP = ngx.req.get_headers()["x_forwarded_for"]
ngx.say("IP:",clientIP );
';
}
location / {
default_type 'text/plain';
content_by_lua_file /etc/nginx/conf.d/dep.lua;
}
location @server{
proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Connection "";
proxy_pass http://127.0.0.1:8090;
}
location @server_test{
proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Connection "";
proxy_pass http://127.0.0.1:8080;
}


}


test2026-06-16 15:58