15

Linuxの達人の助けが必要です。コメットサーバーを含むWebアプリに取り組んでいます。コメットサーバーはlocalhost:8080で実行され、クライアントが接続するためのURL localhost:8080/long_pollingを公開します。私のウェブアプリはlocalhost:80で実行されます。

私はnginxを使用してnginxからcometサーバー(localhost:8080 / long_pollingにプロキシされたlocalhost:80 / long_polling)にリクエストをプロキシしましたが、このソリューションには2つの不満があります。

  1. nginxを使用すると、すべてのタイムアウト設定を600秒に変更したにもかかわらず、1分後に504ゲートウェイがタイムアウトします。
  2. とにかくnginxがcometサーバーにプロキシする必要はありません-nginxプロキシは長期的な接続(おそらく最大30分)用に構築されていません。むしろ、クライアントがコメットサーバーに直接接続できるようにし、コメットサーバーに処理させたいと思います。

だから私の質問は:nginxプロキシを使用せずにlocalhost:8080 / long_pollingをlocalhost:80 / long_pollingに公開できるLinuxのトリックはありますか?何かがあるに違いない。そのため、この質問はおそらくLinuxの第一人者が最もよく答えることができると思います。

/ long_pollingをポート80で公開する必要があるのは、AJAXを使用してポート80に接続できるようにするためです(ajax same-origin-policy)。

これは参考のために私のnginxproxy.confです:

proxy_redirect              off;                                                                                                                         
proxy_set_header            Host $host;
proxy_set_header            X-Real-IP $remote_addr;
proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size        10m;
client_body_buffer_size     128k;
proxy_connect_timeout       600;
proxy_send_timeout          600;
proxy_read_timeout          600;
proxy_buffer_size           4k;
proxy_buffers               4 32k;
proxy_busy_buffers_size     64k;
proxy_temp_file_write_size  64k;
send_timeout                600;
proxy_buffering             off;
4

7 に答える 7

7

これが私のnginx.confと私のproxy.confです。ただし、proxy.confはやり過ぎであることに注意してください。プログラムをデバッグしようとしているときに、これらすべての設定を行っていました。

/etc/nginx/nginx.conf

worker_processes  1;                                                                                                                                     
user www-data;

error_log  /var/log/nginx/error.log debug;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include /etc/nginx/proxy.conf;

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    access_log  /var/log/nginx/access.log;

    sendfile        on;
    tcp_nopush     on;

    keepalive_timeout  600;
    tcp_nodelay        on;

    gzip  on;
    gzip_comp_level 2;
    gzip_proxied any;
    gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

/etc/nginx/proxy.conf

proxy_redirect              off;                                                                                                                         
proxy_set_header            Host $host;
proxy_set_header            X-Real-IP $remote_addr;
proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size        10m;
client_body_buffer_size     128k;
proxy_connect_timeout       6000;
proxy_send_timeout          6000;
proxy_read_timeout          6000;
proxy_buffer_size           4k;
proxy_buffers               4 32k;
proxy_busy_buffers_size     64k;
proxy_temp_file_write_size  64k;
send_timeout                6000;
proxy_buffering             off;
proxy_next_upstream error;
于 2009-07-22T19:18:36.517 に答える
6

私は実際にこれをうまく機能させることができました。皆さん、ありがとうございました。nginxが504タイムアウトした理由は、ばかげた理由でした。次のように、nginx.confにproxy.confを含めていませんでした。

include /etc/nginx/proxy.conf;

そのため、COMETサーバーへのフロントエンドプロキシとしてnginxを保持しています。

于 2009-07-22T15:03:20.093 に答える
5

私はそうは思わない、それは可能だ...

localhost:8080/long_pollingURI...より正確には、ドメイン'localhost'にあるサーバーへのポート80を要求するように解決されますhttp://localhost:8080/long_polling...つまり、127.0.0.1へのtcp接続を開きます。 :80、送信HTTPURI/long_polling

GET /long_polling HTTP/1.1
Host: localhost:8080

さらに、いくつかの追加のHTTPヘッダー...まだ聞いたことがありませんが、ポートはプロセス間でバインドできます...

実際、私がよく理解していれば、nginxはスケーラブルなプロキシとして設計されています...また、10000HTTPアイドリング接続には2.5MBが必要であると主張しています...したがって、実際には問題にはなりません...

どのコメットサーバーを使用していますか?コメットサーバーにWebサーバーのプロキシを許可してもらえますか?通常のhttpリクエストは迅速に処理する必要があります...

グリーツ

back2dos

于 2009-07-21T17:26:41.670 に答える
3

Nginx用のCometプラグインがあります。それはおそらくあなたの問題を非常にうまく解決するでしょう。

http://www.igvita.com/2009/10/21/nginx-comet-low-latency-server-push/

于 2009-12-07T22:30:55.153 に答える
2

試す

proxy_next_upstream error;

デフォルトは

proxy_next_upstream error timeout;

タイムアウトは75秒を超えることはできません。

http://wiki.nginx.org/NginxHttpProxyModule#proxy_next_upstream

http://wiki.nginx.org/NginxHttpProxyModule#proxy_connect_timeout

于 2009-07-22T13:18:05.237 に答える
0

深刻なTCP/IPの混乱を行わずに、同じIPアドレスの同じTCPポートで2つのアプリケーションを公開することはできません。nginxが接続のサービスを開始すると、他のアプリケーションに渡すことはできず、プロキシすることしかできません。

したがって、別のポート、別のIP番号(同じ物理マシン上にある可能性があります)を使用するか、プロキシを使用します。

編集:nginxは長時間アクティビティが表示されないため、タイムアウトになっていると思います。おそらく、数分ごとにnullメッセージを追加することで、接続が失敗するのを防ぐことができます。

于 2009-07-21T17:49:07.053 に答える
0

8080の代わりにnode.jsサーバーでlisten(80)を試して(非同期サーバーとして使用していると思いますか?)、Ngnixを完全に見逃す可能性があります。私は接続ミドルウェアとExpresstoServerの静的ファイルを使用し、通常はNgnixによって処理されるキャッシュを処理します。ノードの複数のインスタンスを実行したい場合(私がお勧めします)、ゲートウェイとしてのNginxではなく、他のノードインスタンスへのプロキシ/ロードバランサーとしてnode.js自体を調べることをお勧めします。一度に大量の静止画像ファイルを提供していたときに問題が発生しましたが、S3に画像を配置すると安定しました。Nginxは、あなたがしていることにやり過ぎかもしれません。試してみてください。幸運を祈ります。

于 2010-10-18T20:23:24.107 に答える