MacOS
Разработка

Как настроить Apache и PHP из Homebrew на macOS

В этом посте мы рассмотрим, как настроить Apache и PHP, используя версии, установленные с помощью менеджера пакетов Homebrew для macOS.

macOS поставляется со встроенными версиями Apache и PHP, и мы могли бы легко их использовать. Однако у этого подхода есть несколько недостатков. У нас нет контроля над точными используемыми версиями, и доступная версия может быть неактуальной. У меня были проблемы, когда обновления ОС перезаписывали мою конфигурацию для встроенного сервера Apache. Наконец, запуск php -v для проверки версии встроенного PHP выдает предупреждающее сообщение о том, что PHP будет удален из будущих версий macOS — на самом деле, в грядущей macOS Monterey PHP, похоже, больше нет... Вместо использования встроенных версий мы установим Apache и PHP с помощью Homebrew. Мы рассмотрим, как настроить локальную среду разработки, используя их, и, как обычно, попытаемся охватить «почему» и «что»; помимо простого представления конфигурации, мы рассмотрим назначение каждой директивы и команды.

Вот шаги, которые мы предпримем:

1. Установка

Инструкцию по установке самого Homebrew можно найти на официальном сайте Homebrew . Предполагая, что Homebrew установлен, все, что вам нужно сделать для установки Apache и PHP, — это выполнить следующую команду: ( httpd относится к веб-серверу Apache).
brew install httpd php

Несколько слов о путях: на Mac с Apple Silicon Homebrew будет использовать /opt/homebrew префикс. Префикс является своего рода базовым каталогом; каталог, в который Homebrew будет помещать различные файлы, принадлежащие пакетам, которые он устанавливает. Двоичные файлы будут находиться в /opt/homebrew/bin, файлы конфигурации в /opt/homebrew/etc/, и так далее. На Mac с процессором Intel скорее всего будет этот базовый каталог /usr/local. В этой статье я буду ссылаться на пути, используя префикс Homebrew /opt/homebrew. Если ваш префикс отличается, пожалуйста, измените пути соответствующим образом. Чтобы узнать, какой базовый каталог использует Homebrew на вашем компьютере, запустите brew --prefix.


2. URL-адреса разработки

Прежде чем мы приступим к настройке Apache и PHP, давайте кратко коснемся темы URL-адресов для разработки. Я думаю, что хорошей установкой для локальной разработки является использование определенного TLD, такого как .test, доступ к моим различным проектам через URL-адреса, такие как my-first-project.test, my-second-project.test и так далее. В этом руководстве мы просто используем этот /etc/hostsфайл, чтобы направить наши «поддельные» домены на наш локальный веб-сервер. Если есть интерес, в будущем посте может быть рассказано, как настроить такую ​​службу, как dnsmasq , для автоматического захвата всех запросов к хостам, заканчивающихся на .test, и отправки их на наш локальный сервер разработки.
.test является зарезервированным доменом верхнего уровня, и поэтому, используя его, вы не должны сталкиваться с такими проблемами, как люди, использующие .dev для сред разработки, когда Google приобрел .dev TLD .
Этот /etc/hosts файл предоставляет удобный способ связать имена хостов с IP-адресами. Обычно, когда мы посещаем URL-адрес, например https://www.git-tower.com/, фактический IP-адрес сервера должен быть определен с помощью чего-то, что называется системой доменных имен или сокращенно DNS. Файл /etc/hosts дает нам простой способ переопределить это. Для целей этой статьи предположим, что мы работаем с проектом под названием my-project, который мы хотим обслуживать по URL-адресу my-project.test. Мы добавим эту строку внизу /etc/hosts:
127.0.0.1 my-project.test

После сохранения файла посещение my-project.test в браузере приведет к отправке запроса на IP-адрес нашей собственной машины.


3. Конфигурация Apache

