Установка и настройка Apache, PHP и MySQL на Mac OS X с помощью MacPorts, установка модулей PHP

Ранее я уже писал про настройку рабочего окружения на Mac OS X, также упоминал про систему управления пакетами MacPorts. Изначально я хотел использовать встроенные средства Mac OS X и установку необходимого ПО для разработку из бинарников, но в этом подходе обнаружились свои недостатки:

  • сложное обновление компонентов
  • сложная установка необходимых модулей для PHP
  • сложная установка дополнительных библиотек

Не менее сложно установить дополнительные модули и для сборки MAMP.

В процессе работы оказалось удобнее воспользоваться MacPorts.

Если в системе ранее установлены Apache и MySQL, необходимо остановить все запущенные процессы с Apache и MySQL, отключить автозапуск MySQL и удалить файл /etc/my.cnf. В остальном все должно пройти гладко.

Предварительно необходимо установить Xcode (идет в комплекте с инсталяционным диском Mac OS X) и MacPorts (можно скачать с официального сайта). Установка пакетов через MacPorts потребует времени, поэтому необходимо запастись терпением и стабильным интернетом.

1. Устанавливаем Apache.

Переходим в командную строку и вводим команду:

$ sudo port install apache2

Установка проходит в автоматическом режиме и займет некоторое время.

После установки запускаем Apache:

$ sudo port load apache2

Проверяем работоспособность Apache, для этого переходим по адресу http://localhost/ и видим сообщение "It works!".

Команды Apache:

$ sudo /opt/local/apache2/bin/apachectl -k restart - перезапуск Apache
$ sudo port load apache2 - запуск Apache
$ sudo port unload apache2 - остановка Apache

Конфигурацией Apache займемся позже.

2. Установка MySQL.

$ sudo port install mysql5-server

По завершении устанавливаем БД:

$ sudo -u mysql mysql_install_db5
$ sudo chown -R mysql:mysql /opt/local/var/db/mysql5/
$ sudo chown -R mysql:mysql /opt/local/var/run/mysql5/
$ sudo chown -R mysql:mysql /opt/local/var/log/mysql5/

Запускаем сервер MySQL:

$ sudo port load mysql5-server

Задаем пароль пользователя root:

$ mysqladmin5 -u root -p password ваш_пароль

Будет предложено ввести пароль, скорее всего у вас он не задан, поэтому просто нажимаем Return (Enter).

Входим на сервер:

$ mysql5 -u root -p

Видим приглашение MySQL, теперь можно работать с БД.

Выходим:

mysql> exit;

3. Устанавливаем PHP.

$ sudo port install php5 +apache2
$ sudo port install php5-mysql

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

Регистрируем модуль PHP:

$ cd /opt/local/apache2/modules
$ sudo /opt/local/apache2/bin/apxs -a -e -n "php5" libphp5.so

Подключить модуль PHP можно и вручную. Ищем в файле конфигурации строки, в которых подключаются дополнительные модули и добавляем строку:

LoadModule php5_module modules/libphp5.so

Открываем файл конфигурации Apache:

$ sudo nano /opt/local/apache2/conf/httpd.conf

Ищем строку с DirectoryIndex и добавляем index.php:

<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

Подключаем пользовательские хосты, для этого в конце файла (где расположены директивы Include) добавляем строки:

