2016-05-02 11 views
0

Hapiで開発されたAPIサーバーは、長時間実行される非同期ジョブを処理する別のサーバー(Hapiとも書かれています)に特定のエンドポイントでPOSTリクエストを送ります。
の要求:元の要求のすべてのHTTPヘッダを保存
http://my-services-staging.northeurope.cloudapp.azure.com/api/v1/importer/items

http://my-api-staging.northeurope.cloudapp.azure.com/api/v1/importer/items
はにプロキシされています。nginxでHapi h2o2を使用しています( 'worker_connections not enough'エラー)

プロキシされた要求を受け取るサーバーも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); 
      } 
      } 
     } 
    } 
} 

私は(APIサーバーと異なるポート上のジョブサーバを結合)localhost上の両方のサーバーを実行すると、すべてが正常に動作します。

私は両方のサーバーを別の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" 

400不正な要求を得、問題を解決していませんworker_connections 20000;設定します。 尾行/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

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