我希望通过nginx在nginx内向Web服务发出请求,并根据我从Web服务获得的响应应用一些进程。
我使用nginx作为反向代理,并且有多个流量路由到的Web服务。我想添加一个额外的webservice(让我们称之为AdminService)作为管理员,这项服务将处理安全,计费和其他流量分析和预处理等事情。 对于通过nginx的每个请求,我需要向AdminService发出请求,然后管理服务将分析更新某些统计信息等的请求并使用某些标记进行响应。然后,nginx将根据返回的标记更新一些标头,并将请求转发给相应的URL。
我已经看过Lua模块了,它似乎没有进行webservice调用。 我也看到有Java,Groovy和Clojure模块可用,这也许是我应该看的东西?否则我应该怎么看?
答案 0 :(得分: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##;
}
这将首先将传入请求发送到AdminService定义的主机。此服务必须使用正常的200头和x_upstreamhost响应:#internalHost#。其中#internalHost#是您要处理请求的主机的ip或dn。
尝试一下,如果遇到问题,请发布你的服务器{}块,有人会看看。
答案 1 :(得分:3)
您可以使用nginx_lua(我喜欢openresty版本)通过在access-by-lua阶段使用脚本来处理您的自定义处理来实现这一目标。
在该脚本中,您可以使用ngx-location-capture来呼叫您的" AdminService"如果该Web服务被定义为nginx位置;或者您可以使用http客户端库(我使用this one)来调用外部服务。
查看类似的用例here.