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

前書き

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

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

前提条件

このガイドでは、https://www.digitalocean.com/community/tutorials/initial-server-setup-withで説明されているように、 `+ sudo +`権限を持つ非rootユーザーで設定されたDebian 8サーバーがあることを前提としています-debian-8 [Debian 8の初期サーバーセットアップガイド]。

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

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

Node.jsをインストールする

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

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

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

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

nano nodesource_setup.sh

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

sudo bash nodesource_setup.sh

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

sudo apt-get install nodejs

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

sudo apt-get install build-essential

Node.jsランタイムがインストールされ、アプリケーションを実行する準備ができました! Node.jsアプリケーションを作成しましょう。

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

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

Hello World Code

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

cd ~
nano hello.js

次のコードをファイルに挿入します。 必要に応じて、両方の場所で強調表示されているポート `++`を置き換えることができます(管理者以外のポート、つまり 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(, 'localhost');
console.log('Server running at http://localhost:/');

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

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

テストアプリケーション

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

chmod +x ./hello.js

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

./hello.js
OutputServer running at http://localhost:/

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

curl http://localhost:

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

OutputHello World

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

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

PM2をインストールする

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

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

sudo npm install -g pm2

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

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

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

アプリケーションを開始

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

pm2 start

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

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

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

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

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

pm2 startup systemd

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

Output[PM2] You have to run this command as root. Execute the following command:

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

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

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

systemctl status pm2

systemdの詳細な概要については、https://www.digitalocean.com/community/tutorials/systemd-essentials-working-with-services-units-and-the-journal [Systemd Essentials:Working with Services、Units、andジャーナル]。

その他の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によって管理されたので、リバースプロキシを設定しましょう。

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

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

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

sudo apt-get install nginx

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

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

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

/ etc / nginx / sites-available / default

server {
   listen 80;

   server_name ;

   location / {
       proxy_pass http://localhost:;
       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 / `にアクセスすると、リクエストが ` hello.js `に送信され、ポート ` 8080 +`でリッスンします* localhost *で。

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

Nginx設定-追加の場所

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

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

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

sudo nginx -t

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

sudo systemctl restart nginx

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

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

sudo ufw allow 'Nginx Full'
  • ufw *を使用すると、次のコマンドでいつでもステータスを確認できます。

sudo ufw status

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

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

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

sudo iptables -S

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

ここから、https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-debian-8 [How Debian 8でLet’s Encryptを使用してNginxを保護するには]。

結論

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

Related