Настройка php, MySQL, nodejs, nginx и mongodb в OS X El Capitan

Недавно вышла OS X El Capitan, давайте обновим систему. Систему будем устанавливать с usb-flash. Из рабочего окружения мы поставим  php, nginx, mariadb, mongodb, elasticsearch, nodejs используя brew и настроем проект на symfony2.

Подготовка к установке Osx

Скачайте систему используя App Store. Сделайте копию всех данных которые посчитаете нужным, я удаляю все что было от прошлой системы и ставлю на пустой диск. Для этого создаю usb-flash командой:

$ sudo /Applications/Install\ OS\ X\ El\ Capitan.app/Contents/Resources/createinstallmedia --volume /Volumes/Untitled --applicationpath /Applications/Install\ OS\ X\ El\ Capitan.app --nointeraction

В данном случае флешка с именем Untitled, должна быть не меньше 8гб и все данные которые на ней находятся будут удалены. После создания носителя перегрузите компьютер удерживая Alt и установите систему следуя инструкциям.

Xcode

Воспользуйтесь встроенным AppStore для установки. После того как установите, примите условия лицензионного соглашение и установите инструменты командной строки. Запустите терминал и выполните команду:

$ xcode-select --install

brew

Установим использую инструкцию на сайте:

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

 Добавим в ~/.bash_profile для того чтобы мы могли использовать команды установленные brew:

$ echo 'export PATH="/usr/local/sbin:$PATH"' >> ~/.bash_profile

Базы данных mariadb, mogodb и elasticsearch

Для elasticsearch необходима java поэтому предварительно установим командой, а затем все необходимые базы данных.

$ brew install Caskroom/cask/java
$ brew install mongodb mariadb elasticsearch

Для того чтобы elasticsearch запускался со стартом системы выполните команду:

