Apple накакали в душу программистам, которые пишут PHP код из под мака. Начиная с macOS Monterey все модули должны быть подписаны, поэтому Apache просто на запустится, если в httpd.config файле будет попытка загрузить PHP.
Я любитель обновляться на свежие вещи и не ждать, но за это поплатился тем, что пришлось искать решение, потому что после обновления все сайты перестали загружаться. Я сначала подумал, что это проблема с конфигурационными файлами, потому что Apple любит затирать все конфигурации при обновлении и у меня уже давно лежат в бакапе httpd.conf и httpd-vhosts.conf. За 10 лет пользования маком у меня уже стало привычкой – копировать эти файлы после обновления, но сайт не запустился.
Если у вас нет резервной копии httpd.conf, то придется редактировать файл заново. Для меня основное изменение это добавление PHP:
LoadModule php7_module libexec/apache2/libphp7.so
Проверяю PHP, а его нет в системе. Спасибо Apple, за то, что подчистили и PHP. Начинаю ставить:
brew install php
Но brew ругается, говорит, что нужно выполнить сначала команду:
git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch –unshallow
Без проблем, выполняю ее. Но и после этого установка не пошла, сказали, что нужно поставить последний Python. Ставлю и его:
brew install python
Только после этого PHP установился. Но Apache снова не стартует. Я только тут увидел, что мне поставили PHP8, который я еще не тестировал и поэтому я поставил PHP7.4 и дальше будет все про 7.4, но если ты будешь работать с PHP 8, то разницы не будет. Если ты тоже хочешь 7.4, то его ставим так:
brew install php@7.4
Кстати, установка 8-ки изменилась и в конце установки сообщают хорошую подсказку, как нужно настраивать и новый путь для httpd.conf файла:
To enable PHP in Apache add the following to httpd.conf and restart Apache:
LoadModule php_module /usr/local/opt/php/lib/httpd/modules/libphp.so
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
Finally, check DirectoryIndex includes index.php
DirectoryIndex index.php index.html
The php.ini and php-fpm.ini file can be found in:
/usr/local/etc/php/8.0/
To restart php after an upgrade:
brew services restart php
Or, if you don't want/need a background service you can just run:
/usr/local/opt/php/sbin/php-fpm --nodaemonize
Самое главное в начале, убедить, что у тебя LoadModule с правильным путем. Опять же, я буду использовать 7.4 дальше.
Проверяю лог и вижу там ошибку:
tail -f /private/var/log/apache2/error_log
Если у тебя этого файла нет, то проверь, что у тебя в ErrorLog в файле /etc/apache2/httpd.conf, у меня стоит именно этот путь:
ErrorLog "/private/var/log/apache2/error_log"
Если у тебя другой, то используй его. В логе я вижу ошибку:
[Tue Nov 23 22:28:02.486093 2021] [mpm_prefork:notice] [pid 43716] AH00163: Apache/2.4.48 (Unix) configured -- resuming normal operations
[Tue Nov 23 22:28:02.486849 2021] [core:notice] [pid 43716] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
Отлично, ничего не понятно, но выполняем команду, которая накрылась:
/usr/sbin/httpd -D FOREGROUND
[Wed Nov 24 07:11:24.128062 2021] [so:error] [pid 56975] AH06665: No code signing authority for module at /usr/local/opt/php@7.4/lib/httpd/modules/libphp7.so specified in LoadModule directive.
httpd: Syntax error on line 171 of /private/etc/apache2/httpd.conf: Code signing absent - not loading module at: /usr/local/opt/php@7.4/lib/httpd/modules/libphp7.so
Отлично, нужно подписывать модули. Ошибка говорит No code signing authority. Запускаем Keychain Access и выбираем меню Keychain Access -> Certificate Assistant -> Create a certificate Authority:
В User Certificate выбираем Code Signing и указываем Email:
Дальше нажимаем много раз далее, пока не встретим шаг Extended key Usage, как на рисунке ниже и тут нужно кликнуть на Code Signing. Все остальное снова по умолчанию до самого конца. Будет создан certificate Authority, у имени которого по умолчанию в конце CA и если вы не меняли, то будет ваше имя и CA, как на второй моей картинке.
На закладке My Certificate ищем этот сертификат авторити, дважды кликаем на нем, ракрываем Trust и выбираем – всегда доверять.
Авторитет мы сделали, теперь сам сертификат. Keychain Access -> Certificate Assistant -> Create a Certificate
Здесь в Identity Type выбираем листевой уровень, а тип сертификата Code Signing, как на рисунке ниже:
Имя на рисунке Michael Flenov 1, потому что у меня уже есть сертификат Michael Flenov, который я и буду дальше использовать, так что это именно очень важно. Дальше все по умолчанию, просто создаем сертификат.
Все, готово, можно подписывать модуль PHP:
codesign --sign "Michael Flenov" --force --keychain ~/Library/Keychains/login.keychain-db /usr/local/opt/php@7.4/lib/httpd/modules/libphp7.so
Michael Flenov поменяй на имя своего сертификата и поменяй путь к PHP, который ты подписываешь, как я сказал, я решил пока остановится на 7.4. Если ты используешь 8, то путь скорей всего будет: /usr/local/opt/php/lib/httpd/modules/libphp.so.
Ты думаешь все? Нет, теперь в httpd.conf добавь имя сертификата после имени модуля:
LoadModule php7_module /usr/local/opt/php@7.4/lib/httpd/modules/libphp7.so "Michael Flenov"
Вот теперь все, можешь перезапускать apache и надеюсь, у тебя все заработает.
Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку уже лайкнули 1 человек
Паника, что-то случилось!!! Ничего не найдено в комментариях. Срочно нужно что-то добавить, чтобы это место не оставалось пустым.
Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.
Добавить Комментарий