前書き
Node.jsは、サーバーサイドおよびネットワークアプリケーションを構築するためのオープンソースのJavaScriptランタイム環境です。 プラットフォームは、Linux、macOS、FreeBSD、およびWindowsで動作します。 Node.jsアプリケーションはコマンドラインで実行できますが、このチュートリアルでは、それらをサービスとして実行することに焦点を当てます。 これは、アプリケーションが再起動または障害時に再起動し、本番環境で安全に使用できることを意味します。
このチュートリアルでは、単一のDebian 10サーバー上に実稼働対応のNode.js環境をセットアップします。 このサーバーは、http://pm2.keymetrics.io/ [PM2]によって管理されるNode.jsアプリケーションを実行し、ユーザーにhttps://nginx.org/[Nginx]リバースプロキシを介してアプリケーションへの安全なアクセスを提供します。 Nginxサーバーは、https://letsencrypt.org/ [Let’s Encrypt]が提供する無料の証明書を使用してHTTPSを提供します。
前提条件
このガイドでは、次のものがあることを前提としています。
-
Debian 10の初期サーバーセットアップガイドで説明されているDebian 10サーバーのセットアップ。 `+ sudo +`権限とアクティブなファイアウォールを持つ非rootユーザーが必要です。
-
https://www.digitalocean.com/docs/networking/dns/quickstart/ [サーバーのパブリックIPを指すドメイン名]。
-
Debian 10にNginxをインストールする方法で説明されているように、Nginxがインストールされています。
-
Let’s Encrypt証明書を使用してSSLで構成されたNginx。 Debian 10でLet’s Encryptを使用してNginxを保護する方法プロセスを通して。
前提条件を完了すると、ドメインのデフォルトのプレースホルダーページを提供するサーバーが `+ https:/// +`にあります。
ステップ1-Node.jsのインストール
NodeSourceパッケージアーカイブを使用して、Node.jsの最新のLTSリリースをインストールすることから始めましょう。
NodeSource PPAをインストールしてそのコンテンツにアクセスするには、まずパッケージインデックスを更新し、 `+ curl +`をインストールする必要があります。
sudo apt update
sudo apt install curl
ホームディレクトリにいることを確認し、 `+ curl +`を使用してNode.js .xアーカイブのインストールスクリプトを取得します。
cd ~
curl -sL https://deb.nodesource.com/setup_.x -o nodesource_setup.sh
このスクリプトの内容は、 `+ nano +`またはhttps://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-9#step-six-%E2%80%で調べることができます94-completing-optional-configuration [優先テキストエディター]:
nano nodesource_setup.sh
スクリプトの検査が完了したら、 `+ sudo +`の下で実行します。
sudo bash nodesource_setup.sh
PPAが構成に追加され、ローカルパッケージキャッシュが自動的に更新されます。 Nodesourceからセットアップスクリプトを実行した後、Node.jsパッケージをインストールできます。
sudo apt install nodejs
これらの最初の手順の後にインストールしたNode.jsのバージョンを確認するには、次のように入力します。
nodejs -v
Outputv
+ nodejs +`パッケージには、 `+ nodejs +`バイナリとNodeモジュールのパッケージマネージャーであるhttps://www.npmjs.com/ [
+ npm +`]が含まれているため、 `+をインストールする必要はありません。 npm + `を個別に。
`+ npm `は、ホームディレクトリの設定ファイルを使用して更新を追跡します。 初めて ` npm `を実行したときに作成されます。 次のコマンドを実行して、「 npm +」がインストールされていることを確認し、構成ファイルを作成します。
npm -v
Output
一部の `+ 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アプリケーションのプロセスマネージャーであるhttp://pm2.keymetrics.io/[PM2]をインストールしましょう。 PM2を使用すると、アプリケーションをデーモン化して、サービスとしてバックグラウンドで実行できます。
サーバーにPM2の最新バージョンをインストールするには、「+ npm +」を使用します。
sudo npm install pm2 -g
`+ -g `オプションは、モジュールをグローバルにインストールするように ` 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 」のないファイル名に基づいて、PM2の「 id 」とともに「 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 `を実行するsystemd _unit_が作成されました。 この ` 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: since Fri 2019-07-12 16:09:54 UTC; 4s ago
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 / your_domain
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 / your_domain-オプション
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リバースプロキシ経由でアプリケーションにアクセスできるようになります。 ブラウザでドメインにアクセスして試してください: + https:// +
。
結論
おめでとうございます。 これで、Node.jsアプリケーションがDebian 10サーバー上のNginxリバースプロキシの背後で実行されました。 このリバースプロキシのセットアップは、ユーザーが共有したい他のアプリケーションまたは静的なWebコンテンツにアクセスできるように十分な柔軟性を備えています。