9

私はApacheの背後で竜巻を実行しています。プロキシサーバーを作成しました。

ProxyRequests On
ProxyPass /chat/ http://localhost:8888/chat/

このコードはうまく機能し、すべてのリクエストを tornado に渡し、レスポンスをクライアントに返します。

今、長いポーリングにトルネードを使用しています。短い時間間隔で終了するリクエストの中には、このリバース プロキシが正常に動作する 1 分未満と言うものがあります。ただし、特定の長いポーリング リクエストでは、502 プロキシ エラーが発生します。このプロキシ エラーの理由は、Apache が長いポーリング要求を 1 分間 (デフォルトで) 保持できるためです。リクエストをクローズするため、プロキシ エラーが発生します。

さて、ディレクティブを次のように変更しました

ProxyRequests On
ProxyPass /chat/ http://localhost:8888/chat/ timeout=12000

つまり、デフォルトのタイムアウトを 12000 秒に変更しました。

これは現在、私にとってはうまく機能しています。しかし、これは問題の最善の解決策ではありません。理想的には、長いポーリング リクエストは、指定されたタイムアウトを超えることができます。だから私の質問は

  1. タイムアウトを無限にする方法は? つまり、リクエストが Apache によってクローズされることはありません。
  2. また、コメントしてください: トルネードのパフォーマンスは、プロキシ サーバーとして Apache を経由することによって低下しますか?
4

1 に答える 1

2

Nginxで同様の問題が発生し、あなたと同じ方法で解決しました。しかし、私の場合は十分に大きかったので、タイムアウトを1日に変更しました。

これをなくすことはできないと思います。この背後にある理論的根拠は、Apache (またはその点で言えば任意のプロキシ サーバー) がそのパフォーマンスを維持する必要があるためです。これは、古い接続または非アクティブな接続を保持する必要がある場合は明らかに不可能です。プロキシ サーバーに非アクティブな接続よりもアクティブな接続をプロキシさせたいと考えています。

したがって、Apache または Nginx (proxy_read_timeout を使用して構成) で ProxyTimeout をオフにする方法はありません。したがって、プロキシ サーバーがタイムアウト内に応答を送信しない場合は、アプリケーション サーバーの応答に時間がかかりすぎるか、アプリケーション サーバーに問題があるか、クライアントが応答を要求していません。最初のケースでは、安全な見積もりを作成して、適切なタイムアウトを設定できます。2 番目のケースでは、アプリケーション サーバーを修正する必要があります。3 番目のケースでは、クライアントの状況を適切に処理し、必要に応じて再接続する必要があります。

2 番目の質問になりますが、Apache と Tornado サーバー間の遅延以外に違いはありません。Tornado サーバーを世界に直接公開することは非常にうまくできますが、それにはいくつかの課題が伴います。2. プロキシと負荷分散がより困難になります。3.何千人もの専門家の貢献者ではなく、あなたがそのコードを書いているため、セキュリティが低下します。したがって、このサーバーを毎回 root として実行することを考えるべきではありません。しかし、Apache や Nginx でも同じことを安全に行うことができます。

もちろん、上記の問題は解決可能ですが、なぜ既に解決された問題を解決するのでしょうか。:)

于 2014-06-29T20:48:11.903 に答える