12月16日
Montereyのapache(HTTPD)にphp8を導入、面倒だ〜お願い標準に戻して〜
macOSには標準でHTTP Sever(httpd)が備わっています。Apache準拠です。Big Surまではそのままphpスクリプトを動作させることができました。MontereyではPHPコマンド自体がなくなり、合わせてApache用のphpモジュールがなくなっています。この標準 httpd上でphpを動作させるまでの参考にすべき情報源とポイントをまとめています。
【前提条件】
導入方法はhttps://www.simplified.guide/にある記事がとても詳しかったので、ここではこの記事でうまくできなかったポイントをまとめています。
How to sign homebrew PHP module in macOS
mac野郎なののかは、ここまでやったことで動きませんでした。
理由はケアレスミス(apachectlの-kありなしで挙動が違う)。mac野郎なのかの設定(launchctlで利用するplist)に依存しているようです。手順通りやれば問題ありませんでした。
sudo apachectl -k restart
sudo apachectl restart
ひとまずmacOS Monterey+Apache+php8.so(homebrew版)の環境が整いました。php8でWARNINGの扱いが厳しくなっています。今まで無言で動いていたスクリプトもしゃべりまくり(ワーニングでまくり)です。
このhomebrew環境を使い続けていく場合、brewで更新、php関連のファイルがアップデートされた場合、再度codesignが必要になります。Big Surまでと同じようにphpをmacOS標準にしてほしいと切に願っています。
-k指定で問題起きました。通常同じなんですよ。でも違いました。この設定も見直す必要があります。この動かない期間、実は色々設定を書き換えています。ひょっとするとこの設定がないと動かない?かもしれないので動かない方は試してみてください。多分不要だと思っています。
brew composerをインストールしたところ関連ファイルとしてphp8.0.13→8.0.14にアップデートしていました。
apacheをrestartするとCode signing errorが発生します。再度codesignが必要です。
- macOS Moterey 12.1で動いている
- httpdが自動起動する設定になっている
- homebrewでphp8をインストール済み
Montereyのapache(HTTPD)にphp8を導入するポイント
導入方法はhttps://www.simplified.guide/にある記事がとても詳しかったので、ここではこの記事でうまくできなかったポイントをまとめています。
How to sign homebrew PHP module in macOS
- Step1 Create Certificate Authority for code signing using Keychain Access.
Step1でCA局を作成します。CA局を作る流れの「Step9 Accept defaults for Certificate Information and click Continue. 」ここで少し流れと違うポイントがあり、悩みました。Continue(続ける)をクリックするとこのような画面が表示されます。どれか選ばなくてはいけません。CAインビテーションに署名する識別情報を選択してください。意味がわかりませんよ。こんな画面が出てきたら、キャンセルし、「証明書アシスタント」画面に「インビテーションに署名」というチェックボックスがONになっているかと思います。これをOFFにしてみてください。続けるで同じような流れになります。 - Step2 Create code signing certificate using Keychain Access.
ここで指定した「名前」は後々の手順で利用します。名前は半角がおすすめです。 - Step5 Locate location or path of PHP module from Apache's PHP LoadModule directive.
→これは意味がよくわからないので飛ばしました。 - Step6 Sign PHP module using codesign with the code signing certificate name you've created.
codesign --sign "macyarounanoka" --force --keychain ~/Library/Keychains/login.keychain-db /usr/local/opt/php@8.0/lib/httpd/modules/libphp.so
- Step7 Open Apache configuration file with PHP LoadModule directive using your preferred text editor.
Step8 Add code signing certificate name after module path in PHP LoadModule directive.
以下ファイルがあることを確認します。これから編集(vi)するのでオリジナルを別ファイル名で取っておきます。ls -l /etc/apache2/httpd.conf
sudo cp -p /etc/apache2/httpd.conf /etc/apache2/httpd.conf.12.1
viを使って編集します。sudo vi /etc/apache2/httpd.conf
/PHPと打ち込んでリターンキーを押します。その行の下(oキーを入力)に以下を追加しました。#PHP was deprecated in macOS 11 and removed from macOS 12
LoadModule php_module /usr/local/opt/php@8.0/lib/httpd/modules/libphp.so "macyarounanoka"- brewで導入したphpのバージョンに合わせてください。
- macyarounanokaはStep2で作成した証明書です。ご自身で作られた証明書に置き換えてください。
- 追加手順 以下ファイルを作成します。
sudo vi /etc/apache2/other/php.conf
ファイルの内容
other下にあるconfファイルは自動で読み込まれる設定になっています。ファイル名自体はなんでもいいです。/etc/apache2/httpd.confで定義したモジュール名称「php_module」と先頭のモジュール指定の名称を合わせてください。<IfModule php_module>
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>
</IfModule> - 動作確認用PHPファイルの作成
以下のようなテストファイルを/Library/WebServer/Documents/php.phpとして保存します。<?php
phpinfo(); - 動作確認はSafariではなくcurlで。
Safariなんだか怪しいです。httpdサーバーが動いてなくても2回に1回、以前のキャッシュがヒットして表示されることがありました。curl mac名.local/php.php
curlでmac名.local/php.phpへアクセスします。正しく動いている場合、phpの設定一覧が表示されます。上記ソースコードが表示されている場合は動いていません。またcurl: (52) Empty reply from serverというようなエラーが表示された場合も動いていません。
mac野郎なののかは、ここまでやったことで動きませんでした。
理由はケアレスミス(apachectlの-kありなしで挙動が違う)。mac野郎なのかの設定(launchctlで利用するplist)に依存しているようです。手順通りやれば問題ありませんでした。
sudo apachectl -k restart
sudo apachectl restart
まとめ:動いたが不安な環境。phpをmacOS標準にしてほしい
ひとまずmacOS Monterey+Apache+php8.so(homebrew版)の環境が整いました。php8でWARNINGの扱いが厳しくなっています。今まで無言で動いていたスクリプトもしゃべりまくり(ワーニングでまくり)です。
このhomebrew環境を使い続けていく場合、brewで更新、php関連のファイルがアップデートされた場合、再度codesignが必要になります。Big Surまでと同じようにphpをmacOS標準にしてほしいと切に願っています。
-k指定で問題起きました。通常同じなんですよ。でも違いました。この設定も見直す必要があります。この動かない期間、実は色々設定を書き換えています。ひょっとするとこの設定がないと動かない?かもしれないので動かない方は試してみてください。多分不要だと思っています。
- 実行権限与えています。
Cellarとoptはハードリンク(同一iノードです)されています。どちらかやればOKです。chmod 755 /usr/local/Cellar/php@8.0/8.0.13/lib/httpd/modules/libphp.so
- opcache.soにもcodesignしています
codesign --sign "macyarounanoka" --force --keychain ~/Library/Keychains/login.keychain-db /usr/local/Cellar/php@8.0/8.0.13/lib/php/20200930/opcache.so
phpがアップデートするとどうなる?Code signing errorが発生します
brew composerをインストールしたところ関連ファイルとしてphp8.0.13→8.0.14にアップデートしていました。
apacheをrestartするとCode signing errorが発生します。再度codesignが必要です。
sudo apachectl -k restart
[Tue Jan 04 15:47:59.995873 2022] [so:error] [pid 1564] AH06663: Unable to find code signature authority on module at /usr/local/opt/php@8.0/lib/httpd/modules/libphp.so that matches authority name "macyarounanoka" configured on LoadModule directive.
httpd: Syntax error on line 190 of /private/etc/apache2/httpd.conf: Code signing error - not loading module at: /usr/local/opt/php@8.0/lib/httpd/modules/libphp.so
ハマったポイント
- 外付けストレージ権限の問題
macOSのプライバシーとセキュリティ、コマンドラインツールとの相性イマイチですよね。拒絶されること多いです。許可を与える必要があります。外付けストレージを使わないのが一番簡単な修正です。
- アクセスユーザーと権限
今回の方法で立ち上げたhttpd、例えばユーザーAでログインし、mba.local/web/test/test1.php等にアクセスした際、ユーザーAのプロセスとして実行されます。
echo get_current_user();などで確認できます。
exec()等でコマンド実行した場合の権限はこれと異なり、_www になります。訳分からんですよね
コメントシステムを利用したくない方はお問い合わせからお願いします。
2013.8.19 DISQUS(外部コメントサービス)の利用を開始しました。
Facebook, google, Twitter等のアカウントで投稿可能です。