Установка и настройка Apache + Mysql на OS X 10.9 Mavericks

Я не один раз устанавливал под windows всякие WAMP’ы для веб разработки, но надо признать, что лучше все таки разрабатывать сайты, которые в итоге будут запускаться под *nix и апач, на схожей системе, а не windows. Так что когда мне попал в руки Mac, я подумал, эй, да OS X  — это же тоже ветка Unix, с веб разработкой должно быть проще, и я угадал.

Если кто не знал, OS X по умолчанию поставляется с веб сервером Apache, его нужно только включить. Зато mysql в поставку не входит, так что есть с чем повозиться, приступим.

Запуск Apache

Если в строке адреса браузере набрать http://localhost/ и попытаться открыть этой сайт, мы получим сообщение об ошибке, изначально Apache не запущен. Чтобы убедиться, что мы хотя бы можем это сделать, нужно открыть консоль Программы/Утилиты/Терминал (Terminal.app)

И набрать команду:

У вас запросят пароль рута, после успешной аутентификации, apache запустится, что мы и проверим, снова открыв в браузере http://localhost/works

Остановить так же просто:

Перезапустить:

Еще бывает полезно узнать версию установленного Apache

В моем случае версия 2.2.24

Активировать PHP

Конфиг апача располагается по пути

Главное что нам надо подправить, это включить php, который по умолчанию выключен. Чтобы сделать это необходимо удалить в этом конфиге решетку из строки загрузки модуля php5_module

httpd config

Редактировать конфиг можно либо вашим любимым текстовым редактором либо из консоли как это сделал я, командой

После удаления решетки нажмите на клавиатуре:
⌃ + O (Ctrl + O ) — записать изменения в файл
⌤(Enter) подтвердить путь по которому запишется файл
⌃ + X (Ctrl + X ) — выйти из nano

И наберите в консоли уже известную вам команду перезагрузки веб сервера

Все, на данный момент мы можем выполнять PHP скрипты.
Замечательно, но где же должны лежать все файлы сайта?
По умолчанию все располагается по пути:

Для теста создадим в этой папке файл test.php с содержимым

И откроем в браузере адрес

phpinfo
Отлично, все работает, но мы же хотим иметь возможность разрабатывать несколько сайтов одновременно, нужны виртуальные хосты.

Virtual Hosts для одновременно разработки нескольких сайтов

Правим конфиг

И убираем решетку у Include

смотрим, что располагается в пресловутом httpd-vhosts.conf
А там записи вида

Что же, давайте представим, что нам надо разработать сайт myfaketestsite.com
Все сайты думаю лучше хранить в папке пользователя, чтобы не пришлось каждый раз при правке указывать пароль от root
Создадим папку ~/sites/ и в ней создадим папку myfaketestsite.com
В итоге получится путь

Добавляем в httpd-vhosts.conf запись:

Где /Users/<Юзер>/sites/myfaketestsite.com — путь к файлам сайта.
Allow from all добавили, чтобы не было ошибки 403

Так же потребуется в файл /private/etc/hosts добавить строку
127.0.0.1 myfaketestsite.com
(спасибо smallll за дополнение, если нужно обращаться по www. то нужно добавить еще одну строку в hosts:
127.0.0.1 www.myfaketestsite.com)
Ну и создадим к примеру в папке ~/sites/myfaketestsite.com файл new.php с тем же содержимым

Рестартуем апач командой

И в браузере открываем адрес http://myfaketestsite.com/new.php и убеждаемся, что все работает.

Права доступа

Сервер Apache запускается с правами пользователя _www, но мы создаем файлы для сайтов из под других пользователей. А права по умолчанию ставятся 644, что означает, что читать могут все, но писать только владелец. Таким образом когда сайту понадобиться изменить конфиг, или закачать файл — у него не будет прав доступа.
Если сайт уже разработан и не будет меняться, можно рекурсивно сменить владельца папки с сайтом на _www командой

Если же идет активная разработка, после смены владельца будет нужно каждый раз вводить пароль владельца или рута для сохранения изменений в файле, что конечно неудобно.
Поэтому нужно исповедовать принцип «все что не разрешено — запрещено». Если сайту явно нужно будет писать в папку/файл — смените владельца папки на _www как указано выше, либо дайте право на запись

Если право на запись надо дать временно, не забудьте после выполнения всех запланированных работ убрать право на запись

Все работает, теперь можно заняться и установкой MySql.

1) Скачиваем последний дистрибутив с официального сайта.
Вместо регистрации не забудьте нажать на мааленькую ссылку внизу No thanks, just start my download.
Иначе прийдется пройти регистрацию с кучей полей, предупреждаю сразу. Oracle, что тут скажешь.
На момент написания статьи актуальной версией MySql была 5.6.15, так что я выбрал на закачку
Mac OS X 10.7 (x86, 64-bit), DMG Archive