Далее давайте приступим к реальной конфигурации Apache. В моем случае основной файл конфигурации Apache находится по адресу /opt/homebrew/etc/httpd/httpd.conf(опять же, на Mac с процессором Intel это, скорее всего, будет /usr/local/etc/httpd/httpd.conf). В этом файле нужно внести несколько изменений:
Listen 8080
Эта строка указывает Apache прослушивать трафик на порту 8080. Для доступа к портам с номерами ниже 1024 требуются привилегии суперпользователя, поэтому прослушивание порта 8080 позволяет пользователям запускать Apache без полномочий root. Однако, поскольку HTTP-трафик по умолчанию идет на порт 80, вместо этого мы хотим прослушивать этот порт:
Listen 80
Также необходимо раскомментировать строки:
LoadModule socache_shmcb_module lib/httpd/modules/mod_socache_shmcb.so
LoadModule ssl_module lib/httpd/modules/mod_ssl.so
LoadModule vhost_alias_module lib/httpd/modules/mod_vhost_alias.so
LoadModule userdir_module lib/httpd/modules/mod_userdir.so
LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so
Скорее всего, вы хотите запустить несколько веб-сайтов на своем компьютере с несколькими именами хостов в формате /etc/hosts. Однако все они попадают на один и тот же сервер Apache. Чтобы обслуживать несколько сайтов с одного сервера Apache, Apache может просмотреть имя хоста входящего запроса и передать запрос одному из нескольких виртуальных хостов . Поддержку виртуального хоста необходимо включить, удалив #перед строкой ниже, превратив ее из комментария в директиву Apache, которая загружает конфигурацию виртуальных хостов из рассматриваемого файла:
#Include /opt/homebrew/etc/httpd/extra/httpd-vhosts.conf
Мы раскомментируем еще одну строку, чтобы загрузить mod_rewrite модуль. Этот модуль используется для перезаписи входящих URL-адресов. Например, многие веб-фреймворки используют его для включения «красивых URL-адресов», позволяя посетителям сайта использовать URL-адреса, например, /posts/2021/some-post-title/при переводе их в URL-адреса, например, /index.php?p=697 для серверной части. Этот модуль, вероятно, будет полезен, поэтому давайте включим его, удалив следующее #:
#LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so
Apache поставляется с конфигурацией для сайта по умолчанию с корневым каталогом документа /opt/homebrew/var/www. Мы не будем использовать этот сайт, так как вместо этого будем использовать виртуальные хосты. В нынешнем виде все будет работать, но Apache будет выдавать предупреждение каждый раз при запуске, заявляя, что он не может определить имя хоста, которое будет использоваться для этого сайта по умолчанию. Позже мы установим имя хоста для каждого виртуального хоста. Однако, чтобы отключить предупреждающее сообщение, мы раскомментируем директиву по умолчанию ServerName( httpd.confили просто введем любое желаемое имя хоста):
ServerName www.example.com:8080

4. Конфигурация PHP

Мы хотим, чтобы PHP был доступен на нашем сервере. Для этого мы добавим еще одну LoadModule директиву после других, загружая модуль, предоставленный PHP, как ранее установленный через Homebrew (на Mac на базе Intel измените /opt/homebrewна /usr/local):
LoadModule php_module /opt/homebrew/opt/php/lib/httpd/modules/libphp.so
Это загружает модуль PHP. Требуется дополнительная настройка. Давайте добавим дальнейшую конфигурацию PHP в отдельный файл в extra каталоге, как и в случае с конфигурацией виртуальных хостов. Нам нужно включить его явно из основного файла конфигурации, поэтому найдите раздел с Include директивами и добавьте его после последнего:
# PHP settings
Include /opt/homebrew/etc/httpd/extra/httpd-php.conf
Остальная часть нашей конфигурации PHP находится в файле /opt/homebrew/etc/httpd/extra/httpd-php.conf:
SetHandler application/x-httpd-php
DirectoryIndex index.html index.php

Начнем с проверки доступности модуля PHP, который может показаться излишним, поскольку мы только что добавили его в httpd.conf файл. Однако эти файлы могут редактироваться независимо друг от друга, поэтому давайте последуем соглашению относительно других файлов в каталоге extra и проверим, доступны ли используемые нами модули. Мы будем искать файлы, оканчивающиеся на .php, и установим их обработчик application/x-httpd-php — обработчик, предоставленный модулем PHP. Обработчик в Apache представляет собой действие, которое необходимо выполнить для файла. В то время как большинство файлов просто обслуживаются с помощью встроенного обработчика, файлы PHP должны быть интерпретированы PHP перед обслуживанием.
Некоторые руководства используют здесь директивы AddType или AddHandler , которые принимают параметры для расширений файлов, к которым они применяются. Это может привести к проблемам с безопасностью , поскольку они проверяют свои настроенные расширения на соответствие каждому расширению файла. Например, веб-приложение может разрешить пользователям загружать .jpeg файлы. Однако, если пользователь загружает файл с именем, оканчивающимся на .php.jpeg, этот файл может быть выполнен как PHP, если используются вышеуказанные директивы. Поэтому мы используем FilesMatch директиву вместе с SetHandler. Не то, чтобы мы столкнулись с этими проблемами, когда мы запускаем Apache локально для себя, но мы могли бы также настроить все правильно.
Директива DirectoryIndex гарантирует, что если запрашивается URL-адрес для каталога, а каталог содержит файл index.php(или index.html файл), этот файл будет обслуживаться.



5. Настройка виртуального хоста

