map $http_upgrade $connection_upgrade { default Upgrade; '' close; } server { listen 80; include autossl.conf; set_real_ip_from 192.168.1.0/24; real_ip_header X-Real-IP; real_ip_recursive on; location / { set $target ''; set $target_scheme 'http'; set $target_port ''; set $header_host $host; access_by_lua { function getTargetInfo(domain, targetInfo) if targetInfo then ngx.log(ngx.ERR, "!!!!!!! getTargetInfo targetFound") return targetInfo end local json = require "cjson" local redis = require "resty.redis" local socket = assert(require "socket.unix"()) local domain, err = ssl.server_name() ngx.log(ngx.ERR, "!!!!!! nginx.conf request_domain !!!!!!!", domain) local function connect(path) assert(socket:settimeout(.1)) local status,err = pcall(function() assert(socket:connect(path)) end) if status then return true end return false end if not domain then ngx.log(ngx.ERR, "no host header found") ngx.exit(499) return false end local red = redis:new() red:set_timeout(1000) -- 1 second local ok, err = red:connect("127.0.0.1", 6379) if not ok then ngx.log(ngx.ERR, "failed to connect to redis: ", err) return ngx.exit(598) end local res, err = red:hgetall("proxy_Host_"..domain) local res = red:array_to_hash(res) if not res["ip"] then if connect("/var/run/proxy_lookup.socket") then assert(socket:send(json.encode({domain = domain}))) while 1 do local s, status, partial = socket:receive() if partial then res = json.decode(partial) socket:close() break end end end end if not res["ip"] then ngx.say('The domain is not allowed on this server.') ngx.exit(406) return false end ngx.ctx.targetInfo = res ngx.ctx.toAllow = true; end local host = ngx.var.host local uri = ngx.var.uri local scheme = ngx.var.scheme local res = getTargetInfo(host, ngx.ctx.targetInfo) if scheme == "http" then if res["forcessl"] == "true" then return ngx.redirect("https://"..host..uri, 301) end end if res["targetssl"] == "true" then ngx.var.target_scheme = "https" end if res["host-pass-though"] == "false" then ngx.var.header_host = res["ip"] end ngx.var.target = res["ip"] ngx.var.target_port = res["targetPort"] } resolver 192.168.1.1 ipv6=off; #8.8.4.4; # use Google's open DNS server proxy_http_version 1.1; proxy_pass_request_headers on; proxy_pass $target_scheme://$target:$target_port; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_ssl_session_reuse on; proxy_intercept_errors off; proxy_set_header Host $header_host; add_header X-Target-Host $target; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $target_scheme; proxy_set_header Referer $target_scheme://$header_host; proxy_set_header Accept-Language $http_accept_language; proxy_set_header User-Agent $http_user_agent; sub_filter $target $host; sub_filter_once off; } }