Как настроить веб-сервер Apache в MacOS Sierra 10.12

Эта статья является переводом статьи How to Set up Apache in macOS Sierra 10.12, и я размещаю ее здесь в первую очередь для себя, так как часто приходится к ней прибегать для настройки/перенастройки Apache в Sierra. Возможно, кому-то этот русскоязычный перевод облегчит понимание, и я буду рад что смог чем-то помочь.

macOS Sierra поставляется с веб-сервером Apache версии 2.4.23. Настройка Apache будет состоять из трех этапов:

  1. Начальная настройка. Мы настроим веб сервер таким образом, что статические (.html) файлы сайта размещенные в папке Sites (внутри вашей домашней папки) будут доступны к просмотру браузером по адресу http://localhost/~username/, где username — это ваше короткое имя пользователя, например admin или andrey.
  2. Настройка виртуальных хостов. На этом этапе мы отредактируем Virtual Hosts и /etc/hosts, чтобы наши сайты были доступны по удобному адресу типа foo.localhost вместо указывания длинного пути с иерархией папок.
  3. И на последнем этапе мы включим PHP модуль, что позволит размещать в папке Sites не только статические, но и скриптовые (.php) файлы, которые сервер будет соответствующим образом обрабатывать и отдавать в браузер результат их работы.

0. Terminal, без которого никуда

Веб-разработчики знают, как незаменим порой может быть Терминал для быстрого и эффективного выполнения ряда задач. Однако для неподготовленного пользователя Терминал может показаться слишком сложным и недружелюбным, поэтому в этом руководстве мы вкратце рассмотрим основные приемы работы с Терминалом, чтобы вы чувствовали себя с ним более уверенно.

Прежде чем вы переключитесь в Терминал и начнете выполнять команды, несколько предостерегающих моментов. Некоторые команды, которые мы используем в настоящем руководстве, используют префикс sudo, который позволяет повысить привилегии текущего пользователя до уровня «root» или «superuser». Однако помните, что расширенные возможности влекут за собой повышенную ответственность. Поэтому будьте особенно внимательными, когда используете sudo, убедитесь что не перепутали путь к файлу и что вы не пытаетесь отредактировать файл, который не подлежит изменению.

Терминал находится по адресу:

Applications -> Utilities -> Terminal.app

Запустите его. Приглашение командной строки будет иметь следующий вид:

andrew-service:~ andrey$

Сначала будет указано имя компьютера, потом :~ потом ваше короткое имя пользователя и знак $ в конце.

1.1. Создаем папку Sites и папки для проектов

Папка Sites будет выступать в роли Document Root для Apache, и в то же время удобно располагаться в вашей домашней папке, обеспечивая беспрепятственный доступ к своему содержимому. Отметим, что папка Sites уже была предустановлена во всех ранних системах Mac OS X и исчезла в OS X 10.7 Lion. Равно как и галочка “web sharing” в System Preferences -> Sharing, которая позволяла запускать/останавливать Apache. Видимо в Apple посчитали, что среднестатистическому пользователю это не нужно, а кому нужно, разберется и без графического интерфейса. Но как только вы создадите папку Sites, сразу станет понятно что Finder ожидает ее возрождения и у него уже есть заготовленная иконка для этой папки с логотипом Safari.

После создания папки Sites мы создадим две папки внутри для отдельных вебсайтов — Foo и Bar.

Создать папку можно с помощью Finder, но мы сделаем это через Terminal, из учебных соображений. Для создания директорий есть команда mkdir (сокращение от make directory). После mkdir должен быть указан путь в файловой системе к создаваемой папке. Символом тильда (~) обозначается ваш домашний каталог (это сокращение принято во всех Unix системах). Таким образом, следующая команда позволит создать папку Sites внутри вашей домашней директории:

$ mkdir ~/Sites

Как узнать что команда сработала и папка создалась? Выполните:

$ ls ~

Команда ls (сокращенно от list), показывает содержимое указанной директории, в данном случае она покажет содержимое нашей домашней директории так как в качестве пути стоит тильда ~.

Папка Sites теперь будет показываться среди другого содержимого домашней папки.

