前記事: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というポート自体は使用できるのに誰もアクセスできないんじゃ意味がない。
え?詰んでね?どうしたらいいの?
と思って調べたら、どうやら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サーバーに接続することができた。
おわり
コメント