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生まれ。
2019年くらいからフロントエンドエンジニアを目指している元アフィリエイターです💩

penpenをフォローする
penpenをフォローする
penpenメモ

コメント

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