local backendInfo, err = red:hmget(subdomain, 'backend', 'dbserver', 'dbpassword', 'staticserver')
if backendInfo[1] == nil then --problem here
ngx.log(ngx.ERR, "failed to get backend info by subdomain key: ", err)
ngx.exit(ngx.HTTP_NOT_FOUND)
end
if not backendInfo
if backandInfo == ''
if backandInfo == nil
--Выбирает параметры из редис по ключу (субдомен)
local subdomain = ngx.var.subdomain
if not subdomain then
ngx.log(ngx.ERR, "no user-agent found")
return ngx.exit(400)
end
local redis = require "resty.redis"
local red = redis:new()
local ok, err = red:connect("127.0.0.1", 6379)
if not ok then
ngx.log(ngx.ERR, "failed to connect to redis: ", err)
ngx.exit(ngx.HTTP_NOT_FOUND)
end
local backendInfo, err = red:hmget(subdomain, 'backend', 'dbserver', 'dbpassword', 'staticserver')
if backendInfo[1] == nil then --problem
ngx.log(ngx.ERR, "failed to get backend info by subdomain key: ", err)
ngx.exit(ngx.HTTP_NOT_FOUND)
end
if backendInfo == ngx.null then
ngx.log(ngx.ERR, "no backendInfo found for key ", key)
ngx.exit(ngx.HTTP_NOT_FOUND)
end
--This is for proxy_pass to backend (proxy_pass http://$backend)
ngx.var.backend = backendInfo[1]
--Theese these passed to php-fpm as headers (proxy_set_header > fastcgi_param)
ngx.var.dbserver = backendInfo[2]
ngx.var.dbpassword = backendInfo[3]
ngx.var.staticserver = backendInfo[4]-- OPENRESTY SIMPLE REDIS BASED LOAD BALANCING
--
-- Data required for backend server is redis hash:
--------------------------------------------------
-- hset subdomain-name backend '127.0.0.1:8080' (For NGINX could proxy pass to this ip)
-- hset subdomain-name dbserver 'localhost' --Pass to backend as header (to connect to DB server)
-- hset subdomain-name dbpassword 'somePassword' --Pass to backend as header (to connect to DB server)
-- hset subdomain-name staticserver 'some.cdn.forstaticcontent.com' --Pass to backend as header (URL of CDN)
--------------------------------------------------
local redis = require "resty.redis"
-- Value of variable $subdomain extracted from server_name directive in nginx.conf like that:
--------------------------------------------------
-- server_name ~^(.+)\.site\.com$;
-- set $subdomain $1;
--------------------------------------------------
local subdomain = ngx.var.subdomain
local red = redis:new()
red:set_timeout(1000) -- 1 second
local redisConnectionEestablished, connectionError = red:connect("127.0.0.1", 6379)
-- If cannot connect to redis server - log connection error to NGINX error.log
-- and stop script execution with HTTP_INTERNAL_SERVER_ERROR (500)
if not redisConnectionEestablished then
ngx.log(ngx.ERR, "Connection to redis server failed, returned error: ", connectionError)
return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
end
-- Trying to get hash from redis by key (sumdomain)
local backendInfo, getKeyError = red:hmget(subdomain, 'backend', 'dbserver', 'dbpassword', 'staticserver')
-- First check for internal errors like network failure etc.
-- See below
if not backendInfo then -- Or "if backendInfo == nil" all the same
ngx.log(ngx.ERR, "Failed to do get hash value from redis, returned error: ", err)
return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
end
-- After check for internal errors (above) check if redis key realy exists
-- See below
if backendInfo[1] == ngx.null then -- IMPORTANT: Do not confuse nil with ngx.null they are entirely different
ngx.log(ngx.ERR, "Failed to get backend server for subdomain ", subdomain)
return ngx.exit(ngx.HTTP_NOT_FOUND) -- Return 404 error
end
--Set NGINX $backend variable. Later NGINX will proxy pass to specified backend like that:
--------------------------------------------------
-- proxy_pass http://$backend
--------------------------------------------------
ngx.var.backend = backendInfo[1]
--Theese passed to backend (like php-fpm) as headers
--------------------------------------------------
-- proxy_set_header $dbserver;
--------------------------------------------------
-- And then backend will:
--------------------------------------------------
-- fastcgi_param dbserver $dbserver;
--------------------------------------------------
ngx.var.dbserver = backendInfo[2]
ngx.var.dbpassword = backendInfo[3]
ngx.var.staticserver = backendInfo[4]