VPS移行時サーバに繋がらない時はFirewallと管理画面のポートを疑え
ローカルで開発してきたサーバをさくらVPSやlightsailにおいて実際にWebブラウザからアクセスしようとした時に応答が無く、connection timeoutのエラーとなって開発に詰まる場合がある。
大抵はPortが開放されていない問題なので、備忘録として解決策を残す。なお、私の環境はCentOS7なので、出てくるコマンドはCentOSのコマンドであるが、基本的なプロセスは変わらないと思うので、間接的には他のDistributionを使用している方も参考になるとは思う。
簡単なテスト用Nodeプログラムを作成
まずは必ず動くと言い切れる簡単なHTTPサーバーを立ち上げよう。ブラウザにIPアドレス:3000で動けばきちんと設定できていることになる。
例えばこんな感じ
const http = require('http');
http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('hello world\n');
}).listen(3000);
console.log('Server running at http://localhost:3000/');
管理画面のポートは開放されているか?
最初に疑うべきは、管理画面でのポート制御。デフォルトでホワイトリスト制御がなされているlightsailではポートを新規に加えないことにはアクセスが遮断される。
さくらVPSはデフォルトではポートは全開放されているが、一度設定した場合は忘れないようにする必要がある。
LinuxのFirewall(ファイヤーウォール)設定
次にLinuxのFirewalldの設定を疑おう。ここで特定ポートがはじかれている可能性も高い。CentOS6までは代わりにiptableが代わりに使われていた。ちなみにFirewallはファイアウォール、ファイアーウオールなど表記のゆれが多くてつらい。「カタカナ用語不統一表記に関するアンケート」 調査結果によると40%がファイアウォールらしい。
以下すべてSudo使うかRootユーザで行う。
Firewallが起動しているかを確認
# systemctl is-enabled firewalld
enabled
開かれているポートを確認
# firewall-cmd --list-ports
3000/tcp
現在3000ポートだけが開かれていることが確認できた。
3001ポートも開けたい
firewall-cmd --permanent --add-port=3001/tcp
success
一時的にポートを許可したい場合は--permanent
は不要。再起動とかしたら消えている。
--permanent
を指定したときは、即座に反映されないのでreloadをする。
# systemctl reload firewalld
RailsなどいくつかのWebServerは外部アクセスをデフォルトで遮断
これでも動かない時は、起動するWebサーバ自体のオプションの可能性がある。例えばrailsでは
$ rails s -b 0.0.0.0
オプションを設定しなければ外部からアクセスできない。すなわち使用するポートをWebサーバーと結びつけ(bind)してやる必要があるのである。0.0.0.0
はStackOverflowの質問によると、使用マシンで使われる全てのIPアドレスらしく、外部公開アドレスも含まれる。これを-b
オプションと結びつけることで外部からアクセス可能となる。
同様に最近使っていたGatsbyjsでも
$ gatsby serve -H 0.0.0.0
を指定しないと外部からのアクセスはできなかった。hはホストの意味、つまりどのIPアドレスに対してWebサービスを公開するかという設定である。
まとめ
HTTPサーバに繋がらない時にできる対処法として、にLinuxの外部(管理画面)、Linux内部のFirewall、Webサーバ自体のホスト設定の3つの可能性があることを示した。繋がらない時はこの辺を疑ってみて欲しい。