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