macOS CatalinaのApacheでlocalhostにアクセスしたかった

タイトルの通りです。
macOS CatalinaのApacheくんとlocalhostを巡って激しく殴り合ったので、メモとして残しておきます。

# 何があった
`http://localhost:8080`は起動するのに色々いじくり回しても`http://localhost/`はrefusedされ、`http://localhost:8080/~{ユーザ名}`は404になる。キレそう。ていうかキレてる。

#目標
- Apacheを起動させてlocalhostにアクセスできるようにする
- 作業ディレクトリをホームディレクトリ直下に変える
- phpを複数バージョン使えるようにしたい

# 実行環境
- mac:MacBook Pro 16 inch(2019)
- OS:10.15 Catalina
- Shell:zsh
- テキストエディタ:atom


# やったこと

実際は[ここ](https://getgrav.org/blog/macos-catalina-apache-multiple-php-versions)を参考にしたので書いてあることはほぼ一緒です。英語に拒絶反応のない人はこっち見たほうがいい。

## まずは動かす

結論から言うとmacにもともと入っていたApacheはなんか色々面倒らしいので、HomeBrewでApacheを持ってきた方が良いらしい。

以下原文ママ
>The latest macOS 10.15 Catalina comes with Apache 2.4 pre-installed, however, it is no longer a simple task to use this version with Homebrew because Apple has removed some required scripts in this release. However, the solution is to install Apache 2.4 via Homebrew and then configure it to run on the standard ports (80/443).

日本語で言うと、
CatalinaにはApache2.4入ってるよ。でもHomebrewで使おうとするとAppleが必要なスクリプトを消しちゃったのでめんどくさいよ。Homebrew経由でインストールして、標準ポートで動作するように設定すれば解決するよ。
ってことらしいです。

とりあえずMacにもともと入っていたApacheを実行している場合は止めて自動で実行しないようにする。

```zsh
$ sudo apachectl stop
$ sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist 2>/dev/null
```
もともと入っていたApacheくんに別れを告げたので、新しいApacheくんを持ってくる。

```zsh
$ brew install httpd
```

新しいApacheくんを自動起動するように設定。

```zsh
$ sudo brew services start httpd
```
ここで一旦[localhost](http://localhost:8080)にアクセスしましょう。**It works!**みたいな表示が出るはずです。

## Apacheの構成を変更する
デフォルトでは8080番ポートをListenしてるので80番ポートにする。
Apacheの設定ファイルは`/usr/local/etc/httpd/httpd.conf`にあるのでこれをテキストエディタで開く。

```zsh
$ atom /usr/local/etc/httpd/httpd.conf
```

52行目に`Listen 8080`と書いてあるので`Listen 80`に変更。

次はDocumentRootを変更する。
249、250行目にこんな感じで書いてあるところがある。

```
DocumentRoot "/usr/local/var/www"
<Directory "/usr/local/var/www">
```
これを以下のようにする。(わかってると思うけど{ユーザ名}には自分のmacのユーザ名を入れる。)

```
DocumentRoot /Users/{ユーザ名}/Sites
<Directory /Users/{ユーザ名}/Sites>
```
そのちょっと下の270行目にある`AllowOverride None`と書いてある箇所を`AllowOverride All`に変更。
次に、182行目の`#LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so`のコメントアウトを解除（行頭の#を削除）。

これでホームディレクトリの指定が終わった。でもこのままではアクセス権の問題があるので193、194行目にこんな感じで書いてある箇所がある。

```
User _www
Group _www
```
これを以下のようにする。

```
User {ユーザ名}
Group staff
```

あと、224行目に`#ServerName www.example.com:8080`と書いてあるはずだが、その下の行に`ServerName localhost`と書いてなかったら改行してから書いておく。

## 動作確認
ホームディレクトリ直下に作業用ディレクトリを作ってテストファイルを作る。

```zsh
$ mkdir ~/Sites
$ echo "<h1>Test</h1>" > ~/Sites/index.html
```


一旦Apacheを再起動。

```zsh
$ sudo apachectl -k restart
```

[localhost](http://localhost)にアクセス。

<img width="849" alt="スクリーンショット 2019-11-26 20.20.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293758/185e0670-ddea-6290-ee83-05640c617c99.png">


こんな感じになれば成功。~~今まではここまで行けなかったので非常に気分がいい。~~

## phpをインストールする

**(2019/12/04追記)php7.4が出たのでphp7.1が消えた。多分インストール出来るんだろうけどやってないのでここでは説明を省きます。以下の文を7.1→7.2、7.2→7.3、7.3→7.4に読み替えて下さい。**

（正直ここらへんは参考にしたサイトの内容をそのままやったらできなかったので自分流）
まずHomebrewでphp7.1とphp7.2とphp7.3をインストール。

```zsh
$ brew install php@7.1
$ brew install php@7.2
$ brew install php@7.3
```
php7.3とのリンクをちょん切ってとphp7.1とリンクする。

```zsh
$ brew unlink php@7.3 && brew link --force php@7.1
```

一応ここで端末を再起動。
phpのバージョンを確認する。

```zsh
$ php -v
PHP 7.1.33 (cli) (built: Oct 25 2019 10:52:19) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.1.33, Copyright (c) 1999-2018, by Zend Technologies
```

## Apacheでphpを使えるようにする
恐らく182行目らへんに`LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so`と書かれているはず。
その下の行にこれを追加。

```
LoadModule php7_module /usr/local/opt/php@7.1/lib/httpd/modules/libphp7.so
#LoadModule php7_module /usr/local/opt/php@7.2/lib/httpd/modules/libphp7.so
#LoadModule php7_module /usr/local/opt/php@7.3/lib/httpd/modules/libphp7.so
```

次に、282-284行目にこんな感じのブロックがある。

```
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>
```

これを下の文に置き換える。

```
<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>
```
保存して、Apacheを停止させてから再起動。

```zsh
$ sudo apachectl -k stop
$ sudo apachectl start
```

phpがインストールできたか確認する。
以下のコマンドを入力。

```zsh
$ echo "<?php phpinfo();" > ~/Sites/info.php
```
[info.php](http://localhost/info.php)を開く。
<img width="1126" alt="スクリーンショット 2019-11-26 21.48.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293758/edc52b5c-4d77-e9fa-cf6d-20e865848ece.png">

こんな感じの画面が出れば成功。

## phpのバージョンを切り替える
以下のコマンドを入力。

```zsh
$ curl -L https://gist.githubusercontent.com/rhukster/f4c04f1bf59e0b74e335ee5d186a98e2/raw > /usr/local/bin/sphp
$ chmod +x /usr/local/bin/sphp
```
続いて、以下のコマンドを入力。

```zsh
$ echo $PATH
```
なんか出てきたと思います。その中に`/usr/local/bin`と`/usr/local/sbin`があるか探してください。
なかったら`export PATH=/usr/local/bin:/usr/local/sbin:$PATH`を`~/.zshrc`に追加しといてください。

`sphp`ができるか確認しましょう。以下のコマンドを入力しましょう。

```zsh
$ sphp 7.2
```
なんか色々出てくるはず。途中でパスワードも多分要求される。最終的に`All done!`と表示されたらOK。
[info.php](http://localhost/info.php)を開く。

<img width="1126" alt="スクリーンショット 2019-11-26 22.11.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293758/7469a589-7af1-c19d-d262-8878667d0596.png">
phpのバージョンが変わっていることがわかる。

以下のようにすれば任意のバージョンに変更可能。

```zsh
$ sphp 変更したいphpのバージョン
```

(2019/12/04 追記)
いつからなのかは知らないけど、`brew upgrade`をすると7.1が消えて、php 7.3が7.4になる。この状態で`sphp 7.4`をやってもこんな感じになる。

```zsh
$ sphp 7.4
Unknown version of PHP. PHP Switcher can only handle arguments of: 5.6,7.0,7.1,7.2,7.3
```

7.3を使いたい場合は`brew install php@7.3`でphp 7.3を再インストール。

`httpd.conf`の`#LoadModule php7_module /usr/local/opt/php@7.3/lib/httpd/modules/libphp7.so`の下の行に
`#LoadModule php7_module /usr/local/opt/php@7.4/lib/httpd/modules/libphp7.so`を追加。

`/usr/local/bin/sphp`を一旦削除する。違うとこ消すと面倒なので慎重に。

その後以下のコマンドを入力。

```zsh
$ curl -L https://gist.githubusercontent.com/rhukster/f4c04f1bf59e0b74e335ee5d186a98e2/raw > /usr/local/bin/sphp
$ chmod +x /usr/local/bin/sphp
```
これで`sphp 7.4`が使えるようになったはず。
(追記終わり)

とりあえずこれで一連の操作はすべて完了。

## 覚えておきたいこと
Apacheの起動、停止、再起動は以下のコマンドで。

```zsh
$ sudo apachectl start
$ sudo apachectl -k stop
$ sudo apachectl -k restart
```

Chromeでlocalhostを見ていると、リロードしても表示が変わらないときが多々ある。
そういうときはスーパーリロードをかけると良いかもしれない。
Chromeのスーパーリロードは`Cmd + Shift + R`で出来る。

# あとがき
数時間で書いたので文章適当かもしれない。
割と面倒臭かった。~~正直Apacheとphp嫌いになった。~~

# 2020年11月22日追記
~~macOS Big Sur出たらどうなるんだろうね。~~
Big Sur出ましたね。
Big Surにした人、ちゃんと動いたか教えてくれると喜びます（）


# 参考
[macOS 10.15 Catalina Apache Setup: Multiple PHP Versions | Official home of Grav CMS](https://getgrav.org/blog/macos-catalina-apache-multiple-php-versions)