Node.js + Nginx-今はどうですか?


1003

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

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

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

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

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

回答:


1306

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を備えたノードに素晴らしいチュートリアルがあります


11
投稿ありがとうございます。nginxは上記のサーバーのnode.js応答をキャッシュするか、毎回再実行します。
ライム、

79
どうしてやれないのlocation / { proxy_pass http://127.0.0.1:3000; }?なぜupstream設定ビット全体が必要なのですか?
Robin Winslow、

20
+1、よくある質問に対する非常に単純明快な回答。nodeとnginxを使用して仮想ホストをセットアップしたい人に最適です。私が見逃したと思うのは、nginx-in-front-of-nodeが複数のvhostを提供するのに最適である理由に対する質的な答えです(質問者の2番目の質問)。
Paul d'Aoust

34
負荷分散のためにサーバーにサーバーを追加する場合は、@ Robin Winslow。
ジョアン

76
この(非常に役立つ)回答は、デフォルトで付属するnginxの1つのフレーバーsites-enabledsites-available内のディレクトリに言及していることに注意してください/etc/nginx。バージョンにこれらの2つのディレクトリがない場合は、conf.d代わりに1つのディレクトリが含まれている可能性があります。その場合、これらの指示に従っても効果はありませんが、デフォルトの代わりにポイントするようにincludeファイル内のステートメントを変更しない限り。それが理にかなっていると思います。中の言われた声明を見ればそれは自明になるはずです。nginx.confsites-enabledconf.dincludenginx.conf
ミタミット

167

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

5
私はproxy_passのメソッドを使用していますが、何らかの理由でhttp://example.com自動的に適用さ302http://www.example.comます。何故ですか?
クリスチャン

Cloudflareまたは類似したものはありますか?上記の設定はまったくリダイレ​​クトすべきではありません。
ozzieisaacs

1
@Kristian proxy_set_header Host $hostHTTP 302リダイレクトを回避するには、追加する必要があります。
Ivan Shatsky、2018年

@IvanShatsky-複数のサブドメインで複数のポートを構成し、別のドメインで他のポートが実行されないようにする方法を教えてください。nginxv 1.14.1
151291

59

1つのサーバー構成でアプリに異なるURLを設定することもできます。

/ etc / nginxの/サイト対応/ 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/');

3
オープンソースコミュニティバージョンは無料ですが、無料ではない他の機能を備えたバージョンがあります。nginx.com/products/feature-matrix
0x8BADF00D

私の無知でごめんなさい。この方法で提供することの目的と利点は何ですか?使用例や事例はありますか?前もって感謝します。
Mauro Aguilar 2017年

2
@MauroAguilar 1つのサーバーで2つのnode.jsアプリが必要な場合は、推奨される方法(異なるポートを使用)でそれらを提供できます。私の場合、それは2つの異なるテストアプリでした。
0x8BADF00D 2017年

では、2つのアプリを実行することと1つのアプリを実行することの違いは何ですか?つまり、同じ目的を意図した場合の利点は何ですか?
Mauro Aguilar 2017年

2
@MauroAguilar、それらを1つのプロジェクトで実行できます。1つのプロジェクトの一部であり、同じ目的を持つ場合、メリットはありません。ただし、1つのサーバー上で2つの異なるプロジェクトを異なる目的で異なる構成で実行する必要がある場合は、この構成を使用すると便利です。
0x8BADF00D 2017年

35

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

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

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

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

アプリケーションをlocalhostからインターネットに移動する必要がある場合、Nodeを使用すると事態が複雑になります。

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

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

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

同時に、ブログなどの他のものを同じ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で実行されているペットプロジェクトノードアプリケーションをhttp:// myhost / demo / pet-projectにマウントしていることがわかります。ます。

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

次に、他のすべてのリクエストは上書きされ、Pet Project Nodeアプリケーションにプロキシされるため、Nodeアプリケーションは実際にマウントされている場所を知る必要がないため、構成によって純粋に任意の場所に移動できます。

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

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

送信元:http : //skovalyov.blogspot.dk/2012/07/deploy-multiple-node-applications-on.html


1
なぜ、どのようにあなたの代わりにサブドメインでそれを行う必要があります。skovalyov.blogspot.dk/2012/10/...を
skovalyov

回答のみをリンク…ブログがなくなった場合に備えて、回答の関連部分を要約してください。
カイザー

11

Nginx構成のNode.js。

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

次の設定を追加して、プロキシとして機能するNginxが「subdomain.your_domain.com」からのサーバーからポート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;
  }
}

9

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

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

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


2
リソースが最も重要な問題である場合は(おそらくない)、このアドバイスに従ってください。(a)と(b)の間には異なる妥協点があります。オプションは、()は、おそらくより良いあなたがなど複数の独立した例えばサイトの再起動やメンテナンス、DB接続、コードベース、ライブラリの依存関係、サーバー間で移動するサイトであるようにサイトを希望する場合である
robocat

8

私はあなたがクローンできるリポジトリを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;
        }
}

5

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

それらの一部をnginxで提供すると、パフォーマンスが向上します。


