• Openresty 进行路由系统设计


    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
  • 相关阅读:
    eas之得到当前选中的行id
    eas之关于数字精度的设置
    eas之使用值对象集合给ComboBox控件赋值
    eas之使用枚举给ComboBox控件赋值
    eas之删除类别时刷新当前结点的父结点,并定位到当前结点的父结点。
    eas之修改类别时刷新当前结点的父结点,并定位到当前结点
    eas之手工发送消息
    【阿里云开发】- 安装MySQL数据库
    【阿里云开发】- 安装JDK
    【开发笔记】- Java读取properties文件的五种方式
  • 原文地址:https://www.cnblogs.com/zhengyionline/p/10365213.html
Copyright © 2020-2023  润新知