【本番リリース】Node.jsサーバ接続方法【リバースプロキシ】

  • このエントリーをはてなブックマークに追加
  • Pocket

こんにちは。タクマ™ [@suwaru_blog] です。

最近は Node.js 製のアプリで Web サーバを起動することが増えてきていますね。
たとえば Next.js だと localhost:3000 でWeb サーバを起動できます。

ローカル開発環境の場合、問題なくブラウザからアクセスできると思います。
ですが、どこかのサーバで localhost:3000 を起動した場合はどうやってアクセスしますか?

Google Chrome の URL に localhost:3000

…としても動きません。 (サーバ上の localhost ではなく、あなたの PC 上の localhost を指すから)
そもそも localhost なんかの URL ではなく、そのサーバの IP やドメインでアプリを動かしたいはず。

これを解決する一つ方法として、リバースプロキシを利用する手段があります。

今回は Apache のリバースプロキシでサーバ上の localhost にアクセスする方法を解説します!
これで Node.js 製アプリの本番リリースができるようになりますよ。

話を分かりやすくするため Next.js の話で進めていますが、
Node.js のサーバアクセス全般に通じる話なので安心してください。

Node.js の Web サーバ起動

どの Node.js フレームワークにも大体ありますが、
例えば Next.js には「本番環境で動かすときはこうしろ!」ってコマンドがサイトに書いてあります。

# プロジェクトをコンパイル・最適化
yarn build

# Web サーバ
yarn start

yarn run v1.22.0
warning package.json: No license field
$ NODE_ENV=production node server.js
> Ready on http://localhost:3000

すると localhost:3000 (127.0.0.1:3000) といった感じの Web サーバが起動がします。
が、初心者が知りたいのは「いや…サーバ上のそれにどうやってアクセスするの?」だと思います。

Apache でリバースプロキシを設定する

Apache のインストール・設定

Web サーバであれば Nginx でもよいのですが、今回は Apache をインストールすることにします。
そしてユーザが Apache にアクセスしてきたら localhost の方に飛ばすようにしてみます。

Web サーバでこういった仕組みを作ることを「リバースプロキシ」と言います。

# CentOS の yum コマンドで Apache をインストールする場合
sudo yum update
sudo yum install -y httpd

# Apache が自動で起動するようにする
sudo chkconfig httpd on

# 初回起動
sudo service httpd start

httpd.conf を編集する

リバースプロキシを設定する

sudo vi /etc/httpd/conf/httpd.conf で Apache 設定ファイルを編集します。
ファイルの最終行に以下を追記してください。

/etc/httpd/conf/httpd.conf

ProxyRequests Off

<Location />
    ProxyPass http://localhost:3000/
    ProxyPassReverse http://localhost:3000/
</Location>

ユーザが Apache のドキュメントルートにアクセスしてきたら、
http://localhost:3000 に飛ばす、ということを記載しています。

ポートは :3000 としていますが、人によって違うと思うので修正しておいてください。

ドキュメントルートを設定する

ちなみに Node.js アプリの場所も httpd.conf で設定しておく必要あります。
今回は /var/www/html/[アプリのディレクトリ] としましょう。

#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/var/www/html/[アプリのディレクトリ]"

#
# 中略
#

# Further relax access to the default document root:
<Directory "/var/www/html/[アプリのディレクトリ]">

上記 2 箇所を探して修正してください。
「document」とかの文字列で検索をかけると場所がわかりやすいです。

設定ファイルの編集が終わったら Apache を再起動します。

# Apache 再起動
sudo service httpd restart

Node.js サーバ起動コマンドには & を付ける

これで本番の IP やドメインにアクセスすると localhost:3000 に飛ばされるはずです。

…が、普通に localhost が起動するコマンドを打っただけだと、
あなたがサーバからログアウトすると、そのコマンドも終了されてしまうはずです。

Linux コマンドを裏側で動かし続けるには、コマンド末尾に & を付けてください。

たとえば yarn start & のように末尾に & を付けると、バックグラウンドでサーバが動き続けます。

zsh などのシェルは nohup コマンドも必要

例えば、シェルが bash なら & だけでよいのですが、
他のシェルだと、ログアウトするとバックグラウンド処理も終了することもあります。

※ たとえば zshの場合、ログアウト時に HUP シグナルが送信されて処理が終了します。

そういった場合は nohup コマンドも付けて、HUP シグナルを送信しないようにする必要があります。
※ しかも zsh の場合は & ではなく &! という特殊な記述に変わります

# zsh の場合は &! を使う
nohup yarn start &!
nohup: 入力を無視し、出力を `nohup.out' に追記します

バックグラウンド処理を中止するには

プロセス ID を調べて kill してください。

# localhost のプロセスをポート番号で調べる
lsof -i :3000

# もしくはプロセスを grep する: node というキーワードで grep
ps aux | grep node

# プロセスIDを指定して強制終了(-9)
kill -9 [プロセスID]

場合によってはジョブ ID で kill することもできます。

# ジョブを表示
jobs -l

kill %[ジョブID]

参考記事

forever ライブラリ

forever という Node.js ライブラリでバックグランド処理する方法もあります。
以下は yarn start コマンドの例です。

# 起動
forever start -c "yarn start" ./

# 再起動
forever restart -c "yarn start" ./

# プロセスの確認
forever list

yarn global add forever とか npm install -g forever でインストールできます。
興味があれば、試してみてください。

forever stop -c "yarn start" ./ が停止処理ではありますが、
検証したらサーバーのプロセスは止まらなかったので、自分で kill した方が良さげです。

関連記事

コメント

コメントを残す

*