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

前書き

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

このチュートリアルでは、単一のUbuntu 18.04サーバー上に実稼働対応のNode.js環境をセットアップします。 このサーバーは、http://pm2.keymetrics.io/ [PM2]によって管理されるNode.jsアプリケーションを実行し、ユーザーにNginxリバースプロキシを介したアプリケーションへの安全なアクセスを提供します。 Nginxサーバーは、https://letsencrypt.org/ [Let’s Encrypt]が提供する無料の証明書を使用してHTTPSを提供します。

前提条件

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

前提条件を完了すると、ドメインのデフォルトのプレースホルダーページを提供するサーバーが `+ https:/// +`にあります。

ステップ1-Node.jsのインストール

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

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

cd ~
curl -sL https://deb.nodesource.com/setup_8.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
Outputv8.11.3

+ nodejs +`パッケージには、 `+ nodejs +`バイナリとNodeモジュールのパッケージマネージャーであるhttps://www.npmjs.com/ [+ npm +`]が含まれているため、 `+をインストールする必要はありません。 npm + `を個別に。

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

npm -v
Output5.6.0

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

sudo apt install build-essential

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

Node.jsランタイムをインストールしたら、Node.jsアプリケーションの作成に進みましょう。

ステップ2-Node.jsアプリケーションの作成

HTTPリクエストに「Hello World」を返す_Hello World_アプリケーションを作成してみましょう。 このサンプルアプリケーションは、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 +)でリッスンし、 + 200 + HTTP成功コードとともに“ Hello World!”を返します。 「+ localhost +」でリッスンしているため、リモートクライアントはアプリケーションに接続できません。

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

node hello.js

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

OutputServer running at http://localhost:3000/

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

curl http://localhost:

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

OutputHello World!

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

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

ステップ3-PM2のインストール

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

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

sudo npm install [email protected] -g

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

最初に、 `+ pm2 start `コマンドを使用して、バックグラウンドでアプリケーション ` hello.js +`を実行しましょう。

pm2 start

これにより、アプリケーションが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 │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼───────────┼───────┼──────────┤
│     │ 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は自動的に(+ .js + 拡張子なしのファイル名に基づいて) + App name + とPM2 + id + `を割り当てます。 PM2は、プロセスの「+ PID +」、現在のステータス、メモリ使用量などの他の情報も保持します。

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

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  --hp /home/

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

pm2 save

これで、ブート時にユーザーの `+ pm2 `を実行するsystemd _unit_が作成されました。 この ` pm2 `インスタンスは、今度は ` hello.js +`を実行します。

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

sudo systemctl start pm2-

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の「+ App name」または「+ id」を指定します):

pm2 stop

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

pm2 restart

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

pm2 list

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

pm2 info

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

pm2 monit

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

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

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

アプリケーションは実行され、 `+ localhost +`でリッスンしていますが、ユーザーがアクセスできるように設定する必要があります。 この目的のために、Nginx Webサーバーをリバースプロキシとして設定します。

前提条件のチュートリアルでは、 `+ / etc / nginx / sites-available / +`ファイルでNginx設定をセットアップします。 このファイルを編集用に開きます。

sudo nano /etc/nginx/sites-available/

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

/etc/nginx/sites-available/example.com

server {
...
   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;
   }
...
}

これにより、サーバーがルートで要求に応答するように構成されます。 サーバーが「+」で利用可能であると仮定すると、ウェブブラウザ経由で「 https:/// 」にアクセスすると、リクエストが「 hello.js 」に送信され、「 localhost 」のポート「+3000」でリッスンされます。

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

/etc/nginx/sites-available/example.com-オプション

server {
...
   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;
   }
...
}

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

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

sudo nginx -t

Nginxを再起動します。

sudo systemctl restart nginx

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

結論

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

Related