開発者ドキュメント

Debian8で本番用にNode.jsアプリケーションを設定する方法

序章

Node.jsは、サーバー側およびネットワークアプリケーションを簡単に構築するためのオープンソースのJavaScriptランタイム環境です。 プラットフォームは、Linux、OS X、FreeBSD、およびWindowsで動作します。 Node.jsアプリケーションはコマンドラインで実行できますが、サービスとして実行することに重点を置いて、再起動または失敗時に自動的に再起動し、本番環境で安全に使用できるようにします。

このチュートリアルでは、単一のDebian8サーバーで本番環境に対応したNode.js環境をセットアップする方法について説明します。 このサーバーは、PM2によって管理されるNode.jsアプリケーションを実行し、Nginxリバースプロキシを介してアプリケーションへの安全なアクセスをユーザーに提供します。

前提条件

このガイドは、Debian 8 初期サーバーセットアップガイドで説明されているように、sudo権限を持つ非rootユーザーで構成されたDebian8サーバーを持っていることを前提としています。

また、サーバーのパブリックIPアドレスを指すドメイン名があることも前提としています。

Node.jsランタイムをサーバーにインストールすることから始めましょう。

Node.jsをインストールします

NodeSource パッケージアーカイブを使用して、Node.jsの最新のLTSリリースをインストールします。

まず、そのコンテンツにアクセスするためにNodeSourcePPAをインストールする必要があります。 ホームディレクトリにいることを確認し、curlを使用してNode.js6.xアーカイブのインストールスクリプトを取得します。

  1. cd ~
  2. curl -sL https://deb.nodesource.com/setup_6.x -o nodesource_setup.sh

このスクリプトの内容は、nano(またはお好みのテキストエディタ)で調べることができます。

  1. nano nodesource_setup.sh

そして、sudoの下でスクリプトを実行します。

  1. sudo bash nodesource_setup.sh

PPAが構成に追加され、ローカルパッケージキャッシュが自動的に更新されます。 nodesourceからセットアップスクリプトを実行した後、上記と同じ方法でNode.jsパッケージをインストールできます。

  1. sudo apt-get install nodejs

nodejsパッケージにはnodejsバイナリとnpmが含まれているため、npmを個別にインストールする必要はありません。 ただし、一部のnpmパッケージ(ソースからのコードのコンパイルが必要なパッケージなど)を機能させるには、build-essentialパッケージをインストールする必要があります。

  1. sudo apt-get install build-essential

これでNode.jsランタイムがインストールされ、アプリケーションを実行する準備が整いました。 Node.jsアプリケーションを書いてみましょう。

Node.jsアプリケーションを作成する

HTTPリクエストに「HelloWorld」を返すだけのHelloWorldアプリケーションを作成します。 これは、Node.jsをセットアップするのに役立つサンプルアプリケーションであり、独自のアプリケーションに置き換えることができます。適切なIPアドレスとポートでリッスンするようにアプリケーションを変更してください。

Hello World Code

まず、編集用にNode.jsアプリケーションを作成して開きます。 このチュートリアルでは、nanoを使用して、hello.jsというサンプルアプリケーションを編集します。

  1. cd ~
  2. nano hello.js

次のコードをファイルに挿入します。 必要に応じて、強調表示されたポート8080を両方の場所で置き換えることができます(管理者以外のポートを使用してください。 1024以上):

hello.js
#!/usr/bin/env nodejs
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(8080, 'localhost');
console.log('Server running at http://localhost:8080/');

保存して終了します。

このNode.jsアプリケーションは、指定されたアドレス(localhost)とポート(8080)をリッスンし、200HTTP成功コードとともに「HelloWorld」を返します。 localhost をリッスンしているため、リモートクライアントはアプリケーションに接続できません。

テストアプリケーション

アプリケーションをテストできるようにするには、hello.js実行可能ファイルにマークを付けます。

  1. chmod +x ./hello.js

そしてそれをそのように実行します:

  1. ./hello.js
Output
Server running at http://localhost:8080/

注:この方法でNode.jsアプリケーションを実行すると、 Ctrl-C を押してアプリケーションが強制終了されるまで、追加のコマンドがブロックされます。

