Я не один раз устанавливал под windows всякие WAMP’ы для веб разработки, но надо признать, что лучше все таки разрабатывать сайты, которые в итоге будут запускаться под *nix и апач, на схожей системе, а не windows. Так что когда мне попал в руки Mac, я подумал, эй, да OS X – это же тоже ветка Unix, с веб разработкой должно быть проще, и я угадал.
Если кто не знал, OS X по умолчанию поставляется с веб сервером Apache, его нужно только включить. Зато mysql в поставку не входит, так что есть с чем повозиться, приступим.
Запуск Apache
Если в строке адреса браузере набрать http://localhost/ и попытаться открыть этой сайт, мы получим сообщение об ошибке, изначально Apache не запущен. Чтобы убедиться, что мы хотя бы можем это сделать, нужно открыть консоль Программы/Утилиты/Терминал (Terminal.app)
И набрать команду:
1 |
sudo apachectl start |
У вас запросят пароль рута, после успешной аутентификации, apache запустится, что мы и проверим, снова открыв в браузере http://localhost/
Остановить так же просто:
1 |
sudo apachectl stop |
Перезапустить:
1 |
sudo apachectl restart |
Еще бывает полезно узнать версию установленного Apache
1 |
httpd -v |
В моем случае версия 2.2.24
Активировать PHP
Конфиг апача располагается по пути
1 |
/etc/apache2/httpd.conf |
Главное что нам надо подправить, это включить php, который по умолчанию выключен. Чтобы сделать это необходимо удалить в этом конфиге решетку из строки загрузки модуля php5_module
1 |
#LoadModule php5_module libexec/apache2/libphp5.so |
Редактировать конфиг можно либо вашим любимым текстовым редактором либо из консоли как это сделал я, командой
1 |
sudo nano /etc/apache2/httpd.conf |
После удаления решетки нажмите на клавиатуре:
⌃ + O (Ctrl + O ) – записать изменения в файл
⌤(Enter) подтвердить путь по которому запишется файл
⌃ + X (Ctrl + X ) – выйти из nano
И наберите в консоли уже известную вам команду перезагрузки веб сервера
1 |
sudo apachectl restart |
Все, на данный момент мы можем выполнять PHP скрипты.
Замечательно, но где же должны лежать все файлы сайта?
По умолчанию все располагается по пути:
1 |
/Library/WebServer/Documents |
Для теста создадим в этой папке файл test.php с содержимым
1 2 3 |
<?php phpinfo(); ?> |
И откроем в браузере адрес
1 |
http://localhost/test.php |
Отлично, все работает, но мы же хотим иметь возможность разрабатывать несколько сайтов одновременно, нужны виртуальные хосты.
Virtual Hosts для одновременно разработки нескольких сайтов
Правим конфиг
1 |
/etc/apache2/httpd.conf |
И убираем решетку у Include
1 2 |
# Virtual hosts #Include /private/etc/apache2/extra/httpd-vhosts.conf |
смотрим, что располагается в пресловутом httpd-vhosts.conf
А там записи вида
1 2 3 4 5 6 7 8 |
<VirtualHost *:80> ServerAdmin webmaster@dummy-host.example.com DocumentRoot "/usr/docs/dummy-host.example.com" ServerName dummy-host.example.com ServerAlias www.dummy-host.example.com ErrorLog "/private/var/log/apache2/dummy-host.example.com-error_log" CustomLog "/private/var/log/apache2/dummy-host.example.com-access_log" common </VirtualHost> |
Что же, давайте представим, что нам надо разработать сайт myfaketestsite.com
Все сайты думаю лучше хранить в папке пользователя, чтобы не пришлось каждый раз при правке указывать пароль от root
Создадим папку ~/sites/ и в ней создадим папку myfaketestsite.com
В итоге получится путь
1 |
~/sites/myfaketestsite.com |
Добавляем в httpd-vhosts.conf запись:
1 2 3 4 5 6 7 8 9 10 11 |
<VirtualHost *:80> <Directory /> Allow from all </Directory> ServerAdmin webmaster@myfaketestsite.com DocumentRoot "/Users/<Юзер>/sites/myfaketestsite.com" ServerName myfaketestsite.com ServerAlias www.myfaketestsite.com ErrorLog "/private/var/log/apache2/myfaketestsite.com-error_log" CustomLog "/private/var/log/apache2/myfaketestsite.com-access_log" common </VirtualHost> |
Где /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 с тем же содержимым
1 2 3 |
<?php phpinfo(); ?> |
Рестартуем апач командой
1 |
sudo apachectl restart |
И в браузере открываем адрес http://myfaketestsite.com/new.php и убеждаемся, что все работает.
Права доступа
Сервер Apache запускается с правами пользователя _www, но мы создаем файлы для сайтов из под других пользователей. А права по умолчанию ставятся 644, что означает, что читать могут все, но писать только владелец. Таким образом когда сайту понадобиться изменить конфиг, или закачать файл – у него не будет прав доступа.
Если сайт уже разработан и не будет меняться, можно рекурсивно сменить владельца папки с сайтом на _www командой
1 |
sudo chown -R _www <путь к папке с сайтом> |
Если же идет активная разработка, после смены владельца будет нужно каждый раз вводить пароль владельца или рута для сохранения изменений в файле, что конечно неудобно.
Поэтому нужно исповедовать принцип “все что не разрешено – запрещено”. Если сайту явно нужно будет писать в папку/файл – смените владельца папки на _www как указано выше, либо дайте право на запись
1 |
sudo chmod a+w <путь к папке> |
Если право на запись надо дать временно, не забудьте после выполнения всех запланированных работ убрать право на запись
1 |
sudo chmod go-w <путь к папке> |
Все работает, теперь можно заняться и установкой MySql.
1) Скачиваем последний дистрибутив с официального сайта.
Вместо регистрации не забудьте нажать на мааленькую ссылку внизу No thanks, just start my download.
Иначе прийдется пройти регистрацию с кучей полей, предупреждаю сразу. Oracle, что тут скажешь.
На момент написания статьи актуальной версией MySql была 5.6.15, так что я выбрал на закачку
Mac OS X 10.7 (x86, 64-bit), DMG Archive
2) Устанавливаем
Запускаем скачанный установщик и видим следующее:
1 – собственно инсталлятор MySql
Cоглашаемся со всем предложенным, в конце вводим пароль root
2 – добавляется в системную панель свойств, что позволяет из панели останавливать, запускать сервис
При установке нужно выбрать ставить только ли для текущего пользователя или для всех
После установки в настройках мы можем найти пункт MySql
Откуда можно управлять сервисом MySql
3 – автостарт сервиса при запуске Mac’а
Так же как и в первом пункте, просто соглашаемся со всем что скажет инсталлятор.
3) Попробуем в консоли выполнить команду mysql
Пишет что не может найти. Что ж, надо добавить путь к исполняемым файлам mysql к нам в профиль, можно сделать это вручную – создать/отредактировать файл .bash_profile в домашней папке пользователя, либо просто выполнить эту команду в консоли:
1 |
echo "export PATH=""/usr/local/mysql/bin:\$PATH""" >> ~/.bash_profile |
Вводим команду mysql снова в консоли – вауля:
4) Устанавливаем пароль.
В консоли набираем следующую команду
1 |
/usr/local/mysql/bin/mysqladmin -u root password 'Ваш Пароль' |
После этого чтобы зайти в клиент mysql необходимо в консоли выполнить следующую команду
1 |
mysql -u root -p |
И после запроса ввести выбранный вами пароль от базы данных.
5) Устраняем 2002 MySql socket ошибку.
Суть в том, что Mysql создает socket файл здесь /tmp, а OS X ищет его здесь /var/mysql
Из за этого из Apache нормально не работает mysql, apache не может с ним связаться.
Чтобы обойти эту проблему выполняем следующие команды в консоли
1 2 |
sudo mkdir /var/mysql sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock |
Вот мы и подготовили плацдарм для разработки сайтов под 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 и прописать в нем
1 2 3 |
<?php phpinfo(); ?> |
То при заходу на корень сайта – он уже должен открыться без ошибки
2) Невнимательность. Хоть в статье я и упоминал, – возможно не обратили внимание. ВАЖНО указать в конфиге для каждого добавленного виртуального хоста
1 2 3 |
<Directory /> Allow from all </Directory> |
В созданом с нуля конфиге я прописал так:
1 2 3 4 5 6 7 8 9 10 |
NameVirtualHost *:80 <VirtualHost *:80> <Directory /> Allow from all </Directory> DocumentRoot "/Users/<Имя пользователя>/vhosts/test.com" ServerName test.com ServerAlias test.com </VirtualHost> |
Естественно вместо <Имя пользователя> должен быть прописан ваш логин в системе.
3) Права доступа на папку или отдельный файл. Самая сложная тема, т.к. чтобы выяснить в чем дело – надо понимать как устроены права доступа в unix системах. Я пошел по простейшему пути.
Итак. Пользователь имеет права записи в свою личную папку, в ней и будем создавать папку с сайтами. Папка пользователя имеет путь /Users/<Имя пользователя>/, но если вы не знаете какое <Имя пользователя> не беда. Открываем консоль и по очереди выполняем команды (для создания виртуального хоста test.com, если будет другой хост – поменяйте на нужный)
1 2 3 4 5 6 |
cd ~ mkdir vhosts cd vhosts mkdir test.com cd test.com pwd |
Эти команды создадут папку /Users/<Имя пользователя>/vhosts/test.com, а последняя команда, pwd – выведет на экран путь который и надо будет подставить вместо /Users/<Имя пользователя>/vhosts/test.com
4) Судя по комментарию Максима, дело еще может быть в <VirtualHost *:80>. Помогает прописать вместо * – hostname.
В консоли выполняем команду
1 |
echo $HOSTNAME |
И результат прописываем вместо звездочки.
В моем случае вышло так:
1 |
<VirtualHost iMac-Alexandr.local:80> |
Но по правде сказать – именно после замены звездочки на hostname – начал получать 403.
А вот эти вот варианты – у меня заработали
1 |
<VirtualHost localhost:80> |
и
1 |
<VirtualHost 127.0.0.1:80> |
P.S. Не забываем после любого внесенного изменения в конфигурацию апача – перезагружать его, иначе можно долго воевать с ветряными мельницами
Возвращаем работу localhost
Меня заинтересовало насколько реально вернуть работоспособность localhost после активации виртуальных хостов. Как оказалось – ничего сложного.
Добавляем секцию
1 2 3 4 5 6 7 8 9 10 |
<VirtualHost *:80> <Directory /> Allow from all </Directory> ServerAdmin localhost@localhost.com DocumentRoot "/Users/<Имя пользователя>/sites/localhost" ServerName localhost ErrorLog "/private/var/log/apache2/localhost.my-error_log" CustomLog "/private/var/log/apache2/localhost.my-access_log" common </VirtualHost> |
Т.е. делаем все один в один как и при добавлении реального адреса.
Рестартуем апач, и localhost снова жив.
Добрый день.
Хочу сделать сервер на Mac OS X Server 3,1
Долго, но запустил.
Теперь нужно создать сервер MySql
Скачал поставил, команды выполнил.
А теперь глупый вопрос наверное, как подключится к нему, управлять базами и т.д.
На сколько я понимаю можно через Sequel Pro или свить PhpMyAdmin
День добрый.
На самом деле как подключаться к Mysql серверу – зависит исключительно от привычек и задачи. Если нормально настроен apache – самым простым решением будет установка phpMyAdmin, можно так же каким то внешним софтом.
Но я нередко прибегаю к консоли. Запускаем консоль и пишем
mysql -u < логин> -p
и вводим пароль.
Ну а дальше уже USE < нужная база данных>;
и прочие команды в зависимости от задачи. Минусы консоли – часто проблемы с кодировками, не наглядно, плохо с историей команд.
Плюсы – работает везде, быстро, не нужно ставить ничего дополнительно.
Опыт бывает полезен когда ковыряешься на виртуальной машине без GUI и без установленного phpmyadmin. Т.к. инструменты упрощают нам жизнь, но неплохо уметь обходиться без них.
Добрый день.
С базами данных разобрался, спасибо, работает.
Но тут новая проблема.
Устанавливаю 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
Что делать, куда копать?
Подскажите пожалуйста.
Странно, специально с нуля поставил новый 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/пример-записи/
Все оказалось просто и глупо с моей стороны. Я использую программу Server.app В настройках каждого сайта что создаем нужно в Edit Advanced Settings ставить галочку на Allow overrides using .htaccecces files
И тогда для каждого сайта будет работать свой .htaccecces
Но напрягает следующая ситуация. Это права доступа. Программа Server.app имеет папку /Library/Server/Web/Data/Sites при добавлении нового сайта создает папку для сайта и дается ему пользователь admin а нам нужен _www для нормальной работы сайтов.
Получается нужно каждую новую папку прогонять через терминал и добавлять ей пользователя.
Кстати прогу Server.app они-то сделали и продают, но никто не сказал что для нормальной работы сайтов нужен пользователь _www это долгими часами поисков нашел у вас за что вам спасибо.
Прошу прощения за долгое ожидание, но прочитав ваш комментарий я понял, что для того чтобы разобраться потребуется поднять сервер на виртуалке, чтобы случайно не повредить рабочий 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
Но, повторюсь, делать так стоит лишь в случаях разработки для себя вещей которые никогда не увидят свет на реальном сервере. В ином случае следует сразу привыкать к аккуратному проставлению прав доступа.
Не все но нечто понял.
Еще раз можно четко объясните, какие права и для кого и как нужны для безопасной работы сайтов сети. Очень важно. Несколько сайтов выпустил в сеть, некоторым какой-то “турок” перезаписал index.php чтоб его. Понимаю что какая-то дыра у меня есть.
И второе. Тут ниже человек правильно обратил внимание на http://www. Поскольку я все делаю через саму программу Server app как мне сделать чтоб ко всем папкам сайтов у меня был и поддомен www. а не только http://
Помогите очень важно и срочно.
Спасибо!
В двух предложениях сложно ответить что нужно для безопасной работы, тем более что всегда найдется новый баг который заставит по новому взглянуть на безопасность (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 подправить, если машинка тестовая
Очень помогли, спасибо.
Добавьте только еще примечание, что есть надо синоним www. то надо это указать и в httpd-vhosts.conf как ServerAlias и в hosts отдельной строкой:
127.0.0.1 test.local
127.0.0.1 http://www.test.local
Рад помочь )
И спасибо за дополнение, все таки сложно вспомнить все нюансы, особенно те, которые не нужны или наоборот делаешь на автомате.
Включение Virtual Hosts вырубает Apache
после обратного закоменнтирования строки в
/etc/apache2/httpd.conf
#Include /private/etc/apache2/extra/httpd-vhosts.conf
сервер обратно работает но только localhost(
В чем может быть конфликт ?
Сложно сказать, нужно смотреть логи с ошибками. Явно что то криво в httpd-vhosts.conf
Думал, что у вас будет написано..
в общем, ситуёвина такая:
ошибка “(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”.
Вопрос: что ему не понравилось?