Теперь создадим две папки для сайтов внутри Sites. Используем для этого mkdir:

$ mkdir ~/Sites/foo
$ mkdir ~/Sites/bar

С помощью ls убедитесь что папки созданы:

$ ls ~/Sites

1.2. Создадим простой HTML файл

Можно, конечно, создать simple-text файл в TextEdit, и наполнить его HTML кодом, но мы по-прежнему будем использовать Терминал. Создавать файл удобно командой touch. Она либо создает новый пустой файл либо меняет дату изменения на текущую на указанном файле либо директории. Это удобно запомнить, так как touch == потрогать.

$ touch ~/Sites/foo/index.html

После выполнения этой команды проверьте папку foo — в ней должен находиться index.html.

От пустого index.html толку мало, нужно наполнить его HTML разметкой, и для этого мы воспользуемся редактором nano:

$ nano ~/Sites/foo/index.html

Откроется текстовый редактор прямо в окне Терминала. Внизу будут перечислены команды-подсказки. Символ ^ стоящий перед буквой означает что чтобы выполнить эту команду, нужно нажать клавишу Ctrl и соответствующую букву.

Добавьте следующие строки в файл ~/Sites/foo/index.html:

<!doctype html>
<html>
<head>
<title>Hello, World! | Foo</title>
</head>
<body>
<h1>Hello, World!</h1>
<p>Welcome to <strong>Foo</strong>.</p>
</body>
</html>

Закройте и сохраните файл используя клавишное сочетание Ctrl+X (выйти) потом Y (да, сохранить) и Enter.

Теперь подобный файл нужно положить еще и в папку Bar. Но вместо того, чтобы повторять описанные выше действия, мы отработаем новый навык — копирование. Для копирования существует команда cp. Скопировать index.html из foo в bar поможет такая конструкция:

$ cp ~/Sites/foo/index.html ~/Sites/bar/index.html

А теперь откройте свежескопированный файл в nano:

$ nano ~/Sites/bar/index.html

Измените его содержимое, чтобы оно выглядело примерно так:

<!doctype html>
<html>
<head>
<title>Hello, World! | Bar</title>
</head>
<body>
<h1>Hello, World!</h1>
<p>Welcome to <strong>Bar</strong>.</p>
</body>
</html>

Теперь, когда у нас есть две папки с тестовыми файлами, можно переключиться на настройку Apache.

1.3. Настраиваем Apache

1.3.1. Конфигурационный файл Apache

Первым делом создадим новый конфигурационный файл, который будет указывать вебсерверу Apache где находятся файлы сайта, которые нужно обслуживать. Конфигурационный файл должен состоять из вашего имени пользователя на данном компьютере и расширения ‘.conf’. Например, у меня этот файл называется andrey.conf. Еще не знаете как узнать свое имя пользователя? Выполните в Терминале команду:

$ whoami

Теперь нам нужно переместиться в директорию /etc/apache2/users и создать там .conf-файл. Apache будет его искать именно там. Переместитесь в эту папку командой cd:

$ cd /etc/apache2/users

Здесь вы создадите файл username.conf, где username — это ваше имя пользователя. Для того чтобы создать файл по этому пути, потребуется использовать префикс sudo, поскольку эта часть файловой системы относится к системным файлам, и по умолчанию, пользователю не разрешается вносить в них изменения. Можете в этот раз не использовать touch, а просто указать после вызова текстового редактора nano имя нового файла:

$ sudo nano username.conf

Еще раз проверьте что вместо username вы подставили свое реальное имя пользователя!

Откроется новый пустой текстовый файл в редакторе nano, в который нужно добавить следующее содержимое:

<Directory "/Users/username/Sites/">
AllowOverride All
Options Indexes MultiViews FollowSymLinks
Require all granted
</Directory>

И снова замените username на ваше имя пользователя. Закройте Ctrl+X редактор, укажите сохранить (Y) документ, и нажмите Enter для подтверждения.

Теперь подкорректируем права доступа, чтобы Apache мог прочитать этот новосозданный файл. Для изменения прав доступа воспользуйтесь командой:

$ sudo chmod 644 username.conf