アプリケーションをテストするには、サーバーで別のターミナルセッションを開き、curlを使用してlocalhostに接続します。

  1. curl http://localhost:8080

次の出力が表示された場合、アプリケーションは正常に動作しており、適切なアドレスとポートでリッスンしています。

Output
Hello World

適切な出力が表示されない場合は、Node.jsアプリケーションが実行されており、適切なアドレスとポートでリッスンするように構成されていることを確認してください。

動作していることを確認したら、 Ctrl + C を押して、アプリケーションを強制終了します(まだ実行していない場合)。

PM2をインストールします

次に、Node.jsアプリケーションのプロセスマネージャーであるPM2をインストールします。 PM2は、アプリケーションを管理およびデーモン化する(サービスとしてバックグラウンドで実行する)簡単な方法を提供します。

Node.jsとともにインストールするNodeモジュールのパッケージマネージャーであるnpmを使用して、サーバーにPM2をインストールします。 次のコマンドを使用して、PM2をインストールします。

  1. sudo npm install -g pm2

-gオプションは、npmにモジュールをグローバルにインストールして、システム全体で使用できるようにするように指示します。

PM2でアプリケーションを管理する

PM2はシンプルで使いやすいです。 PM2のいくつかの基本的な使用法について説明します。

アプリケーションを開始する

最初に実行するのは、pm2 startコマンドを使用して、アプリケーションhello.jsをバックグラウンドで実行することです。

  1. pm2 start hello.js

これにより、アプリケーションがPM2のプロセスリストに追加されます。このリストは、アプリケーションを起動するたびに出力されます。

Output
[PM2] Spawning PM2 daemon [PM2] PM2 Successfully daemonized [PM2] Starting hello.js in fork_mode (1 instance) [PM2] Done. ┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐ │ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │ ├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤ │ hello │ 0 │ fork │ 3524 │ online │ 0 │ 0s │ 21.566 MB │ disabled │ └──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────────────┴──────────┘ Use `pm2 show <id|name>` to get more details about an app

ご覧のとおり、PM2はアプリ名.js拡張子なしのファイル名に基づく)とPM2 idを自動的に割り当てます。 PM2は、プロセスの PID 、その現在のステータス、メモリ使用量などの他の情報も保持します。

PM2で実行されているアプリケーションは、アプリケーションがクラッシュまたは強制終了された場合に自動的に再起動されますが、システムの起動(起動または再起動)時にアプリケーションを起動するには、追加の手順を実行する必要があります。 幸い、PM2は、これを行う簡単な方法であるstartupサブコマンドを提供します。

startupサブコマンドは、サーバーの起動時にPM2とその管理対象プロセスを起動するための起動スクリプトを生成および構成します。 また、実行しているプラットフォーム(この場合は、ubuntu)を指定する必要があります。

  1. pm2 startup systemd

結果の出力の最後の行には、スーパーユーザー権限で実行する必要のあるコマンドが含まれます。

Output
[PM2] You have to run this command as root. Execute the following command: sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy

生成されたコマンド(上記の強調表示された出力と同様ですが、sammyの代わりにユーザー名を使用)を実行して、PM2を起動時に開始するように設定します(独自の出力からのコマンドを使用します)。

  1. sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy

これにより、起動時にユーザーに対してpm2を実行するsystemdunitが作成されます。 このpm2インスタンスは、hello.jsを実行します。 systemdユニットのステータスはsystemctlで確認できます。

  1. systemctl status pm2

systemdの詳細な概要については、 Systemd Essentials:サービス、ユニット、およびジャーナルの操作を参照してください。

その他のPM2の使用法(オプション)

PM2には、アプリケーションに関する情報を管理または検索できる多くのサブコマンドが用意されています。 引数なしでpm2を実行すると、チュートリアルのこのセクションよりも詳細にPM2の使用法をカバーする使用例を含むヘルプページが表示されることに注意してください。

このコマンドでアプリケーションを停止します(PM2 App nameまたはidを指定):

  1. pm2 stop app_name_or_id

