タイトルの通りです。
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
やったこと
実際はここを参考にしたので書いてあることはほぼ一緒です。英語に拒絶反応のない人はこっち見たほうがいい。
まずは動かす
結論から言うと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を実行している場合は止めて自動で実行しないようにする。
$ sudo apachectl stop
$ sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist 2>/dev/null
もともと入っていたApacheくんに別れを告げたので、新しいApacheくんを持ってくる。
$ brew install httpd
新しいApacheくんを自動起動するように設定。
$ sudo brew services start httpd
ここで一旦localhostにアクセスしましょう。**It works!**みたいな表示が出るはずです。
Apacheの構成を変更する
デフォルトでは8080番ポートをListenしてるので80番ポートにする。
Apacheの設定ファイルは/usr/local/etc/httpd/httpd.conf
にあるのでこれをテキストエディタで開く。
$ 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
と書いてなかったら改行してから書いておく。
動作確認
ホームディレクトリ直下に作業用ディレクトリを作ってテストファイルを作る。
$ mkdir ~/Sites
$ echo "<h1>Test</h1>" > ~/Sites/index.html
一旦Apacheを再起動。
$ sudo apachectl -k restart
localhostにアクセス。
こんな感じになれば成功。今まではここまで行けなかったので非常に気分がいい。
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をインストール。
$ brew install php@7.1
$ brew install php@7.2
$ brew install php@7.3
php7.3とのリンクをちょん切ってとphp7.1とリンクする。
$ brew unlink php@7.3 && brew link --force php@7.1
一応ここで端末を再起動。
phpのバージョンを確認する。
$ 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を停止させてから再起動。
$ sudo apachectl -k stop
$ sudo apachectl start
phpがインストールできたか確認する。
以下のコマンドを入力。
$ echo "<?php phpinfo();" > ~/Sites/info.php
info.phpを開く。
こんな感じの画面が出れば成功。
phpのバージョンを切り替える
以下のコマンドを入力。
$ curl -L https://gist.githubusercontent.com/rhukster/f4c04f1bf59e0b74e335ee5d186a98e2/raw > /usr/local/bin/sphp
$ chmod +x /usr/local/bin/sphp
続いて、以下のコマンドを入力。
$ echo $PATH
なんか出てきたと思います。その中に/usr/local/bin
と/usr/local/sbin
があるか探してください。
なかったらexport PATH=/usr/local/bin:/usr/local/sbin:$PATH
を~/.zshrc
に追加しといてください。
sphp
ができるか確認しましょう。以下のコマンドを入力しましょう。
$ sphp 7.2
なんか色々出てくるはず。途中でパスワードも多分要求される。最終的にAll done!
と表示されたらOK。
info.phpを開く。
以下のようにすれば任意のバージョンに変更可能。
$ sphp 変更したいphpのバージョン
(2019/12/04 追記)
いつからなのかは知らないけど、brew upgrade
をすると7.1が消えて、php 7.3が7.4になる。この状態でsphp 7.4
をやってもこんな感じになる。
$ 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
を一旦削除する。違うとこ消すと面倒なので慎重に。
その後以下のコマンドを入力。
$ curl -L https://gist.githubusercontent.com/rhukster/f4c04f1bf59e0b74e335ee5d186a98e2/raw > /usr/local/bin/sphp
$ chmod +x /usr/local/bin/sphp
これでsphp 7.4
が使えるようになったはず。
(追記終わり)
とりあえずこれで一連の操作はすべて完了。
覚えておきたいこと
Apacheの起動、停止、再起動は以下のコマンドで。
$ 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