how-to-set-up-a-node-js-application-for-production-on-ubuntu-14-04
前書き
Node.jsは、サーバーサイドおよびネットワークアプリケーションを簡単に構築するためのオープンソースのJavascriptランタイム環境です。 このプラットフォームはLinux、OS X、FreeBSD、およびWindowsで動作し、そのアプリケーションはJavaScriptで記述されています。 Node.jsアプリケーションはコマンドラインで実行できますが、サービスとして実行する方法をお教えします。再起動または障害が発生すると自動的に再起動されるため、運用環境で使用できます。
このチュートリアルでは、2つのUbuntu 14.04サーバーで構成される実稼働対応のNode.js環境のセットアップについて説明します。 1つのサーバーはPM2によって管理されるNode.jsアプリケーションを実行し、もう1つのサーバーはユーザーにアプリケーションサーバーへのNginxリバースプロキシを介してアプリケーションへのアクセスを提供します。
このチュートリアルのCentOSバージョンは、https://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-centos-7 [ここにあります]。
前提条件
このガイドでは、2つのUbuntu 14.04サーバー(同じネットワーク内のプライベートネットワーク)を使用しています。 以下の名前でそれらを参照します。
-
* app *:Node.jsランタイム、Node.jsアプリケーション、およびPM2をインストールするサーバー
-
* web *:Nginx Webサーバーをインストールするサーバー。アプリケーションへのリバースプロキシとして機能します。 ユーザーは、このサーバーのパブリックIPアドレスにアクセスしてNode.jsアプリケーションにアクセスします。
このチュートリアルでは単一のサーバーを使用できますが、途中でいくつかの変更を行う必要があります。 localhost IPアドレス、つまり + 127.0.0.1 +
、* app *サーバーのプライベートIPアドレスが使用されている場所。
以下は、このチュートリアルを実行した後のセットアップの図です。
image:https://assets.digitalocean.com/articles/nodejs/node_diagram.png [Node.jsアプリケーションへのリバースプロキシ]
このガイドを始める前に、両方のサーバーで設定された `+ sudo +`権限を持つ通常の非rootユーザーが必要です。これは、サーバーにログインするユーザーです。 通常のユーザーアカウントを構成する方法については、https://www.digitalocean.com/community/articles/initial-server-setup-with-ubuntu-14-04 [初期サーバーセットアップガイドUbuntu 14.04の場合]。
パブリックIPアドレスの代わりにドメイン名を使用して* web *サーバーにアクセスできるようにする場合は、ドメイン名を購入してから次のチュートリアルに従ってください。
Node.jsランタイムを* app *サーバーにインストールすることから始めましょう。
Node.jsをインストールする
Node.jsの最新のLTSリリースを* app *サーバーにインストールします。
-
app *サーバーで、次のコマンドでapt-getパッケージリストを更新しましょう。
sudo apt-get update
次に、 + apt-get`を使用して
+ git`パッケージをインストールします。
sudo apt-get install git
Node.jsダウンロードページに移動し、* Linuxバイナリ(.tar.xz)ダウンロードリンクを見つけます。 それを右クリックし、そのリンクアドレスをクリップボードにコピーします。 この記事の執筆時点では、最新のLTSリリースは 4.2.3 *です。 Node.jsの最新の安定版リリースをインストールする場合は、https://nodejs.org/en/download/stable/ [適切なページ]に移動し、そのリンクをコピーします。
ホームディレクトリに移動して、 `+ wget +`でNode.jsソースをダウンロードします。 強調表示された部分の代わりにダウンロードリンクを貼り付けます。
cd ~
wget
次のコマンドを使用して、ダウンロードしたtarアーカイブを `+ node +`ディレクトリに解凍します。
mkdir node
tar xvf node-v*.tar.?z --strip-components=1 -C ./node
ダウンロードしたNode.jsアーカイブを削除する場合は、不要になったため、ホームディレクトリに移動し、この「+ rm +」コマンドを使用します。
cd ~
rm -rf node-v*
次に、 `+ npm `のグローバルな ` prefix `を設定します。ここで、 ` npm `はインストールされたNodeパッケージへのシンボリックリンクをデフォルトパスのどこかに作成します。 次のコマンドを使用して、「 / usr / local +」に設定します。
mkdir node/etc
echo 'prefix=/usr/local' > node/etc/npmrc
これで、 + node`と
+ npm`バイナリをインストール場所に移動する準備ができました。 次のコマンドでそれを `+ / opt / node +`に移動します:
sudo mv node /opt/
この時点で、 `+ root +`をファイルの所有者にしたい場合があります。
sudo chown -R root: /opt/node
最後に、デフォルトパスに「+ node」および「+ npm」バイナリのシンボリックリンクを作成しましょう。 次のコマンドを使用して、リンクを `+ / usr / local / bin +`に配置します。
sudo ln -s /opt/node/bin/node /usr/local/bin/node
sudo ln -s /opt/node/bin/npm /usr/local/bin/npm
次のコマンドでバージョンを確認して、ノードがインストールされていることを確認します。
node -v
Node.jsランタイムがインストールされ、アプリケーションを実行する準備ができました! Node.jsアプリケーションを作成しましょう。
Node.jsアプリケーションを作成する
次に、HTTPリクエストに「Hello World」を返すだけの_Hello World_アプリケーションを作成します。 これはNode.jsのセットアップに役立つサンプルアプリケーションです。これを独自のアプリケーションに置き換えることができます。適切なIPアドレスとポートでリッスンするようにアプリケーションを変更してください。
Node.jsアプリケーションがリバースプロキシサーバー* web からのリクエストを処理するようにしたいので、サーバー間通信に app *サーバーのプライベートネットワークインターフェイスを利用します。 * app *サーバーのプライベートネットワークアドレスを検索します。
DigitalOceanドロップレットをサーバーとして使用している場合、_Metadata_サービスを介してサーバーのプライベートIPアドレスを検索できます。 * app *サーバーで、 `+ curl +`コマンドを使用してIPアドレスを今すぐ取得します。
curl -w "\n" http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address
Node.jsアプリケーションの構成に使用されるため、出力(プライベートIPアドレス)をコピーする必要があります。
Hello World Code
次に、Node.jsアプリケーションを作成して開き、編集します。 このチュートリアルでは、 `+ vi `を使用して ` hello.js +`というサンプルアプリケーションを編集します。
cd ~
vi hello.js
次のコードをファイルに挿入し、強調表示された「+ APP_PRIVATE_IP_ADDRESS 」アイテムの両方を* app *サーバーのプライベートIPアドレスに置き換えてください。 必要に応じて、両方の場所で強調表示されているポート「+8080」を置き換えることもできます(必ず非管理ポートを使用してください。 1024以上):
hello.js
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(, '');
console.log('Server running at http://:/');
ここで保存して終了します。
このNode.jsアプリケーションは、指定されたIPアドレスとポートで単純にリッスンし、「+ 200+」HTTP成功コードとともに「Hello World」を返します。 これは、* web *サーバーなど、同じプライベートネットワーク上のサーバーからのみアプリケーションに到達できることを意味します。
テストアプリケーション(オプション)
アプリケーションが機能するかどうかをテストする場合は、* app *サーバーで次の `+ node +`コマンドを実行します。
node hello.js
*注意:*この方法でNode.jsアプリケーションを実行すると、 `+ CTRL + C +`を押してアプリケーションが強制終了されるまで、追加のコマンドがブロックされます。
アプリケーションをテストするには、別のターミナルセッションを開き、* web *サーバーに接続します。 Webサーバーは同じプライベートネットワーク上にあるため、 `+ curl `を使用して* app *サーバーのプライベートIPアドレスに到達できるはずです。 * app *サーバーのプライベートIPアドレスを ` APP_PRIVATE_IP_ADDRESS +`に、ポートを変更した場合は必ず置き換えてください:
curl http://:
次の出力が表示される場合、アプリケーションは適切に動作しており、適切なIPアドレスとポートでリッスンしています。
Output:Hello World
適切な出力が表示されない場合は、Node.jsアプリケーションが実行されており、適切なIPアドレスとポートでリッスンするように構成されていることを確認してください。
-
app *サーバーで、 `+ CTRL + C +`を押してアプリケーションを強制終了します(まだ行っていない場合)。
PM2をインストールする
次に、Node.jsアプリケーションのプロセスマネージャーであるPM2をインストールします。 PM2は、アプリケーションを管理およびデーモン化する(サービスとして実行する)簡単な方法を提供します。
Node.jsでインストールするNodeモジュール用のパッケージマネージャーであるNode Packaged Modules(NPM)を使用して、* app *サーバーにPM2をインストールします。 次のコマンドを使用して、PM2をインストールします。
sudo npm install pm2 -g
PM2でアプリケーションを管理する
PM2はシンプルで使いやすいです。 PM2のいくつかの基本的な使用方法について説明します。
アプリケーションを開始
最初にしたいことは、バックグラウンドで `+ pm2 start `コマンドを使用してアプリケーション ` hello.js +`を実行することです:
pm2 start
これにより、アプリケーションがPM2のプロセスリストに追加され、アプリケーションを起動するたびに出力されます。
Output:┌──────────┬────┬──────┬──────┬────────┬───────────┬────────┬────────────┬──────────┐
│ App name │ id │ mode │ PID │ status │ restarted │ uptime │ memory │ watching │
├──────────┼────┼──────┼──────┼────────┼───────────┼────────┼────────────┼──────────┤
│ │ 0 │ fork │ 5871 │ online │ 0 │ 0s │ 9.012 MB │ disabled │
└──────────┴────┴──────┴──────┴────────┴───────────┴────────┴────────────┴──────────┘
ご覧のように、PM2は_App name_(ファイル名に基づいて、拡張子「+ .js +」なし)とPM2 id_を自動的に割り当てます。 PM2は、プロセスの_PID、その現在のステータス、メモリ使用量などの他の情報も保持します。
PM2で実行中のアプリケーションは、アプリケーションがクラッシュまたは強制終了すると自動的に再起動されますが、システムの起動時にアプリケーションを起動するために追加の手順を実行する必要があります(ブートまたはリブート)。 幸いなことに、PM2はこれを行う簡単な方法である `+ startup +`サブコマンドを提供します。
`+ startup `サブコマンドは、サーバーの起動時にPM2とその管理対象プロセスを起動するための起動スクリプトを生成および構成します。 また、実行しているプラットフォームを指定する必要があります。この場合、 ` ubuntu +`です。
pm2 startup ubuntu
結果の出力の最後の行には、実行する必要があるコマンド(スーパーユーザー特権で実行する必要があります)が含まれます。
Output:[PM2] You have to run this command as root
[PM2] Execute the following command :
[PM2]
生成されたコマンドを実行し(上記の強調表示された出力と同様)、PM2を起動時に起動するように設定します(独自の出力からコマンドを使用します)。
その他のPM2の使用法(オプション)
PM2には、アプリケーションに関する情報を管理または検索できる多くのサブコマンドがあります。 引数なしで `+ pm2 +`を実行すると、使用例を含むヘルプページが表示され、チュートリアルのこのセクションよりも詳細にPM2の使用法が説明されています。
このコマンドでアプリケーションを停止します(PM2の「+ App name」または「+ id」を指定します):
pm2 stop
次のコマンドでアプリケーションを再起動します(PM2の「+ App name」または「+ id」を指定します):
pm2 restart
現在PM2によって管理されているアプリケーションのリストは、 `+ list +`サブコマンドで検索することもできます:
pm2 list
特定のアプリケーションに関する詳細情報は、「+ info +」サブコマンドを使用して見つけることができます(PM2 _App name_または_id_を指定してください):
pm2 info
PM2プロセスモニターは、 `+ monit +`サブコマンドでプルアップできます。 これにより、アプリケーションのステータス、CPU、およびメモリ使用量が表示されます。
pm2 monit
Node.jsアプリケーションが実行され、PM2によって管理されたので、リバースプロキシを設定しましょう。
リバースプロキシサーバーのセットアップ
アプリケーションが実行され、プライベートIPアドレスをリッスンしているので、ユーザーがアクセスする方法を設定する必要があります。 この目的のために、Nginx Webサーバーをリバースプロキシとして設定します。 このチュートリアルでは、Nginxサーバーをゼロからセットアップします。 すでにNginxサーバーをセットアップしている場合は、 `+ location +`ブロックを選択したサーバーブロックにコピーするだけです(場所がWebサーバーの既存のコンテンツと競合しないことを確認してください)。
-
web *サーバーで、次のコマンドでapt-getパッケージリストを更新しましょう。
sudo apt-get update
次に、apt-getを使用してNginxをインストールします。
sudo apt-get install nginx
次に、デフォルトのサーバーブロック構成ファイルを開いて編集します。
sudo vi /etc/nginx/sites-available/default
ファイル内のすべてを削除し、次の構成を挿入します。 + server_name +`ディレクティブ(またはドメインが設定されていない場合はIPアドレス)を独自のドメイン名に置き換え、 `+ APP_PRIVATE_IP_ADDRESS +`を* app *サーバーのプライベートIPアドレスに置き換えてください。 さらに、アプリケーションが別のポートでリッスンするように設定されている場合は、ポート( `+ 8080 +
)を変更します。
/ etc / nginx / sites-available / default
server {
listen 80;
server_name ;
location / {
proxy_pass http://:;
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;
}
}
これにより、ルートでリクエストに応答するように* web *サーバーが設定されます。 サーバーが `+ example.com `で利用できると仮定すると、Webブラウザー経由で ` http:// example.com / `にアクセスすると、ポート ` 8080 +`でアプリケーションサーバーのプライベートIPアドレスにリクエストが送信されます。 Node.jsアプリケーションによって受信され、返信されます。
同じサーバーブロックに追加の「+ location 」ブロックを追加して、同じ* web *サーバー上の他のアプリケーションへのアクセスを提供できます。 たとえば、ポート ` 8081 `の* app *サーバーで別のNode.jsアプリケーションも実行している場合、このロケーションブロックを追加して、 ` http://example.com/app2+経由でアクセスできるようにします。 `:
Nginx設定-追加の場所
location /app2 {
proxy_pass http://:;
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;
}
アプリケーションのロケーションブロックの追加が完了したら、保存して終了します。
-
web *サーバーで、Nginxを再起動します。
sudo service nginx restart
Node.jsアプリケーションが実行中で、アプリケーションとNginxの構成が正しいと仮定すると、* web *サーバーのリバースプロキシ経由でアプリケーションにアクセスできるはずです。 *ウェブ*サーバーのURL(パブリックIPアドレスまたはドメイン名)にアクセスして試してください。
結論
おめでとうございます。 これで、Ubuntu 14.04サーバー上のNginxリバースプロキシの背後でNode.jsアプリケーションが実行されました。 このリバースプロキシのセットアップは、ユーザーが共有したい他のアプリケーションまたは静的なWebコンテンツにアクセスできるように十分な柔軟性を備えています。 Node.jsの開発を頑張ってください!
また、Webサーバーとユーザー間の送信を暗号化する場合は、https://www.digitalocean.com/community/tutorials/how-to-install-an-ssl-certificate-from-a-commercial-certificate -authority [これは、HTTPS(TLS / SSL)サポートのセットアップに役立つチュートリアルです]。