1097

サーバーに Node.js と Nginx をセットアップしました。今私はそれを使いたいのですが、始める前に2つの質問があります:

  1. それらはどのように連携すべきでしょうか? リクエストはどのように処理すればよいですか?
  2. Node.js サーバーには 2 つの概念があり、どちらが優れていますか。

    a. 必要な Web サイトごとに個別の HTTP サーバーを作成します。次に、プログラムの開始時にすべての JavaScript コードをロードして、コードが一度解釈されるようにします。

    b. すべての Node.js リクエストを処理する単一の Node.js サーバーを作成します。これにより、要求されたファイルが読み取られ、その内容が評価されます。そのため、ファイルはリクエストごとに解釈されますが、サーバー ロジックははるかに単純です。

Node.js を正しく使用する方法が明確ではありません。

4

12 に答える 12

1395

Nginx はフロント エンド サーバーとして機能し、この場合はリクエストを node.js サーバーにプロキシします。したがって、ノードの nginx 構成ファイルをセットアップする必要があります。

これは、Ubuntuボックスで行ったことです。

yourdomain.com次の場所にファイルを作成します/etc/nginx/sites-available/

vim /etc/nginx/sites-available/yourdomain.com

その中には、次のようなものが必要です。

# the IP(s) on which your node server is running. I chose port 3000.
upstream app_yourdomain {
    server 127.0.0.1:3000;
    keepalive 8;
}

# the nginx server instance
server {
    listen 80;
    listen [::]:80;
    server_name yourdomain.com www.yourdomain.com;
    access_log /var/log/nginx/yourdomain.com.log;

    # pass the request to the node.js server with the correct headers
    # and much more can be added, see nginx config options
    location / {
      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_set_header X-NginX-Proxy true;

      proxy_pass http://app_yourdomain/;
      proxy_redirect off;
    }
 }

nginx (>= 1.3.13) で websocket リクエストも処理する場合は、location /セクションに次の行を追加します。

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

このセットアップが完了したら、上記の構成ファイルで定義されたサイトを有効にする必要があります。

cd /etc/nginx/sites-enabled/ 
ln -s /etc/nginx/sites-available/yourdomain.com yourdomain.com

でノード サーバー アプリを作成し/var/www/yourdomain/app.js、で実行します。localhost:3000

var http = require('http');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(3000, "127.0.0.1");
console.log('Server running at http://127.0.0.1:3000/');

構文の誤りをテストします。

nginx -t

nginx を再起動します。

sudo /etc/init.d/nginx restart

最後にノード サーバーを起動します。

cd /var/www/yourdomain/ && node app.js

yourdomain.com に「Hello World」が表示されるはずです。

ノード サーバーの起動に関する最後の注意: ノード デーモンには何らかの監視システムを使用する必要があります。upstart と monit を使用した node に関する素晴らしいチュートリアルがあります。

于 2011-02-16T10:20:53.867 に答える
180

nginx を使用して複数のドメインをセットアップし、複数の node.js プロセスに転送することもできます。

たとえば、これらを達成するには:

これらのポート (4000 および 5000) は、アプリ コードでアプリ リクエストをリッスンするために使用する必要があります。

/etc/nginx/sites-enabled/domain1

server {
    listen 80;
    listen [::]:80;
    server_name domain1.com;
    access_log /var/log/nginx/domain1.access.log;
    location / {
        proxy_pass    http://127.0.0.1:4000/;
    }
}

/etc/nginx/sites-enabled/domain2 内

server {
    listen 80;
    listen [::]:80;
    server_name domain2.com;
    access_log /var/log/nginx/domain2.access.log;
    location / {
        proxy_pass    http://127.0.0.1:5000/;
    }
}
于 2012-05-02T11:38:05.647 に答える
35

Nginx を介して独立した Node Express アプリケーションをプロキシします。

したがって、新しいアプリケーションを簡単にマウントでき、別の場所にある同じサーバー上で他のものを実行することもできます。

Nginx 構成例を使用したセットアップの詳細は次のとおりです。

Nginx を使用してサブフォルダー内の 1 つの Web サーバーに複数の Node アプリケーションをデプロイする

アプリケーションを localhost からインターネットに移動する必要がある場合、Node.js では扱いが難しくなります。

Node の展開に共通のアプローチはありません。

Google はこのトピックに関する記事をたくさん見つけることができますが、私は必要なセットアップの適切な解決策を見つけるのに苦労していました.