Теперь мы настроили Apache для поддержки PHP и виртуальных хостов. Нам все еще нужно добавить конфигурацию для каждого виртуального хоста отдельно. Ранее мы раскомментировали строку, чтобы включить /opt/homebrew/etc/httpd/extra/httpd-vhosts.conf файл ( /usr/local/etc/httpd/extra/httpd-vhosts.conf на Mac с процессором Intel). Теперь давайте отредактируем его, чтобы фактически настроить виртуальный хост.
<VirtualHost *:8080>
    ServerName tempd.test
    DocumentRoot /Users/xdomus/Sites/tempd.test
    <Directory /Users/xdomus/Sites/tempd.test>
        Require all granted
        AllowOverride All
    </Directory>
</VirtualHost>

Это настраивает виртуальный хост на порту 80. ServerName устанавливает имя хоста для виртуального сайта. Когда мы заходим my-project.test в браузер, сделанное нами изменение /etc/hosts гарантирует, что запрос будет отправлен на локальный сервер Apache. Apache найдет виртуальный хост с соответствующим именем хоста и обслужит этот сайт. Директива DocumentRoot указывает место в файловой системе, где находятся обслуживаемые файлы. Обязательно измените этот путь вместе с другим его экземпляром в директиве Directory на фактический путь вашего веб-сайта на вашем компьютере!
Директива Directory имеет отношение к разрешениям. В httpd.conf файле есть раздел, который по умолчанию запрещает доступ к любому ресурсу. Доступ ко всему, что должно быть общедоступным, должен быть специально разрешен. Итак, для файлов в корне нашего сайта мы даем всем доступ ко всем ресурсам через директиву Require. Директива AllowOverride определяет, какие директивы могут быть переопределены в .htaccess файле. Файл .htaccess можно использовать для конфигурации каждого каталога — многие CMS используют этот файл вместе с mod_rewrite упомянутым ранее модулем, например, для настройки своих URL-адресов. Здесь мы разрешаем переопределять все директивы.
Пока мы это делаем, мы можем удалить или закомментировать существующие фиктивные виртуальные хосты, существующие в этом файле, иначе Apache будет выдавать некоторые предупреждения при запуске, поскольку корневые документы для этих сайтов, вероятно, не существуют.

Также надо отредактировать:
sudo nano /etc/hosts
Необходимо прописать локальный адрес для виртуального хоста:
127.0.0.1 wp.test
::1 wp.test

6. Настройка SSL

Проверяем модуль ssl_module в httpd.conf
sudo nano /opt/homebrew/etc/httpd/httpd.conf
должна быть раскомментирована строка:
LoadModule ssl_module lib/httpd/modules/mod_ssl.so
Потребуется установка openssl
brew install openssl
Проверяем:
which openssl
должны получить:
/usr/bin/openssl
Редактируем порт для SSL соединения в настройках (8443 на 443):
sudo nano /opt/homebrew/etc/httpd/extra/httpd-ssl.conf
Поменял в трёх местах:
Listen 443
<VirtualHost _default_:443>
ServerName www.example.com:443
Далее создаем ключ для самоподписанного сертификата:
cd /opt/homebrew/etc/httpd/
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt
Необходимо отредактировать настройки виртуальных хостов:
sudo nano /opt/homebrew/etc/httpd/extra/httpd-vhosts.conf
Изменяем данные в соответствии со своими виртуальными хостами:
<VirtualHost *:8080>
ServerName yourprojectdomain.com
DocumentRoot "/Users/your_username/Sites/yourprojectname"
ErrorLog "/usr/local/var/log/httpd/yourprojectname-error_log"
CustomLog "/usr/local/var/log/httpd/yourprojectname-access_log" common
</VirtualHost><VirtualHost *:443>
DocumentRoot "/Users/your_username/Sites/yourprojectname"
ServerName yourprojectdomain.com
SSLEngine on
SSLCertificateFile "/usr/local/etc/httpd/server.crt"
SSLCertificateKeyFile "/usr/local/etc/httpd/server.key"
</VirtualHost>

7. Полезняшки

Вот и вся настройка! Осталось только запустить сервер. Если вы хотите, чтобы Apache запускался автоматически на вашем компьютере, вы можете использовать команду Homebrews, services чтобы запустить сервер и одновременно включить его для автозапуска:
sudo brew services restart httpd
Посмотреть ошибки запуска httpd:
apachectl configtest

 

Как прописать переменные среды в MacOs

Посмотреть все переменные среды:
printenv
Посмотреть конкретную переменную в среде:
echo $JAVA_HOME
Установить временную переменную среды (сохраняется до закрытия терминала):
export MY_VAR=value
Установить постоянную переменную среды:
nano ~/.zshrc
Откроется файл с постоянными переменными среды (для пользователя) в который надо добавить требуемую переменную.
Затем необходимо выполнить команду:
source ~/.zshrc


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