VPSでNode.jsとExpress.jsでHello Worldする

VPSでNode.jsとExpress.jsでHello Worldする

October 31, 2020

手順をまとめています。すぐに終わります。

(想定環境)サーバ:CentOS 8.2 / ローカル:macOS

1.Node.js(と npm)をインストールする #

サーバにログインしていて、root ユーザを使っているものとして進めます。

以下を実行して Node.js をインストールする。

dnf install -y nodejs

dnf は CentOS のパッケージ管理システムで、Yum の後継です。

Node.js をインストールすると、Node.js のパッケージマネージャである npm(Node Package Manage)も自動でインストールされます。

Node.js がインストールされていることを確認する。

node -v

v10.21.0 などと表示されれば OK.

npm がインストールされていることを確認する。

npm -v

6.14.4 などと表示されれば OK.

npm は Node.js 標準のパッケージマネージャです。

*補足 #

Node.js のパッケージマネージャで他に有名なものとして Yarn があります。Yarn でパッケージ管理をしたい場合は、Yarn をインストールする必要があり、インストール方法は直接インストールする方法と、npm 経由でインストールする方法があります。

なお、かつては npm が機能およびセキュリティ的に貧弱だったため、Yarn の使用が一般的でしたが、現在は npm も進化しており、Yarn との違いはあまりなくなっています。そのため、特にこだわりがないのであれば npm を使用すれば良いです。

本手順では Yarn はインストールせず、npm を利用して進めていきますが、Yarn をインストールする場合の手順を参考までに記しておきます。

**直接インストールする場合 #

Yarn 公式サイトに従ってコマンドを実行します。

説明ページ:https://classic.yarnpkg.com/en/docs/install/#centos-stable

実行コマンド

curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
sudo dnf install yarn

**npm 経由でインストールする場合 #

Yarn 公式サイトにも、直接インストールできない場合の代替として npm 経由のインストール方法が記載されています。

説明ページ:https://classic.yarnpkg.com/en/docs/install/#alternatives-stable

実行コマンド

npm install --global yarn

ただし、公式サイトにも書いてあるように、npm から Yarn をインストールすることは推奨されていません。そのため、可能であれば直接インストールの方法で実施しましょう。

npm から Yarn をインストールすることは一般的にはお勧めしません。Node ベースのパッケージマネージャで Yarn をインストールする場合は、パッケージは署名されておらず、整合性のチェックはベーシックな SHA1 ハッシュのみで行われており、システム全体にまたがるアプリケーションをインストールする場合にはセキュリティリスクとなります。これらの理由から、使用中の OS に最も適した方法で Yarn をインストールすることを強くお勧めします。

classic.yarnpkg.com

2.3000 番ポートを開放する #

今後の作業で利用するため、先に CentOS の 3000 番ポートを開放しておきます。以下を実行します。

firewall-cmd --add-port=3000/tcp --permanent

その後、firewalld をリロードします。

firewall-cmd --reload

これで設定が反映されます。設定内容が更新されていることを確認します。

firewall-cmd --list-all

ports: の部分に 3000/tcp の記載があれば OK です。

3.Express をインストールして Hello World #

Express をインストールして Hello World してみましょう。Express.js は、Node.js の Web アプリケーションフレームワークです。

なお、Express の Hello World には2種類のやり方があります。

その1は Express ジェネレータを使わない素の Express だけで実施するもの、その2は Express ジェネレータを利用して実施するものですが、ここでは、その1の素の Express の方法で実施します。

アプリ開発をする場合は、その2の Express ジェネレータを利用して開発していくことが多いと思いますが、基本的に VPS にはローカルで開発したアプリをデプロイする形になると思いますので、VPS 上で Express ジェネレータを実行する機会は少ないのではないでしょうか。

Hello World できることだけが目的であれば、よりシンプルなその1のパターンで十分と考え、こちらの方法にしました。

なお、ローカルで Express ジェネレータを利用して雛形を作成する手順については前回の記事でまとめています。

素の Express で実施する Hello World #

Express.js の公式サイトにも手順が記載されています。

説明ページ1:https://expressjs.com/ja/starter/installing.html

説明ページ2:https://expressjs.com/ja/starter/hello-world.html

まずはアプリのディレクトリを作成し、そのディレクトリに移動します。

mkdir myapp
cd myapp

