Apache с PHP не загружается после обновления на macOS Monterey


0 1

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 человек


Комментарии

Паника, что-то случилось!!! Ничего не найдено в комментариях. Срочно нужно что-то добавить, чтобы это место не оставалось пустым.

Добавить Комментарий

Еще что-нибудь

Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне