1 つのサーバー上で nginx と node.js を実行するにはどうすればよいですか?

1 つのサーバー上で nginx と node.js を実行するにはどうすればよいですか?

wordpress/php と node.js の両方を同じサーバーでホストするには、どのような設定を使用すればよいですか? 私は Digitalocean の VPS、Ubuntu 12.04 サーバーを使用しています。

Apache -> Nginx -> Varnish を使用する人もいると読んだことがありますが、一方で、Nginx があれば Varnish は必要ないという記述もいくつかありました。

私が現在持っている解決策は、ポート 80 の Varnish と 2 つのバックエンド (1 つは Apache 用、もう 1 つは Node.js 用) です。

これは、Varnish の背後にある Apache の代わりに nginx でも機能しますか?

答え1

はい、既存のセットアップ (Varnish フロントエンド、Apache および Node.js バックエンド) は、Apache を Nginx に切り替えても同じように動作します (つまり、Varnish はバックエンドを特に考慮しません。Nginx と Apache は同じように扱われます)。

Node.js は通常、Nginx で実行されます。これは、静的アセットを Node.js 経由よりも Nginx 経由で直接提供する方がはるかに効率的だからです。シンプルなセットアップの場合は、Varnish を完全に排除できます。Node.js はポート 80 で実行され、選択したリクエストを Node.js アップストリーム サーバーにプロキシします。

upstream nodejs  {
      server 127.0.0.1:3000;
      server 127.0.0.1:3000;
}

server {
        listen 80 default_server;
        server_name  www.example.com;
        error_log /var/log/nginx/www.example.com/error.log;
        access_log /var/log/nginx/www.example.com/access.log;
        root   /var/www/www.example.com/public;

        location / {
             try_files $uri @nodejs;
        }

        location @nodejs {
             proxy_pass  http://nodejs;
             proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
             proxy_redirect off;
             proxy_buffering 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;
        }
}

このセットアップの前に Varnish を使用する (以前の) 理由の 1 つは、Nginx が HTTP 1.1 接続のプロキシをネイティブにサポートしていなかったためです (これは Websocket で使用される Upgrade ヘッダーに必要でした)。これはもう問題ではなく、現在のバージョンの Nginx は Websocket 接続もプロキシできます。それはさておき、実際に Varnish を使用してファイルをキャッシュしている場合は、フロントエンド サーバーとして保持する説得力のある理由になります (ただし、Varnish を使用して動的に生成されたページのキャッシュされたコピーを提供する場合にのみ、実際の利点が発生することに注意してください)。たとえば、Nginx がポート 81 でリッスンし、Node.js がポート 3000 でリッスンしている場合、Varnish VCL に次の内容を含めることができます (これにより、example.com/nodejs からのパスが Node.js を使用して提供され、その他すべてが Nginx で提供されます)。

backend default {
  .host = "127.0.0.1";
  .port = "81";
}

backend nodejs{
  .host = "127.0.0.1";
  .port = "3000";
}

...

sub vcl_recv {
    set req.grace = 120s;
    ...
    if (req.http.Host ~ "^(www\.)?example.com") {
        if (req.url ~ "^/nodejs/") {
            set req.backend = nodejs;                       
        }
    }

    return (lookup);
}

関連情報