XサーバーでNode.jsをWEBサーバーとして動かす(2/2)

前記事:Xサーバーでnvm+Node.jsをインストールして動かすぞい(1/2)

 

Xサーバーのポート80番はすでにApacheによって使われている。

なので、以下のような「Node.jsでWEBサーバーをたててポート80番でlistenする」みたいなコードは動かそうとしても「もう80番は使われてまっせ?」と言われてエラーになる。

index.js

const http = require('http');
const server = http.createServer((req, res) => {
  res.writeHead(200, {
    'Content-Type': 'text/plain; charset=utf-8'
  });
  res.write(req.headers['user-agent']);
  res.end();
});
const port = 80;
server.listen(port, () => {
  console.log('Listening on ' + port);
});

 

というかポート1023番以下(ウェルノウンポートと呼ぶらしいが)はroot権限じゃないと実行できないらしいので、そもそもApacheが動いてなくても「お前にそんな権限ねえぜ?」と言われる。(逆に自分がroot権限を持っているサーバーの場合はsudo nodeなどを実行すると80番でもサーバーが建てられる)

一般ユーザー権限でターミナル上で動かそうとしても・・

$ node index.js
Error: listen EACCES: permission denied 0.0.0.0:80

#上のコードを動かそうとすると「お前にそんな権限ねえぜ?」と言われる

 

かと言って、Xサーバーは「特定のポートからのアクセス以外は禁止する!」みたいな処理にしているらしいので(Xサーバーに限らずほとんどレンタルサーバーがそうだと思うが)、

以下のように「Node.jsでWEBサーバーをたててポート65000番でlistenする」みたいなコードは動かしても、ブラウザからはアクセスできない。

index.js

const http = require('http');
const server = http.createServer((req, res) => {
  res.writeHead(200, {
    'Content-Type': 'text/plain; charset=utf-8'
  });
  res.write(req.headers['user-agent']);
  res.end();
});
const port = 65000;
server.listen(port, () => {
  console.log('Listening on ' + port);
});

▲65000ポートにブラウザからアクセスしても「ねーよそんなページ」と言われちゃう

65000というポート自体は使用できるのに誰もアクセスできないんじゃ意味がない。

 

え?詰んでね?どうしたらいいの?

と思って調べたら、どうやらApacheのリバースプロキシという機能を使えばなんとかなるっぽい。

リバースプロキシというのは「Aサーバーのhttp://abc.com/def/というパスにアクセスがきたらAサーバーのポート○○番に丸投げする」みたいなことができる機能。(要するにプロキシと逆のことができる機能)

たとえば

  • 「Aサーバーのhttp://abc.com/def/にアクセスがきたらBサーバーのポート○○番に丸投げする」
  • 「Aサーバーのhttp://abc.com/hoge/にアクセスがきたらCサーバーのポート○○番に丸投げする」

みたいなことができちゃうのだ。

ちなみにリバースプロキシを使うと、アクセスしているユーザーからすると「Aサーバーのポート80番のhttp://abc.com/def/にアクセスしているつもり」なのに、実際は「Bサーバーのポート60000番にアクセスしている」みたいなことになる。

スゲー!!

 

というわけでApacheの設定を変えてやるぞい。

Apacheのおおもとの設定ファイルは大抵の場合、httpd.confというファイルだけど(Ubuntuの場合はapache2.confだったりするらしいが)、レンタルサーバーの場合はこのファイルを編集する権限がない。

なので、リバースプロキシしたいURLに対応するパスに.htaccessを設置してリバースプロキシを実行する。

 

例えば

  • 使用するURL:http://test.com/hoge/
  • 飛ばしたいサーバーのIP:localhost(自分自身)
  • 飛ばしたいサーバーで使用するポート:65000

みたいにしたい場合は

/home/ユーザー名/test.com/public_html/hoge/

というパスに以下の内容の.htaccessを設置する。(Xサーバーの場合はこういうパスになっているはず)

.htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^$ http://localhost:65000/ [P,L]
</IfModule>

 

このRewriteRuleなどの記述の説明については、きちんと説明すると1万文字とか超えちゃうので、ここではサクっと紹介しますが

以下の部分が、「もしmod_rewrite.cというモジュールが使える環境なら中身を実行する」という意味で

<IfModule mod_rewrite.c>

</IfModule>

以下の部分がリバースプロキシの部分。[P]というフラグでリバースプロキシ設定になる。

RewriteEngine On
RewriteRule ^$ http://localhost:65000/ [P,L]
  • RewriteEngineはURLの書き換え機能をONにするためのディレクティブ。RewriteRuleなどを使う場合はONにしないといけないらしい。
  • ^$は正規表現。
  • [P]というフラグでリバースプロキシ設定になる。
  • RewriteRuleはURLの書き換えができるApacheのディレクティブ(指示文)

 

 

これで実行すると、無事にリバースプロキシが行われてNode.jsでつくったWEBサーバーに接続することができた。

▲無事うごいた

 

おわり

Node.js
スポンサーリンク
この記事を書いた人
penpen

1991生まれ。WEBエンジニア。

技術スタック:TypeScript/Next.js/Express/Docker/AWS

フォローする
フォローする

コメント

タイトルとURLをコピーしました