序章

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

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

前提条件

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

  • Ubuntu18.04初期サーバーセットアップガイドで説明されているUbuntu18.04サーバーセットアップ。 sudo権限とアクティブなファイアウォールを持つ非rootユーザーが必要です。
  • サーバーのパブリックIPを指すドメイン名。 このチュートリアルでは、全体を通してドメイン名example.comを使用します。
  • Ubuntu 18.04にNginxをインストールする方法で説明されているように、Nginxがインストールされています。
  • Let’sEncrypt証明書を使用してSSLで構成されたNginx。 Ubuntu 18.04でLet’sEncryptを使用してNginxを保護する方法では、プロセスについて説明します。

前提条件を完了すると、ドメインのデフォルトのプレースホルダーページを提供するサーバーが次の場所に表示されます。 https://example.com/.

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

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

まず、そのコンテンツにアクセスするためにNodeSourcePPAをインストールします。 ホームディレクトリにいることを確認し、 curl Node.js 8.xアーカイブのインストールスクリプトを取得するには、次の手順に従います。

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

このスクリプトの内容は、次のコマンドで調べることができます。 nano またはお好みのテキストエディタ:

  1. nano nodesource_setup.sh

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

  1. sudo bash nodesource_setup.sh

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

  1. sudo apt install nodejs

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

  1. nodejs -v
Output
v8.11.3

注: NodeSource PPAからインストールする場合、Node.js実行可能ファイルが呼び出されます nodejs、 それよりも node.

The nodejs パッケージには、 nodejs バイナリとnpm、ノードモジュールのパッケージマネージャーなので、インストールする必要はありません npm 別々に。

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

  1. npm -v
Output
5.6.0

いくつかのために npm 動作するパッケージ(たとえば、ソースからのコードのコンパイルが必要なパッケージ)の場合、 build-essential パッケージ:

  1. sudo apt install build-essential

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

Node.jsランタイムがインストールされたら、Node.jsアプリケーションの作成に移りましょう。

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

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

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

  1. cd ~
  2. 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!」を返します。 とともに 200 HTTP成功コード。 聞いているので localhost、リモートクライアントはアプリケーションに接続できなくなります。

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

  1. node hello.js

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

Output
Server running at http://localhost:3000/

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

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

  1. curl http://localhost:3000

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

Output
Hello World!

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

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

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

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

使用する npm サーバーに最新バージョンのPM2をインストールするには:

  1. sudo npm install pm2@latest -g

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

まずは pm2 start アプリケーションを実行するコマンド、 hello.js、バックグラウンドで:

  1. 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は自動的に App name (ファイル名に基づいて、 .js 拡張機能)およびPM2 id. PM2は、次のような他の情報も保持します。 PID プロセス、その現在のステータス、およびメモリ使用量の。

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

  1. pm2 startup systemd

結果の出力の最後の行には、PM2を起動時に開始するように設定するために、スーパーユーザー権限で実行するコマンドが含まれます。

Output
[PM2] Init System found: systemd [PM2] To setup the Startup Script, copy/paste the following command: sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy

の代わりにユーザー名を使用して、出力からコマンドを実行します sammy:

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

追加の手順として、PM2プロセスリストと対応する環境を保存できます。

  1. pm2 save

これで、実行するsystemdユニットが作成されました。 pm2 起動時のユーザー向け。 これ pm2 次に、インスタンスが実行されます hello.js.

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

  1. sudo systemctl start pm2-sammy

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

  1. systemctl status pm2-sammy

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

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

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

  1. pm2 stop app_name_or_id

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

  1. pm2 restart app_name_or_id

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

  1. pm2 list

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

  1. pm2 info app_name

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

  1. pm2 monit

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

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

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

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

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

  1. sudo nano /etc/nginx/sites-available/example.com

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

/etc/nginx/sites-available/example.com
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;
    }
...
}

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

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

/etc/nginx/sites-available/example.com —オプション
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;
    }
...
}

アプリケーションのロケーションブロックの追加が完了したら、ファイルを保存してエディターを終了します。

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

  1. sudo nginx -t

Nginxを再起動します:

  1. sudo systemctl restart nginx

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

結論

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