Ubuntu16.04で本番用にNode.jsアプリケーションを設定する方法
序章
Node.jsは、サーバーサイドおよびネットワーキングアプリケーションを構築するためのオープンソースのJavaScriptランタイム環境です。 プラットフォームは、Linux、MacOS、FreeBSD、およびWindowsで動作します。 Node.jsアプリケーションはコマンドラインで実行できますが、サービスとして実行することに重点を置いて、再起動または失敗時に自動的に再起動し、本番環境で安全に使用できるようにします。
このチュートリアルでは、単一のUbuntu16.04サーバーで本番環境に対応したNode.js環境をセットアップする方法について説明します。 このサーバーは、PM2によって管理されるNode.jsアプリケーションを実行し、Nginxリバースプロキシを介してアプリケーションへの安全なアクセスをユーザーに提供します。 Nginxサーバーは、Let’sEncryptが提供する無料の証明書を使用してHTTPSを提供します。
前提条件
このガイドでは、次のことを前提としています。
- root以外のユーザーで構成されたUbuntu16.04サーバー
sudo
Ubuntu16.04の初期サーバーセットアップガイドで説明されている特権。 - DigitalOcean を使用してホスト名を設定する方法に従って、サーバーのパブリックIPを指すドメイン名。 このチュートリアルでは、全体を通してexample.comを使用します。
- Nginxがインストールされています。Ubuntu16.04にNginxをインストールする方法で説明されています
- Let’sEncrypt証明書を使用してSSLで構成されたNginx。 Ubuntu 16.04でLet’sEncryptを使用してNginxを保護する方法では、プロセスについて説明します。
前提条件を完了すると、https://example.com/にあるデフォルトのNginxプレースホルダーページを提供するサーバーが作成されます。
Node.jsランタイムをサーバーにインストールすることから始めましょう。
ステップ1—Node.jsをインストールする
NodeSource パッケージアーカイブを使用して、Node.jsの最新のLTSリリースをインストールします。
まず、そのコンテンツにアクセスするためにNodeSourcePPAをインストールする必要があります。 ホームディレクトリにいることを確認し、 curl
Node.js 16.xアーカイブのインストールスクリプトを取得するには、次の手順に従います。
- cd ~
- curl -sL https://deb.nodesource.com/setup_16.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
The nodejs
パッケージには、 node
バイナリだけでなく npm
、インストールする必要はありません npm
別々に。 しかし、いくつかのために npm
動作するパッケージ(ソースからコードをコンパイルする必要があるパッケージなど)をインストールするには、 build-essential
パッケージ:
- sudo apt-get install build-essential
これでNode.jsランタイムがインストールされ、アプリケーションを実行する準備が整いました。 Node.jsアプリケーションを書いてみましょう。
ステップ2—Node.jsアプリケーションを作成する
HTTPリクエストに「HelloWorld」を返すHelloWorldアプリケーションを作成します。 これは、Node.jsをセットアップするのに役立つサンプルアプリケーションであり、独自のアプリケーションに置き換えることができます。適切なIPアドレスとポートでリッスンするようにアプリケーションを変更してください。
Hello World Code
まず、編集用にNode.jsアプリケーションを作成して開きます。 このチュートリアルでは、 nano
と呼ばれるサンプルアプリケーションを編集するには hello.js
:
- cd ~
- nano hello.js
次のコードをファイルに挿入します。 必要に応じて、強調表示されたポートを置き換えることができます。 8080
、両方の場所で(管理者以外のポートを使用してください。 1024以上):
#!/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(8080, 'localhost');
console.log('Server running at http://localhost:8080/');
保存して終了します。
このNode.jsアプリケーションは、指定されたアドレスでリッスンします(localhost
)およびポート(8080
)、「HelloWorld」を返します。 200
HTTP成功コード。 localhost をリッスンしているため、リモートクライアントはアプリケーションに接続できません。
テストアプリケーション
アプリケーションをテストするには、 hello.js
を使用して実行可能にする chmod
:
- chmod +x ./hello.js
次に、次のように実行します。
- ./hello.js
OutputServer running at http://localhost:8080/
注:この方法でNode.jsアプリケーションを実行すると、 Ctrl-C を押してアプリケーションが強制終了されるまで、追加のコマンドがブロックされます。
アプリケーションをテストするには、サーバーで別のターミナルセッションを開き、localhostに接続します。 curl
:
- curl http://localhost:8080
次の出力が表示された場合、アプリケーションは正常に動作しており、適切なアドレスとポートでリッスンしています。
OutputHello World
適切な出力が表示されない場合は、Node.jsアプリケーションが実行されており、適切なアドレスとポートでリッスンするように構成されていることを確認してください。
動作していることを確認したら、他のターミナルに戻り、 Ctrl + C を押してNode.jsアプリケーションを強制終了します(まだ実行していない場合)。
ステップ3—PM2をインストールする
次に、Node.jsアプリケーションのプロセスマネージャーであるPM2をインストールします。 PM2は、アプリケーションを管理およびデーモン化する(サービスとしてバックグラウンドで実行する)ための簡単な方法を提供します。
我々は使用するだろう npm
、Node.jsとともにインストールするNodeモジュールのパッケージマネージャーで、サーバーにPM2をインストールします。 次のコマンドを使用して、PM2をインストールします。
- sudo npm install -g pm2
The -g
オプションは教えます npm
モジュールをグローバルにインストールして、システム全体で使用できるようにします。
ステップ4—PM2を使用したアプリケーションの管理
PM2のいくつかの基本的な使用法について説明します。
アプリケーションを開始します
あなたが最初にしたいことは、 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.
┌─────┬──────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
├─────┼──────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0 │ hello │ default │ N/A │ fork │ 13734 │ 0s │ 0 │ online │ 0% │ 25.0mb │ sammy │ disabled │
└─────┴──────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
ご覧のとおり、PM2は名前を自動的に割り当てます(ファイル名に基づいて、 .js
拡張機能)およびPM2 id。 PM2は、プロセスの PID 、その現在のステータス、メモリ使用量などの他の情報も保持します。
PM2で実行されているアプリケーションは、アプリケーションがクラッシュまたは強制終了された場合に自動的に再起動されますが、システムの起動(起動または再起動)時にアプリケーションを起動するには、追加の手順を実行する必要があります。 幸いなことに、PM2はこれを行う簡単な方法を提供します。 startup
サブコマンド。
The startup
サブコマンドは、サーバーの起動時にPM2とその管理対象プロセスを起動するための起動スクリプトを生成および構成します。
- pm2 startup systemd
結果の出力の最後の行には、スーパーユーザー権限で実行する必要のあるコマンドが含まれます。
Output[PM2] Init System found: systemd
[PM2] You have to run this command as root. Execute the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy
生成されたコマンドを実行します(上記で強調表示された出力と同様ですが、代わりにユーザー名を使用します sammy
)起動時に開始するようにPM2を設定するには(独自の出力からコマンドを使用します):
- sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy
これにより、実行されるsystemdユニットが作成されます pm2
起動時のユーザー向け。 これ pm2
次に、インスタンスが実行されます hello.js
. systemdユニットのステータスは次のコマンドで確認できます。 systemctl
:
- systemctl status pm2-sammy
systemdの詳細な概要については、 Systemd Essentials:サービス、ユニット、およびジャーナルの操作を参照してください。
その他のPM2の使用法(オプション)
PM2には、アプリケーションに関する情報を管理または検索できる多くのサブコマンドが用意されています。 実行していることに注意してください pm2
引数なしで、チュートリアルのこのセクションよりも詳細にPM2の使用法をカバーする使用例を含むヘルプページが表示されます。
このコマンドでアプリケーションを停止します(PM2を指定します) App name
また id
):
- pm2 stop app_name_or_id
このコマンドでアプリケーションを再起動します(PM2を指定します) App name
また id
):
- pm2 restart app_name_or_id
PM2によって現在管理されているアプリケーションのリストは、 list
サブコマンド:
- pm2 list
特定のアプリケーションに関する詳細情報は、を使用して見つけることができます info
サブコマンド(PM2アプリ名またはid を指定):
- pm2 info example
PM2プロセスモニターは、 monit
サブコマンド。 これにより、アプリケーションのステータス、CPU、およびメモリ使用量が表示されます。
- pm2 monit
Node.jsアプリケーションが実行され、PM2によって管理されたので、リバースプロキシを設定しましょう。
ステップ5—Nginxをリバースプロキシサーバーとして設定する
アプリケーションが実行され、 localhost をリッスンしているので、ユーザーがアプリケーションにアクセスする方法を設定する必要があります。 この目的のために、NginxWebサーバーをリバースプロキシとして設定します。
前提条件のチュートリアルでは、Nginx構成を /etc/nginx/sites-available/default
ファイル。 編集用にファイルを開きます。
- sudo nano /etc/nginx/sites-available/default
以内 server
既存のブロックが必要です location /
ブロック。 そのブロックの内容を次の構成に置き換えます。 アプリケーションが別のポートでリッスンするように設定されている場合は、強調表示された部分を正しいポート番号に更新します。
. . .
location / {
proxy_pass http://localhost: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;
}
}
これにより、サーバーがルートで要求に応答するように構成されます。 私たちのサーバーがで利用可能であると仮定すると example.com
、アクセス https://example.com/
Webブラウザを介してリクエストをに送信します hello.js
、ポートでリッスン 8080
localhostで。
追加できます location
同じサーバーブロックへのブロックは、同じサーバー上の他のアプリケーションへのアクセスを提供します。 たとえば、ポートで別のNode.jsアプリケーションも実行している場合 8081
、このロケーションブロックを追加して、経由でアクセスできるようにすることができます http://example.com/app2
:
location /app2 {
proxy_pass http://localhost: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;
}
アプリケーションのロケーションブロックの追加が完了したら、保存して終了します。
次のように入力して、構文エラーが発生していないことを確認してください。
- sudo nginx -t
次に、Nginxを再起動します。
- sudo systemctl restart nginx
Node.jsアプリケーションが実行されていて、アプリケーションとNginxの構成が正しいと仮定すると、Nginxリバースプロキシを介してアプリケーションにアクセスできるようになります。 サーバーのURL(パブリックIPアドレスまたはドメイン名)にアクセスして試してみてください。
結論
おめでとう! これで、Ubuntu16.04サーバー上のNginxリバースプロキシの背後でNode.jsアプリケーションが実行されます。 このリバースプロキシ設定は、共有したい他のアプリケーションや静的Webコンテンツへのアクセスをユーザーに提供するのに十分な柔軟性があります。 Node.jsの開発に頑張ってください。