我想在nginx的每个请求中通过nginx请求一个web服务,并根据从web服务获得的响应来应用一些进程。
我正在使用nginx作为反向代理,并有多个networking服务的stream量路由到。 我想添加一个额外的web服务(让我们称之为AdminService)作为pipe理员,这个服务将处理安全,计费和其他stream量分析和预处理。 对于每一个请求通过nginx我需要向AdminService请求,然后pipe理服务将分析请求更新一些统计数据和喜欢,并与一些标签响应。 然后nginx会根据返回的标签更新一些头文件并将请求转发到合适的url。
我已经看了看Lua模块,似乎没有做web服务调用。 我也看到有Java,Groovy和Clojure模块可用,这可能是我应该看的? 否则,我应该看什么?
请裸露我对nginx很新。
一种选择是使用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。
尝试一下,如果遇到问题,请发布您的服务器块,有人会看看。
你可以使用nginx_lua(我喜欢openresty版本),通过在lua阶段访问脚本来处理你的自定义处理。
在该脚本中,如果该web服务被定义为nginx位置,则可以使用ngx-location-capture来调用您的“AdminService” 或者你可以使用一个http客户端库(我用这个 )来调用外部服务。
在这里看到一个类似的用例。