VirtualBoxのCentOS7下でsinatraのアクセスができないとき


VirtualBoxにCentOS7とrubyを入れてsinatraでブラウザに「hello」と表示させようとしてもうまくいかず、また他の色々なサイトのやり方を試しても全然つながらなかったので、同じような方がいたときに参考になればと思います。
ちなみに解決策の情報源は職場の先輩です。

環境

  • ローカルOS:Windows10
  • リモートOS:CentOS7
  • Ruby2.7.1
  • フレームワーク:sinatra
  • 仮想マシン:Oracle VM VirtualBox 6.1
  • CentOS7はTeratermでssh接続をして使用

発生した問題

app.rbの立ち上げはうまくいっているのに、どれだけアクセス方法を変えても一向に「hello」の文字が表示されなかった。
SinatraでとりあえずWebアプリを立ち上げてみる
↑こちらの記事を参考にしていたのですが、「1.3 アプリケーションの作成と起動」のところで、ブラウザでhttp://localhost:4567にアクセスしようとしたら・・・

このようにアクセスできませんと。
ここから色々なサイトを参考にさせていただき、試してみました。

解決まで(失敗も含む)

1. アクセス先を変更する

【参考記事】
外部接続だとSinatraはデフォルトの状態では繋がらない。あとlocalhostのあるあるミスも。
そもそもWindowsやMacなどのホスト側のlocalhostではなく、CentOSに対してアクセスしないといけなかったみたいです。
それもそうですよね、今動かしているのはVirtualBox内のCentOSなんですから。
この時に指定したのがホストオンリーアダプターのIPアドレスなんですが、その確認の仕方も書いておきます。

ホストオンリーアダプターの確認

ip addr

これを実行すると、

このような画面が出るはずです。
下の方に3: enp0s8があって、そのinetの次の「192.168.〇〇.〇〇」がホストオンリーアダプターのIPアドレスになります。
環境によって異なるらしいので適宜調べてください。
Teratermでssh接続するときもおそらくこのアドレスを使用していると思います。

なのでアクセスするのはhttp://localhost:4567ではなく、http:192.168.〇〇.〇〇:4567になります。(192.168.〇〇.〇〇は先ほど調べたホストオンリーアダプターのIPアドレスが入る)
結果的に言えばアクセス先はこれで合っているんですが、自分の場合は他の設定が足りておらずこの時はまだ正常にアクセスできませんでした。

2. 外部からもつながるようにする

【参考記事】
Sinatraがデフォルトでは外部から繋がらなくなってたよ
Sinatra ver1.4.0以降は、development環境だとlocalhostからのアクセスしか受け付けないようになっているらしいです。
この記事の一番下の「rubyのコードの中で設定する」と同じように記述しました。

app.rb
set :environment, :production

実際のapp.rbの中身は

こうなっています。

で、これもまた結果的には正しい設定でした。
まだ、この後に記述する設定が残っていたので、この時点では先ほどと同じように正常なアクセスは出来ませんでした。
正常にアクセスできるようになった後で、試しにこの記述を外してアクセスしようとしたらアクセスできなかったのでやっぱり必要みたいです。

3. CentOS側の設定

こちらの設定についてはいくら探しても同じような記事が見つからず、結果的にすべて先輩からのアドバイスで解決しました。
順番にどうしていったかを説明します。

3-1. 現状の設定の確認

systemctl status httpd
systemctl status firewalld
getenforce

この3つを実行します。
それぞれどのようになるかというと・・・



ちなみに、これは3つとも要修正の状態です。どれも正しい状態ではありません。
↓それぞれの言葉について。

httpd
【参考記事】
「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
Webサーバーとしての仕事をしているデーモン(常駐プログラム)のこと。
このサイトにあるように、自分もApacheをインストールしています。
Apacheを入れているから自分のパソコンでもWebサーバーとして機能することができるわけですね。

firewalld, SELinux
Linux Firewalld を一から完全に理解する
【ざっくりと理解する】SELinuxとは?
すみません、これらは自分の言葉でうまく説明できそうにないので上記のサイトに丸投げします。

3-2. 設定の変更(実はまだ足りない)

では、それぞれの修正をしたいと思います。
◆httpdを停止→起動

systemctl start httpd.service

これで起動させて、

systemctl status httpd

これで状態を確認します。

先ほどActive: inactive(dead)だったのがActive: active(running)になりました。

◆firewalldを起動→停止

systemctl stop firewalld.service

これで停止させて、

systemctl status firewalld

これで状態を確認します。

こちらは先ほどのhttpdとは逆で停止状態になりました。

◆SELinuxを起動→停止
【参考記事】
SELinuxの無効化
こちらを参考に永続的に無効化します。

vi /etc/selinux/config

ここで、SELINUX=enforcingSELINUX=disabledに変更。
変更後はrebootをしてサーバーを再起動します。
変更が反映されているか確認すると

きちんと修正されています。

3-3. アクセスの確認(失敗します)

これで全部の設定が終了したはずなので、いざアクセス!!

とやってみましたがまだ繋がらなかったです。
なんでよ・・・
実は、httpdとfirewalldは最後のrebootしたときに変更前の状態に戻っちゃったんですよね。
今のままだと起動するたびにさっきのコマンドをいちいち打たなくてはいけなくなるので自動起動を設定もしくは停止するように追加で修正します。

3-4. 自動起動の修正(これが最後)

◆httpd
Apacheの自動起動を有効にします。

sudo systemctl enable httpd.service

これの後に、自動起動設定を確認

systemctl is-enabled httpd.service

実行結果がenabledであればOKです。

◆firewalld
firewalldの自動起動を無効にします。

systemctl disable firewalld.service

これの後に、自動起動設定を確認

systemctl is-enabled firewalld.service

実行結果がdisabledであればOKです。

これでアクセスが成功するはずです。