MAMPでポート番号を標準にすると403になったりする件の解決法
この記事はqiitaでも投稿しています。
最初に結論
MAMPのポート番号はデフォルトのまま変にいじらない方が良い。
特にweb:80, mysql:3306 にしてはいけない。
本番と同じポートを使って動作させたいなら有料版のMAMP Proに移行すべき。
※2022年5月現在の情報です。今後OSやMAMPの変化により情勢が変わるかもしれません。むしろ変わってくれ。
本文
MAMPとは
MacOS向け
Apache(Webサーバ)
MySQL(MariaDB、DBサーバ)
PHP(Web開発用プログラミング言語)
がワンセットになった統合運用環境です。Windows版もありますがMac専用と考えた方が良いです。
インストールするとダッシュボードが表示され、上記の各サーバがワンクリックで開始、終了できるお手軽環境です。
PHPが使えるのでWordpress等の開発環境として導入されている方も多いかと思います。
MAMPで起こる問題
MAMPで開始、終了できるApache, MySQLは標準の接続ポート番号がそれぞれ80, 3306です。
対してMAMP上でのデフォルトポート番号はそれぞれ8888, 8889となっており標準ポート番号とは異なります。
別に標準ポート番号と異なっても各アプリの設定で適切にポート番号を設定すればそのままWebサーバもDBも使用することができるので開発時には何ら問題はありません。
問題は標準のポートで稼働しようとした場合です。
上記のように設定でポートを標準設定にして、MAMPをStartするといきなり403エラーになったり500エラーになったりします。
この現象に遭遇した人は多いかと思います。
なぜこのようなことが起こるのでしょうか。
Macは「アクセス権限」に割と厳格である
Macで普通にアプリを使っていたり、プログラム開発をしていると以下のようなダイアログが表示されることがあります。
「デスクトップ」「書類」「ダウンロード」など、特別な名前を持つフォルダに対してアクセスしようとすると表示されることがあります。
これはアプリ側から「このフォルダへの無制限な読み書きを行いたいので許可をください」というお願いです。
iPhone等のiOSを使っている方は「写真」や「カメラ」でも同じような許可表示が出るのでお馴染みだと思います。
この許可をOKしたかどうかは「システム環境設定 > セキュリティとプライバシー > ファイルとフォルダ」でチェックすることができます。許可を要求したアプリケーションと、許可の状態が表示されます。許可/不許可を設定し直すことも可能です。
この許可制度ですが、単に「ファイルに対するアクセス権限を設定する」わけではありません。別にこの許可を求めなくてもファイルの読み書きはアプリ上で可能です。実はこの許可制度の核心は 「このコンピュータの外にこのデータが送信される可能性がありますが良いですよね?」 ということを指しています。
この核心部分が、MAMP上でポートを標準にした際のエラー表示に関係しています。
開発版はアクセスOKだけど、本番運用ではアクセスは認めません!
Webサーバの標準ポートは80、MySQLの標準ポートは3306です。これらのポートはIANAというインターネットのルールを統括する機関に登録されている正式な番号です。
対してMAMPでのデフォルトポートはそれぞれ8888,8889で、これは明らかに「開発時用の仮のポート番号」と解釈できます。
開発時は、基本的には作業中のデータは外部に送信されることはないと思われます。
しかし本番環境では外部からのインターネットアクセスがあり、サーバ内のデータがインターネットの外側へ送信されることになります。
最近のMacはそのあたりのサビわけを厳密に監視しているようで、例えばwebサーバであればポート80を開いているアプリがデスクトップなどの「特別な権限が必要」なフォルダ内のファイルを読み書きしようとすると前述の「許可」がない限り読みも書きもブロックするような挙動をするようです。
この機能は無闇にコンピュータ内部の情報を漏出するのを防ぐ点では必要な機能であると思います。
MAMPでポート番号を標準にするとエラーが発生する原因
以上が前置きで、ここからが本題です。
原因その1 : MAMPはアクセス権を求めない
上記の通り、ポート80を使用するアプリはデスクトップや書類フォルダ等からファイルを読み書きするために特別な許可が必要になります。これはアプリ側から能動的に求めないといけないことになっています。
MAMPはこのアクセス許可をアプリ上で要求するようにはなっていません。
アクセス許可が得られないとファイルの読み書きができないのは、MAMPで管理され開始、停止されるApacheやNginxも同様です。
原因その2 : Macの標準的なファイル管理手法のネガティブな面
Macを使っている人の9割以上の人(当社調べ)が、自身で作成したデータを「デスクトップ」上か、デスクトップに作成したフォルダの中に保存しているかと思います。画像も動画もプログラムも等しくそうであると思います。
これはMacOSのユーザーファイル管理コンセプトが 「デスクトップ上にユーザーが作成したファイルを意図的に集めようとしている」 からだと考えられます。
MacOSのファイルマネージャであるFinderには左側に各種重要なフォルダへ簡単にアクセスできるようショートカットがあります。デフォルトでこの中にあるのは「デスクトップ」「ダウンロード」くらいで、他のフォルダ、例えば自分のアカウントのホームディレクトリすらありません。
一応「移動」メニューの中には入っていますが、MacOS的には上部のメニューを使うのは直感的ではなく(ウィンドウとメニューが離れているため)全てウィンドウ内で完結するようなユーザーインターフェースになるのが理想のようです。
私も結構長くメンター業務を行なっていますが、Mac使いの半分くらいの人は「上部メニューの◯◯を選択してください」と指示してもどこにメニューがあるのかがわかりません。
そのような理由で、Finderからアクセスできるフォルダが「デスクトップ」と「ダウンロード」しか存在しない、それ以外のフォルダのありかがわからないのはMacというコンピュータの設計上仕方のないことだと思われます。
下手にシステム関連のファイルに触ってほしくはないのはよく理解できますが、過保護すぎるかなとも思います。
かくして、Macでソフトウェア開発する人のほとんどが「デスクトップ」上かそのサブフォルダに成果物を保存していくことになります。私もそうですけどね。
原因1+2 : 本番環境設定したMAMPはデスクトップ上のフォルダにアクセスできない
上記2つの理由が組み合わさることにより、本件の現象が発生します。
MAMPを使ってWebサイトを開発している人のほとんどが、原因2で書いた通りデスクトップ以下に作成した作業フォルダをMAMPの「ドキュメントルート」に設定しているかと思います。原因1で書いたようにMAMPはデスクトップ以下のフォルダやファイルに対してWebサーバとして実行されるアプリがファイルへアクセスする権限を取得していないので、アクセス権限に関するエラーが発生することになります。
対策
その1 : MAMPデフォルトのドキュメントルートに全ファイルをコピーする
MAMPのドキュメントルート、デフォルトは /Applications/MAMP/htdocs
です。このフォルダはMac的には「特別なフォルダ」ではないので前述の厳しいアクセス制限に引っ掛かりません。このフォルダに制作物を丸ごとコピーすれば標準ポート設定でもWebサイトやWordpressは動作します。
ただし、何か変更が発生するたび開発側のファイル群とMAMPのドキュメントルート側のファイル群の同期をとるのは大変だと思われます。シェルスクリプト等で解決しても良いですが、そのようなスクリプトを書ける人ならもっと良い方法を思いつくでしょう。この件の挙動が正しく理解できていない人向けの解決方法であるかと思います。
SOやTeratailを検索すると、この方法で解決としている記事がいくつか見受けられます。
その2 : デスクトップフォルダ以外の場所を開発用ルートフォルダとする
自ユーザーのホームディレクトリに開発用のフォルダを作り、そこで制作物を管理するほうが良いかと思います。
Finderのサイドメニューでは前述のように初期状態は「デスクトップ」と「ダウンロード」しか表示していませんが、フォルダを左メニューにドラッグすれば任意のフォルダを左メニューに登録できます。
Macがアクセス制限をかけるのはあくまで特別フォルダだけなので、ホームディレクトリに別の新しいディレクトリを作成し、その中のサブフォルダをドキュメントルートにする分には今回のような制限に引っ掛かりません。
その3 : ポート80の使用はあきらめ、デフォルトポートで開発を進める
諦めたらそこで試合終了のようなことをおっしゃる先生もいらっしゃいますが、別にポート80で無理に動作テストをしなくても良いかと思います。
とはいえ、wordpressでは自サイトの完全なURLを設定で書かなければいけません(このURLにはポートも含まれます)ので本番さながらのテストをしたい場合もありますが、それならば解決法その1で書いたデフォルトのドキュメントルートにデプロイすれば良いような気がします。
なお、MySQLのポート3306は特に制限はありません。もともとMySQLのデータファイルはデスクトップ上にありませんし、Mac側のアクセス制限にも引っ掛かりません。
その4 : MAMP Proを使う
どうしてもデスクトップ上でファイルを管理し、本番用ポートでテストもしたいのであれば、有料版のMAMP Proを導入しましょう。
MAMP Proはどういうわけか 「きっちり特別フォルダへのアクセス権を要求する」 ようになっているので、ドキュメントルートをデスクトップ上のフォルダに設定するとアクセス権の許可を求められます。ここで許可を選択すればデスクトップ上のフォルダをドキュメントルートにし、かつ、本番のポート設定でも問題なく動作させることが可能です。
有料版と無料版の違いがそこである、という考え方もできますが、この方法は全く世に広まっておらず、MAMP側もこの件に対して大っぴらに宣伝してもしていないのでどうしてこのような差が存在しているのかが謎です。
有料版ならデスクトップ上のフォルダをドキュメントルートにできるよ、くらいの宣伝をしてもいいんじゃないかと思いますが、どうなのでしょうか。
おわりに
以上、MAMPでポート番号を標準にすると403になったりする件の原因と解決法を解説いたしました。
アクセス権の要求に関する所作は「わざとやってませんか」とはあんまり思いたくないのですが、無料版は意図的にアクセス権を要求していないのかもしれません。Pro版ではちゃんとアクセス権を要求していますからね。
ただ、デスクトップ上にあるフォルダやファイルがOSによって手厚く保護されているのも事実で、その保護機能に助けられている部分も大いにあります。自力で重要な情報の防衛ができるかどうか、それが無料版とPro版の挙動の違いに現れているのかもしれません。
アクセス権限に関する話はどうあれ、無料版のMAMPで本番さながらのテストをしたいのであればそれなりにセキュリティの知識やコンピュータのファイルシステムに関する知識が必要です。皆様もしっかり学習していきましょう。
余談
私がこの原因の件に気づいたのは、MAMP Proの無料トライアルで同様のことを試しに行ってみたからです。
無料版MAMPだけ調査していたからおそらく気づきませんでした。
有料だからと臆せず試してみるのも大事ですね。