1、系统基础设计图为:

用户通过Http访问Openresty(Nginx + Lua), 其中Nginx虚拟主机中配置文件进行Lua脚本加载。
LUA通过nginx内置变量或者http请求中变量来区分不同集群,使用LUA脚本从redis中获取所属集群。
然后通过反向代理到对应集群。
2、 Openresty配置
Nginx主配置文件:
- 1 user nginx;
- 2 worker_processes 4;
- 3 pid logs/nginx.pid;
- 4
- 5 worker_rlimit_nofile 1000000;
- 6
- 7 events {
- 8 use epoll;
- 9 worker_connections 65535;
- 10 }
- 11
- 12 http {
- 13 lua_package_path "/usr/local/openresty/lualib/resty/lrucache/?.lua;;"; # 加载lua自定义模块。
- 14 include mime.types;
- 15 default_type application/octet-stream;
- 16 log_format main '$remote_addr - $remote_user [$time_local] $request $http_host '
- 17 '$status $body_bytes_sent $http_referer '
- 18 '"$http_user_agent" $http_x_forwarded_for '
- 19 '$upstream_addr $upstream_status $upstream_cache_status '
- 20 '$upstream_response_time $request_time';
- 21 access_log logs/access.log main;
- 22 error_log logs/error.log;
- 23 sendfile on;
- 24 tcp_nopush on;
- 25 max_ranges 1;
- 26 keepalive_timeout 120;
- 27 gzip on;
- 28 gzip_min_length 1k;
- 29 gzip_buffers 4 16k;
- 30 gzip_comp_level 2;
- 31 gzip_types application/x-www-form-urlencoded application/pdf text/plain application/x-javascript application/javascript text/css application/xml application/json;
- 32 client_max_body_size 22m;
- 33 client_body_buffer_size 1024k;
- 34 client_header_buffer_size 1024k;
- 35 underscores_in_headers on;
- 36
- 37 location /status {
- 38 stub_status on;
- 39 access_log off;
- 40 allow 127.0.0.1;
- 41 deny all;
- 42 }
- 43 }
- 44 include /data/work/conf/conf.d/*/*.conf;
虚拟主机的配置:
- 1 server {
- 2 listen 80;
- 3 server_name 域名;
- 4 access_log logs/access_80.log main;
- 5 error_log logs/error_80.log;
- 6
- 7
- 8 location / {
- 9 resolver DNS的IP地址 valid=3600; 如果配置文件中使用了域名,需要此配置,不然无法解析DNS。
- 10 set $url ''; 定义变量
- 11 set $upstream_port '80'; 变量赋值
- 12 rewrite_by_lua_file lua/get_upstream_url.lua; 加载lua脚本
- 13 proxy_pass http://$url$request_uri;
- 14 proxy_http_version 1.1;
- 15 proxy_set_header Upgrade $http_upgrade;
- 16 proxy_set_header connection "keep-alive";
- 17 proxy_set_header Host $host;
- 18 proxy_set_header X-Forwarded-Port $server_port;
- 19 proxy_set_header X-Forwarded-For $remote_addr;21 proxy_set_header X-Real-IP $remote_addr;
- 22 proxy_read_timeout 300;
- 23 proxy_send_timeout 300;
- 24 proxy_connect_timeout 90;
- 25 proxy_temp_file_write_size 10240k;
- 26 }
- 27 }
lua 脚本
- local localCache = require("mycache") 本地缓存配置
- local localRes, err = localCache.get(ngx.var.host)
- if localRes ~= nil then
- ngx.var.url = localRes .. ":" .. ngx.var.upstream_port
- return
- else
- local redis = require "resty.redis"
- local red = redis:new()
- red:set_timeout(1000)
- local ok, err = red:connect("redis地址", 6379)
- if not ok then
- ngx.log(ngx.ERR, "failed to connect: ", err)
- return
- end
- local res, err = red:hget("hosts", ngx.var.host)
- if not res then
- ngx.log(ngx.ERR, "failed to get host: ", err)
- return
- end
- if res == ngx.null then
- ngx.log(ngx.ERR, "host not found.")
- ngx.var.url = "异常网址"
- return
- else
- localCache.set(ngx.var.host, res)
- ngx.var.url = res .. ":" .. ngx.var.upstream_port
- end
- local ok, err = red:set_keepalive(10000, 100)
- if not ok then
- ngx.log(ngx.ERR, "failed to set keepalive: ", err)
- return
- end
- end
自定义本地缓存的lua模块脚本
- 1 local _M = {}
- 2
- 3 local lrucache = require "resty.lrucache"
- 4
- 5 local c, err = lrucache.new(10000)
- 6 if not c then
- 7 return error("failed to create the cache: " .. (err or "unknown"))
- 8 end
- 9
- 10 function _M.get(host)
- 11 local key = c:get(host)
- 12 return key
- 13 end
- 14
- 15 function _M.set(host, key)
- 16 c:set(host, key, 3600)
- 17 local res = c:get(host)
- 18 end
- 19
- 20 return _M