Настройка Apache и PHP из Homebrew на macOS

Настройка Apache и PHP из Homebrew на macOS

21 апреля 2022 г.

В Tower мы используем Apache для размещения веб-сайтов, таких как наша учебная платформа, наш [блог] (https://www.git-tower.com/blog) и наш [основной сайт продукта] (https://www.git-tower.com). Хотя это не означает, что мы должны использовать Apache для локального запуска сайтов, использование аналогичного стека для разработки и производства, как правило, является хорошей идеей. Это означает настройку среды разработки с Apache.


В macOS, которую мы используем, по большей части, есть довольно много вариантов. Мы могли бы настроить Apache на виртуальной машине, возможно, управляемой с помощью [Vagrant] (https://www.vagrantup.com). Мы могли бы использовать Docker для запуска Apache в контейнере. Существуют также решения с графическим пользовательским интерфейсом, такие как [MAMP] (https://www.mamp.info/en/mac/). Однако удобное и простое решение — просто настроить Apache, работающий изначально в macOS — без оболочек, без виртуальных машин, без контейнеризации. В этом посте мы рассмотрим, как настроить Apache и PHP, используя версии, установленные с помощью [менеджера пакетов Homebrew] (https://brew.sh) для macOS.


macOS поставляется со встроенными версиями Apache и PHP, и мы могли бы легко их использовать. Однако у этого подхода есть несколько недостатков. У нас нет контроля над точными используемыми версиями, и доступная версия может быть неактуальной. У меня были проблемы, когда обновления ОС перезаписывали мою конфигурацию для встроенного сервера Apache. Наконец, запуск php -v для проверки версии встроенного PHP дает предупреждающее сообщение о том, что PHP будет удален из будущих версий macOS — на самом деле, в будущей macOS Monterey PHP [кажется, исчез] (https://mjtsai.com/blog/2021/06/16/macos-12-removes-php/). Вместо использования встроенных версий мы установим Apache и PHP с помощью Homebrew.


Мы рассмотрим, как настроить локальную среду разработки, используя их, и, как обычно, попытаемся охватить «почему» и «что»; помимо простого представления конфигурации, мы рассмотрим назначение каждой директивы и команды.


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


  1. Установка Apache и PHP

  1. Настройка URL-адресов разработки

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

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

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

  1. Работаем

1. Установка


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


Несколько слов о путях: на 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.


Файл /etc/hosts предоставляет удобный способ связать имена хостов с IP-адресами. Обычно, когда мы посещаем такой URL-адрес, как https://www.git-tower.com/, фактический IP-адрес сервера должен быть определен с помощью чего-то, что называется системой доменных имен или сокращенно DNS. Файл /etc/hosts дает нам простой способ переопределить это.


Для целей этой статьи предположим, что мы работаем с проектом под названием «my-project», который мы хотим обслуживать по URL-адресу «my-project.test». Мы добавим эту строку внизу /etc/hosts:


```javascript


127.0.0.1 мой-проект.тест


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


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


Далее давайте приступим к реальной конфигурации Apache. В моем случае основной файл конфигурации Apache расположен в /opt/homebrew/etc/httpd/httpd.conf (опять же, на Mac с процессором Intel это, вероятно, будет /usr/local/etc/httpd /httpd.conf). В этом файле нужно внести несколько изменений:


```javascript


Слушай 8080


Эта строка указывает Apache прослушивать трафик на порту 8080. Для доступа к портам с номерами ниже 1024 требуются привилегии суперпользователя, поэтому прослушивание порта 8080 позволяет пользователям запускать Apache без полномочий root. Однако, поскольку HTTP-трафик по умолчанию идет на порт 80, вместо этого мы хотим прослушивать этот порт:


```javascript


Слушай 80


Скорее всего, вы хотите запустить несколько веб-сайтов на своем компьютере с несколькими именами хостов в /etc/hosts. Однако все они попадают на один и тот же сервер Apache. Чтобы обслуживать несколько сайтов с одного сервера Apache, Apache может просмотреть имя хоста входящего запроса и передать запрос одному из нескольких виртуальных хостов. Поддержка виртуального хоста должна быть включена, удалив # перед строкой ниже, превратив ее из комментария в директиву Apache, которая загружает конфигурацию виртуальных хостов из рассматриваемого файла:


```javascript


Включить /opt/homebrew/etc/httpd/extra/httpd-vhosts.conf


Мы раскомментируем еще одну строку, чтобы загрузить модуль mod_rewrite. Этот модуль используется для перезаписи входящих URL-адресов. Например, многие веб-фреймворки используют его для включения «красивых URL-адресов», позволяя посетителям сайта использовать такие URL-адреса, как /posts/2021/some-post-title/, переводя их в URL-адреса, такие как /index.php?p=697 для задней части. Этот модуль, вероятно, будет полезен, поэтому давайте включим его, удалив # ниже:


```javascript


LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so


Apache поставляется с конфигурацией для сайта по умолчанию с корневым каталогом документа /opt/homebrew/var/www. Мы не будем использовать этот сайт, так как вместо этого мы будем использовать виртуальные хосты. В нынешнем виде все будет работать, но Apache будет выдавать предупреждение при каждом запуске, заявляя, что не может определить имя хоста, которое будет использоваться для этого сайта по умолчанию. Позже мы установим имя хоста для каждого виртуального хоста. Однако, чтобы отключить предупреждающее сообщение, мы раскомментируем директиву ServerName по умолчанию в httpd.conf (или просто введите любое имя хоста, которое вы хотите):


```javascript


Имя сервера www.example.com:8080


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


Мы хотим, чтобы PHP был доступен на нашем сервере. Для этого мы добавим еще одну директиву LoadModule после других, загружая модуль, предоставленный PHP, как ранее установленный через Homebrew (на Mac на базе Intel измените /opt/homebrew на /usr/local ):


```javascript


LoadModule php_module /opt/homebrew/opt/php/lib/httpd/modules/libphp.so


Это загружает модуль PHP. Требуется дополнительная настройка. Давайте добавим дополнительную конфигурацию PHP в отдельный файл в каталоге «extra», как и в случае с конфигурацией виртуальных хостов. Нам нужно включить его явно из основного файла конфигурации, поэтому найдите раздел с директивами Include и добавьте его после последнего:


```javascript


настройки PHP


Включить /opt/homebrew/etc/httpd/extra/httpd-php.conf


Остальная часть нашей конфигурации PHP находится в файле /opt/homebrew/etc/httpd/extra/httpd-php.conf:


```javascript



<Соответствие файлов .php$>


Приложение SetHandler/x-httpd-php




DirectoryIndex index.html index.php




Начнем с проверки доступности модуля PHP, который может показаться излишним, поскольку мы только что добавили его в файл httpd.conf. Однако эти файлы могут редактироваться независимо друг от друга, поэтому давайте последуем соглашению о других файлах в дополнительном каталоге и проверим, доступны ли используемые нами модули. Мы будем искать файлы, оканчивающиеся на .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). Теперь давайте отредактируем его, чтобы фактически настроить виртуальный хост.


```javascript


<Виртуальный хост *:80>


имя_сервера my-project.test


DocumentRoot /путь/к/моему проекту


<Каталог /путь/к/моему проекту>


Требовать все предоставленные


Разрешить переопределить все




Это настраивает виртуальный хост на порту 80. ServerName устанавливает имя хоста для виртуального сайта. Когда мы посещаем my-project.test в браузере, изменение, которое мы сделали в /etc/hosts, гарантирует, что запрос будет отправлен на локальный сервер Apache. Apache найдет виртуальный хост с соответствующим именем хоста и обслужит этот сайт. Директива DocumentRoot указывает место в файловой системе, где находятся обслуживаемые файлы. Обязательно измените этот путь вместе с другим его экземпляром в директиве Directory на фактический путь вашего веб-сайта на вашем компьютере!


Директива Directory связана с разрешениями. В файле httpd.conf есть раздел, который по умолчанию запрещает доступ к любому ресурсу. Доступ ко всему, что должно быть общедоступным, должен быть специально разрешен. Итак, для файлов в корне нашего сайта мы даем всем доступ ко всем ресурсам через директиву Require. Директива AllowOverride определяет, какие директивы могут быть переопределены в файле .htaccess. Файл .htaccess можно использовать для конфигурации каждого каталога — многие CMS используют этот файл вместе с упомянутым ранее модулем mod_rewrite, например, для настройки своих URL-адресов. Здесь мы разрешаем переопределять все директивы.


Пока мы это делаем, мы можем удалить или закомментировать существующие фиктивные виртуальные хосты, существующие в этом файле, иначе Apache будет выдавать некоторые предупреждения при запуске, поскольку корни документов для этих сайтов, вероятно, не существуют.


6. Готово и работает


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


```javascript


Службы sudo brew запускаются httpd


sudo brew services stop httpd выключит сервер и отключит для него автозапуск.


Лично я обычно использую встроенный в Apache «интерфейс управления сервером» для запуска сервера по мере необходимости: «sudo apachectl start» запускает сервер, а «sudo apachectl stop» останавливает его.


Надеемся, что после запуска сервера посещение выбранного вами имени хоста в браузере приведет к правильному обслуживанию вашего сайта!


Вот и все на сегодня! Я надеюсь, что вы нашли это руководство полезным. Конечно, мы рассмотрели только Apache и PHP — есть много дополнений, которые вы можете внести в этот стек, например [сервер базы данных MySQL] (https://www.mysql.com). Если вы заинтересованы в будущей статье, посвященной этому или любому другому аспекту стека хостинга на основе Apache, пожалуйста дайте нам знать!


Также опубликовано [Здесь] (https://www.git-tower.com/blog/apache-on-macos/)



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE