Ubuntu22.04で本番用にNode.jsアプリケーションを設定する方法
序章
Node.js は、サーバーサイドおよびネットワーキングアプリケーションを構築するためのオープンソースのJavaScriptランタイム環境です。 プラットフォームは、Linux、macOS、FreeBSD、およびWindowsで動作します。 コマンドラインでNode.jsアプリケーションを実行できますが、このチュートリアルでは、それらをサービスとして実行することに焦点を当てます。 これは、再起動または失敗時に再起動し、実稼働環境で安全に使用できることを意味します。
このチュートリアルでは、単一のUbuntu22.04サーバー上に本番環境に対応したNode.js環境をセットアップします。 このサーバーは、 PM2 によって管理されるNode.jsアプリケーションを実行し、Nginxリバースプロキシを介してアプリケーションへの安全なアクセスをユーザーに提供します。 Nginxサーバーは、 Let’sEncryptが提供する無料の証明書を使用してHTTPSを提供します。
前提条件
このガイドでは、次のことを前提としています。
- Ubuntu22.04の初期サーバーセットアップガイドで説明されているUbuntu22.04サーバーセットアップ。 sudo権限とアクティブなファイアウォールを持つ非rootユーザーが必要です。
- サーバーのパブリックIPを指すドメイン名。 このチュートリアルでは、全体を通してドメイン名example.comを使用します。
- Ubuntu 22.04にNginxをインストールする方法で説明されているように、Nginxがインストールされています。
- Let’sEncrypt証明書を使用してSSLで構成されたNginx。 Ubuntu 22.04でLet’sEncryptを使用してNginxを保護する方法では、プロセスについて説明します。
- サーバーにインストールされているNode.js。 Ubuntu22.04にNode.jsをインストールする方法
前提条件を完了すると、ドメインのデフォルトのプレースホルダーページを提供するサーバーが次の場所に表示されます。 https://example.com/
.
ステップ1—Node.jsアプリケーションを作成する
HTTPリクエストに「HelloWorld」を返すHelloWorldアプリケーションを作成してみましょう。 このサンプルアプリケーションは、Node.jsを起動して実行するのに役立ちます。 独自のアプリケーションに置き換えることができます。適切なIPアドレスとポートでリッスンするようにアプリケーションを変更してください。
まず、 nano
またはお気に入りのテキストエディタで、というサンプルアプリケーションを作成します hello.js
:
- nano 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}/`);
});
ファイルを保存して、エディターを終了します。 使用している場合 nano
、 押す Ctrl+X
、プロンプトが表示されたら、 Y
次にEnterキーを押します。
このNode.jsアプリケーションは、指定されたアドレスでリッスンします(localhost
)およびポート(3000
)、「HelloWorld!」を返します。 とともに 200
HTTP成功コード。 聞いているので localhost
、リモートクライアントはアプリケーションに接続できなくなります。
アプリケーションをテストするには、次のように入力します。
- node hello.js
次の出力が表示されます。
OutputServer running at http://localhost:3000/
注:この方法でNode.jsアプリケーションを実行すると、を押してアプリケーションを強制終了するまで、追加のコマンドがブロックされます。 CTRL+C
.
アプリケーションをテストするには、サーバーで別のターミナルセッションを開き、に接続します。 localhost
と curl
:
- curl http://localhost:3000
次の出力が表示された場合、アプリケーションは正常に動作しており、正しいアドレスとポートでリッスンしています。
OutputHello World!
期待どおりの出力が得られない場合は、Node.jsアプリケーションが実行され、適切なアドレスとポートでリッスンするように構成されていることを確認してください。
動作していることを確認したら、を押してアプリケーションを強制終了します(まだ実行していない場合)。 CTRL+C
.
ステップ2—PM2をインストールする
次に、Node.jsアプリケーションのプロセスマネージャーであるPM2をインストールしましょう。 PM2を使用すると、アプリケーションをデーモン化して、サービスとしてバックグラウンドで実行できるようになります。
使用する npm
サーバーに最新バージョンのPM2をインストールするには:
- sudo npm install pm2@latest -g
The -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.
┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name │ mode │ ↺ │ status │ cpu │ memory │
├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤
│ 0 │ hello │ fork │ 0 │ online │ 0% │ 25.2mb │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘
上に示したように、PM2は自動的に App name
(ファイル名に基づいて、 .js
拡張機能)およびPM2 id
. PM2は、次のような他の情報も保持します。 PID
プロセス、その現在のステータス、およびメモリ使用量の。
PM2で実行されているアプリケーションは、アプリケーションがクラッシュまたは強制終了された場合に自動的に再起動されますが、システムの起動時にアプリケーションを起動するための追加の手順を実行できます。 startup
サブコマンド。 このサブコマンドは、サーバーの起動時にPM2とその管理対象プロセスを起動するための起動スクリプトを生成および構成します。
- pm2 startup systemd
結果の出力の最後の行には、PM2を起動時に開始するように設定するために、スーパーユーザー権限で実行するコマンドが含まれます。
Output[PM2] Init System found: systemd
sammy
[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
:
- sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy
追加の手順として、PM2プロセスリストと対応する環境を保存できます。
- pm2 save
これで、実行するsystemdユニットが作成されました。 pm2
起動時のユーザー向け。 これ pm2
次に、インスタンスが実行されます hello.js
.
でサービスを開始します systemctl
:
- sudo systemctl start pm2-sammy
systemdユニットのステータスを確認します。
- systemctl status pm2-sammy
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によって実行および管理されているので、リバースプロキシを設定しましょう。
ステップ3—Nginxをリバースプロキシサーバーとして設定する
アプリケーションが実行され、リッスンしています localhost
、ただし、ユーザーがアクセスする方法を設定する必要があります。 この目的のために、NginxWebサーバーをリバースプロキシとして設定します。
前提条件のチュートリアルでは、Nginx構成を /etc/nginx/sites-available/example.com
ファイル。 このファイルを開いて編集します。
- sudo nano /etc/nginx/sites-available/example.com
以内 server
ブロック、あなたは既存のものを持っている必要があります location /
ブロック。 そのブロックの内容を次の構成に置き換えます。 アプリケーションが別のポートでリッスンするように設定されている場合は、強調表示された部分を正しいポート番号に更新します。
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
、ポートでリッスン 3000
で localhost
.
追加できます location
同じサーバーブロックへのブロックは、同じサーバー上の他のアプリケーションへのアクセスを提供します。 たとえば、ポートで別のNode.jsアプリケーションも実行している場合 3001
、このロケーションブロックを追加して、経由でアクセスできるようにすることができます https://example.com/app2
:
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リバースプロキシを介してアプリケーションにアクセスできるようになります。 サーバーのURL(パブリックIPアドレスまたはドメイン名)にアクセスして試してみてください。
結論
おめでとう! これで、Ubuntu22.04サーバー上のNginxリバースプロキシの背後でNode.jsアプリケーションが実行されます。 このリバースプロキシ設定は、共有したい他のアプリケーションや静的Webコンテンツへのアクセスをユーザーに提供するのに十分な柔軟性があります。
次に、Dockerを使用してNode.jsアプリケーションを構築する方法を調べてください。