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アプリを立ち上げてみる](https://qiita.com/k-ta-yamada/items/9e35c5f8b31862267e01)
↑こちらの記事を参考にしていたのですが、「1.3 アプリケーションの作成と起動」のところで、ブラウザで`http://localhost:4567`にアクセスしようとしたら・・・
![image14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/7b2e0312-7a80-13c8-5fda-f14849fbc664.png)
このようにアクセスできませんと。
ここから色々なサイトを参考にさせていただき、試してみました。

## 解決まで(失敗も含む)
### 1. アクセス先を変更する
【参考記事】
[外部接続だとSinatraはデフォルトの状態では繋がらない。あとlocalhostのあるあるミスも。](https://qiita.com/kawabex/items/ea85d498eed480f2c34d)
そもそもWindowsやMacなどのホスト側のlocalhostではなく、CentOSに対してアクセスしないといけなかったみたいです。
それもそうですよね、今動かしているのはVirtualBox内のCentOSなんですから。
この時に指定したのがホストオンリーアダプターのIPアドレスなんですが、その確認の仕方も書いておきます。

#### ホストオンリーアダプターの確認
```
ip addr
```
これを実行すると、
![image21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/3a7fbf24-d65b-3c27-d6fd-a192d2b99cd7.jpeg)
このような画面が出るはずです。
下の方に`3: enp0s8`があって、その`inet`の次の「192.168.〇〇.〇〇」がホストオンリーアダプターのIPアドレスになります。
環境によって異なるらしいので適宜調べてください。
Teratermでssh接続するときもおそらくこのアドレスを使用していると思います。

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

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

```app.rb
set :environment, :production
```
実際のapp.rbの中身は
<img width="500" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/fa19eff7-cacb-2d52-2f3f-def7266db535.png">
こうなっています。

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

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

#### 3-1. 現状の設定の確認
```
systemctl status httpd
```
```
systemctl status firewalld
```
```
getenforce
```
この3つを実行します。
それぞれどのようになるかというと・・・
![image6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/26ee77dd-db96-41ea-8afa-0894cf1be2a3.png)
![image7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/25724cdb-05d3-e23a-bebb-07506ccaca05.png)
![image8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/e8b73503-0338-4b92-f168-26192b06f915.png)
ちなみに、これは3つとも要修正の状態です。どれも正しい状態ではありません。
↓それぞれの言葉について。

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

__firewalld__, __SELinux__
[Linux Firewalld を一から完全に理解する](https://turningp.jp/server-client/linux/firewalld)
[【ざっくりと理解する】SELinuxとは？](https://eng-entrance.com/linux-selinux)
すみません、これらは自分の言葉でうまく説明できそうにないので上記のサイトに丸投げします。

#### 3-2. 設定の変更(実はまだ足りない)
では、それぞれの修正をしたいと思います。
__◆httpdを停止→起動__

```
systemctl start httpd.service
```
これで起動させて、

```
systemctl status httpd
```
これで状態を確認します。
![image9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/797b80bd-d788-4755-f921-5b8817d178cb.png)
先ほど`Active: inactive(dead)`だったのが`Active: active(running)`になりました。

__◆firewalldを起動→停止__

```
systemctl stop firewalld.service
```
これで停止させて、

```
systemctl status firewalld
```
これで状態を確認します。
![image10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/35243565-66c0-25f1-28ff-16b401f22116.png)
こちらは先ほどのhttpdとは逆で停止状態になりました。

__◆SELinuxを起動→停止__
【参考記事】
[SELinuxの無効化](https://qiita.com/hanaita0102/items/5d3675e4dc1530b255ba)
こちらを参考に永続的に無効化します。

```
vi /etc/selinux/config
```
ここで、`SELINUX=enforcing`を`SELINUX=disabled`に変更。
変更後は`reboot`をしてサーバーを再起動します。
変更が反映されているか確認すると
![image12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/c6f08e48-6186-9e9f-cdd7-5dc2b7a35c67.png)
きちんと修正されています。

#### 3-3. アクセスの確認(失敗します)
これで全部の設定が終了したはずなので、いざアクセス！！
<img width="500" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/1aca1387-b146-8d2b-eac0-81ea0350aacf.png">
とやってみましたがまだ繋がらなかったです。
なんでよ・・・
実は、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です。

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