опять-таки, измените username на реальный. Не особо углубляясь в детали структуры прав доступа в Unix системах, вам нужно понимать, что три цифры ‘6’ ‘4’ ‘4’ указывают уровень доступа для Владельца (Owner) Группы (Group) и Прочих (Other). Цифра 6 для владельца указывает что владелец может читать и писать (read/write), 4 и 4 соответственно указывают, что группа и прочие могут лишь читать (read).

Теперь, когда конфиг-файл создан, и у него установлены корректные права доступа, включим ключевые модули вебсервера Apache.

1.3.2. Включаем модули в httpd.conf

На следующем шаге нам нужно переместиться назад или вверх на один уровень, в папку /etc/apache2. Сейчас, вы наиболее вероятно находитесь в /etc/apache2/users (если не переходили никуда с прошлого шага). Чтобы переместиться на уровень вверх (перейти в родительскую папку), используйте команду cd и две точки вместо указания имени папки:

$ cd ..

Перешли? Проверьте, что вы находитесь в правильном месте командой pwd (сокращение от print working directory):

$ pwd

Команда должна показать: /etc/apache2.

В папке /etc/apache2 первым делом следует создать резервную копию существующего httpd.conf файла. Используем уже знакомую для копирования команду cp:

$ sudo cp httpd.conf httpd.conf.bak

Этой командой мы скопируем httpd.conf в новый файл с именем httpd.conf.bak. Резервная копия никогда не помешает, на случай если мы захотим вернуть все как было, или хотя-бы посмотреть синтаксис оригинального файла.

Теперь, когда есть резервная копия, внесем необходимые правки в httpd.conf. Откроем его с помощью nano:

$ sudo nano httpd.conf

В этом файле мы включим несколько модулей. ‘Включить’ означает раскомментировать строку с названием модуля. Комментарии в данном файле представляют собой такие значки: #

Так как файл httpd.conf не маленький, найти в нем что-то может оказаться затруднительно. Поэтому можете использовать поиск, доступный по сочетанию клавиш Ctrl+W. В результате, следующие модули/строки должны быть раскомментированы:

LoadModule authz_host_module libexec/apache2/mod_authz_host.so
LoadModule authz_core_module libexec/apache2/mod_authz_core.so
LoadModule userdir_module libexec/apache2/mod_userdir.so
LoadModule vhost_alias_module libexec/apache2/mod_vhost_alias.so

Include /private/etc/apache2/extra/httpd-userdir.conf
Include /private/etc/apache2/extra/httpd-vhosts.conf

Когда уберете # и таким образом, активируете перечисленные выше модули, сохраните и закройте httpd.conf.

1.3.3. Редактируем httpd-userdir.conf

После того как мы обновили файл httpd.conf, нужно внести изменения в httpd-userdir.conf, который находится в папке extra:

$ cd /etc/apache2/extra

Как и в предыдущем случае, обязательно создадим резервную копию файла перед изменением:

$ sudo cp httpd-userdir.conf httpd-userdir.conf.bak

Теперь используя уже знакомый нам тектовый редактор nano, поработаем с httpd-userdir.conf:

$ sudo nano httpd-userdir.conf

Раскомментируйте указанную ниже строку, удалив # перед ней:

