我们正在使用在一个主机上运行的 nginx 作为在另一台主机上的 tomcat 中运行的 java servlet 的代理。
我们想要做的是说一个请求http://a.xyz.com/a/b?q1=v1&q2=v2,我们希望从 nginx 向客户端提供 HTML 代码,并 ping 上游服务器http://ip地址[冒号]端口/a/b?q1=v1&q2=v2. 在 ping 上游服务器时,uri 路径和查询参数保持不变。
我已经想出了如何单独完成这两项任务,但我无法想出如何针对同一个请求同时完成这两项任务。
到目前为止,我的 conf 文件是这样的。我在下面写了两个 if 条件。如果只使用 if 条件 1,我就能提供 HTML 代码。如果只使用 if 条件 2,我就能 ping 上游服务器,在这种情况下上游服务器会响应 200 OK,并通过 nginx 发送给客户端。有人能帮忙一起实现这两个吗?Nginx 应该提供 html 代码并释放客户端,然后 ping 上游服务器,它会向 nginx 返回 200 OK,而 nginx 只需接受它即可。
upstream u_server {
server <ip_address>:8080;
}
server {
listen 80;
server_name a.xyz.com;
# if condition 1
if ($host = "a.xyz.com") {
rewrite ^ /pqr.html last;
}
# if condition 2
if ($host = "a.xyz.com") {
set $upserver="u_server";
}
location /pqr.html {
root /opt/mydir/html;
}
location / {
proxy_pass http://$upserver;
}
}
答案1
这可以通过至少两种方法来完成(均使用第三方模块)。
A)lua 模块。
upstream upserver {
server <ip_address>:8080;
}
server {
listen 80;
server_name a.xyz.com;
location / {
root /opt/mydir/html;
access_by_lua '
local res = ngx.location.capture("/ping")
return
';
}
location = /ping {
proxy_pass http://upserver;
}
}
B)auth_request 模块。您的 ping 后端必须始终返回“200 Ok”响应,否则客户端将收到“403 访问被拒绝”而不是静态文件内容。
upstream upserver {
server <ip_address>:8080;
}
server {
listen 80;
server_name a.xyz.com;
location / {
root /opt/mydir/html;
auth_request /ping;
}
location = /ping {
proxy_pass http://upserver;
}
}