2) Устанавливаем
Запускаем скачанный установщик и видим следующее:
package

1 — собственно инсталлятор MySql
Cоглашаемся со всем предложенным, в конце вводим пароль root
2 — добавляется в системную панель свойств, что позволяет из панели останавливать, запускать сервис
pref Pane
При установке нужно выбрать ставить только ли для текущего пользователя или для всех

После установки в настройках мы можем найти пункт MySql
all prefs

Откуда можно управлять сервисом MySql

mysql panel
3 — автостарт сервиса при запуске Mac’а
Так же как и в первом пункте, просто соглашаемся со всем что скажет инсталлятор.

3) Попробуем в консоли выполнить команду mysql
Пишет что не может найти. Что ж, надо добавить путь к исполняемым файлам mysql к нам в профиль, можно сделать это вручную — создать/отредактировать файл .bash_profile в домашней папке пользователя, либо просто выполнить эту команду в консоли:

Вводим команду mysql снова в консоли — вауля:
mysql console

4) Устанавливаем пароль.

В консоли набираем следующую команду

После этого чтобы зайти в клиент mysql необходимо в консоли выполнить следующую команду

И после запроса ввести выбранный вами пароль от базы данных.

5) Устраняем 2002 MySql socket ошибку.
Суть в том, что Mysql создает socket файл здесь /tmp, а OS X ищет его здесь /var/mysql
Из за этого из Apache нормально не работает mysql, apache не может с ним связаться.

Чтобы обойти эту проблему выполняем следующие команды в консоли

Вот мы и подготовили плацдарм для разработки сайтов под OS X Mavericks.

Возвращаясь к проблеме 403

Судя по коментариям, у некоторых возникли проблемы с ошибкой 403 после включения виртуальных хостов. Я решил проверить, что могло послужить причиной. На расстоянии тяжело ванговать, поэтому я решил просто повторить процесс с нуля.
Итак. На уже настроенном апаче я открыл localhost — действительно 403, но это не проблема, т.к. localhost мной и не настраивался. Это я к тому, что если после включения вирутальных хостов перестал работать localhost — это не означает, что не будут работать виртуальные хосты.
Вновь закомментировав строчку Include /private/etc/apache2/extra/httpd-vhosts.conf в httpd.conf и перезагрузив апач командой sudo apachectl restart Я получил вновь работающий localhost, но естественно настроенные виртуальных хосты работать перестали. Я забекапил файлик httpd-vhosts.conf и удалил его, чтоб с нуля написать. После исследования могу сказать что 403 ошибка может возникнуть скорее всего в 3х случаях.
1) Самый простой — вы создали виртуальный хост, создали под него папку, все правильно прописали, но никаких файлов php или html внутрь папки не положили. В итоге при обращении к вашему хосту (допустим http://test.com) apache пытается найти index.html или index.php — не находит и выдает 403. Если внутрь папки хоста положить к примеру файл index.php и прописать в нем

То при заходу на корень сайта — он уже должен открыться без ошибки
2) Невнимательность. Хоть в статье я и упоминал, — возможно не обратили внимание. ВАЖНО указать в конфиге для каждого добавленного виртуального хоста

В созданом с нуля конфиге я прописал так:

Естественно вместо <Имя пользователя> должен быть прописан ваш логин в системе.

3) Права доступа на папку или отдельный файл. Самая сложная тема, т.к. чтобы выяснить в чем дело — надо понимать как устроены права доступа в unix системах. Я пошел по простейшему пути.
Итак. Пользователь имеет права записи в свою личную папку, в ней и будем создавать папку с сайтами. Папка пользователя имеет путь /Users/<Имя пользователя>/, но если вы не знаете какое <Имя пользователя> не беда. Открываем консоль и по очереди выполняем команды (для создания виртуального хоста test.com, если будет другой хост — поменяйте на нужный)

Эти команды создадут папку /Users/<Имя пользователя>/vhosts/test.com, а последняя команда, pwd — выведет на экран путь который и надо будет подставить вместо /Users/<Имя пользователя>/vhosts/test.com

4) Судя по комментарию Максима, дело еще может быть в <VirtualHost *:80>. Помогает прописать вместо * — hostname.
В консоли выполняем команду

И результат прописываем вместо звездочки.
В моем случае вышло так:

Но по правде сказать — именно после замены звездочки на hostname — начал получать 403.
А вот эти вот варианты — у меня заработали

и

P.S. Не забываем после любого внесенного изменения в конфигурацию апача — перезагружать его, иначе можно долго воевать с ветряными мельницами

Возвращаем работу localhost

Меня заинтересовало насколько реально вернуть работоспособность localhost после активации виртуальных хостов. Как оказалось — ничего сложного.
Добавляем секцию

