如何在nginx中进行Web服务调用?

Ign*_*tes 6 nginx

什么:

我想在nginx中通过nginx向每个请求发出Web服务请求,并根据我从Web服务获得的响应应用一些进程.

应用:

我使用nginx作为反向代理,并有多个流量路由到的web服务.我想添加一个额外的webservice(让我们称之为AdminService)作为管理员,这项服务将处理安全,计费和其他流量分析和预处理等事情.对于通过nginx的每个请求,我需要向AdminService发出请求,然后管理服务将分析更新某些统计信息等的请求并使用某些标记进行响应.然后,nginx将根据返回的标记更新一些标头,并将请求转发给相应的URL.

我看了一下Lua模块,它似乎没有进行webservice调用.我也看到有Java,Groovy和Clojure模块可用,这也许是我应该看的东西?否则我应该怎么看?

Ste*_* E. 6

一种选择是使用auth_request模块.它不是为您的场景设计的,并不是默认的Nginx模块,因此您需要从源代码构建以使用./configure --with-http_auth_request_module进行编译.

auth_request用于通过远程HTTP调用预先验证Nginx请求.只要响应头是HTTP 200,就会正常处理初始请求.这可以用于将请求发送到您的AdminService,并且响应将能够确定接下来发生的事情.

就像是:

# Default location
location / {
    auth_request /AdminService;

    # Look for X_UpstreamHost: header in the response
    auth_request_set $x_upstreamhost $upstream_http_x_upstreamhost;

    # Use the value of the response header to choose the internal processing host
    proxy_pass http://$x_upstreamhost;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $remote_addr;

}

# Send requests for AdminService to the AdminService
# This expects AdminService to be listening on a path called AdminService
# and based at ##adminip##
location /AdminService {
     proxy_pass http://##adminip##;
}
Run Code Online (Sandbox Code Playgroud)

这将首先将传入请求发送到AdminService定义的主机.此服务必须使用正常的200头和x_upstreamhost响应:#internalHost#.其中#internalHost#是您要处理请求的主机的ip或dn.

尝试一下,如果遇到问题,请发布你的服务器{}块,有人会看看.


dan*_*gpm 6

您可以使用 nginx_lua (我喜欢openresty版本)通过在access-by-lua阶段使用脚本来处理您的自定义处理来完成此任务。

在该脚本中,如果该 Web 服务被定义为 nginx 位置,则可以使用ngx-location-capture来调用“AdminService”;或者您可以使用 http 客户端库(我使用过这个)来调用外部服务。

请参阅此处的类似用例