我有一个使用Hapi开发的API服务器,它将特定端点上的POST请求代理到处理长时间运行的异步作业的不同服务器(也使用Hapi编写)。
要求:
http://my-api-staging.northeurope.cloudapp.azure.com/api/v1/importer/items
代理:http://my-services-staging.northeurope.cloudapp.azure.com/api/v1/importer/items
保留原始请求的所有HTTP头。
接收代理请求的服务器也使用Hapi编写,用于处理长时间运行的作业 在API服务器上,Hapi h2o2插件处理请求代理。代理路由的代码如下所示:
{
method: 'POST',
path: '/importer/items',
config: {
payload: {
parse: false
},
handler: {
proxy: {
passThrough: true,
xforward: true,
host: SERVICES_HOST,
port: SERVICES_PORT,
protocol: SERVICES_PROTOCOL,
onResponse: function(err, res, request, reply, settings, ttl) {
var response = (err) ? err : res;
return reply(response);
}
}
}
}
}
当我在localhost
上运行两个服务器(在不同端口上绑定API服务器和作业服务器)时,一切正常。
我已经在不同的Microsoft Azure VM上设置了两台服务器,将它们绑定在端口3000上,前面的nginx充当反向代理。
我的nginx配置看起来像这样(两台服务器上相同,只有server_name
更改):
server {
listen 80;
server_name my-api-staging.northeurope.cloudapp.azure.com;
index index.php index.html index.htm;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
请求由nginx正确处理,其他路由不涉及在不同的远程计算机上代理请求 当我通过邮递员发送请求或在涉及远程代理的某个端点上的VM上卷曲时,问题就开始了:
curl -XPOST -H 'Bearer: foobar'
-H 'Authorization: token somerandomstring'
-H "Content-type: application/json"
'http://127.0.0.1:3000/api/v1/importer/items'
nginx挂起几秒钟,发回500内部服务器错误。
拖尾/var/log/nginx/error.log
:
worker_connections are not enough while connecting to upstream,
client: 127.0.0.1,
server: my-api-staging.northeurope.cloudapp.azure.com,
request: "POST /api/v1/importer/items HTTP/1.1",
upstream: "http://127.0.0.1:3000/api/v1/importer/items",
host: "my-api-staging.northeurope.cloudapp.azure.com"
设置worker_connections 20000;
无法解决问题,产生400 Bad Request。
拖尾/var/log/nginx/error.log
:
accept4() failed (24: Too many open files)
我猜有某种循环正在进行,nginx无法使用我提供的配置正确处理多重重定向。
我希望能够处理这种请求流程:
(Request) -> nginx:80 -> API server:3000 -> nginx:80 -> Jobs server:3000
h2o2
有可能吗?
答案 0 :(得分:0)
使用reply.proxy(options) API
显然解决了开箱即用的问题,而没有对nginx配置进行任何更改。
我还删除了xforward
选项,默认为false
时不存在。
{
method: 'POST',
path: '/importer/items',
config: {
payload: {
parse: false
},
handler: function(request, reply) {
return reply.proxy({
host: SERVICES_HOST,
port: SERVICES_PORT,
protocol: SERVICES_PROTOCOL,
passThrough: true,
onResponse: function(err, res, request, reply, settings, ttl) {
var response = (err) ? err : res;
return reply(response);
}
});
}
}