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

提供:Dev Guides
移動先:案内検索

序章

Node.js は、サーバーサイドおよびネットワーキングアプリケーションを構築するためのオープンソースのJavaScriptランタイム環境です。 プラットフォームは、Linux、macOS、FreeBSD、およびWindowsで動作します。 コマンドラインでNode.jsアプリケーションを実行できますが、このチュートリアルでは、それらをサービスとして実行することに焦点を当てます。 これは、アプリケーションが再起動または失敗時に再起動し、実稼働環境で安全に使用できることを意味します。

このチュートリアルでは、単一のDebian10サーバー上に本番環境に対応したNode.js環境をセットアップします。 このサーバーは、 PM2 によって管理されるNode.jsアプリケーションを実行し、Nginxリバースプロキシを介してアプリケーションへの安全なアクセスをユーザーに提供します。 Nginxサーバーは、 Let'sEncryptが提供する無料の証明書を使用してHTTPSを提供します。

前提条件

このガイドでは、次のことを前提としています。

  • Debian10の初期サーバーセットアップガイドで説明されているDebian10サーバーのセットアップ。 sudo権限とアクティブなファイアウォールを持つ非rootユーザーが必要です。
  • サーバーのパブリックIPを指すドメイン名。
  • Debian10にNginxをインストールする方法で説明されているようにNginxがインストールされています。
  • Let'sEncrypt証明書を使用してSSLで構成されたNginx。 Debian 10でLet'sEncryptを使用してNginxを保護する方法では、プロセスを順を追って説明します。

前提条件を完了すると、https://your_domain/でドメインのデフォルトのプレースホルダーページを提供するサーバーが作成されます。

ステップ1—Node.jsをインストールする

NodeSource パッケージアーカイブを使用して、Node.jsの最新のLTSリリースをインストールすることから始めましょう。

NodeSource PPAをインストールしてそのコンテンツにアクセスするには、最初にパッケージインデックスを更新し、curlをインストールする必要があります。

sudo apt update
sudo apt install curl

ホームディレクトリにいることを確認してから、curlを使用して、Node.js 10.xアーカイブのインストールスクリプトを取得します。

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

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

nano nodesource_setup.sh

スクリプトの検査が終了したら、sudoでスクリプトを実行します。

sudo bash nodesource_setup.sh

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

sudo apt install nodejs

これらの最初の手順の後にインストールしたNode.jsのバージョンを確認するには、次のように入力します。

nodejs -v
Outputv10.16.0

注: NodeSource PPAからインストールする場合、Node.js実行可能ファイルはnodeではなくnodejsと呼ばれます。


nodejsパッケージには、nodejsバイナリと、ノードモジュールのパッケージマネージャーである npm が含まれているため、npmを個別にインストールする必要はありません。 。

npmは、ホームディレクトリの構成ファイルを使用して更新を追跡します。 npmを初めて実行したときに作成されます。 次のコマンドを実行して、npmがインストールされていることを確認し、構成ファイルを作成します。

npm -v
Output6.9.0

一部のnpmパッケージ(たとえば、ソースからのコードのコンパイルが必要なパッケージ)を機能させるには、build-essentialパッケージをインストールする必要があります。

sudo apt install build-essential

これで、ソースからコードをコンパイルする必要があるnpmパッケージを操作するために必要なツールができました。

Node.jsランタイムがインストールされたら、Node.jsアプリケーションの作成に進むことができます。

ステップ2—Node.jsアプリケーションを作成する

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

まず、hello.jsというサンプルアプリケーションを作成しましょう。

cd ~
nano hello.js

次のコードをファイルに挿入します。

〜/ hello.js

const http = require('http');

const hostname = 'localhost';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World!\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

ファイルを保存して、エディターを終了します。

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

アプリケーションをテストするには、次のように入力します。

node hello.js

次の出力が表示されます。

OutputServer running at http://localhost:3000/

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


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

curl http://localhost:3000

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

OutputHello World!

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

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

ステップ3—PM2をインストールする

次に、Node.jsアプリケーションのプロセスマネージャーであるPM2をインストールしましょう。 PM2を使用すると、アプリケーションをデーモン化して、サービスとしてバックグラウンドで実行できるようになります。

npmを使用して、最新バージョンのPM2をサーバーにインストールします。

sudo npm install pm2 -g

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