次に、npm init コマンドを実施して、アプリケーション用の package.json ファイルを作成します。

npm init

上記コマンドを実行すると、アプリケーションの名前や設定内容を聞かれます。何も入力せずに RETURN キーを押下し続ければ、デフォルトの内容で設定されます。ここではすべてデフォルトのまま進めます。すべてデフォルトだと、下記のような設定内容になります。

About to write to /root/myapp/package.json:

{
  "name": "myapp",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

Is this OK? (yes)

Is this OK? (yes) と聞かれるので、OK ならば yes を入力しましょう。

次に、Express.js をインストールしましょう。Express.js は Node.js のパッケージのひとつです。npm でインストールします。

npm install express

*補足 #

npm のバージョンが 5.0 以降だと、npm install はデフォルトでモジュールを package.json の dependencies(依存関係)リストに追加します。それ以前のバージョンの npm だと、依存関係リストに追加するためには -save オプションを明示しなければいけません。npm のバージョンが古い場合は、次のように-save オプションをつけて「npm install express -save」と実行しましょう。

Express がインストールできたことを確認します。

npm view express version

4.17.1 などと表示されていれば OK です。

次に、app.js ファイルを作成&編集します。myapp ディレクトリで下記を実行。

vim app.js

開いた js ファイルに以下を記載します。

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello World! I am Express.js!');
});

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`);
});

確認のため、サーバを立ち上げます。

node app.js

http://サーバのIPアドレス:3000 にアクセスすると、「Hello World! I am Express.js!」が表示されます。

これで Hello World が確認できました。サーバを停止するには「control + C」を押します。

4.Node.js のプロセスをデーモン化(永続起動)させる #

3までのままでは、サーバを一時的にしか立ち上げられないため、本番運用する場合は永続的に起動できるようにします。手順を記しておきますので、デプロイ後に本格運用する際はこの手順を参考にしてください。

公式サイトにも参考ページがあります。

説明ページ:https://expressjs.com/ja/advanced/pm.html

ここでは、npm のパッケージである Forever を利用します。

Forever をインストールします。myapp ディレクトリ上で以下を実行。

npm install forever

ここでは、グローバルインストールしていません。パスが通っていないことに留意ください。

次に、Forever でサーバを立ち上げます。

./node_modules/forever/bin/forever start ./bin/www

*補足 #

Forever をグローバルにインストールしている場合は、パスが通っていますので、「forever start ./bin/www」で実行できます。

それでは、プロセスが上がっていることを確認しましょう。以下を実行。Forever によって開始されたプロセスのリストを表示します。

./node_modules/forever/bin/forever list

プロセスが上がっていれば OK です。

http://サーバのIPアドレス:3000 にアクセスすると、ページが表示されます。

プロセスを停止したい時は以下を実行します。

./node_modules/forever/bin/forever stopall

stopall とすると、Forever で立ち上げたプロセスを全て停止します。ここでは、今回作成した Express アプリ1つのプロセスしか上がっていないと想定しているため、stopall を使っていますが、特定の1つのみを指定して停止したい場合は forever の stop コマンドを使用します。

5.80 番ポートでアクセスできることを確認する #

試しに、80 番ポート(http のデフォルト)でアクセスできることも確認しておきます。

アプリの、bin/www の以下を編集しましょう。

// 更新前
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
// 更新後
var port = normalizePort(process.env.PORT || '80');
app.set('port', port);

次に、CentOS の 80 番ポートも開放します。

firewall-cmd --add-service=http --permanent

リロードしましょう。

firewall-cmd --reload

変更を確認します。

firewall-cmd --list-all

services: の部分に http の記載があれば OK です。

これで 3000 番ポートを付けずに、 http://サーバのIPアドレス でアクセスできるようになります。

ちなみに、ポートを閉塞したい場合は下記を実行します。

firewall-cmd --remove-service=http --permanent

*補足 #

なお、今回はすべて root ユーザで作業しているため 80 番ポート利用でのアプリの立ち上げができたが、root 以外のユーザで、80 番ポートでアプリを上げようとするとエラーになってしまう。これはウェルノウンポートでアプリを起動するにはスーパーユーザ権限が必要ということに関係している。80 番であげたいときには、root で行うか、sudo でアプリ起動させる必要がある。

以上です #

Good Bye!!