gpt4 book ai didi

nginx - 在向上游发送请求之前,先从API获取信息

转载 作者:行者123 更新时间:2023-12-04 11:47:29 24 4
gpt4 key购买 nike

是否可以在位置块中发送http子请求并在proxy_pass指令中使用响应?

用例

我的上游应用程序需要来自API的一些其他信息。
我编写了一个位置块,以proxy_pass指令代理请求。
在nginx将请求发送到我的应用程序之前。我想向我的API发送一个HTTP请求并使用几个响应头
作为我的应用程序的请求 header 。

这是我要实现的概述:

server {
server_name ...;
location {
# perform subrequest to fetch additional information from an api

proxy_pass myapplication;

proxy_set_header X-Additional-Info "some information from the subrequest";
}

}

该行为类似于 auth_request module。但是,我找不到使用标准nginx配置在位置块内之前发送其他阻止HTTP请求的文档。

最佳答案

您不能使用常规的nginx指令来做到这一点,但是使用lua-nginx-module却很容易。

This module embeds Lua, via the standard Lua 5.1 interpreter or LuaJIT 2.0/2.1, into Nginx and by leveraging Nginx's subrequests, allows the integration of the powerful Lua threads (Lua coroutines) into the Nginx event model.



这是完成您需要的方法:
  • 创建目录conf.d/
  • 放入2个文件test.confheader.lua(请参见下面的内容)
  • docker run -p8080:8080 -v your_path/conf.d:/etc/nginx/conf.d openresty/openresty:alpine
  • curl http://localhost:8080/

  • test.conf
      server {
    listen 8080;

    location /fetch_api {
    # this is a service echoing your IP address
    proxy_pass http://api.ipify.org/;
    }

    location / {
    set $api_result "";
    access_by_lua_file /etc/nginx/conf.d/header.lua;
    proxy_set_header X-Additional-Info $api_result;
    # this service just prints out your request headers
    proxy_pass http://scooterlabs.com/echo;
    }
    }

    header.lua
    local res = ngx.location.capture('/fetch_api', { method = ngx.HTTP_GET, args = {} });

    ngx.log(ngx.ERR, res.status);
    if res.status == ngx.HTTP_OK then
    ngx.var.api_result = res.body;
    else
    ngx.exit(403);
    end

    结果
    curl http://localhost:8080/
    Simple webservice echo test: make a request to this endpoint to return the HTTP request parameters and headers. Results available in plain text, JSON, or XML formats. See http://www.cantoni.org/2012/01/08/simple-webservice-echo-test for more details, or https://github.com/bcantoni/echotest for source code.

    Array
    (
    [method] => GET
    [headers] => Array
    (
    [X-Additional-Info] => my-ip-address
    [Host] => scooterlabs.com
    [Connection] => close
    [User-Agent] => curl/7.43.0
    [Accept] => */*
    )

    [request] => Array
    (
    )

    [client_ip] => my-ip-address
    [time_utc] => 2018-01-23T19:25:56+0000
    [info] => Echo service from Scooterlabs (http://www.scooterlabs.com)
    )

    注意 X-Additional-Info header 填充了 /fetch_api处理程序中获得的数据

    关于nginx - 在向上游发送请求之前,先从API获取信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48348647/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com