5

私は完全に js の HTML5 キャンバス ゲームに取り組んでおり、それを「リアルタイム」にしたいと考えています。私の調査に基づいて、node.jsはエキサイティングな見通しであることがわかったので、socket.io、expressなどを使用してubuntu 12 Webサーバーで構成しました.

私はプログラマーですが、ウェブサーバー バックエンドの世界では新人にすぎません。そのため、あなたの助けを求めています。システム モデル全体に​​ついて混乱しており、それがどのように機能しているかを明確にしたいと考えています。たぶん、私は短時間であまりにも多くの記事を読みました.

まず、Web サーバーで nginx 1.2.x を実行します。私が知っているように、nginxはrquestsを処理しており、ポート80(私にとって)専用で、httpリクエストを処理しています(php-fpmを使用してphpを処理しています)。次に、ポート 8080 で nodejs サーバーを正常に実行しています。nginx は websocket をサポートしていないため、websocket を介した接続が必要です (その性質とプロトコルのため)。

http://mydomain.tld:8080 にアクセスすると、これはノード サーバーを経由して nginx をオフにしますか? この場合、接続は websocket を介して行うことができ、xhr などにフォールバックすることはできません (スケーラビリティーのために必要ありません)。

次に、 http://mydomain.tld/game/ で同じ効果を得るにはどうすればよいですか? nginx.conf のリクエストをノードサーバーにプロキシするだけですか? お気に入り:

 # if a file does not exist in the specified root and nothing else is definded, we want to serve the request via node.js
try_files   $uri    @nodejs;          

location @nodejs
{       
     proxy_pass  127.0.0.1:8080;
     break;
}

から: https://stackoverflow.com/a/14025374/2039342

また、nginx を介した Websocket 通信が必要な場合に、これが適切なプロキシの回避策であるとしたら? 通常の php サイトとその中に socket.io 接続が必要な場合に行います。この時点で、ポート 80 でトラフィックを実行し、標準のリクエストと Websocket トラフィックを分離することが重要であると推測しています。私の場合、最も簡単な解決策は何ですか?

http://www.exratione.com/2012/07/proxying-websocket-traffic-for-nodejs-the-present-state-of-play/この記事で、nginx 1.3 まで HAProxy が私にとって最適であることがわかりました。 、 それは...ですか?

私の質問が少し混乱していることは知っていますが、正確なテクニックを理解するのに苦労しています。ヒントをください | 読むべき記事 | 出発点 | 基本構成。

PS .: ここで関連するトピックのほとんどを読みました。

Ps2.: ばかげないように: 私はすでにこのゲームを red5 (Java ベースのフラッシュ サーバー) + フラッシュで作成したので、適切な現在のテクノロジで再検討して公開したいと思います。

4

1 に答える 1

6

最後に、私の基本的な問題は、正しい方法で nginx を構成することでした。

最初に、nginx_tcp_proxy_module を使用してパッチを適用したバージョンとして nginx を再インストールしました。

次のステップは、http または tcp 経由でリクエストを処理するための適切な構成をセットアップすることでした。標準ファイルは webroot から正常に提供されるようにしたかったのですが、ゲーム ロジックは node.js (および socket.io js 自体) によって提供され、.php ファイルは php_fpm によって提供されました。

そのため、次の動作するnginxセットアップになりました。

user  www-data;
worker_processes  16;

events {
    worker_connections  1024;
}

http {
    upstream node-js-myapp {
        server 127.0.0.1:3000;
    }

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

    sendfile        on;
    keepalive_timeout  65;
    gzip  on;

    server {
        listen          80;
        server_name    domain.xx;  # Multiple hostnames seperated by spaces
        root            /var/www/domain.xx; # Replace this
        charset         utf-8;
        access_log  /var/log/nginx/domain.xx.access.log  combined;
        error_log   /var/log/nginx/domain.xx.error.log;

        location ~ \.php$ {
                fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name; 
                include /etc/nginx/conf.d/php_fpm; # Includes config for PHP-FPM (see below)
        }


        location / {
            index  index.html index.htm;
        }


        location ^~ /socket.io/ {
            try_files $uri @node-js-myapp;
        }

        location /status {
            check_status;
        }

        location @node-js-myapp { 
          proxy_set_header X-Real-IP  $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_pass  http://node-js-myapp;
        }
    }
}

tcp {
  upstream websocket-myapp {
    server 127.0.0.1:8080;
    check interval=3000 rise=2 fall=5 timeout=1000;
  }

  server {
    listen 3000;
    server_name _;
    access_log  /var/log/nginx/domain.xx.access.log;

    proxy_read_timeout 200000;
    proxy_send_timeout 200000;
    proxy_pass websocket-myapp;
  }
}

このnode.jsサーバーでうまく機能しています:

var app = require('express').createServer()
var io = require('socket.io').listen(app);
io.set('transports', [
    'websocket'
  , 'flashsocket'
  , 'htmlfile'
  , 'xhr-polling'
  , 'jsonp-polling'
  ]);

app.listen(8080);

要求されたファイルがサーバーの公開側とその HEAD セクションにある間:

<script src="/socket.io/socket.io.js"></script>

私のnginxは完全ではなく、雄牛が含まれている可能性があると確信しています...しかし、それは一種の機能であり、良い出発点です.

于 2013-02-05T13:59:11.677 に答える