使用Hapi h2o2和nginx(' worker_connections是不够的'错误)

时间:2016-05-02 16:55:30

标签: node.js nginx proxy reverse-proxy hapijs

我有一个使用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

有可能吗?

1 个答案:

答案 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);
        }
      });
    }
}