5

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やスーパーバイザーなどのプロセスマネージャーによって管理される必要があります。

  • 歩哨ロールバーなどの生産エラーを取得するためのエラー報告サービスをセットアップする

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


1
pm2を使用するもう1つの理由は、シェルを終了した後にアプリを「永久に」実行し、サーバーを再起動する必要がある場合は自動的に起動できるようにするためです。pm2.keymetrics.io
usage

3

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はクライアントに応答を返します。

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

nodejs以外のサービスを実行したい場合は、Django、フラスコ、phpなどの別のサービスを異なるポートで実行し、nginxで構成してください。


1

各マイクロサービス手段を管理して実行する場合は、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

NginxとNodejsを使用した最良かつ簡単なセットアップは、proxy_protocolを有効にしたHTTPおよびTCPロードバランサーとしてNginxを使用することです。このコンテキストでは、Nginxは着信リクエストをnodejsにプロキシし、プロキシサーバー自体ではなくバックエンドNginxサーバーへのSSL接続を終了することができます。(SSL-PassThrough)

私の意見では、すべてのWebアプリは安全な環境を使用している(または使用する必要がある)ため、非SSLの例を示す意味はありません。

/etc/nginx/nginx.confにあるプロキシサーバーの設定例

user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
  upstream webserver-http {
    server 192.168.1.4; #use a host port instead if using docker
    server 192.168.1.5; #use a host port instead if using docker
  }
  upstream nodejs-http {
    server 192.168.1.4:8080; #nodejs listening port
    server 192.168.1.5:8080; #nodejs listening port
  }
  server {
    server_name example.com;
    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-Host $server_name;
      proxy_set_header Connection "";
      add_header       X-Upstream $upstream_addr;
      proxy_redirect     off;
      proxy_connect_timeout  300;
      proxy_http_version 1.1;
      proxy_buffers 16 16k;
      proxy_buffer_size 16k;
      proxy_cache_background_update on;
      proxy_pass http://webserver-http$request_uri;
    }
  }
  server {
    server_name node.example.com;
    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-Host $server_name;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "Upgrade";
      add_header       X-Upstream $upstream_addr;
      proxy_redirect     off;
      proxy_connect_timeout  300;
      proxy_http_version 1.1;
      proxy_buffers 16 16k;
      proxy_buffer_size 16k;
      proxy_cache_background_update on;
      proxy_pass http://nodejs-http$request_uri;
    }
  }
}
stream {
  upstream webserver-https {
    server 192.168.1.4:443; #use a host port instead if using docker
    server 192.168.1.5:443; #use a host port instead if using docker
  }

  server {
    proxy_protocol on;
    tcp_nodelay on;
    listen 443;
    proxy_pass webserver-https;
  }
  log_format proxy 'Protocol: $protocol - $status $bytes_sent $bytes_received $session_time';
  access_log  /var/log/nginx/access.log proxy;
  error_log /var/log/nginx/error.log debug;
}

次に、バックエンドWebサーバーを処理します。 /etc/nginx/nginx.conf

user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
load_module /etc/nginx/modules/ngx_http_geoip2_module.so; # GeoIP2
events {
    worker_connections  1024;
}
http {
    variables_hash_bucket_size 64;
    variables_hash_max_size 2048;
    server_tokens off;
    sendfile    on;
    tcp_nopush  on;
    tcp_nodelay on;
    autoindex off;
    keepalive_timeout  30;
    types_hash_bucket_size 256;
    client_max_body_size 100m;
    server_names_hash_bucket_size 256;
    include         mime.types;
    default_type    application/octet-stream;
    index  index.php index.html index.htm;
    # GeoIP2
    log_format  main    'Proxy Protocol Address: [$proxy_protocol_addr] '
                        '"$request" $remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';

    # GeoIP2
    log_format  main_geo    'Original Client Address: [$realip_remote_addr]- Proxy Protocol Address: [$proxy_protocol_addr] '
                            'Proxy Protocol Server Address:$proxy_protocol_server_addr - '
                            '"$request" $remote_addr - $remote_user [$time_local] "$request" '
                            '$status $body_bytes_sent "$http_referer" '
                            '$geoip2_data_country_iso $geoip2_data_country_name';

    access_log  /var/log/nginx/access.log  main_geo; # GeoIP2
#===================== GEOIP2 =====================#
    geoip2 /usr/share/geoip/GeoLite2-Country.mmdb {
        $geoip2_metadata_country_build  metadata build_epoch;
        $geoip2_data_country_geonameid  country geoname_id;
        $geoip2_data_country_iso        country iso_code;
        $geoip2_data_country_name       country names en;
        $geoip2_data_country_is_eu      country is_in_european_union;
    }
    #geoip2 /usr/share/geoip/GeoLite2-City.mmdb {
    #   $geoip2_data_city_name city names en;
    #   $geoip2_data_city_geonameid city geoname_id;
    #   $geoip2_data_continent_code continent code;
    #   $geoip2_data_continent_geonameid continent geoname_id;
    #   $geoip2_data_continent_name continent names en;
    #   $geoip2_data_location_accuracyradius location accuracy_radius;
    #   $geoip2_data_location_latitude location latitude;
    #   $geoip2_data_location_longitude location longitude;
    #   $geoip2_data_location_metrocode location metro_code;
    #   $geoip2_data_location_timezone location time_zone;
    #   $geoip2_data_postal_code postal code;
    #   $geoip2_data_rcountry_geonameid registered_country geoname_id;
    #   $geoip2_data_rcountry_iso registered_country iso_code;
    #   $geoip2_data_rcountry_name registered_country names en;
    #   $geoip2_data_rcountry_is_eu registered_country is_in_european_union;
    #   $geoip2_data_region_geonameid subdivisions 0 geoname_id;
    #   $geoip2_data_region_iso subdivisions 0 iso_code;
    #   $geoip2_data_region_name subdivisions 0 names en;
   #}

#=================Basic Compression=================#
    gzip on;
    gzip_disable "msie6";
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/css text/xml text/plain application/javascript image/jpeg image/png image/gif image/x-icon image/svg+xml image/webp application/font-woff application/json application/vnd.ms-fontobject application/vnd.ms-powerpoint;
    gzip_static on;

    include /etc/nginx/sites-enabled/example.com-https.conf;
}

