ブログのサーバ構築して、WordPressを設置 & 初期設定を済ませた後、しばらくして自分のブログを訪れてみたらconnection refusedが返ってきてアクセスできない状態になっていた。 同じようなことをやってしまう人が世界70億人もいればもう一人ぐらい居ると思うので、その時の対応記録をメモっときます。
3行まとめ
- Connection refusedの原因は、http/httpsアクセスを firewalld で許可していなかったため
- ConoHa のCentOS7.2は初期状態でFirewalldが有効、SELinuxが無効
- tryは「サボらず最初(アプリ構築時)からファイアウォールの設定をする」
調査
経験的に Connection refused の場合、原因は下記のいずれかであることが多い
- Webサーバ関連のミドルウェア (nginx, php-fpm) が死んでいる
- firewallの設定が不十分で、外部からの接続を受け付けないようになっている
- SELinuxの設定が不十分で、ミドルウェアの実行がブロックされている
上から順に調べていく
nginx
h-shinoda@marlin:~ $ sudo systemctl status nginx ● nginx.service - The nginx HTTP and reverse proxy server Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled) Active: active (running) since ...
問題なし
php-fpm
h-shinoda@marlin:~ $ sudo systemctl status php-fpm ● php-fpm.service - The PHP 7 FastCGI Process Manager Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled) Active: active (running) since ...
問題なし
サーバローカルから疎通できるか
h-shinoda@marlin:~ $ curl localhost -I HTTP/1.1 200 OK Server: nginx Date: Fri, 30 Dec 2016 11:24:29 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive
問題なし ここまでで、Webサーバ関連のミドルウェアのせいではないことが確定
firewalld
firewalld = CentOS7以降から採用されているファイアウォールミドルウェア
ConoHaはfirewalldを使っているが、IaaSベンダーによってfirewalldではなくiptablesを使うようにイジられている場合もあるのでちょっと注意
h-shinoda@marlin:~ $ sudo systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) Active: active (running) since ... h-shinoda@marlin:~ $ sudo firewall-cmd --list-services --zone=public dhcpv6-client ssh
なるほど(O_O)
httpアクセスを受けるときに必要な http
と https
に対して通信許可設定がされていない
もしSELinuxが既に無効状態であればこれが原因っぽいので、そうなら許可してあげれば問題は解決しそう
SELinux
h-shinoda@marlin:~ $ getenforce Disabled
Disabled = 無効状態なので今回の原因ではなさそう)
SELinuxはサーバのセキュリティ向上のためのミドルウェアだが、有効なせいで動くはずのものが動かなかったりして大変なので(ちゃんと設定すれば動くようになるが、結構設定が大変)、自分は無効にしてしまうことが多い
が、今回はSELinuxを無効にした覚えはないので ConoHaはデフォルトでSELinuxを無効にしている 模様 (自分が書いたインフラ構築スクリプト中のどこかで無効化している可能性は微レ存)
対処
1. 暫定対処
h-shinoda@marlin:~ $ sudo firewall-cmd --add-service=http --zone=public success h-shinoda@marlin:~ $ sudo firewall-cmd --add-service=https --zone=public success h-shinoda@marlin:~ $ sudo firewall-cmd --reload success
上記の設定によって、Webサイトがアクセス可能になったことを確認 firewallの設定不足によってconnection refusedになっていた、と言う原因でFA
2. 恒久対処
h-shinoda@marlin:~ $ sudo firewall-cmd --add-service=http --zone=public --permanent success h-shinoda@marlin:~ $ sudo firewall-cmd --add-service=https --zone=public --permanent success
--permanent
オプションをつけないと、firewalldがrestartしたときにリセットされる
3. 確認
h-shinoda@marlin:~ $ sudo firewall-cmd --list-services --zone=public --permanent dhcpv6-client http https ssh h-shinoda@marlin:~ $ sudo firewall-cmd --reload success
ブラウザから、アクセスできることを確認
振り返り
真の原因
最初のWordPressの構築時に、とあえずWPを動かすことを最優先に考えて、ファイアウォールを一時的に無効にした状態でWordPressを構築する、っていう手順をとった
その後、ファイアウォールの設定を忘れたままサーバをrebootしたので、firewalldが自動起動してデフォルト設定のファイアウォールが有効な状態になり、外部からのアクセスを受け付けない状態になった
Try
サボらず最初(アプリ構築時)からファイアウォールの設定をする
「一時的に」っていう何かには本当に気をつけたい… 一時的 is 悪。
余談
この記事を書くために何度かこの手順を繰り返していたら、
sudo firewall-cmd --reload
しても、疎通できない- add-serviceしたあとremove-serviceしても、疎通しちゃう
みたいなことがあった
マジ謎
特に深く調べる気力はなかったので sudo firewall-cmd --reload
ではなく sudo systemctl reload firewalld
したら変更が適用された (白目)
さらにちなみに、 reloadしまくったら、何度かfirewalldが死んだ (白目) そっちも原因究明する気力はないのでだれか..