まず、pm2 startコマンドを使用して、hello.jsアプリケーションをバックグラウンドで実行します。

pm2 start hello.js

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

Output[PM2] Spawning PM2 daemon with pm2_home=/home/sammy/.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting /home/sammy/hello.js in fork_mode (1 instance)
[PM2] Done.
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────┬───────────┬───────┬──────────┐
│ App name │ id │ mode │ pid  │ status │ restart │ uptime │ cpu │ mem       │ user  │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼───────────┼───────┼──────────┤
│ hello    │ 0  │ fork │ 1338 │ online │ 0       │ 0s     │ 0%  │ 23.0 MB   │ sammy │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴───────────┴───────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app

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

PM2で実行されているアプリケーションは、アプリケーションがクラッシュまたは強制終了された場合に自動的に再起動されますが、startupサブコマンドを使用して、システムの起動時にアプリケーションを起動するための追加の手順を実行できます。 このサブコマンドは、サーバーの起動時にPM2とその管理対象プロセスを起動するためのスタートアップスクリプトを生成および構成します。 次のように入力します。

sudo pm2 startup

PM2が生成したサービス構成を説明する次のような出力が表示されます。

Output[PM2] Init System found: systemd
Platform systemd
Template
[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target

[Service]
Type=forking
User=root
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/root/.pm2
PIDFile=/root/.pm2/pm2.pid
Restart=on-failure

ExecStart=/usr/lib/node_modules/pm2/bin/pm2 resurrect
ExecReload=/usr/lib/node_modules/pm2/bin/pm2 reload all
ExecStop=/usr/lib/node_modules/pm2/bin/pm2 kill

[Install]
WantedBy=multi-user.target

Target path
/etc/systemd/system/pm2-root.service
Command list
[ 'systemctl enable pm2-root' ]
[PM2] Writing init configuration in /etc/systemd/system/pm2-root.service
[PM2] Making script booting at startup...
[PM2] [-] Executing: systemctl enable pm2-root...
Created symlink /etc/systemd/system/multi-user.target.wants/pm2-root.service → /etc/systemd/system/pm2-root.service.
[PM2] [v] Command successfully executed.
+---------------------------------------+
[PM2] Freeze a process list on reboot via:
$ pm2 save

[PM2] Remove init script via:
$ pm2 unstartup systemd

これで、起動時にpm2を実行するsystemdunitが作成されました。 このpm2インスタンスは、hello.jsを実行します。

systemctlでサービスを開始します。

sudo systemctl start pm2-root.service

systemdユニットのステータスを確認します。

systemctl status pm2-root.service

次のような出力が表示されます。

Output● pm2-root.service - PM2 process manager
   Loaded: loaded (/etc/systemd/system/pm2-root.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2019-07-12 16:09:54 UTC; 4s ago

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

PM2には、これまでに説明したものに加えて、アプリケーションに関する情報を管理または検索できる多くのサブコマンドが用意されています。

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

pm2 stop app_name_or_id

アプリケーションを再起動します。

pm2 restart app_name_or_id

PM2によって現在管理されているアプリケーションを一覧表示します。

pm2 list

App nameを使用して、特定のアプリケーションに関する情報を取得します。

pm2 info app_name

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

pm2 monit

引数なしでpm2を実行すると、使用例が記載されたヘルプページも表示されることに注意してください。

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

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

アプリケーションはlocalhostで実行およびリッスンしていますが、ユーザーがアプリケーションにアクセスする方法を設定する必要があります。 この目的のために、NginxWebサーバーをリバースプロキシとして設定します。

前提条件のチュートリアルでは、/etc/nginx/sites-available/your_domainファイルでNginx構成を設定します。 このファイルを開いて編集します。

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

serverブロック内に、既存のlocation /ブロックが必要です。 そのブロックの内容を次の構成に置き換えます。 アプリケーションが別のポートでリッスンするように設定されている場合は、強調表示された部分を正しいポート番号に更新します。

/ etc / nginx / sites-available / your_domain

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

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

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

/ etc / nginx / sites-available / your_domain —オプション

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

Node.jsアプリケーションが実行されており、アプリケーションとNginxの構成が正しいと仮定すると、Nginxリバースプロキシを介してアプリケーションにアクセスできるようになります。 ブラウザでドメインにアクセスして試してみてください:https://your_domain

結論

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