さて、みましょうconfigureは、このSSLとproxy_protocolの仮想ホストがで設定を有効に/etc/nginx/sites-available/example.com-https.conf

server {
    real_ip_header proxy_protocol;
    set_real_ip_from 192.168.1.1; #proxy server ip address
    #set_real_ip_from proxy; #proxy container hostname if you are using docker
    server_name 192.168.1.4; #Your current server ip address. It will redirect to the domain name.
    listen 80;
    listen 443 ssl http2;
    listen [::]:80;
    listen [::]:443 ssl http2;
    ssl_certificate     /etc/nginx/certs/example.com.crt;
    ssl_certificate_key /etc/nginx/certs/example.com.key;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;
    return 301 https://example.com$request_uri;
}
server {
    real_ip_header proxy_protocol;
    set_real_ip_from 192.168.1.1; #proxy server ip address
    #set_real_ip_from proxy; #proxy container hostname if you are using docker
    server_name  example.com;
    listen       *:80;
    return 301   https://example.com$request_uri;
}
server {
    real_ip_header proxy_protocol;
    set_real_ip_from 192.168.1.1; #proxy server ip address
    #set_real_ip_from proxy; #proxy container hostname if you are using docker
    server_name www.example.com;
    listen 80;
    listen 443 http2;
    listen [::]:80;
    listen [::]:443 ssl http2 ;
    ssl_certificate     /etc/nginx/certs/example.com.crt;
    ssl_certificate_key /etc/nginx/certs/example.com.key;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;
    return 301 https://example.com$request_uri;
}
server {
    real_ip_header proxy_protocol;
    set_real_ip_from 192.168.1.1; #proxy server ip address
    #set_real_ip_from proxy; #proxy container hostname if you are using docker
    server_name example.com;
    listen 443 proxy_protocol ssl http2;
    listen [::]:443 proxy_protocol ssl http2;
    root /var/www/html;
    charset UTF-8;
    add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header Referrer-Policy no-referrer;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;
    keepalive_timeout   70;
    ssl_buffer_size 1400;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=86400;
    resolver_timeout 10;
    ssl_certificate     /etc/nginx/certs/example.com.crt;
    ssl_certificate_key /etc/nginx/certs/example.com.key;
    ssl_trusted_certificate /etc/nginx/certs/example.com.crt;
location ~* \.(jpg|jpe?g|gif|png|ico|cur|gz|svgz|mp4|ogg|ogv|webm|htc|css|js|otf|eot|svg|ttf|woff|woff2)(\?ver=[0-9.]+)?$ {
    expires modified 1M;
    add_header Access-Control-Allow-Origin '*';
    add_header Pragma public;
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    access_log off;
    }
    location ~ /.well-known { #For issuing LetsEncrypt Certificates
        allow all;
    }
location / {
    index index.php;
    try_files $uri $uri/ /index.php?$args;
    }
error_page  404    /404.php;

location ~ \.php$ {
    try_files       $uri =404;
    fastcgi_index   index.php;
    fastcgi_pass    unix:/tmp/php7-fpm.sock;
    #fastcgi_pass    php-container-hostname:9000; (if using docker)
    fastcgi_pass_request_headers on;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_intercept_errors on;
    fastcgi_ignore_client_abort off;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_request_buffering on;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 256k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    include fastcgi_params;
}
location = /robots.txt {
    access_log off;
    log_not_found off;
    }
location ~ /\. {
    deny  all;
    access_log off;
    log_not_found off;
    }
}

そして最後に、2つのnodejsウェブサーバーのサンプル:最初のサーバー:

var http = require('http');

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

2番目のサーバー:

var http = require('http');

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

これで、すべてが完全に機能し、負荷が分散されるはずです。

しばらく前に、DockerでNginxをTCPロードバランサーとして設定する方法について書きました。Dockerを使用しているかどうかを確認してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.