OpenResty使用Lua实现动态路由的脚本

OpenResty使用Lua实现动态路由,根据地址的路径路由到不同的K8s服务上。

# 添加 http 前的基础配置
worker_processes 1;

events {
    worker_connections 65535;
}

http {
    resolver kube-dns.kube-system.svc.cluster.local;
    # resolver 8.8.8.8 8.8.4.4 valid=300s; # 使用Google的公共DNS服务器
    resolver_timeout 10s; # 设置DNS解析超时时间为10秒

    server {
        listen 8000;

        location / {
            # 定义变量 target 并设置一个默认值
            set $target "";
            set $new_uri "";

            # 使用 Lua 脚本动态生成目标上游地址
            access_by_lua_block {
                local uri = ngx.var.uri  -- 获取请求的 URI
                local match = string.match(uri, "^/game(%d+)")
                
                if match then
                    local game_id = tonumber(match)
                    if game_id >= 1 and game_id <= 1000 then
                        -- 假设游戏服在 "default" 命名空间中,生成完整的 Kubernetes 服务地址
                        -- local upstream_url = "http://game" .. game_id .. ".default.svc.cluster.local"
                        local upstream_url = "http://127.0.0.1/game" .. game_id .. ".php"
                        ngx.var.target = upstream_url
                        ngx.var.new_uri = string.gsub(uri, "^/game" .. match, "")
                    else
                        -- 如果游戏服 ID 超出范围,返回 404
                        ngx.exit(404)
                    end
                else
                    -- 如果请求不匹配 /gameN 格式,返回 404
                    ngx.exit(404)
                end
            }

            # 将 Lua 变量 target 传递给 proxy_pass
            proxy_pass $target$new_uri$is_args$args;
            proxy_set_header Host $host;
            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 $scheme;

            # WebSocket支持
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_read_timeout 86400;  # 根据需要调整超时时间
        }
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容