# Include user configurations
Include /private/etc/apache2/users/*.conf

Все пользовательские хосты будут находится здесь:

/private/etc/apache2/users/имя_пользователя.conf

Настройкой виртуальных хостов займемся позже.

В конце файла конфигурации httpd.conf добавляем строки (для конфигурации AddType):

# Include PHP configurations
Include conf/extra/mod_php.conf

Сохраняем файл конфигурации httpd.conf и выходим из режима редактирования.

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

Установим конфигурационный файл PHP:

$ cd /opt/local/etc/php5
$ sudo cp php.ini-development php.ini

Открываем файл конфигурации php.ini:

$ sudo nano /opt/local/etc/php5/php.ini

Зададим часовой пояс, для этого ищем в файле строку date.timezone и добавляем свой часовой пояс, также необходимо раскомментировать строку (убрать точку с запятой ";"):

date.timezone = Europe/Moscow

Установим MySQL соккет, для этого ищем последовательно строки pdo_mysql.default_socket, mysql.default_socket, mysqli.default_socket и для каждой указываем соккет по умолчанию:

pdo_mysql.default_socket = /opt/local/var/run/mysql5/mysqld.sock
mysql.default_socket = /opt/local/var/run/mysql5/mysqld.sock
mysqli.default_socket = /opt/local/var/run/mysql5/mysqld.sock

Сохраняем файл конфигурации php.ini и выходим из режима редактирования.

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

Настройка виртуальных хостов достаточно простая, но объяснить в двух строчках не получится.

Открываем файл с пользовательскими настройками виртуальных хостов:

$ sudo nano /private/etc/apache2/users/имя_пользователя.conf

Добавляем базовую конфигурацию, не забываем поменять имя_пользователя на текущее имя пользователя в системе.

NameVirtualHost *:80

<VirtualHost *:80>
    ServerName "localhost"
    DocumentRoot "/Users/имя_пользователя/Sites"
    <Directory "/Users/имя_пользователя/Sites">
        Allow From All
        AllowOverride All
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin webmaster@example
    DocumentRoot "/Users/имя_пользователя/Sites/example"
    ServerName example
    <Directory "/Users/имя_пользователя/Sites/example">
        AllowOverride All
        Allow from all
    </Directory>
</VirtualHost>

Сохраняем изменения и выходим из режима редактирования.

http://localhost/ - запускает срипты из папки /Users/имя_пользователя/Sites/
http://example/ - запускает срипты из папки /Users/имя_пользователя/Sites/example/

Открываем файл с исключениями:

$ sudo nano /etc/hosts

Добавим http://example/ в исключения, для этого необходимо в файле добавить следующую строку:

127.0.0.1 example

Сохраняем изменения и выходим из режима редактирования. По аналогии можно создавать неограниченное кол-во виртуальных хостов.

Создадим директорию example в папке Сайты:

$ mkdir ~/Sites/example

Создадим тестовый скрипт для http://example/, который проверит соединение с MySQL:

$ touch ~/Sites/example/index.php

Откроем файл index.php:

$ nano ~/Sites/example/index.php

Добавим следующии строки:

<?php
$db = mysql_connect('localhost', 'root', 'ваш_пароль');
if (!$db) {
    die('Could not connect to MySQL: ' . mysql_error());
}
echo 'Connected successfully';
mysql_close($db);
?>

Сохраняем и выходим.

Создадим тестовый скрипт для http://localhost/:

$ touch ~/Sites/index.php

Откроем файл index.php:

$ nano ~/Sites/index.php

Добавим следующую строку:

<?php phpinfo(); ?>

Сохраняем и выходим.

Перезапускаем Apache:

$ sudo /opt/local/apache2/bin/apachectl -k restart

Проверяем рабоспособность сервера, для этого переходим по ссылкам http://localhost/ и http://example/. Если все настроено корректно, то первый покажет информацию о PHP, второй сообщение "Connected successfully".

Для работы с БД рекомендую использовать Sequel Pro, поэтому установку phpMyAdmin не рассматриваю.

7. Установка дополнительных модулей PHP (опционально, в зависимости от требуемой конфигурации).

Поиск портов выполняется командой:

$ port search имя_порта

Установка mcrypt:

$ sudo port install php5-mcrypt

Установка библиотеки ImageMagick и модуля PHP imagick:

$ sudo port install ImageMagick
$ sudo port install php5-imagick

Установка библиотеки GD:

$ sudo port install php5-gd

Установка модуля APC:

$ sudo port install php5-apc

Установка модуля SOAP:

$ sudo port install php5-soap

Установка Xdebug:

$ sudo port install php5-xdebug

Перезапускаем Apache:

$ sudo /opt/local/apache2/bin/apachectl -k restart

Рабочее окружение готово к работе, все установленные компоненты хранятся в папке /opt/local/.

Комментарии (32):

  1. Makc

    25 марта 2011 в 14:00  #

    mySQL ставится какой?
    64 бит?

    И если потом установлю с сайта mySQL, это не помешает? одинаковые версии? какой будет работать?

  2. makegood

    25 марта 2011 в 14:14  #

    Все тестировалось на 64-битной системе, если поставить MySQL из коробки, то должно все нормально работать, потребуется прописать правильные соккеты в PHP или создать символьные ссылки.

    Работать будет тот сервер, который запущен, остановка сервера MySQL, установленного из MacPorts, осуществляется командой:

    sudo port unload mysql5-server

  3. Makc

    25 марта 2011 в 15:03  #

    И у меня еще проблема!
    когда я вбиваю в сафари: http://example/
    то у меня скачивается файл с кодом, а не пишет «Connected successfully», ПОЧЕМУ?

    http://localhost/ — всё ок!

  4. makegood

    25 марта 2011 в 15:11  #

    Попробуй, переместить скрипт из папки example в папку, на которую ссылается localhost, если заработает, то проблема в настройке виртуальных хостов.

  5. Makc

    25 марта 2011 в 16:17  #

    если я прохожу так: http://example/ – то пишет: ‘Warning: mysql_connect() [function.mysql-connect]: [2002] No such file or directory (trying to connect via unix:///var/mysql/mysql.sock) in /Users/iSkyNets/Sites/example/index.php on line 2

    Warning: mysql_connect() [function.mysql-connect]: No such file or directory in /Users/iSkyNets/Sites/example/index.php on line 2
    Could not connect to MySQL: No such file or directory’

    а если я к этому файлу пробираюсь так: «http://localhost/example/» или «http://localhost/example/index.php»
    то пишет — ‘Connected successfully’ !!! )))

    1)в чём проблема?
    2) если база данных не наэтом компе, то что мне писать вместо localhost? — IP адрес?

  6. makegood

    25 марта 2011 в 20:10  #

    Останови сервер MySQL и поставь через MacPorts, предварительно удали файл /etc/my.cnf. Если по прежнему работать не будет — проблема в виртуальных хостах. На второй вопрос точно ответить не смогу, т.к. все зависит от конфигурации и, скорее всего, потребуется настроить SSH.

  7. Makc

    26 марта 2011 в 01:00  #

    я и ставил с портов…. но почему-то перестал работать (((
    но при переустановке, всё заработало :)

    почему у меня слетело соединение с локальной ДБ?

  8. CrossX

    28 марта 2011 в 18:00  #

    Огромное спасибо автору за статью! Доходчиво и понятно.
    Выполнял поэтапно и все работает!

    З.Ы. И за наводочку на Sequel Pro — отдельное спасибо!

  9. Makc

    29 марта 2011 в 11:52  #

    отписываюсь!
    у меня снова возникла эта проблема, не могу подключиться к mysql.

    запустить не получается… незнаю в чём проблема, но решается перезагрузкой мака.

  10. Dolby

    29 марта 2011 в 14:33  #

    Хорошее описание — спасибо!

  11. makegood

    29 марта 2011 в 15:00  #

    Макс, если установка MySQL выполняется из портов и сделано все правильно, то работать будет, если ранее устанавливался сервер MySQL из бинарника, то необходимо удалить файл /etc/my.cnf и остановить сервер. Все остальное делается по инструкции и должно работать.

    Мне кажется, что после перезагрузки у тебя запускается сервер из коробки.

  12. Makc

    30 марта 2011 в 15:27  #

    я удалял /etc/my.cnf
    перед установкой из портов.

  13. Mikhail

    16 мая 2011 в 20:28  #

    Делал все по инструкции. Трижды.
    Результат:

    clause (see docs)
    May 16 20:26:23 MacBook-Pro-Mikhail-Seliverstov com.apple.launchd[1] (org.apache.httpd[6378]): Exited with exit code: 1
    May 16 20:26:23 MacBook-Pro-Mikhail-Seliverstov com.apple.launchd[1] (org.apache.httpd): Throttling respawn: Will start in 10 seconds
    May 16 20:26:33 MacBook-Pro-Mikhail-Seliverstov org.apache.httpd[6379]: Syntax error on line 33 of /private/etc/apache2/extra/httpd-vhosts.conf:
    May 16 20:26:33 MacBook-Pro-Mikhail-Seliverstov org.apache.httpd[6379]: CustomLog takes two or three arguments, a file name, a custom log format string or format name, and an optional «env=» clause (see docs)

    Что не так?

  14. makegood

    16 мая 2011 в 21:45  #

    Ошибка в виртуальных хостах, файл у вас указан, строка тоже.

  15. Makc

    24 июня 2011 в 12:20  #

    вопрос: где хранятся таблицы БД MySQL?
    Я хочу стереть старые таблицы не через интерфейс…

    + как мне синхронизировать 2 и более БД?

  16. андрей

    2 ноября 2011 в 13:34  #

    Отличный гайд! Все работает ))

  17. kc

    8 февраля 2012 в 03:13  #

    sudo vim /opt/local/etc/mysql5/my.cnf

    [mysql_safe] socket = /opt/local/var/run/mysql5/mysqld.sock

    source: http://2tbsp.com/content/install_and_configure_mysql_5_macports

  18. Алексей

    27 февраля 2012 в 19:55  #

    Почему-то не работает PDO
    PDO
    PDO support enabled
    PDO drivers no value — это из phpinfo

    А это при попытке обращения:
    Fatal error: Uncaught exception ‘PDOException’ with message ‘could not find driver’

  19. makegood

    27 февраля 2012 в 20:15  #

    Алексей, возможно, не выполнили команду sudo port install php5-mysql, либо ошибка в php.ini. С вашей проблемой не сталкивался.

  20. Алексей

    27 февраля 2012 в 20:21  #

    Простите, пропустил sudo port install php5-mysql — все заработало. Удалите, пожалуйста оба.

  21. Владимир

    1 апреля 2012 в 21:16  #

    Вечер добрый, а кто нибудь с LDAP дело имел?

  22. Владимир

    23 декабря 2012 в 09:49  #

    Хорошая статья, делал все по порядку, все получилось … но только в конце самом нужно перегазрузить компьютер, потому что без перезагрузки компа, но перезагрузки апачи, в браузере в мне предлогалось скачать файлы php. Перезагрузил комп, все заработало. Спасибо.

  23. Юрий

    14 февраля 2013 в 17:38  #

    Спасибо большое, самый нормальный How-to в сети.

  24. Юрий

    1 апреля 2013 в 10:21  #

    Спасибо за подробный гайд :) Все работает, как надо!

  25. serj

    25 мая 2013 в 03:57  #

    почему то не срабатывает вирт. сервер
    то есть чтобы выполнить скрипт присоединения к базе мне нужно переходить по адресу http://example/example/
    а на http://example/ у меня скрипт что запускает phpinfo т.е. example = localhost

  26. Кирилл

    8 июля 2013 в 14:29  #

    Добрый день! Замечательный гайд, все получилось) Но.

    $ sudo apachectl -k restart
    httpd: Syntax error on line 119 of /private/etc/apache2/httpd.conf: Cannot load /opt/local/apache2/modules/libphp5.so into server: dlopen(/opt/local/apache2/modules/libphp5.so, 10): Library not loaded: /opt/local/lib/libaprutil-1.0.dylib\n Referenced from: /opt/local/apache2/modules/libphp5.so\n Reason: Incompatible library version: libphp5.so requires version 6.0.0 or later, but libaprutil-1.0.dylib provides version 4.0.0

    получил такую вот бяку. Как поправить? Не подскажете?
    Заранее спасибо!

  27. K

    8 февраля 2014 в 02:01  #

    То же самое подробнее https://trac.macports.org/wiki/howto/MAMP

  28. Виктор

    20 марта 2014 в 19:01  #

    Здравствуйте! Спасибо за очень подробное описание!

    Столкнулся с проблемой. При открытии файлов .php браузером по ссылке localhost/…php просто открывает код. Помогите пожалуйста с решением.

  29. Станислав

    8 апреля 2014 в 01:06  #

    Ребят, подскажите, мучаюсь уже второй день:

    не работает http://localhost ; сначала мурыжил встроенный сервер, сейчас по инструкции поставил через макпортс, эффект тот же

    еще до этого стоял xamp и mamp может они как то повлияли?

    hosts чистил, брендмауер отключен

    где копать?

  30. Станислав

    8 апреля 2014 в 01:34  #

    Все, решил проблему удалив apache встроенный в систему))

  31. Frozen

    8 мая 2014 в 15:32  #

    За статью спасибо, а как изменгить версию PHP не подскажите?

  32. Chupacabra

    7 апреля 2016 в 22:05  #

    При установке PHP в качестве модуля настройки из php.ini читаются один раз при запуске Web-сервера. Поэтому при внесении изменений в php.ini необходимо перегрузить Apache для того, чтобы внесенные изменения вступили в силу.