web-dev-qa-db-ja.com

Node.js + Nginx - 今何ですか?

サーバーにNode.jsとNginxを設定しました。今それを使いたいのですが、始める前に2つの質問があります。

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

    a。必要なWebサイトごとに別々のHTTPサーバーを作成してください。その後、プログラムの先頭にすべてのJavaScriptコードをロードすると、コードは1回解釈されます。

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

Node.jsを正しく使用する方法は私にはわかりません。

918
Van Coding

Nginxはフロントエンドサーバーとして機能します。この場合、リクエストはnode.jsサーバーにプロキシされます。したがって、node用に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を持つノードに関するチュートリアル _があります。

1230
Joao Da Silva

Nginxで複数のドメインを設定し、複数のnode.jsプロセスに転送することもできます。

例えば、これらを達成するために:

/ 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/;
    }
}
154
250R

1つのサーバー構成でアプリのURLを変えることもできます。

  • yourdomain.com/app1/* - >ローカルで実行されているNode.jsプロセスへ http://127.0.0.1:3000
  • yourdomain.com/app2/* - >ローカルで実行されているNode.jsプロセスへ http://127.0.0.1:4000

/etc/nginx/sites-enabled/yourdomain

server {
    listen 80;
    listen [::]:80;
    server_name yourdomain.com;

    location ^~ /app1/{
        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://127.0.0.1:3000/;
    }

    location ^~ /app2/{
        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://127.0.0.1:4000/;
    }
}

Nginxを再起動します。

Sudo service nginx restart

アプリケーションを起動しています。

ノードapp1.js

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

ノードapp2.js

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello from app2!\n');
}).listen(4000, "127.0.0.1");
console.log('Server running at http://127.0.0.1:4000/');
53
0x8BADF00D

私はNginxを通して独立したNode Expressアプリケーションを代理します。

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

Nginxの設定例で私のセットアップに関する詳細はここにあります:

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

アプリケーションをlocalhostからインターネットに移動する必要があるときには、Nodeでは注意が必要です。

ノード展開には一般的な方法はありません。

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

基本的に、私はWebサーバを持っていて、Nodeアプリケーションをサブフォルダにマウントしたい(すなわち http:// myhost/demo/pet-project/ )ようにします。

同時に、私はblogのような他のものが同じWebサーバー上で動くことを望みます。

簡単でしょ?どうやらそうではない。

Web上の多くの例では、ノードアプリケーションはポート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 applicationにプロキシされるので、Nodeアプリケーションはそれが実際にマウントされている場所を知る必要はなく、純粋に構成によって移動できます。

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

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

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

31
skovalyov

Nginx構成のNode.js。

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

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

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;
  }
}
10
aquadir

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

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

しかし、複数のコアがある場合は、それらすべてを使用するようにnode.jsを調整する必要があります。

8
Hugo Mota

私はGithubにクローンを作成できるリポジトリを作りました、 vagrant-node-nginx-boilerplate

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

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/');

そして/etc/nginx/sites-available/のnginxの設定は

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;
        }
}
7
svnm

Node.jsを使用して、nginxによって提供されるディレクトリに静的ファイルを生成することもできます。もちろん、あなたのサイトのいくつかの動的な部分はnodeによって、そしていくつかはnginx(static)によって提供することができます。

そのうちのいくつかをnginxで処理すると、パフォーマンスが向上します。

5
code ninja

リバースプロキシとして機能する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アプリは

  • レスポンスを提供するドメイン固有のロジックを適用できるHTTP_Hostヘッダーを取得します。 '
  • あなたのアプリケーションは pm2 のようなプロセスマネージャによって管理されなければなりません。

  • sentry または rollbar のようなプロダクションエラーを取得するためのエラー報告サービスを設定します。

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

5
I Am Batman

Nginxは、プロジェクトマネージャのように動作するリバースプロキシサーバーとして機能することができます。要求を受け取ると、それを分析して要求を上流(プロジェクトメンバー)に転送するか、自分自身を処理します。 Nginxには、設定方法に基づいて要求を処理する方法が2つあります。

  • 要求に応える
  • 要求を別のサーバーに転送する

    server{
     server_name mydomain.com sub.mydomain.com;
    
     location /{ 
      proxy_pass http://127.0.0.1:8000;  
      proxy_set_header Host $Host;
      proxy_pass_request_headers on;  
     }
    
     location /static/{
       alias /my/static/files/path;
     }
    

    }

リクエストをサーバーする

この構成では、リクエストのURLがmydomain.com/static/myjs.jsの場合、myjs.jsフォルダー内の/my/static/files/pathファイルを返します。静的ファイルを処理するようにnginxを設定すると、要求自体を処理します。

リクエストを別のサーバーに転送します

リクエストのURLがmydomain.com/dothisの場合、nginxはリクエストを http://127.0.0.1:8000 に転送します。 localhost 8000ポートで実行されているサービスは要求を受け取り、応答をnginxに返し、nginxは応答をクライアントに返します。

ポート8000​​でnode.jsサーバーを実行すると、nginxは要求をnode.jsに転送します。 node.jsロジックを作成してリクエストを処理します。それがあなたのnodejsサーバーがnginxサーバーの後ろで動いているということです。

Nodejs以外の他のサービスを実行したい場合は、Django、flask、phpなどの別のサービスを異なるポートで実行し、それをnginxで設定してください。

3

各マイクロサービス手段を管理して実行する場合は、pm2を使用してnodejsを実行できます。ノードはポートで実行されますnginx(/etc/nginx/sites-enabled/domain.com)でそのポートを設定するだけです。

server{
    listen 80;
    server_name domain.com www.domain.com;

  location / {
     return 403;
  }
    location /url {
        proxy_pass http://localhost:51967/info;
    }
}

Pingを使用して、localhostが動作しているかどうかを確認します。

そして

Create one single Node.js server which handles all Node.js requests. This reads the requested files and evals their contents. So the files are interpreted on each request, but the server logic is much simpler.

これは最良であり、あなたも簡単に言ったように

1
gokul kandasamy