nginx根据报文里字段转发至不同地址

nginx接收到post请求.请求报文里是一个json字符串,字符串里有个字段id。

根据id不同,转发到不同地址。

如果id=aaa,转发到www.aaa.com.test

如果id=bbb,转发到www.bbb.com.test

如何配置,请提供一个nginx.conf

要在 Nginx 中根据 POST 请求的 JSON 负载中的 id 字段的值进行转发,你可以使用 Nginx 的 ngx_http_lua_module 模块,这个模块允许你在 Nginx 配置中使用 Lua 脚本。下面是一个示例配置,它展示了如何根据 POST 请求的 JSON 负载中的 id 字段的值来转发请求。

首先,确保你的 Nginx 已经安装了 lua-nginx-modulelua-resty-http 库。这些可以通过 OpenResty 来安装,OpenResty 是一个集成了常用模块的 Nginx 发行版。

安装 OpenResty

你可以通过以下命令安装 OpenResty(假设你使用的是基于 Debian 的系统,如 Ubuntu):

bash 复制代码
sudo apt-get update
sudo apt-get install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyring
curl -O https://openresty.org/package/pubkey.gpg
sudo apt-key add pubkey.gpg
sudo apt-get install -y apt-transport-https
echo "deb https://openresty.org/package/debian $(lsb_release -sc) openresty" | sudo tee /etc/apt/sources.list.d/openresty.list
sudo apt-get update
sudo apt-get install -y openresty

Nginx 配置 (nginx.conf)

下面是一个示例的 nginx.conf 配置,它使用 Lua 脚本来解析 POST 请求的 JSON 负载,并根据 id 字段的值转发请求。

nginx 复制代码
http {
    lua_package_path "/usr/local/openresty/luajit/share/lua/5.1/?.lua;;";
    lua_shared_dict my_cache 10m;

    server {
        listen 80;

        location / {
            content_by_lua_block {
                -- 读取 POST 请求体
                ngx.req.read_body()
                local data = ngx.req.get_body_data()

                if not data then
                    ngx.status = ngx.HTTP_BAD_REQUEST
                    ngx.say("No request body found")
                    return ngx.exit(ngx.HTTP_BAD_REQUEST)
                end

                -- 解析 JSON
                local cjson = require "cjson.safe"
                local json_data = cjson.decode(data)

                if not json_data or not json_data.id then
                    ngx.status = ngx.HTTP_BAD_REQUEST
                    ngx.say("Invalid JSON or missing 'id' field")
                    return ngx.exit(ngx.HTTP_BAD_REQUEST)
                end

                local id = json_data.id
                local target_url

                if id == "aaa" then
                    target_url = "http://www.aaa.com.test"
                elseif id == "bbb" then
                    target_url = "http://www.bbb.com.test"
                else
                    ngx.status = ngx.HTTP_NOT_FOUND
                    ngx.say("Unknown 'id' value")
                    return ngx.exit(ngx.HTTP_NOT_FOUND)
                end

                -- 创建 HTTP 客户端并转发请求
                local http = require "resty.http"
                local httpc = http.new()
                local res, err = httpc:request_uri(target_url, {
                    method = ngx.var.request_method,
                    body = data,
                    headers = ngx.req.get_headers(),
                    keepalive = false,
                })

                if not res then
                    ngx.status = ngx.HTTP_INTERNAL_SERVER_ERROR
                    ngx.say("Failed to forward request: ", err)
                    return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
                end

                -- 设置响应头
                for k, v in pairs(res.headers) do
                    ngx.header[k] = v
                end

                -- 发送响应体
                ngx.status = res.status
                ngx.print(res.body)

                -- 关闭 HTTP 客户端
                httpc:close()
            }
        }
    }
}

解释

  1. lua_package_pathlua_shared_dict:设置 Lua 模块的搜索路径和共享字典。
  2. serverlocation:定义一个服务器块和一个位置块来处理进入的请求。
  3. content_by_lua_block:使用 Lua 脚本处理请求。
  4. ngx.req.read_body():读取 POST 请求体。
  5. cjson.decode(data):解析 JSON 数据。
  6. 条件判断 :根据 id 字段的值决定目标 URL。
  7. resty.http :使用 resty.http 模块创建 HTTP 客户端并转发请求。
  8. 设置响应头和状态:将目标服务器的响应头和状态码传递给客户端。
  9. 发送响应体:将目标服务器的响应体发送给客户端。

确保你安装了 lua-cjsonlua-resty-http 库,这通常在使用 OpenResty 时已经包含在内。如果你手动安装 Nginx 和 Lua 模块,则需要确保这些库可用。

重启 Nginx

在修改完 nginx.conf 后,不要忘记重启 Nginx 以应用新的配置:

bash 复制代码
sudo systemctl restart nginx

这样,Nginx 将能够根据 POST 请求的 JSON 负载中的 id 字段的值来转发请求。

相关推荐
lht63193561234 分钟前
从Windows通过XRDP远程访问和控制银河麒麟 v10服务器
linux·运维·服务器·windows
3DVisionary1 小时前
从手动到智能:XTOM-STATION自动化检测中心在复杂曲面零件全尺寸检测中的应用
运维·自动化·自动驾驶·工业自动化·质量控制·自动化3d测量·复杂零件检测
阿豪学编程1 小时前
环境变量与程序地址空间
linux·运维·windows
佐杰2 小时前
什么是DevOps
运维·devops
CaracalTiger2 小时前
本地部署 Stable Diffusion3.5!cpolar让远程访问很简单!
java·linux·运维·开发语言·python·微信·stable diffusion
梁萌3 小时前
linux中使用docker安装MySQL
linux·运维·docker·容器·mysql安装
文言一心3 小时前
SenseVoice 离线部署指南(Xinference Docker v1.12)
运维·docker·ai·容器
AIchiNiurou3 小时前
mermaid install for free docker
运维·docker·容器
wei_shuo3 小时前
智能运维×低资源占用:金仓数据库助力能源企业降本增效与国产化替换实践
运维·数据库·king base
❀͜͡傀儡师3 小时前
根据docker服务保存日志脚本,时间可选版本
运维·docker·容器