【本番リリース】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 に飛ばされるはずです。

…が、普通にサーバ起動するコマンドを入力しただけだと、
あなたがサーバからログアウトすると同時にサーバも止まってしまうはずです。

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

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

nohup コマンドも必要

通常、自分のログアウトと一緒にバックグラウンド処理も終了されてしまいます。
今回のような Web サーバ処理がそれで終了されてしまうのは困ります。

これはログアウト時に HUP シグナルが送信されて処理が終了されることに起因します。
なので nohup コマンドも付けて HUP シグナルを送信しないようにしてあげる必要があります。

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

zsh の場合は &! を使う

実はシェルが 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 した方が良さげです。

関連記事

お仕事ください!

僕が代表を務める 株式会社 EeeeG では Web 制作・システム開発・マーケティング相談を行っています。
なにかお困りごとがあれば、Twitter DM や Web サイトからお気軽にご相談ください。

コメント

コメントを残す

*