【本番リリース】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 (ポート番号 3000) の話で進めていますが、
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 サーバが起動がします。

いや…サーバ上で動いてる localhost
それにブラウザからどうアクセスするのか一番知りたいんだけど!

と、ここで思いませんか。
僕は当時思いましたが、ググっても答えがわかりませんでした。

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 サーバ起動コマンドには nohup と & を付ける

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

ですが、ただサーバ起動するコマンドを入力するだけでは「バックグラウンド処理」になりません。
また、あなたがサーバから「ログアウトすると同時に localhost サーバも止まる」はずです。

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

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

nohup コマンドとは

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

これはログアウト時に SIGHUP シグナルなるものが送信されるから処理が終了しているのですが、
nohup コマンドを付けていると、そのシグナルの影響を受けなくなります。

# 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 サイトからお気軽にご相談ください。

カテゴリ「Develop」の最新記事

最新記事

コメント

コメントを残す

*