次のコマンドを使用してアプリケーションを再起動します(PM2 App nameまたはidを指定)。

  1. pm2 restart app_name_or_id

PM2によって現在管理されているアプリケーションのリストは、listサブコマンドでも検索できます。

  1. pm2 list

特定のアプリケーションの詳細については、infoサブコマンドを使用して見つけることができます(PM2アプリ名またはid を指定):

  1. pm2 info example

PM2プロセスモニターは、monitサブコマンドでプルアップできます。 これにより、アプリケーションのステータス、CPU、およびメモリ使用量が表示されます。

  1. pm2 monit

Node.jsアプリケーションが実行され、PM2によって管理されたので、リバースプロキシを設定しましょう。

Nginxをリバースプロキシサーバーとして設定する

アプリケーションが実行され、 localhost をリッスンしているので、ユーザーがアプリケーションにアクセスする方法を設定する必要があります。 この目的のために、リバースプロキシとしてNginxWebサーバーをセットアップします。 このチュートリアルでは、Nginxサーバーを最初からセットアップします。 すでにNginxサーバーをセットアップしている場合は、locationブロックを選択したサーバーブロックにコピーするだけです(場所がWebサーバーの既存のコンテンツと競合しないことを確認してください)。

まず、apt-getを使用してNginxをインストールします。

  1. sudo apt-get install nginx

次に、デフォルトのサーバーブロック構成ファイルを開いて編集します。

  1. sudo nano /etc/nginx/sites-available/default

ファイル内のすべてを削除し、次の構成を挿入します。 server_nameディレクティブの代わりに独自のドメイン名を使用してください。 さらに、アプリケーションが別のポートでリッスンするように設定されている場合は、ポート(8080)を変更します。

/ etc / nginx / sites-available / default
server {
    listen 80;

    server_name example.com;

    location / {
        proxy_pass http://localhost:8080;
        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;
    }
}

これにより、サーバーがルートで要求に応答するように構成されます。 サーバーがexample.comで利用可能であるとすると、Webブラウザーを介してhttp://example.com/にアクセスすると、localhostのポート8080でリッスンし、hello.jsにリクエストが送信されます。

同じサーバーブロックにlocationブロックを追加して、同じサーバー上の他のアプリケーションへのアクセスを提供できます。 たとえば、ポート8081で別のNode.jsアプリケーションも実行している場合は、このロケーションブロックを追加して、http://example.com/app2経由でのアクセスを許可できます。

Nginx構成—追加の場所
    location /app2 {
        proxy_pass http://localhost:8081;
        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;
    }

アプリケーションのロケーションブロックの追加が完了したら、保存して終了します。

次のように入力して、構文エラーが発生していないことを確認してください。

  1. sudo nginx -t

次に、Nginxを再起動します。

  1. sudo systemctl restart nginx

次に、ファイアウォールを有効にしている場合は、ファイアウォールを介したNginxへのトラフィックを許可します。

ufw を使用している場合は、次のコマンドを使用できます。

  1. sudo ufw allow 'Nginx Full'

ufw を使用すると、次のコマンドでいつでもステータスを確認できます。

  1. sudo ufw status

代わりにIPTablesを使用している場合は、次のコマンドを使用してNginxへのトラフィックを許可できます。

  1. sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT

次のコマンドを実行すると、IPTablesのステータスをいつでも確認できます。

  1. sudo iptables -S

Node.jsアプリケーションが実行されていて、アプリケーションとNginxの構成が正しいと仮定すると、Nginxリバースプロキシを介してアプリケーションにアクセスできるようになります。 サーバーのURL(パブリックIPアドレスまたはドメイン名)にアクセスして試してみてください。

ここから、 Debian 8でLet’sEncryptを使用してNginxを保護する方法を読んで、セットアップを保護し続ける必要があります。

結論

おめでとう! これで、Node.jsアプリケーションがDebian8サーバー上のNginxリバースプロキシの背後で実行されます。 このリバースプロキシ設定は、共有したい他のアプリケーションや静的Webコンテンツへのアクセスをユーザーに提供するのに十分な柔軟性があります。 Node.jsの開発に頑張ってください!

モバイルバージョンを終了