基本的に、Web サーバーがあり、アプリケーション コードに構成依存関係を導入することなく、Node アプリケーションをサブフォルダー (つまり、http://myhost/demo/pet-project/ ) にマウントしたいと考えています。

同時に、ブログのような他のものを同じ Web サーバーで実行したいと考えています。

シンプルですね。どうやらそうではありません。

Web Node アプリケーションの多くの例では、ポート 80 で実行されるか、Nginx によってルートにプロキシされます。

どちらのアプローチも特定のユース ケースには有効ですが、私の単純だが少し風変わりな基準を満たしていません。

そのため、独自の Nginx 構成を作成しました。ここに抜粋があります。

upstream pet_project {
  server localhost:3000;
}

server {
  listen 80;
  listen [::]:80;
  server_name frontend;

  location /demo/pet-project {
    alias /opt/demo/pet-project/public/;
    try_files $uri $uri/ @pet-project;
  }

  location @pet-project {
    rewrite /demo/pet-project(.*) $1 break;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $proxy_host;
    proxy_set_header X-NginX-Proxy true;

    proxy_pass http://pet_project;
    proxy_redirect http://pet_project/ /demo/pet-project/;
  }
}

この例から、ポート 3000 で実行されている Pet Project Node アプリケーションをhttp://myhost/demo/pet-projectにマウントしていることがわかります。

最初に Nginx は、要求されたリソースが/opt/demo/pet-project/public/で利用可能な静的ファイルであるかどうかを確認し、そうである場合はそれをそのまま提供します。これは非常に効率的であるため、Connect のような冗長なレイヤーは必要ありません。静的ミドルウェア。

その後、他のすべてのリクエストは上書きされ、Pet Project Nodeアプリケーションにプロキシされるため、Node アプリケーションは実際にマウントされている場所を知る必要がなく、構成だけでどこにでも移動できます。

proxy_redirectは Location ヘッダーを適切に処理するために必須です。Node アプリケーションでres.redirect()を使用する場合、これは非常に重要です。

異なるポートで実行されている複数の Node アプリケーションに対してこのセットアップを簡単に複製し、他の目的のためにロケーション ハンドラーを追加することができます。

から: http://skovalyov.blogspot.dk/2012/07/deploy-multiple-node-applications-on.html

于 2012-07-13T07:53:54.967 に答える
13

Nginx 構成の Node.js。

$ sudo nano /etc/nginx/sites-available/subdomain.your_domain.com

次の構成を追加して、「subdomain.your_domain.com」から来たときに、プロキシとして機能する Nginx がサーバーからのポート 3000 トラフィックにリダイレクトするようにします。</p>

upstream subdomain.your_domain.com {
  server 127.0.0.1:3000;
}
server {
  listen 80;
  listen [::]:80;
  server_name subdomain.your_domain.com;
  access_log /var/log/nginx/subdomain.your_domain.access.log;
  error_log /var/log/nginx/subdomain.your_domain.error.log debug;
  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_pass http://subdomain.your_domain.com;
    proxy_redirect off;
  }
}
于 2014-03-17T12:24:35.520 に答える
10

Github にリポジトリを作成しました。これを複製できますvagrant-node-nginx-boilerplate

基本的にnode.jsアプリ/var/www/nodeapp

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(4570, '127.0.0.1');

console.log('Node Server running at 127.0.0.1:4570/');

nginxの設定/etc/nginx/sites-available/

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/nodeapp;
        index index.html index.htm;

        server_name localhost;

        location / {
          proxy_pass http://127.0.0.1:4570;
          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;
        }
}
于 2015-03-18T10:24:18.753 に答える
9

あなたの質問に答える2:

オプションを使用するb理由は、リソースの消費がはるかに少ないという理由だけです。オプション「a」を使用すると、すべてのクライアントがサーバーに大量のメモリを消費させ、必要なすべてのファイルをロードします(私はphpが好きですが、これは問題の1つです)。オプション 'b' を使用すると、ライブラリ (再利用可能なコード) をロードして、すべてのクライアント リクエスト間で共有できます。

ただし、複数のコアがある場合は、node.js を微調整してそれらすべてを使用する必要があることに注意してください。

于 2012-01-03T04:51:37.377 に答える
6

Nginx がリバース プロキシとして機能することで、Nodejs アプリを簡単にセットアップできます。
次の構成は、NodeJS アプリケーションが 127.0.0.1:8080 で実行されていることを前提としています。

  server{
     server_name domain.com sub.domain.com; # multiple domains

     location /{ 
      proxy_pass http://127.0.0.1:8080;  
      proxy_set_header Host $host;
      proxy_pass_request_headers on;  
     }

     location /static/{
       alias /absolute/path/to/static/files; # nginx will handle js/css
     }
   } 

上記のセットアップでは、Nodejs アプリは、

注: ドメイン固有のリクエスト ルートを処理するためのロジックをセットアップし、expressjs アプリケーション用のミドルウェアを作成できます。

于 2017-01-07T18:54:02.263 に答える
6

node.js を使用して、nginx が提供するディレクトリに静的ファイルを生成することもできます。もちろん、サイトの一部の動的部分はノードによって提供され、一部は nginx (静的) によって提供されます。

それらのいくつかをnginxで提供すると、パフォーマンスが向上します..

于 2013-07-05T14:17:12.683 に答える