Ubuntu14.04で本番用にNode.jsアプリケーションを設定する方法
序章
Node.jsは、サーバー側およびネットワークアプリケーションを簡単に構築するためのオープンソースのJavascriptランタイム環境です。 プラットフォームはLinux、OS X、FreeBSD、およびWindowsで動作し、そのアプリケーションはJavaScriptで記述されています。 Node.jsアプリケーションはコマンドラインで実行できますが、サービスとして実行する方法を説明します。これにより、再起動または失敗時に自動的に再起動し、実稼働環境で使用できるようになります。
このチュートリアルでは、2台のUbuntu14.04サーバーで構成される本番環境に対応したNode.js環境のセットアップについて説明します。 一方のサーバーはPM2によって管理されるNode.jsアプリケーションを実行し、もう一方のサーバーはユーザーにアプリケーションサーバーへのNginxリバースプロキシを介したアプリケーションへのアクセスを提供します。
このチュートリアルのCentOSバージョンはここにあります。
前提条件
このガイドでは、(同じデータセンター内の)プライベートネットワークを備えた2台のUbuntu14.04サーバーを使用します。 それらを次の名前で参照します。
- app :Node.jsランタイム、Node.jsアプリケーション、およびPM2をインストールするサーバー
- web :アプリケーションのリバースプロキシとして機能するNginxWebサーバーをインストールするサーバー。 ユーザーは、このサーバーのパブリックIPアドレスにアクセスして、Node.jsアプリケーションにアクセスします。
このチュートリアルでは単一のサーバーを使用することもできますが、途中でいくつかの変更を加える必要があります。 ローカルホストのIPアドレスを使用するだけです。 127.0.0.1
、appサーバーのプライベートIPアドレスが使用されている場合。
このチュートリアルに従った後のセットアップの図は次のとおりです。
このガイドを開始する前に、両方のサーバーでsudo
権限が構成された通常の非rootユーザーが必要です。これは、サーバーにログインするユーザーです。 Ubuntu 14.04 の初期サーバーセットアップガイドの手順1〜4に従って、通常のユーザーアカウントを構成する方法を学習できます。
パブリックIPアドレスではなくドメイン名を介してwebサーバーにアクセスできるようにする場合は、ドメイン名を購入してから、次のチュートリアルに従ってください。
Node.jsランタイムをappサーバーにインストールすることから始めましょう。
Node.jsをインストールします
Node.jsの最新のLTSリリースをappサーバーにインストールします。
app サーバーで、次のコマンドを使用してapt-getパッケージリストを更新しましょう。
- sudo apt-get update
次に、apt-get
を使用して、npm
が依存するgit
パッケージをインストールします。
- sudo apt-get install git
Node.jsダウンロードページに移動し、 Linuxバイナリ(.tar.xz)ダウンロードリンクを見つけます。 それを右クリックし、そのリンクアドレスをクリップボードにコピーします。 この記事の執筆時点で、最新のLTSリリースは4.2.3です。 Node.jsの最新の安定したリリースをインストールしたい場合は、適切なページに移動し、そのリンクをコピーしてください。
ホームディレクトリに移動し、wget
を使用してNode.jsソースをダウンロードします。 強調表示された部分の代わりにダウンロードリンクを貼り付けます。
- cd ~
- wget https://nodejs.org/dist/v4.2.3/node-v4.2.3-linux-x64.tar.gz
次に、次のコマンドを使用して、ダウンロードした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
は、インストールされているノードパッケージへのシンボリックリンクを、デフォルトパスのどこかに作成します。 次のコマンドで/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リクエストに「HelloWorld」を返すだけの HelloWorldアプリケーションを作成します。 これは、Node.jsをセットアップするのに役立つサンプルアプリケーションであり、独自のアプリケーションに置き換えることができます。適切なIPアドレスとポートでリッスンするようにアプリケーションを変更してください。
Node.jsアプリケーションでリバースプロキシサーバーwebからのリクエストを処理する必要があるため、サーバー間通信にappサーバーのプライベートネットワークインターフェイスを利用します。 appサーバーのプライベートネットワークアドレスを検索します。
サーバーとしてDigitalOceanドロップレットを使用している場合は、メタデータサービスを介してサーバーのプライベート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以上):
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(8080, 'APP_PRIVATE_IP_ADDRESS');
console.log('Server running at http://APP_PRIVATE_IP_ADDRESS:8080/');
保存して終了します。
このNode.jsアプリケーションは、指定されたIPアドレスとポートをリッスンし、200
HTTP成功コードとともに「HelloWorld」を返します。 つまり、アプリケーションには、webサーバーなどの同じプライベートネットワーク上のサーバーからのみアクセスできます。
テストアプリケーション(オプション)
アプリケーションが機能するかどうかをテストする場合は、appサーバーで次のnode
コマンドを実行します。
- node hello.js
注:この方法でNode.jsアプリケーションを実行すると、CTRL+C
を押してアプリケーションが強制終了されるまで、追加のコマンドがブロックされます。
アプリケーションをテストするには、別のターミナルセッションを開き、webサーバーに接続します。 Webサーバーは同じプライベートネットワーク上にあるため、curl
を使用してappサーバーのプライベートIPアドレスに到達できるはずです。 appサーバーのプライベートIPアドレスをAPP_PRIVATE_IP_ADDRESS
に置き換え、ポートを変更した場合は、次のように置き換えてください。
- curl http://APP_PRIVATE_IP_ADDRESS:8080
次の出力が表示された場合、アプリケーションは正常に動作しており、適切なIPアドレスとポートでリッスンしています。
Output:Hello World
適切な出力が表示されない場合は、Node.jsアプリケーションが実行されており、適切なIPアドレスとポートでリッスンするように構成されていることを確認してください。
app サーバーで、CTRL+C
を押して、アプリケーションを強制終了してください(まだ終了していない場合)。
PM2をインストールします
次に、Node.jsアプリケーションのプロセスマネージャーであるPM2をインストールします。 PM2は、アプリケーションを管理およびデーモン化する(サービスとして実行する)ための簡単な方法を提供します。
基本的にNode.jsとともにインストールするNodeモジュールのパッケージマネージャーであるNodePackagedModules(NPM)を使用して、appサーバーにPM2をインストールします。 次のコマンドを使用して、PM2をインストールします。
- sudo npm install pm2 -g
PM2でアプリケーションを管理する
PM2はシンプルで使いやすいです。 PM2のいくつかの基本的な使用法について説明します。
アプリケーションを開始する
最初に実行するのは、pm2 start
コマンドを使用して、アプリケーションhello.js
をバックグラウンドで実行することです。
- pm2 start hello.js
これにより、アプリケーションがPM2のプロセスリストに追加されます。このリストは、アプリケーションを起動するたびに出力されます。
Output:┌──────────┬────┬──────┬──────┬────────┬───────────┬────────┬────────────┬──────────┐
│ App name │ id │ mode │ PID │ status │ restarted │ uptime │ memory │ watching │
├──────────┼────┼──────┼──────┼────────┼───────────┼────────┼────────────┼──────────┤
│ hello │ 0 │ fork │ 5871 │ online │ 0 │ 0s │ 9.012 MB │ disabled │
└──────────┴────┴──────┴──────┴────────┴───────────┴────────┴────────────┴──────────┘
ご覧のとおり、PM2はアプリ名(.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] sudo su -c "env PATH=$PATH:/opt/node/bin pm2 startup ubuntu -u sammy --hp /home/sammy"
生成されたコマンド(上記で強調表示された出力と同様)を実行して、PM2を起動時に開始するように設定します(独自の出力からのコマンドを使用します)。
- sudo su -c "env PATH=$PATH:/opt/node/bin pm2 startup ubuntu -u sammy --hp /home/sammy"
その他のPM2の使用法(オプション)
PM2には、アプリケーションに関する情報を管理または検索できる多くのサブコマンドが用意されています。 引数なしでpm2
を実行すると、チュートリアルのこのセクションよりも詳細にPM2の使用法をカバーする使用例を含むヘルプページが表示されることに注意してください。
このコマンドでアプリケーションを停止します(PM2 App name
またはid
を指定):
- pm2 stop example
次のコマンドを使用してアプリケーションを再起動します(PM2 App name
またはid
を指定)。
- pm2 restart example
PM2によって現在管理されているアプリケーションのリストは、list
サブコマンドでも検索できます。
- pm2 list
特定のアプリケーションの詳細については、info
サブコマンドを使用して見つけることができます(PM2アプリ名またはid を指定)::
- pm2 info example
PM2プロセスモニターは、monit
サブコマンドでプルアップできます。 これにより、アプリケーションのステータス、CPU、およびメモリ使用量が表示されます。
- pm2 monit
Node.jsアプリケーションが実行され、PM2によって管理されたので、リバースプロキシを設定しましょう。
リバースプロキシサーバーを設定する
アプリケーションが実行され、プライベートIPアドレスをリッスンしているので、ユーザーがアプリケーションにアクセスする方法を設定する必要があります。 この目的のために、リバースプロキシとしてNginxWebサーバーをセットアップします。 このチュートリアルでは、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
。 さらに、アプリケーションが別のポートでリッスンするように設定されている場合は、ポート(8080
)を変更します。
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://APP_PRIVATE_IP_ADDRESS: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;
}
}
これにより、ルートでリクエストに応答するようにwebサーバーが構成されます。 サーバーがexample.com
で利用可能であるとすると、Webブラウザーを介してhttp://example.com/
にアクセスすると、ポート8080
でアプリケーションサーバーのプライベートIPアドレスにリクエストが送信され、受信されて応答されます。 Node.jsアプリケーションによって。
同じサーバーブロックにlocation
ブロックを追加して、同じwebサーバー上の他のアプリケーションへのアクセスを提供できます。 たとえば、ポート8081
のapp サーバーで別のNode.jsアプリケーションも実行している場合は、このロケーションブロックを追加して、http://example.com/app2
経由でアクセスできるようにすることができます。 :
location /app2 {
proxy_pass http://APP_PRIVATE_IP_ADDRESS: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;
}
アプリケーションのロケーションブロックの追加が完了したら、保存して終了します。
web サーバーで、Nginxを再起動します。
- sudo service nginx restart
Node.jsアプリケーションが実行されていて、アプリケーションとNginxの構成が正しいと仮定すると、webサーバーのリバースプロキシを介してアプリケーションにアクセスできるはずです。 web サーバーのURL(パブリックIPアドレスまたはドメイン名)にアクセスして試してみてください。
結論
おめでとう! これで、Ubuntu14.04サーバー上のNginxリバースプロキシの背後でNode.jsアプリケーションが実行されます。 このリバースプロキシ設定は、共有したい他のアプリケーションや静的Webコンテンツへのアクセスをユーザーに提供するのに十分な柔軟性があります。 Node.jsの開発に頑張ってください!
また、Webサーバーとユーザー間の送信を暗号化する場合は、 HTTPS(TLS / SSL)サポートを設定するのに役立つチュートリアルがあります。