Include /private/etc/apache2/users/*.conf

1.3.4. Перезагрузка Apache

Внеся указанные выше изменения в:

/etc/apache2/users/username.conf
/etc/apache2/httpd.conf
/etc/apache2/extra/httpd-userdir.conf

нужно перезагрузить Apache, чтобы изменения вступили в силу. Выполните для перезагрузки Apache команду:

sudo apachectl restart

После перезапуска Apache можно проверить результат с помощью браузера (Safari, Firefox, или что вы там используете).

1.3.5. Просмотр локальных веб-сайтов

Перейдите по адресу http://localhost/~username, только не забудьте поменять username на свое имя пользователя. Если все настроено верно, вы увидите содержимое папки Sites, среди которого будут созданные нами ранее ~/Sites/foo и ~/Sites/bar. Если щелкнуть на foo или bar, откроется заготовленная нами веб-страница которая выводит Hello World. Apache видит наличие html-файла по умолчанию, а именно index.html и при переходе в папку автоматически загружает index.html.

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

2. Настройка виртуальных хостов — опционально

Если вам приходится работать над несколькими проектами одновременно, или вы по каким-то другим причинам не хотите добираться до своих локальных сайтов, указывая несколько вложенных папок в строке адреса, типа http://localhost/~username/foo или http://localhost/~username/bar, можно настроить локальные доменные имена для каждого проекта. В таком случае сайт, размещенный в ~/Sites/foo будет доступен по адресу foo.localhost, а сайт из папки ~/Sites/bar будет доступен соответственно по bar.localhost. Так удобнее, правда?

Использование виртуальных хостов позволяет описать несколько блоков VirtualHost, в каждом из которых будут указаны переменные ServerName — имя сервера/адрес сайта и DocumentRoot — путь к файлам сайта в файловой системе. Таким образом, Apache будет знать, что если пользователь зашел по адресу ServerName (напр. foo.localhost), то показать ему сайт из папки DocumentRoot (напр. /Users/john/Sites/foo).

Обратите внимание: используя VirtualHosts, нам придется отказаться от индексированного представления на localhost, и нужно будет отредактировать hosts файл вашего Mac, добавив в него уникальные имена хостов для каждого проекта.

Следуя хорошей традиции, создайте бекап файла описывающего виртуальные хосты — httpd-vhosts.conf. Этот файл располагается по адресу /etc/apache2/extra, и его копию мы сделаем уже знакомой нам командой cp:

$ sudo cp httpd-vhosts.conf httpd-vhosts.conf.bak

Теперь отредактируйте httpd-vhosts.conf, добавив блоки ‘VirtualHost’ для каждого из сайтов, в нашем случае — для foo.localhost и bar.localhost. Редактируем, как обычно, редактором nano:

$ sudo nano httpd-vhosts.conf

В результате у вас должен получиться файл httpd-vhosts.conf следующего содержания:

#Virtual Host Entry for foo.localhost
<VirtualHost *:80>
DocumentRoot "/Users/andrey/Sites/foo"
ServerName foo.localhost
ErrorLog "/private/var/log/apache2/foo-error_log"
CustomLog "/private/var/log/apache2/foo-access_log" common 
</VirtualHost>

#Virtual Host Entry for bar.localhost
<VirtualHost *:80>
DocumentRoot "/Users/john/Sites/bar"
ServerName bar.localhost
ErrorLog "/private/var/log/apache2/bar-error_log"
CustomLog "/private/var/log/apache2/bar-access_log" common 
</VirtualHost>

Сохраните и закройте httpd-vhost.conf. Теперь нам необходимо внести изменения в файл /etc/hosts, добавив туда доменные имена foo.localhost и bar.localhost. Файл /etc/hosts очень важный. Он существует в любой операционной системе (путь может отличаться) и представляет собой локальный DNS. Именно его в первую очередь проверит браузер, чтобы узнать, не указан ли для запрашиваемого URL IP адрес. Если не указан — обратится к внешнему DNS, который указан в настройках сети.

Будьте внимательны редактируя файл hosts. Добавьте ваши записи в низ файла и не изменяйте первых три строчки!

Откройте файл /etc/hosts с помощью nano:

$ sudo nano /etc/hosts

Если вы ранее не вносили никаких правок в этот файл, он должен выглядеть так:

##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost

Добавьте в него свои локальные доменные имена, и файл будет выглядеть примерно так:

##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost

#Local sites
127.0.0.1 foo.localhost
127.0.0.1 bar.localhost

Сохраните и закройте /etc/hosts.

Прежде чем мы сможем проверить что мы понастраивали, нужно перезапустить Apache:

sudo apachectl restart

После перезапуска Apache, заходим на foo.localhost и bar.localhost веб-браузером, оба сайта должны выдавать соответствующий index.html.

3.0. Включаем модуль PHP — опционально

Модуль PHP встроен в веб-сервер Apache на macOS Sierra, и чтобы его использовать, достаточно его просто включить. Если вы — PHP разработчик, то наверняка захотите активировать PHP на своем Mac. Обратите внимание, что macOS Sierra поставляется с PHP версии 5.6.3. И в этом руководстве мы просто активируем этот модуль. Если вам нужны новые возможности и улучшенная производительность PHP 7.2, придется обновить версию PHP на вашем Mac, но эта тема выходит за пределы этой статьи, поэтому, мы еще рассмотрим этот вопрос отдельно.

Обратимся еще раз к файлу httpd.conf:

$ sudo nano /etc/apache2/httpd.conf

Найдите и раскомментируйте в этом файле строку:

LoadModule php5_module libexec/apache2/libphp5.so

Теперь (если перезапустить Apache), сервер сможет обрабатывать файлы с расширением .php. Apache будет передавать такой файл на обработку интерпретатору PHP, потом получать результат и отдавать его в ответ на HTTP запрос.

3.1. Интерпретация PHP кода внутри HTML файлов

Часто бывает ситуация, когда мы имеем дело не с чистыми .php файлами, а php код располагается в виде вставок в .html файлах. И он тоже должен быть как-то обработан. Чтобы реализовать это, внесем изменения в httpd-vhosts.conf:

$ sudo nano /etc/apache2/extra/httpd-vhosts.conf

Добавьте следующий блок кода в самый верх файла:

<FilesMatch ".+\.html$">
SetHandler application/x-httpd-php
</FilesMatch>

Теперь httpd-vhosts.conf будет выглядеть примерно так:

#Enable PHP interpretation within HTML files
<FilesMatch ".+\.html$">
SetHandler application/x-httpd-php
</FilesMatch>

#Virtual Host Entry for foo.localhost
<VirtualHost *:80>
DocumentRoot "/Users/john/Sites/foo"
ServerName foo.localhost
ErrorLog "/private/var/log/apache2/foo-error_log"
CustomLog "/private/var/log/apache2/foo-access_log" common 
</VirtualHost>

#Virtual Host Entry for bar.localhost
<VirtualHost *:80>
DocumentRoot "/Users/john/Sites/bar"
ServerName bar.localhost
ErrorLog "/private/var/log/apache2/bar-error_log"
CustomLog "/private/var/log/apache2/bar-access_log" common 
</VirtualHost>

И после всех этих изменений перезапустим Apache:

sudo apachectl restart

3.2. Проверка работы PHP модуля

А теперь проверим, все ли у нас корректно работает. Для начала создадим обычный .php файл:

$ nano ~/Sites/foo/example.php

Поместите в него php-код следующего содержания или любой другой php-код:

<?php
$greeting = 'Hello, PHP World!';
echo '<h1>' . $greeting . '</h1>';
?>

Сохраните и закройте. Теперь, при обращении по адресу foo.localhost/example.php, браузер должен отобразить надпись «Hello, PHP World!» в стиле соответствующем тегу H1.

Также желательно протестировать как будет интерпретироваться PHP код, вставленный в HTML документ. Открываем на редактирование index.html:

$ nano ~/Sites/foo/index.html

Добавим несколько строк PHP кода в самое начало файла, этот код будет задавать переменную $day, присваивая ей текущее значение дня недели. И потом в теле HTML документа мы выведем значение переменной $day:

<?php
date_default_timezone_set('UTC');
$day = date('l');
?>
<!doctype html>
<html>
<head>
<title>Hello, World! | Foo</title>
</head>
<body>
<h1>Hello, World!</h1>
<p>Welcome to <strong>Foo</strong>.</p>
<p>Today is <?php echo $day; ?>.</p>
</body>
</html>

Когда вы обратитесь браузером по адресу foo.localhost, вы должны увидеть какой сейчас день недели с учетом часового пояса.

На этом настройка Apache завершена, и ваш компьютер теперь представляет собой практически полноценный веб-сервер.

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

Конечно, немаловажный вопрос о версии PHP. К сожалению, в Sierra используется уже немного подустаревший и в плане функционала и в плане производительности PHP 5.6.3. В High Sierra, насколько мне известно уже предустанавливается PHP 7.1. В любом случае, обновление до 7.2 крайне желательно, но эту тему мы рассмотрим уже в другой статье.

Оставьте первый комментарий

Оставить комментарий