$ ln -sfv /usr/local/opt/elasticsearch/*.plist ~/Library/LaunchAgents

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

$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.elasticsearch.plist

или

$ elasticsearch --config=/usr/local/opt/elasticsearch/config/elasticsearch.yml

У меня не так много проектов используют данную систему потому я не добавляю его в автозагрузку, а запускаю только когда он необходим, так же и с mariadb.

Вместо mysql мы будем использовать mariadb, так как на серверах стоит именного эта версия реляционной базы данных. Для запуска при старте системы выполните команду:

$ ln -sfv /usr/local/opt/mariadb/*.plist ~/Library/LaunchAgents

для старта mariadb

$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mariadb.plist

или

$ mysql.server start

После запуска базы данных, ее можно использовать:

$ mysql -uroot

Тут ничего нового, просто mongodb(https://www.mongodb.org) добавляем в загрузку:

$ ln -sfv /usr/local/opt/mongodb/*.plist ~/Library/LaunchAgents

запускаем mongodb командой

$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist

или

$ mongod --config /usr/local/etc/mongod.conf

В данном случае я ее добавляю в автозагрузку.

php и php-fpm

Установка: 

$ brew tap homebrew/php
$ sudo chown -R `whoami`:admin /usr/local/sbin
$ brew install --without-apache --with-fpm --with-mysql php56

Любые дополнения нужно ставить c помощью brew например mongo

$ brew install php56-mongo php56-intl php56-memcached

Чтобы использовать php-cli добавим:

$ echo 'export PATH="$(brew --prefix homebrew/php/php56)/bin:$PATH"' >> ~/.bash_profile

Добавим php-fpm в автозагрузку от root. это необходимо чтобы запускать потоки от пользователя _www для доступа nginx к php.

$ sudo vi /Library/LaunchDaemons/homebrew.mxcl.php56.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>KeepAlive</key>
  <true/>
  <key>Label</key>
  <string>homebrew.mxcl.php56</string>
  <key>ProgramArguments</key>
  <array>
  <string>/usr/local/opt/php56/sbin/php-fpm</string>
  <string>--fpm-config</string>
  <string>/usr/local/etc/php/5.6/php-fpm.conf</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>LaunchOnlyOnce</key>
  <true/>
  <key>UserName</key>
  <string>root</string>
  <key>WorkingDirectory</key>
  <string>/usr/local/var</string>
  <key>StandardErrorPath</key>
  <string>/usr/local/opt/php56/var/log/php-fpm.log</string>
</dict>
</plist>

Запуск php-fpm

$ sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.php56.plist

Остановка php-fpm

$ sudo launchctl unload -w /Library/LaunchDaemons/homebrew.mxcl.php56.plist

Изменим настройки чтобы использовать php-fpm сокет.

$ vim /usr/local/etc/php/5.6/php-fpm.conf
listen = /var/run/php5-fpm.sock;

Настроим дату в php

$ vim /usr/local/etc/php/5.6/php.ini
date.timezone = Europe/Simferopol

nginx

Установка

$ brew install nginx

Добавим в загрузку от пользователя root, это необходимо для того чтобы запустить на 80 порту.

$ sudo cp /usr/local/opt/nginx/homebrew.mxcl.nginx.plist /Library/LaunchDaemons/homebrew.mxcl.nginx.plist

Для настройки php-fpm добавим в настройки:

$ vim /usr/local/etc/nginx/nginx.conf
http {
    #….
    upstream phpfcgi {
        # server 127.0.0.1:9000;
        server unix:/usr/local/var/run/php5-fpm.sock; #PHP-FPM running on UNIX socket 
    }
}

Создадим шаблон для Symfony2 проекта:

$ vim /usr/local/etc/nginx/templates/symfony.conf
listen 80;
rewrite ^/app\.php/?(.*)$ /$1 permanent;
location / {
    index app_dev.php;
    try_files $uri @rewriteapp;
}
location @rewriteapp {
    rewrite ^(.*)$ /app_dev.php/$1 last;
}
location ~ ^/(app|app_dev|config)\.php(/|$) {
    fastcgi_pass phpfcgi;
    fastcgi_split_path_info ^(.+\.php)(/.*)$;
    include fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param  HTTPS off;
}

Добавим Symfony2 проект в папку servers

$ vim /usr/local/etc/nginx/servers/symfony.conf
server {
    server_name symfony.local;
    error_log /usr/local/var/log/nginx/symfony.error.log;
    access_log /usr/local/var/log/nginx/symfony.access.log;
    root /Users/andrey/Sites/symfony/web;
    include templates/symfony.conf;
}

перезагрузим nginx с новыми настройками командой

$ nginx -s reload

composer

Для установки и настройки воспользуемся официальной документацией

$ curl -sS https://getcomposer.org/installer | php
$ mv composer.phar /usr/local/bin/composer

git настройки для пользователя

$ git config --global user.name "andrey1s"
$ git config --global user.email "andrey@4devs.org"

Добавим файлы для игнорирования

$ vim ~/.gitignore_global
# OS generated files #
######################
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
Icon?
ehthumbs.db
Thumbs.db
# Dev #
######################
.idea
$ git config --global core.excludesfile ~/.gitignore_global

Настроим используемые алиасы в git, подробнее можно прочитать в статье настройка алиасов в git

$ git config --global alias.st status
$ git config --global alias.co checkout

symfony2

Для того чтобы использовать структуру папок Symfony3 добавим в bash_profile:

$ echo 'export SENSIOLABS_ENABLE_NEW_DIRECTORY_STRUCTURE=true' >> ~/.bash_profile

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

$ mkdir Sites && cd Sites

Создаем проект:

$ composer create-project symfony/framework-standard-edition symfony/ 2.7.4

на момент написания стсти последняя была версия 2.7.5, но она не поддерживает структуру папок для symfony3, поэтому ставим версию 2.7.4 и обновим его до последней версии.

$ cd symfony && composer update

Не забудем настроить права доступа:

$ mkdir -p var/spool && mkdir -p var/dump && rm -rf var/cache/* && rm -rf var/logs/* && rm -rf var/spool/* && rm -rf var/dump/*
$ HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1` 
$ sudo chmod +a "$HTTPDUSER allow delete,write,append,file_inherit,directory_inherit" var/cache var/logs var/spool var/dump
$ sudo chmod +a "`whoami` allow delete,write,append,file_inherit,directory_inherit" var/cache var/logs var/spool var/dump

Добавляем наш проект в hosts

$ sudo vim /etc/hosts
127.0.0.1       symfony.local

nodejs 

Добавим nodejs, npm и дополнительные пакеты bower, uglify-js, uglifycss, jpegoptim используемые в проектах.

$ brew install node
$ npm install -g bower 
$ npm install -g uglify-js
$ npm install -g uglifycss
$ npm install -g less
$ brew install jpegoptim

Заключение

Используя brew можно легко настроить рабочее окружение. Если вы хотите собрать php из исходников, можете прочитать в статье, поскольку не всегда самая последняя версия в менеджере пакетов. Если использовать brew то можно поставить несколько версий php, к примеру на данный момент доступна версия php 7.0. Можно даже для разных проектов запускать свои версии php, но командная строка по умолчанию будет всегда одна.

Читайте также:

Docker установка и настройка

При разработке используется множество технологий. К примеру данный блог использует php(Symfony 2), mongodb, elastic, nginx это основные но также используется nodejs к примеру для минификации css, js. При разработке приходится настраивать все технологии как показано в статье. Но что делать если проектов несколько или они используют разные технологии, например другой проект использует MySQL, или еще могут использовать разные версии php или других библиотек. Для разработки и поддержки проектов на разных технологиях можно использовать Виртуальную машину и поставить на нее к примеру centos, но это не совсем удобно, надо все равно настраивать подобное окружение как на сервере и на других машинах разработчиков. Мы будет использовать контейнеры, такие как Docker. Настроем блог разработчиков чтобы использовать Docker для разработки.

Nginx: HTTP/2 не работает

Настройка HTTP/2 в Nginx может показаться тривиальной задачей, однако есть ряд потенциальных проблем, с которыми вы можете столкнуться. В данной статье я опишу несколько из тех, с которыми столкнулся лично я при настройке наших серверов.

Как настроить HTTP/2 с Varnish используя Nginx

Все больше и больше компаний начинают использовать HTTP/2 для повышения производительности своих сайтов. Настроить HTTP/2 довольно просто, но что делать, если в вашей инфраструктуре есть Varnish. Т.к. Varnish 4.* не поддерживает SSL, то нам прийдется найти способ заставить все необходимые компоненты работать друг с другом.

Как использовать произвольное хранилище пользователей в FOSUserBundle

Практически все используют FOSUserBundle в своих Symfony проектах т.к. он ускоряет разработку и обладает хорошим набором функциональности для управления пользователями. Бандл предоставляет несколько готовых реализаций хранилищ данных: Propel и несколько для Doctrine (ORM и ODM). Это здорово, но иногда возникает необходимость работы с другими хранилищами данных. FOSUserBundle достаточно гибок и позволяет реализовать, и использовать произвольное хранилище. Для того, чтобы использовать все возможности FOSUserBundle Вам достаточно будет написать свой менеджер пользователей под конкретного провайдера.

Интеграция Paysera в Symfony

Сегодня сложно представить себе серьезный проект, где не понадобилась бы интеграция с платежными системами. Не смотря на то что существует множество популярных систем и аггрегаторов, таких как PayPal, RBKMoney, Paymentwall, Robokassa и т.д., я хочу рассказать о Paysera. Это еще одна, довольно новая платежная система. Они позиционируют себя как выгодных с точки зрения комиссий за их услуги. Paysera позволяет вашим пользователям расплачиваться карточками, SMS и т.д. Интеграция довольно простая, однако имеет некоторые неочевидные моменты, которые я и хочу осветить.