Ubuntu 14.04で実稼働用にNode.jsアプリケーションをセットアップする方法

前書き

Node.js is an open source Javascript runtime environment for easily building server-side and networking applications. このプラットフォームはLinux、OS X、FreeBSD、およびWindowsで動作し、そのアプリケーションはJavaScriptで記述されています。 Node.js applications can be run at the command line but we will teach you how to run them as a service, so they will automatically restart on reboot or failure, so you can use them in a production environment.

このチュートリアルでは、2つのUbuntu 14.04サーバーで構成される実稼働対応のNode.js環境のセットアップについて説明します。 1つのサーバーはPM2によって管理されるNode.jsアプリケーションを実行し、もう1つのサーバーはユーザーにアプリケーションサーバーへのNginxリバースプロキシを介してアプリケーションへのアクセスを提供します。

このチュートリアルのCentOSバージョンはhereにあります。

前提条件

このガイドでは、(同じデータセンター内の)2つのUbuntu 14.04サーバーwith private networkingを使用します。 以下の名前でそれらを参照します。

  • app:Node.jsランタイム、Node.jsアプリケーション、およびPM2をインストールするサーバー

  • web:Nginx Webサーバーをインストールするサーバー。これは、アプリケーションのリバースプロキシとして機能します。 ユーザーは、このサーバーのパブリックIPアドレスにアクセスしてNode.jsアプリケーションにアクセスします。

このチュートリアルでは単一のサーバーを使用できますが、途中でいくつかの変更を行う必要があります。 localhost IPアドレス、つまり 127.0.0.1appサーバーのプライベートIPアドレスが使用されている場合。

以下は、このチュートリアルを実行した後のセットアップの図です。

Reverse Proxy to Node.js Application

このガイドを開始する前に、両方のサーバーでsudo権限を持つ通常の非rootユーザーが構成されている必要があります。これは、サーバーにログインする必要があるユーザーです。 initial server setup guide for 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を使用してgitパッケージをインストールします。これはnpmが依存します。

sudo apt-get install git

Node.js Downloads pageに移動し、Linux Binaries (.tar.xz)ダウンロードリンクを見つけます。 それを右クリックし、そのリンクアドレスをクリップボードにコピーします。 この記事の執筆時点では、最新のLTSリリースは4.2.3です。 Node.jsの最新の安定版リリースをインストールする場合は、appropriate pageに移動してそのリンクをコピーします。

ホームディレクトリに移動し、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」を返すだけの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(8080, 'APP_PRIVATE_IP_ADDRESS');
console.log('Server running at http://APP_PRIVATE_IP_ADDRESS:8080/');

ここで保存して終了します。

このNode.jsアプリケーションは、指定されたIPアドレスとポートをリッスンし、200HTTP成功コードとともに「HelloWorld」を返します。 これは、アプリケーションが同じプライベートネットワーク上のサーバー(webサーバーなど)からのみ到達可能であることを意味します。

テストアプリケーション(オプション)

アプリケーションが機能するかどうかをテストする場合は、appサーバーで次のnodeコマンドを実行します。

node hello.js

Note:この方法で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モジュールのパッケージマネージャーであるNodePackaged Modules(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は自動的にApp name(ファイル名に基づいて、.js拡張子なし)とPM2idを割り当てます。 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の使用法をカバーする使用例を含むヘルプページが表示されることに注意してください。

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

pm2 stop example

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

pm2 restart example

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

pm2 list
特定のアプリケーションの詳細については、infoサブコマンドを使用してください(PM2App nameまたはidを指定してください)
pm2 info example

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_ADDRESSappサーバーのプライベートIPアドレスに置き換えてください。 。 さらに、アプリケーションが別のポートでリッスンするように設定されている場合は、ポート(8080)を変更します。

/etc/nginx/sites-available/default

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

Nginx設定—追加の場所

    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アドレスまたはドメイン名)にアクセスして試してみてください。

結論

おめでとうございます。 これで、Ubuntu 14.04サーバー上のNginxリバースプロキシの背後でNode.jsアプリケーションが実行されました。 このリバースプロキシのセットアップは、ユーザーが共有したい他のアプリケーションまたは静的なWebコンテンツにアクセスできるように十分な柔軟性を備えています。 Node.jsの開発を頑張ってください!

また、Webサーバーとユーザー間の送信を暗号化する場合は、here is a tutorial that will help you get HTTPS (TLS/SSL) support set upを使用します。

Related