Т.е. делаем все один в один как и при добавлении реального адреса.
Рестартуем апач, и localhost снова жив.

13 thoughts on “Установка и настройка Apache + Mysql на OS X 10.9 Mavericks

  1. Lyaer

    Добрый день.
    Хочу сделать сервер на Mac OS X Server 3,1
    Долго, но запустил.
    Теперь нужно создать сервер MySql
    Скачал поставил, команды выполнил.
    А теперь глупый вопрос наверное, как подключится к нему, управлять базами и т.д.
    На сколько я понимаю можно через Sequel Pro или свить PhpMyAdmin

    1. Администратор Автор записи

      День добрый.
      На самом деле как подключаться к Mysql серверу — зависит исключительно от привычек и задачи. Если нормально настроен apache — самым простым решением будет установка phpMyAdmin, можно так же каким то внешним софтом.

      Но я нередко прибегаю к консоли. Запускаем консоль и пишем
      mysql -u < логин> -p
      и вводим пароль.
      Ну а дальше уже USE < нужная база данных>;
      и прочие команды в зависимости от задачи. Минусы консоли — часто проблемы с кодировками, не наглядно, плохо с историей команд.
      Плюсы — работает везде, быстро, не нужно ставить ничего дополнительно.
      Опыт бывает полезен когда ковыряешься на виртуальной машине без GUI и без установленного phpmyadmin. Т.к. инструменты упрощают нам жизнь, но неплохо уметь обходиться без них.

  2. lyaer

    Добрый день.
    С базами данных разобрался, спасибо, работает.

    Но тут новая проблема.

    Устанавливаю wordpress, работает. Включаю в нем %postname% и получаю 404 not found.
    .htaccess c кодом:

    # BEGIN WordPress

    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ — [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]

    # END WordPress

    Module mod_rewrite вроде как установлен, показал phpinfo

    Что делать, куда копать?
    Подскажите пожалуйста.

    1. Администратор Автор записи

      Странно, специально с нуля поставил новый wordpress. Установил (даже не дал прав на запись, так что вручную заполнил и wp-config.php по тому что мне предложил вордпресс и .htaccess)

      Код в .htaccess у меня следующий:


      RewriteEngine On
      RewriteBase /
      RewriteRule ^index\.php$ — [L]
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule . /index.php [L]

      И все прекрасно открывается, причем линки содержат кириллицу типа
      http://wptest.com/пример-записи/

      1. Lyaer

        Все оказалось просто и глупо с моей стороны. Я использую программу Server.app В настройках каждого сайта что создаем нужно в Edit Advanced Settings ставить галочку на Allow overrides using .htaccecces files
        И тогда для каждого сайта будет работать свой .htaccecces

        Но напрягает следующая ситуация. Это права доступа. Программа Server.app имеет папку /Library/Server/Web/Data/Sites при добавлении нового сайта создает папку для сайта и дается ему пользователь admin а нам нужен _www для нормальной работы сайтов.
        Получается нужно каждую новую папку прогонять через терминал и добавлять ей пользователя.
        Кстати прогу Server.app они-то сделали и продают, но никто не сказал что для нормальной работы сайтов нужен пользователь _www это долгими часами поисков нашел у вас за что вам спасибо.

        1. Администратор Автор записи

          Прошу прощения за долгое ожидание, но прочитав ваш комментарий я понял, что для того чтобы разобраться потребуется поднять сервер на виртуалке, чтобы случайно не повредить рабочий Mac, а времени на это катастрофически не хватало.
          В общем по ситуации: действительно Server.app при создании сайта — дает права root/admin для папки с сайтом. Я надеялся что если изменить владельца для папки Sites — это в будущем изменит и владельцов новых папок созданных внутри нее сервером, но не прошло, по прежнему root/admin. Я не буду говорить, что обходного пути нет, но потратив полчаса я сходу найти решения не смог.

          Но нужно так же понимать зачем так было сделано — для безопасности. Все таки Server означает что вы планируете на базе MacOS поднять реальный сервер на котором будут реальные сайты, и безопасность должна быть во главе угла. Всем созданным сайтам даются permission 755, что означает что читать могут все (включая apache), но писать может только root или любой из админов. Таким образом злоумышленник нашедший дырку в безопасности не сможет переписать файлы сервера (если apache поднят конечно из под _www, а не из под рута, но за такое надо отлучать от администрирования навечно).
          Да, это геморой, согласен, но по хорошему если разрабатывать что то по работе следует заранее думать о безопасности. А если так, для себя поиграться, то после создания нового сайта и закидывания в него сорцов того же вордпресса или любого другого движка — всегда можно рекурсивно всем файлам и вложенным папкам сменить владельца

          sudo chown -R _www test.com

          или права доступа

          sudo chmod -R 777 test.com

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

          1. Lyaer

            Не все но нечто понял.

            Еще раз можно четко объясните, какие права и для кого и как нужны для безопасной работы сайтов сети. Очень важно. Несколько сайтов выпустил в сеть, некоторым какой-то «турок» перезаписал index.php чтоб его. Понимаю что какая-то дыра у меня есть.

            И второе. Тут ниже человек правильно обратил внимание на http://www. Поскольку я все делаю через саму программу Server app как мне сделать чтоб ко всем папкам сайтов у меня был и поддомен www. а не только http://

            Помогите очень важно и срочно.
            Спасибо!

          2. Администратор Автор записи

            В двух предложениях сложно ответить что нужно для безопасной работы, тем более что всегда найдется новый баг который заставит по новому взглянуть на безопасность (heartbleed, shellshock из последних). Базово нужно полагать следующее:
            — Apache (да в принципе любой веб сервер, nginx например) нужно запускать от отдельного пользователя, а не root (чтобы если уж злоумышленник получил доступ к шеллу — натворить делов смог только в папке сайта, а не по всей системе)
            — на папки ставить права доступа 755, на файлы 644, это дает право на чтение всем, а на запись — только владельцу (пользователю из под которого запущен веб сервер), это ограничит от записи на другими пользователями на shared хостингах
            — стоит понимать вышесказанное, что это по прежнему позволит в случае уязвимого скрипта перезаписывать файлы с правом 644. Ведь скрипт выполняется от имени владельца apache и все файлы внутри папки сервера имеют того же владельца. Все как всегда, система имеет прочность равную прочности самого слабого звена. Поэтому если Вы уверены что что то не должно перезаписываться вообще, ставьте 444 на эти файлы, чтобы даже сам apache и скрипты не могли поменять содержимое к примеру index.php. (если конечно из php нельзя вызвать chmod и поменять право доступа к любому файлу). Не стоит забывать что нередко тупо угоняют ftp, и тогда все права доступа вообще не важны. Или ломают провайдера и по тихой обрабатывают сайты клиентов. Вариантов тьма.
            Безопасность — это комплекс мер, не поможет поставить бронированную дверь с забором если не поставили крышу.
            Я не считаю себя гуру в веб программировании и тем более безопасности, но моих знаний достаточно чтобы понять, что одних заградительных мер недостаточно. Всегда буду находиться новые дыры, нужно помимо защиты планировать отходные пути — к примеру грамотно поместить сайт в git или любую другую систему контроля версий, и настроить ежедневный забор изменений. Это позволит в случае появлении заразы увидеть где она поселилась, и определить временные рамки. Делать бекап логов, чтобы было что посомтреть для изучения точки входа заразы. Но повторюсь, серебряной пули нет нигде, в безопасности в том числе. Я постарался лишь задать Вам векторы для изучения.

            По поводу Server App, в данный момент к маку практически не подхожу, много работы на PC к сожалению. Но я попробовал поискать ответ на Ваш вопрос и увидел, что люди все делают вручную. Через Server Admin tools настраивают DNS (полноценный а не редирект), и через server app добавляют еще один сайт уже с www, но путь ему указывают тот же что и был указан для сайта без www. По мне так быстрее в hosts подправить, если машинка тестовая

  3. smallll

    Очень помогли, спасибо.

    Добавьте только еще примечание, что есть надо синоним www. то надо это указать и в httpd-vhosts.conf как ServerAlias и в hosts отдельной строкой:
    127.0.0.1 test.local
    127.0.0.1 http://www.test.local

    1. Администратор Автор записи

      Рад помочь )
      И спасибо за дополнение, все таки сложно вспомнить все нюансы, особенно те, которые не нужны или наоборот делаешь на автомате.

  4. macspace

    Включение Virtual Hosts вырубает Apache
    после обратного закоменнтирования строки в
    /etc/apache2/httpd.conf
    #Include /private/etc/apache2/extra/httpd-vhosts.conf
    сервер обратно работает но только localhost(

    В чем может быть конфликт ?

  5. Артем

    Думал, что у вас будет написано..
    в общем, ситуёвина такая:
    ошибка «(include_path=’:.’) in Unknown on line 0»
    смотрю, а include_path у меня нигде не прописан, ну тогда я его прописываю в httpd.conf
    а именно пишу путь к папке сайта. в общем, это не помогло. тогда вопрос у меня встал: а к кому путь он просит? какой должен быть тогда там путь?

    Ну и второй вопрос: обновил php до 7.1 (7.2 не пошла вообще), в итоге apachectl -t выдал мне: «AH01574: module php7_module is already loaded, skipping».
    Вопрос: что ему не понравилось?

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *