За последние 24 часа нас посетили 20597 программистов и 1010 роботов. Сейчас ищут 370 программистов ...

HowTo: VirtualBox + CentOS 7 (php-fpm + nginx) установка руками по шагам и с картинками

Тема в разделе "Настройка веб-сервера", создана пользователем igordata, 24 июн 2016.

  1. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Я не такой уж прям спец, но вот как я это делаю.
    Установка PHP на виртуалочку почти ничем не отличается от установки PHP на не-виртуалку.

    Где взять
    VirtualBox
    https://www.virtualbox.org/wiki/Downloads
    Скачать нужно саму программу и пакет дополнений к ней VirtualBox Extension Pack -- это такой софт, который пихается в виртуалку в виде CD-диска. Его нужно запустить, он перекомпилирует ядро операционной системы с той целью, чтобы можно было прокидывать в виртуалку, которая называется гость, всякое из внешнего компа, который называется хост. Т.е. после накатки этого пака можно прокинуть порты USB с хоста в гостя, и соответственно, пользоваться на виртуалке USB-устройствами, если это необходимо.

    Ещё можно станет расшарить папки так, чтобы они были видны на госте и на хосте, и моментально синхронизировались. И даже можно сделать так, чтобы с гостя можно было вытаскивать отдельные окошки в хоста и там с ними работать, как с обычными программами.

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

    CentOS
    https://www.centos.org/download/
    Скачать можно торрент-файл, чтобы быстрее скачать торрентом, не напрягая серверы сообщества.

    Установка VirtualBox
    Скачали - установите. Во время установки могут быть обрывы связи. Виртуалбокс ставит свою виртуальную сетевушку, чтобы прокидывать трафик в виртуалки. После установки нужно скачать и запустить VirtualBox Extension Pack. Он поставится как плагин и будет жить в самой программе.

    Создание виртуалки

    Поначалу список виртуалок пуст.
    upload_2016-6-23_21-12-48.png

    Тыкаете "New", открывается диалог, где нужно новую виртуалку как-нибудь назвать. Называете "CentOS" и замечаете, что виртуалбокс сам предлагает подходящие тип и версию.

    upload_2016-6-23_21-22-30.png

    На следующем экране ставите памяти, сколько не жалко. Можно 512 мегабайт, лучше 2048.
    Потом вам предлагается создать виртуальный жесткий диск.
    upload_2016-6-23_21-24-45.png
    Потом нужно выбрать тип. Выбираем родной и тыкаем дальше:
    upload_2016-6-23_21-25-37.png

    Динамический от фиксированного отличается тем, что динамический пухнет по мере работы гостевой оси, пухнет, но не уменьшается никогда. И да, он никогда не станет больше выбранного размера. А фиксированный сразу большой. Так что выбирайте динамический - пусть пухнет по чуть чуть.

    upload_2016-6-23_21-32-17.png

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

    upload_2016-6-23_21-35-2.png

    После этого система создана.

    upload_2016-6-23_21-35-34.png

    Но надо ещё поковырять настройки.

    upload_2016-6-23_21-36-40.png

    Процессоров надо поставить столько, сколько у вас ядер, а возможности жрать CPU предлагаю зарезать до 95%, т.к. иначе хост будет тормозить при большой загрузке гостя. Если что-то пойдёт не так, то будет сложно даже выключить гостя, т.к. мышка может еле ползать в таких случаях.

    Настройка сети виртуалки
    Сеть по-дефолту выглядит так:
    upload_2016-6-23_21-40-51.png

    Через этот NAT виртуалка может выходить в интернет так, будто бы подключена через роутер к вашей домашней сети. Но не через ваш роутер, а через виртуальный. Она будет жить в своей виртуальной локалке, снаружи будет не видна.

    Для удобства и чтобы избежать гемороя с пробросом портов, можно сделать так, будто бы виртуалка подключена напрямую в вашу локалку.
    upload_2016-6-23_21-44-37.png

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

    Но для работы с веб-сервером может быть удобнее и безопаснее добавить ещё один тип адаптера, который работает только на связь с хостом. Он так и называется host-only.


    --- Добавлено ---
    upload_2016-6-23_21-47-49.png
    --- Добавлено ---
    Host-only даёт адрес вида 192.168.56.101 для гостя, и 192.168.56.100 для хоста. Весьма удобно.
    --- Добавлено ---
    Для удобства будущей работы стоит прокинуть папку из хоста в гостя.
    upload_2016-6-23_21-50-47.png

    Тыкайте справа в папку с плюсиком, добавляйте
    --- Добавлено ---
    Сверху путь, снизу название. Через название расшареную папку можно подцепить в нужном месте системы.
    upload_2016-6-23_21-58-48.png

    (картинки огромные...)

    Авто-маунтом я пользоваться не научился, так что забил и сделал иначе. Расскажу потом.

    Первый запуск
    Запускаете виртуалку, грузиться ей не с чего, так что это пока дохлый компик такой. Нужно выбрать тот образ операционной системы, который вы скачали.
    upload_2016-6-23_22-2-16.png

    Я скачал так называемый net install. Это когда в самом образе почти ничего нет, всё будет качаться по необходимости.
    Выбираете диск, перезагружаете машину.
    upload_2016-6-23_22-3-58.png
    --- Добавлено ---
    Чего такие картинки огромные я не знаю. Они в два раза шире и в два раза выше, чем у меня на экране исходные изображения.
     
    Noobasishe, Aerofreak, mahmuzar и 2 другим нравится это.
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Важно: Захват мышки и клавиатуры
    Вы можете неожиданно для себя лишиться мышки. Не пугайтесь. Она попала в зазеркалье виртуалки. Чтобы высвободить её нужно нажать Host Key. Обычно это правый ctrl. После накатки VirtualBox Extension Pack мышка сможет кликать в окно виртуалки не боясь попасть в мышеловку. Но пока так.

    Установка CentOS 7
    Данный раздел не связан с виртуалкой. Эти шаги одинаковы для любого способа установки центоси.

    upload_2016-6-23_22-13-55.png
    Английский, учите английский. Тыкайте дальше.

    Далее нужно выбрать, откуда качать, если надо качать, и куда ставить.
    upload_2016-6-23_22-18-20.png

    Но сначала нужно включить сеть, и не забудьте включить её автовключение. :D А не то в первую загрузку можете остаться без сети, и придётся включать её руками или начинать с начала. Настройки сети видны чуть ниже. Вон черная палочка торчит, прокрутите.

    upload_2016-6-23_22-22-37.png

    Тут у каждого подключения нужно протыкать справа On, и обязательно включить автоматическое подключение в настройках!
    upload_2016-6-23_22-24-49.png

    Сохраняйте и тыкайте Done в верхнем левом углу.

    Теперь источники. Откуда качать. Если надо.
    Яндекс хостит много линуксов, я указываю его зеркало. Т.к. на текущий момент версия центоси 7.2, то я укажу этот путь: http://mirror.yandex.ru/centos/7.2.1511/os/x86_64/
    upload_2016-6-23_22-30-54.png
    Done.

    Следующий этап - указать, куда ставить ось. Мне кажется, что в XXI веке можно делать это всё автоматически, но вот нет.
    Выбираем единственный диск, тыкаем Done. У меня не с первого раза прокатило, видна надпись красным "No disks selected". Пр'осто выбираем диск ещё раз, и снова тыкаем Done. Должно прокатить. Если прокатило, будет написано "Automatic partitioning selected".
    upload_2016-6-23_22-36-41.png






    --- Добавлено ---
    гайд для слепых, походу.
     
    Noobasishe, Aerofreak, mahmuzar и 2 другим нравится это.
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Далее надо выбрать комплектацию. Я оставляю minimal.
    upload_2016-6-23_23-2-25.png
    Тыкайте Done, когда определитесь.

    Ещё я отключаю KDUMP.

    Включайте установку. Пока ставится система можно установить и пароль на пользователя root. =)

    Когда установка завершится, можно будет нажать на кнопочку "Reboot"справа внизу, и виртуалка перезагрузится.
     
    #3 igordata, 24 июн 2016
    Последнее редактирование: 24 июн 2016
    Noobasishe, Aerofreak, mahmuzar и 2 другим нравится это.
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Установка сервера
    При загрузке, если всё хорошо, вы попадаете куда-то на такой экран:
    upload_2016-6-23_23-39-56.png

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

    Специальные программы чтобы подключаться
    mRemoteNG
    Скачать: http://www.mremoteng.org/download
    Это чтобы команды вводить

    WinSCP
    Скачать: https://winscp.net
    Это чтобы файликами орудовать

     

    Вложения:

    #4 igordata, 24 июн 2016
    Последнее редактирование: 24 июн 2016
    Noobasishe, Aerofreak, mahmuzar и 2 другим нравится это.
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Устанавливаете и запускаете mRemoteNG, создаете новое подключение
    upload_2016-6-24_11-3-45.png

    Заполняете настройки подключения, не забывая сменить протокол на SSH 2, а то по умолчанию тут удалённый рабочий стол.

    upload_2016-6-24_11-14-42.png

    Если виртуалка запущена, то подключаетесь, соглашаетесь сохранить сертификат


    upload_2016-6-24_11-13-2.png

    И видите консоль

    upload_2016-6-24_11-17-7.png


    Если вы уже подключались, то будет писать дату последнего успешного входа.


    Важно: Пара команд
    ls - покажет список файлов в текущей директории
    cd - перейти в другую папку

    Yum
    Для установки программ в CentOS используется yum.
    yum search - искать
    yum install - ставить
    yum install -y - ставить и не спрашивать подтверждения
    Первым делом пишем yum install mc и далее соглашаемся со всяким. Получаем привычный нортон. Чтобы посмотреть, что за синими панелями в консоли, когда в ней есть некий текст, который мы не успели прочесть - нажмите ctrl+O. Обратно так же.
    Внизу кнопочки для рутинных операций. Они привязаны к F1-F10 кнопкам клавиатуры. Т.е. заглянуть внутрь файла будет F3, редактировать его F4.

    upload_2016-6-24_11-26-42.png

    Через yum будут установлены и другие компоненты вашего сервера, если вы не маньяк, который ставит всё из исходов.

    Вставлять текст в mRemoteNG окошечко можно мышкой - правой кнопкой вставлять команды, если вы редактируете что-то в mc, то может понадобиться нажать шифт в этот момент. Левой кнопкой выделять. Разберётесь, вобщем.

    Репозитории
    Т.к. CentOS вся из себя стабильная околокорпоративная, то в её родных репах нет новых версий ничего, и вообще только жутко стабильные, проверенные годами пакеты софта. Нужно на свой страх и риск добавить другие репозитории, чтобы идти в ногу со временем. Это просто.

    Epel
    Епель можно доставить из родных реп, как это ни забавно.
    Код (Text):
    1. yum install -y epel-release
    это установит репозитории епеля.

    Remi
    Реми репа содержит в себе всякое более-менее стабильное новьё. В основном из неё и ставимся.
    Чтобы поставить реми репу нужно сходить на сайт реми и глянуть, как её ставить. Тогда точно всё будет хорошо.
    http://blog.remirepo.net/pages/Config-en
    Пример Enterprise Linux 7 (with EPEL) x86_64 - это наш случай.

    Код (Text):
    1. wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
    2. wget http://rpms.remirepo.net/enterprise/remi-release-7.rpm
    3. rpm -Uvh remi-release-7.rpm epel-release-latest-7.noarch.rpm
    Нажмите ctrl+O если вы в mc, чтобы видеть, что происходит. Копируйте эти команды и вставляйте в консоль правой кнопкой мышки.
    Последню строчку возможно придётся допихнуть энтером.

    Если вы всё сделали правильно, и у вас есть wget, то репа установится. В моём случае netinstall конфигурации требуется предварительно поставить wget.
    Код (Text):
    1. yum install wget
    Если вы тоже ставитесь из куцей версии, то после установки вгета вы команды установки репы повторите.



    --- Добавлено ---
    Yum priorities
    Т.к. теперь есть несколько репозиториев, в них может встречаться одинаковый софт разных версий. Нужно объяснить установщику, откуда что брать. Для этого есть плагин к юму для установки приоритетов репозиториев. Значение приоритета чем меньше - тем круче!
    Код (Text):
    1. yum install yum-priorities
    После этого надо подправить в файлы конфигов репозиториев. Они лежат в /etc/yum.repos.d/ файлы *.repo

    Я предпочитаю php седьмой версии, так что лезу в /etc/yum.repos.d/remi-php70.repo и во-первых включаю его, во вторых даю высший приоритет. Чтобы отредактировать файл в mc нажмите F4. Для сохранения F2. Если вы не хотите страдать, то можете подключиться к серверу в WinSCP и отредактировать файлы нормальным виндовым редактором, каким больше нравится. В рамках этого гайда предлагаю чуток пострадать.

    Если вы открыли файл, то вы видите в нём такой текст:
    Код (Text):
    1. # This repository only provides PHP 7.0 and its extensions
    2. # NOTICE: common dependencies are in "remi-safe"
    3.  
    4. [remi-php70]
    5. name=Remi's PHP 7.0 RPM repository for Enterprise Linux 7 - $basearch
    6. #baseurl=http://rpms.remirepo.net/enterprise/7/php70/$basearch/
    7. mirrorlist=http://rpms.remirepo.net/enterprise/7/php70/mirror
    8. enabled=0
    9. gpgcheck=1
    10. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
    11.  
    12. [remi-php70-debuginfo]
    13. name=Remi's PHP 7.0 RPM repository for Enterprise Linux 7 - $basearch - debuginfo
    14. baseurl=http://rpms.remirepo.net/enterprise/7/debug-php70/$basearch/
    15. enabled=0
    16. gpgcheck=1
    17. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
    18.  
    19. [remi-php70-test]
    20. name=Remi's PHP 7.0 test RPM repository for Enterprise Linux 7 - $basearch
    21. #baseurl=http://rpms.remirepo.net/enterprise/7/test70/$basearch/
    22. mirrorlist=http://rpms.remirepo.net/enterprise/7/test70/mirror
    23. enabled=0
    24. gpgcheck=1
    25. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
    26.  
    27. [remi-php70-test-debuginfo]
    28. name=Remi's PHP 7.0 test RPM repository for Enterprise Linux 7 - $basearch - debuginfo
    29. baseurl=http://rpms.remirepo.net/enterprise/7/debug-test70/$basearch/
    30. enabled=0
    31. gpgcheck=1
    32. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
    У всех стоит enabled=0 это значит они отключены нафик. Включить нужно только [remi-php70]. В него же добавить приоритет.
    Код (Text):
    1. [remi-php70]
    2. name=Remi's PHP 7.0 RPM repository for Enterprise Linux 7 - $basearch
    3. #baseurl=http://rpms.remirepo.net/enterprise/7/php70/$basearch/
    4. mirrorlist=http://rpms.remirepo.net/enterprise/7/php70/mirror
    5. enabled=1
    6. priority=1
    7. gpgcheck=1
    8. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
    Сохраняем F2, выходим F10.

    Все репозитории реми по-умолчанию выключены. В remi-php70 есть только пхп и его расширения под седьмую версию. Поэтому нужно включить и просто remi:

    /etc/yum.repos.d/remi.repo выглядит примерно так. Ниже есть ещё репозитории для php5.6 и т.п. Для моей версии пхп я их не трогаю вообще, оставляю выключенными.
    Код (Text):
    1. [remi]
    2. name=Remi's RPM repository for Enterprise Linux 7 - $basearch
    3. #baseurl=http://rpms.remirepo.net/enterprise/7/remi/$basearch/
    4. mirrorlist=http://rpms.remirepo.net/enterprise/7/remi/mirror
    5. enabled=0
    6. gpgcheck=1
    7. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

    Включаю только первый просто реми:
    Код (Text):
    1.  
    2. [remi]
    3. name=Remi's RPM repository for Enterprise Linux 7 - $basearch
    4. #baseurl=http://rpms.remirepo.net/enterprise/7/remi/$basearch/
    5. mirrorlist=http://rpms.remirepo.net/enterprise/7/remi/mirror
    6. enabled=1
    7. priority=2
    8. gpgcheck=1
    9. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
    Приоритет 2 это значит после 1. Т.к. приоритет в плагине приоритетов чем ниже - тем круче. Получается, сначала установщик выберет пакеты из реми-пхп7, если там нету, то тогда из реми просто. F2, F10.


    Ещё нужно подправить епель и родные репы. В epel.repo добавляете строчку priority=3 сразу после enabled=1.

    Родные репы центоси можно глянуть тут https://wiki.centos.org/AdditionalResources/Repositories
    Соотв. нужно растыкать приоритеты в них.
    Чтобы они не конфликтовали, нужно поставить им приоритет большим числом, чем на реми и епель. Т.е. они будут идти после в очереди. Но я не знаю, как соотносятся приоритеты между репами base и допустим updates, поэтому поставлю им всем одинаковый. Поставлю сотню.
     
    Noobasishe, Aerofreak, mahmuzar и 2 другим нравится это.
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Фигассе простыня!
     
    Noobasishe и mr.akv нравится это.
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Сейчас этот файл выглядит вот так:
    Код (Text):
    1. # CentOS-Base.repo
    2. #
    3. # The mirror system uses the connecting IP address of the client and the
    4. # update status of each mirror to pick mirrors that are updated to and
    5. # geographically close to the client.  You should use this for CentOS updates
    6. # unless you are manually picking other mirrors.
    7. #
    8. # If the mirrorlist= does not work for you, as a fall back you can try the.
    9. # remarked out baseurl= line instead.
    10. #
    11. #
    12.  
    13. [base]
    14. name=CentOS-$releasever - Base
    15. mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
    16. #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
    17. gpgcheck=1
    18. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    19.  
    20. #released updates.
    21. [updates]
    22. name=CentOS-$releasever - Updates
    23. mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
    24. #baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
    25. gpgcheck=1
    26. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    27.  
    28. #additional packages that may be useful
    29. [extras]
    30. name=CentOS-$releasever - Extras
    31. mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
    32. #baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
    33. gpgcheck=1
    34. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    35.  
    36. #additional packages that extend functionality of existing packages
    37. [centosplus]
    38. name=CentOS-$releasever - Plus
    39. mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
    40. #baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
    41. gpgcheck=1
    42. enabled=0
    У вас может выглядеть иначе, так что не копируйте, а дописывайте. В каждую секцию я вкрячу две строки
    Код (Text):
    1. enabled=1
    2. priority=100
    За исключением centosplus, в котором уже есть enabled=0, и её надо исправить и добить приоритета на всякий случай на единичку больше. В итоге получается так:
    Код (Text):
    1. # CentOS-Base.repo
    2. #
    3. # The mirror system uses the connecting IP address of the client and the
    4. # update status of each mirror to pick mirrors that are updated to and
    5. # geographically close to the client.  You should use this for CentOS updates
    6. # unless you are manually picking other mirrors.
    7. #
    8. # If the mirrorlist= does not work for you, as a fall back you can try the.
    9. # remarked out baseurl= line instead.
    10. #
    11. #
    12.  
    13. [base]
    14.  
    15. name=CentOS-$releasever - Base
    16. mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
    17. #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
    18. enabled=1
    19. priority=100
    20. gpgcheck=1
    21. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    22.  
    23. #released updates.
    24. [updates]
    25. name=CentOS-$releasever - Updates
    26. mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
    27. #baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
    28. gpgcheck=1
    29. enabled=1
    30. priority=100
    31. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    32.  
    33. #additional packages that may be useful
    34. [extras]
    35. name=CentOS-$releasever - Extras
    36. mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
    37. #baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
    38. gpgcheck=1
    39. enabled=1
    40. priority=100
    41. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    42.  
    43. #additional packages that extend functionality of existing packages
    44. [centosplus]
    45. name=CentOS-$releasever - Plus
    46. mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
    47. #baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
    48. gpgcheck=1
    49. enabled=1
    50. priority=101
    51. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

    F2 сохранить, F10 выйти.

    Yum быстрое зеркало приятнее медленного
    Т.к. скачиваются пакеты с разных серверов, некоторые из них медленнее, другие быстрее, то хочется конечно, чтобы было побыстрее. :D
    Вот надо поставить плагинчик. Он будет выбирать то зеркало, с которым связь лучше. Почти всегда.
    Код (Text):
    1. yum install yum-fastestmirror
    Возможно он уже стоит, в таких случаях yum пишет "Nothing to do".

    Nginx repo
    Я предпочитаю nginx в качестве веб-сервера. У него есть свой собственный репозиторий. И хотя его можно поставить из epel, тем не менее, в своём родном репозитории он может быть новее, чем где либо. Вот тут http://nginx.org/en/linux_packages.html написано как это сделать. Это просто. Нужно создать файлик /etc/yum.repos.d/nginx.repo командой
    Код (Text):
    1. touch /etc/yum.repos.d/nginx.repo
    Это команда такая, которая трогает файлики. Если файлика нет, то он возникнет. Если есть, то меняется время последнего изменения.
    В этот файлик надо запихать такой код, как в примере, только заменить ось и версию на свои, плюс приоритет:
    Код (Text):
    1. [nginx]
    2. name=nginx repo
    3. baseurl=http://nginx.org/packages/centos/7/$basearch/
    4. gpgcheck=0
    5. enabled=1
    6. priority=1
    Приоритет 1 это самый приоритетный приоритет. Т.к. нгинкс сам себе самый главный источник, на мой взгляд. Других пакетов там нет, так что всё хорошо.

    Чтобы посмотреть информацию об имеющихся пакетах, нужно воспользоваться командой yum info.
    Вот что покажет yum info nginx если нет родного его репозитория:
    Код (Text):
    1. Available Packages
    2. Name        : nginx
    3. Arch        : x86_64
    4. Epoch       : 1
    5. Version     : 1.6.3
    6. Release     : 9.el7
    7. Size        : 508 k
    8. Repo        : epel/x86_64
    9. Summary     : A high performance web server and reverse proxy server
    10. URL         : http://nginx.org/
    11. License     : BSD
    12. Description : Nginx is a web server and a reverse proxy server for HTTP, SMTP, POP3 and
    13.             : IMAP protocols, with a strong focus on high concurrency, performance and low
    14.             : memory usage.
    А вот из родного с правильным приоритетом:
    Код (Text):
    1. Available Packages
    2. Name        : nginx
    3. Arch        : x86_64
    4. Epoch       : 1
    5. Version     : 1.10.1
    6. Release     : 1.el7.ngx
    7. Size        : 640 k
    8. Repo        : nginx/x86_64
    9. Summary     : High performance web server
    10. URL         : http://nginx.org/
    11. License     : 2-clause BSD-like license
    12. Description : nginx [engine x] is an HTTP and reverse proxy server, as well as
    13.             : a mail proxy server.
    Версия 1.10.1 против 1.6.3. Лучше? Лучше.



    Yum clean all
    После всех этих действий с репами стоит почистить кеши юма.
    Код (Text):
    1. yum clean all
     
    #7 igordata, 24 июн 2016
    Последнее редактирование: 24 июн 2016
    Noobasishe, Aerofreak, mahmuzar и 3 другим нравится это.
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Установка сервера, наконец-то
    Вот теперь можно начать установку программ.

    Первым делом хочу сказать, что апач не нужен. Много лет обхожусь без него. Не знаю, зачем нужен апач. Поэтому я буду ставить nginx + php-fpm. Yum позволяет писать сразу несколько того, чего мы хотим установить. Собственно так и пишем:
    Код (Text):
    1. yum install nginx php-fpm
    Это только вебсервер с пхп. Для установки базы данных надо добавить туда или написать отдельно ещё и mariadb-server. Она теперь заместо мускула, полная бинарная совместимость, не спрашивайте почему так. Гуглите, если кому интересно.
    Пока сосредоточимся на настройке веб-сервера и пхп. Заставим их работать и работать хорошо. Потом накатим БД и кеши и прочую всякую штуку.

    Юм покажет что-то вроде:
    Код (Text):
    1. Dependencies Resolved
    2.  
    3. ==============================================================================
    4. Package         Arch        Version                    Repository       Size
    5. ==============================================================================
    6. Installing:
    7. nginx           x86_64      1:1.10.1-1.el7.ngx         nginx           640 k
    8. php-fpm         x86_64      7.0.8-1.el7.remi           remi-php70      1.4 M
    9. Installing for dependencies:
    10. php-common      x86_64      7.0.8-1.el7.remi           remi-php70      995 k
    11. php-json        x86_64      7.0.8-1.el7.remi           remi-php70       53 k
    12.  
    13. Transaction Summary
    14. ==============================================================================
    15. Install  2 Packages (+2 Dependent packages)
    16.  
    17. Total download size: 3.0 M
    18. Installed size: 14 M
    19. Is this ok [y/d/N]:
    Это значит, что он проверил, какой пакет от какого зависит, посмотрел, что для пхп-фпм потребуется ещё парочка и собирается скачать три мегабайта и после установки они отожрут 14 мегабайт места. Отлично. Вводите "y" если не использовали ключик -y заранее.
    Может спросить про ключи репозиториев. Тыкайте y опять же.

    В итоге будет:
    Код (Text):
    1.  
    2. Installed:
    3.   nginx.x86_64 1:1.10.1-1.el7.ngx      php-fpm.x86_64 0:7.0.8-1.el7.remi
    4.  
    5. Dependency Installed:
    6.   php-common.x86_64 0:7.0.8-1.el7.remi   php-json.x86_64 0:7.0.8-1.el7.remi
    7.  
    8. Complete!
    Это значит, что программы установились. Но они не запущены, и даже если вы их запустите руками, они не запустятся после перезагрузки сами. Их нужно включить в автозапуск после перезагрузки.
    Код (Text):
    1. systemctl enable nginx php-fpm
    Получим
    Код (Text):
    1.  
    2. Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
    3. Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.
    Что значит, что всё включилось и при перезагруке они будут запускаться.
    По старинке можно написать
    Код (Text):
    1. chkconfig nginx on
    2. chkconfig php-fpm on
    Но сейчас так в седьмой центоси обычно не пишут.
     
    #8 igordata, 24 июн 2016
    Последнее редактирование: 25 июн 2016
    Noobasishe, Aerofreak, mahmuzar и 2 другим нравится это.
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    WinSCP

    Если вам надоело ковырять файлики в консоли, вы можете залезть на сервер через WinSCP и редактировать конфиги в привычной среде. Рекомендую поставить Sublime или Notepad++, т.к. виндовый блокнот ващпе не понимаю юниксовые переводы строк.

    Запускаете WinSCP, тыкаете "New site", вводите название и адрес:
    upload_2016-6-24_15-45-8.png
    Тыкаете "сохранить" и ставите галку "сохранить пароль":
    upload_2016-6-24_15-45-32.png
    Название можно сменить
    upload_2016-6-24_15-45-56.png
    Ну и ОК. Теперь можно потыкать в CentOS и подключиться.

    Новый ключ, сохранить.
    upload_2016-6-24_15-46-38.png

    Видите файлики в папке /root. Отлично.
    Я предпочитаю работать в однопанельном режиме. В настройках этот делается так:
    upload_2016-6-24_15-49-1.png

    Я предпочитаю сразу видеть всю информацию по файлам. Так что выбираю вид "Details":
    upload_2016-6-24_15-50-42.png

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

    upload_2016-6-24_15-52-38.png

    Нажимайте Add... и указываете путь к вашему редактору:
    upload_2016-6-24_15-53-49.png

    Далее ОК. WinSCP позволяет задать маску и приоритет для разных редакторов так, чтобы разные типы файлов можно было открывать в разных программах. Нам пока это не понадобится в ближайшие годы. Так что тыкаем Up пока он не долезет до самого верха. Готово.
     
    #9 igordata, 25 июн 2016
    Последнее редактирование: 25 июн 2016
    Aerofreak, mahmuzar, denis01 и ещё 1-му нравится это.
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Nginx
    Настройка нгинкса довольно проста.
    Его конфиги живут в /etc/nginx, так что отправляйтесь туда.
    Файл nginx.conf содержит в себе глобальные настройки самого нгинкса. Один раз настроить и забыть.
    В scgi_params задаются некоторые переменные, которые будут передаваться в php-fpm с каждым запросом. Сюда вообще лазить не нужно. Но этот файл включается в конфиг каждого сайта.

    Лезем в WinSCP в папку /etc/nginx и там редактируем nginx.conf. Если с WinSCP всё было сделано правильно, то откроется ваш редактор, у меня - sublime.

    upload_2016-6-24_15-57-35.png

    DblClick или Edit из меню

    upload_2016-6-24_15-58-7.png

    Вот. Можно удобно ковырять.

    При сохранении файла он будет автоматически заливаться:
    upload_2016-6-24_16-7-46.png

    Код (Text):
    1. worker_processes  4;
    ставите столько, сколько у вас ядер в виртуалке. Больше ничего трогать не надо.

    Зайдите в /etc/nginx/conf.d и удалите нафик default.conf

    Далее нужно создать конфиг для нашего сайта. Например example.com, но где он будет жить?

    VirtualBox Extension Pack
    Обычно сайты складывают в папку /var/www. Им там хорошо. Там в этой папке стоит создать ещё одну папку с именем сайта. Так будет лучше всего. Нужно, чтобы у этой папки был хозяин - некий юзер. И группа. Юзер должен быть в группе. Проще всего и наименее секурно сделать одного юзера и одну группу и забить. Но мы и этого делать не станем. Потому что мы расшарим папку из виртуалки в хоста. Тогда будет полный разврат, чад кутежа, стыд и срам, 777 на оба ваши дома. Никакой безопасностью тут и не пахнет. Зато пахнет удобством. До тех пор, пока ваша виртуалка не открывает свои порты всему интернету, можно жить и так. Вперёд.

    Если у вас уже как выше предлагалось добавлена папка
    upload_2016-6-24_19-33-3.png
    то надо подмонтировать шару виртуалбокса. Сделать это можно только если установлено расширение
    VirtualBox Extension Pack и надо ещё накатить на ядро гостя всякое называемое Guest Additions. В случае некоторых конфигураций оно с наскоку не встанет, и нужно будет доставить пару пакетов. В моём как раз случае.

    upload_2016-6-24_19-39-0.png

    Они появятся как CD-диск в гостевой системе. В нашем случае авторана как на винде нету, надо диск подмонтировать. Сидюк лежит по адресу /dev/cdrom, в mc он виден вот так, как файл с собачкой:
    upload_2016-6-24_19-41-42.png
    Это потому, что это ссылка, на самом деле он /dev/sr0 скорее всего. Или нет. Поэтому проще через ссылку эту.
    Смонтировать его надо куда-нить, куда хочется. Например в /media/cdrom. Для этого надо сначала создать папку
    Код (Text):
    1. mkdir /media/cdrom
    и смонтировать
    Код (Text):
    1. mount -t auto /dev/cdrom /media/cdrom
    Должно быть написано, что подмонтировано
    Код (Text):
    1. mount: /dev/sr0 is write-protected, mounting read-only
    То, что он ридонли это нормально, он же сидюк.

    Идите туда. Там файлики. На все случаи жизни. Большие буквы важны. В линуксе большие и маленькие буквы в именах файлов - это разные имена, разные файлы.
    Нужно запустить VBoxLinuxAdditions.run:
    Код (Text):
    1. sh VBoxLinuxAdditions.run
    Если всё прошло удачно, то будет написано, что всё прошло удачно.
    В противном случае надо начинать решать проблемы.
    Код (Text):
    1. [root@localhost cdrom]# sh VBoxLinuxAdditions.run
    2. Verifying archive integrity... All good.
    3. Uncompressing VirtualBox 5.0.22 Guest Additions for Linux............
    4. VirtualBox Guest Additions installer
    5. Copying additional installer modules ...
    6. ./install.sh: line 344: bzip2: command not found
    7. tar: This does not look like a tar archive
    8. tar: Exiting with failure status due to previous errors
    9. ./install.sh: line 357: bzip2: command not found
    10. tar: This does not look like a tar archive
    11. tar: Exiting with failure status due to previous errors
    12. [root@localhost cdrom]#
    В моём случае просто не вышло распаковать какие-то архивы. Нужно доставить архиватор.
    Код (Text):
    1. ./install.sh: line 344: bzip2: command not found
    Можно спросить у юма, кто даёт такую команду:
    Код (Text):
    1. yum provides bzip2
    Он укажет пакеты, которые добавляют этот функционал. Как ни удивительно, это bzip2.
    Код (Text):
    1. yum install bzip2
    Запускаю ещё раз
    Код (Text):
    1.  sh VBoxLinuxAdditions.run
    В этот раз он ругается на то, что расширение было скачано отдельно от виртуалбокса. Ну и ладно.
    Код (Text):
    1.  
    2. Verifying archive integrity... All good.
    3. Uncompressing VirtualBox 5.0.22 Guest Additions for Linux............
    4. VirtualBox Guest Additions installer
    5. You appear to have a version of the VBoxGuestAdditions software
    6. on your system which was installed from a different source or using a
    7. different type of installer.  If you installed it from a package from your
    8. Linux distribution or if it is a default part of the system then we strongly
    9. recommend that you cancel this installation and remove it properly before
    10. installing this version.  If this is simply an older or a damaged
    11. installation you may safely proceed.
    12.  
    13. Do you wish to continue anyway? [yes or no]
    Ну yes.
    В моём случае процесс утановки закономерно спотыкается на том, что во-первых:
    Код (Text):
    1. The gcc utility was not found.
    и
    Код (Text):
    1. The headers for the current running kernel were not found. If the following
    2. module compilation fails then this could be the reason.
    3. The missing package can be probably installed with
    4. yum install kernel-devel-3.10.0-327.el7.x86_64
    Это решается установкой пакета для разрабов.
    Код (Text):
    1. groupinstall "Development Tools"
    Тут и gcc, и заголовки, и всё, что нужно, чтобы Guest Additions собрались наконец-то.

    Если вдруг в комнату вошла мамка и потребовала выключить эту порнографику сичазже-прямщас, то после перезагрузки опять надо вбить команды:
    Код (Text):
    1. mount -t auto /dev/cdrom /media/cdrom
    2. cd /media/cdrom
    3. sh VBoxLinuxAdditions.run
    Однако, иногда этого может оказаться недостаточно. По какой-то странной причине сорцы ядра не находятся, хотя попытка их поставить так, как советует установщик Guest Additions заканчивается сообщением, что они уже давно и успешно установлены и "Nothing to do". Такое бывает. Без паники. Можно воспользоваться вот этим гайдом http://www.dedoimedo.com/computers/virtualbox-compilation-errors.html где объясняется почему виртуалбоксовые Guest Additions упорно не видят установленные заголовки файлов ядра. Господь милостив, однажды это исправят.

    Из этого гайда можно сделать вывод, что ссылка на сорцы битая. Её нужно заменить на правильную.
    Идите в /usr/src/kernels, там посмотрите, какая папка самая последняя или соответствует тому ядру, в которое вы грузитесь. Оно мелькает при загрузке. Пять секунд можно выбирать ядро. Если нажать стрелочку, то можно будет переписать номер ядра. Вот на папку с этим же номером и надо сделать ссылку.
    В моём случае это папка 3.10.0-327.22.2.el7.x86_64

    Если мы перейдём в mc папку /lib/modules/ и там в папку почти с тем же названием, то увидим, что там и правда красная битая ссылка:

    upload_2016-6-24_21-27-51.png

    Фигарим правильную ссылку. Файл убивать руками не надо, он пресоздастся.
    Код (Text):
    1. ln -sf /usr/src/kernels/3.10.0-327.22.2.el7.x86_64 build
    Внешний вид ссылки поменялся:
    upload_2016-6-24_21-29-46.png
    Теперь она хорошая.

    Идите в /media/cdrom и снова запускайте VBoxLinuxAdditioncs.run. Если процесс залип на "Building the VirtualBox Guest Additions kernel modules", то скорее всего процесс пошел в нужное русло, и скоро всё скомпилится.
    Целиком это может выглядеть так:
    Код (Text):
    1.  
    2. Verifying archive integrity... All good.
    3. Uncompressing VirtualBox 5.0.22 Guest Additions for Linux............
    4. VirtualBox Guest Additions installer
    5. Removing installed version 5.0.22 of VirtualBox Guest Additions...
    6. Removing existing VirtualBox DKMS kernel modules[  OK  ]
    7. Removing existing VirtualBox non-DKMS kernel modules[  OK  ]
    8.  
    9. Broadcast message from systemd-journald@localhost.localdomain (Sat 2016-06-25 00:31:08 EDT):
    10.  
    11. dracut[3665]: Can't write to /boot/initramfs-: Directory /boot/initramfs- does not exist or is not accessible.
    12.  
    13.  
    14. Message from syslogd@localhost at Jun 25 00:31:08 ...
    15. dracut:Can't write to /boot/initramfs-: Directory /boot/initramfs- does not exist or is not accessible.
    16. Copying additional installer modules ...
    17. Installing additional modules ...
    18. Removing existing VirtualBox DKMS kernel modules[  OK  ]
    19. Removing existing VirtualBox non-DKMS kernel modules[  OK  ]
    20. Building the VirtualBox Guest Additions kernel modules[  OK  ]
    21. Doing non-kernel setup of the Guest Additions[  OK  ]
    22. Starting the VirtualBox Guest Additions Installing the Window System drivers
    23. Could not find the X.Org or XFree86 Window System, skipping.
    24. [  OK  ]
    Но главное это:
    Код (Text):
    1. Building the VirtualBox Guest Additions kernel modules [  OK  ]
    Прекрасно.

    Теперь надо перезагрузиться в новое пропатченное ядро и подцепить папку.
    Если у вас нету /var/www, то вы её создайте
    Код (Text):
    1. mkdir /var/www
    и потом подцепляйте командой
    Код (Text):
    1. mount -t vboxsf www /var/www
    Где первое www это название шары в настройках виртуалки, а /var/www это куда шару подцеплять внутри виртуалки.
    Должна появиться.

    Как проверить?
    Открываете в винде в проводнике тот путь, который выбирали, когда делали расшаренную папку. Его можно посмотреть в настройках виртуалки во вкладке расшареных папок. Там же можно посмотреть и её название.
    upload_2016-6-24_21-43-12.png






     
    #10 igordata, 25 июн 2016
    Последнее редактирование: 25 июн 2016
    Aerofreak, askanim, mahmuzar и 2 другим нравится это.
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Создаёте по этому пути какой-нить файлик. Ну например "New Text Document.txt", потом смотрите в консоли виртуалки, появился ли этот файлик. Если вы вошли в папку /var/www до того, как создали файл, то нужно выйти из неё куданить, например на уровень выше, и войти снова, т.к. mc не обновляет автоматически список файлов в папке. WinSCP тоже, у него есть для этого кнопка "Обновить".

    upload_2016-6-24_21-48-44.png

    Если файлик там, где его не было, значит подцпилась. Если нет - пишите вопросы в этот топик.

    Вроде уже nginx настраивали, а до сайта ещё как до Луны пешком? Держитесь, мы уже близко. Дорогу осилит идущий.

    Ну наконец-то можно уже попробовать создать конфиг для сайта. Два конфига, если честно.

    Nginx хранит конфиги отдельно от сервера в своей папке /etc/nginx/conf.d - вот тут хранятся все конфиги всех сайтов, какие только есть, если иное не задано в конфиге линукса. Нужно создать конфиг для нашего сайта. Nginx читает конфиги, которые имеют расширение .conf, и надо создать такой. Название не имеет значения.

    Откройте WinSCP, перейдите в эту папку /etc/nginx/conf.d и создайте новый файл. Откроется редактор, напишите там что угодно и сохраните. WinSCP закачает этот файл на сервер. Теперь можно его отредактировать вот так:

    Код (Text):
    1. server {
    2.   server_name     example.com;
    3.   root     /var/www/example.com/;
    4.   access_log      /var/log/nginx/example.com.access.log  main;
    5.  
    6.   client_max_body_size 10000m;
    7.  
    8.   location / {
    9.     index    index.php;
    10.     try_files      $uri  $uri/ @cgi;
    11.   }
    12.  
    13.   location ~* ^.+\.(jpg|jpeg|gif|ico|txt|png)$ {
    14.       access_log  off;
    15.   }
    16.  
    17.   location ~ \.php$ {
    18.     try_files      $uri  @cgi;
    19.     fastcgi_pass       unix:/var/run/php-fpm.sock;
    20.     fastcgi_param      SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    21.     fastcgi_read_timeout 9999s;
    22.     include        /etc/nginx/fastcgi_params;
    23.   }
    24.  
    25.   location @cgi {
    26.     fastcgi_pass       unix:/var/run/php-fpm.sock;
    27.     fastcgi_param  SCRIPT_FILENAME  $document_root/index.php;
    28.     fastcgi_read_timeout 9999s;
    29.     include        /etc/nginx/fastcgi_params;
    30.   }
    31. }
    Это наверное самый дебильный подход делать конфиги для сайтов для nginx, но он сработает на ура. Вчитайтесь в него, он простой.

    Первая строчка говорит о том, что нгинкс будет делать то, что написано в этом конфиге тогда, когда запрос приходит на сайт example.com, а не на какой-то другой.

    Вторая строчка говорит, где этот сайт искать. А именно в "/var/www/example.com/".

    Код (Text):
    1.   location / {
    2.     index    index.php;
    3.     try_files      $uri  $uri/ @cgi;
    4.   }
    Этот кусок конфига говорит, что нужно сначала попробовать отдать файл, который запрошен как урл, если такой есть, а потом поробовать папку, а потом, если ничего не нашлось - перекинуть запрос в другой локейшн @cgi.

    Код (Text):
    1.   location ~* ^.+\.(jpg|jpeg|gif|ico|txt|png)$ {
    2.       access_log  off;
    3.   }
    Этот кусок говорит, что запросы файлов с такими расширениями не должны логгироваться в лог доступа, т.к. иначе он распухнет моментально.

    Код (Text):
    1.   location ~ \.php$ {
    2.     try_files      $uri  @cgi;
    3.     fastcgi_pass       unix:/var/run/php-fpm.sock;
    4.     fastcgi_param      SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    5.     fastcgi_read_timeout 9999s;
    6.     include        /etc/nginx/fastcgi_params;
    7.   }
    Тут: запросы к *.php файлам перекидываются на @cgi, и отдаётся результат работы php-fpm, а не содержимое файлов.

    Код (Text):
    1.   location @cgi {
    2.     fastcgi_pass       unix:/var/run/php-fpm.sock;
    3.     fastcgi_param  SCRIPT_FILENAME  $document_root/index.php;
    4.     fastcgi_read_timeout 9999s;
    5.     include        /etc/nginx/fastcgi_params;
    6.   }
    Это тот самый локейшн @cgi, куда приходят запросы на несуществующие файлы и *.php. Всё это уходит в php-fpm на index.php.
    По-хорошему прямого обращения к *.php-файлам быть не должно. Но более умный конфиг пока не нужен, начинающим удобнее работать с отдельными файлами порой.


    При сохранении конфига убедитесь, что символы новой строки (энтеры) у вас линуксовые. А то будут ругачки. В Sublime это в меню View->Line Endings->Unix. В Notepad++ это Edit->EOL Conversion->UNIX/OSX Format. Вперёд.

    php-fpm

    Настройки php-fpm живут в папке /etc/php-fpm.d. Там сейчас должен быть файл www.conf с большим количеством коментариев и настроек. Замените всё его богатое содержимое вот на это:
    Код (Text):
    1. [www]
    2. listen = /var/run/php-fpm.sock
    3. listen.owner = www-data
    4. listen.group = www-data
    5. listen.mode = 0666
    6. user = www-data
    7. group = www-data
    8. pm = dynamic
    9. pm.max_children = 10
    10. pm.start_servers = 2
    11. pm.min_spare_servers = 2
    12. pm.max_spare_servers = 4
    13. catch_workers_output = no
    Юниксовые сокеты быстрее, поэтому я предпочитаю пользоваться ими. Это такой файл, через который происходит общение nginx и php-fpm. Только это не файл. Это путь. В линуксе всё - путь. Даже устройства. Вы это видели, когда линковали сидюк в папку. Вот такой путь для общения программ называется юникс сокет. И в данном случае этот путь "/var/run/php-fpm.sock".

    Теперь php-fpm будет слушать и отвечать, а nginx будет спрашивать и получать ответы на свои запросы по адресу "/var/run/php-fpm.sock". Но пока они этого не делают, потому что при запуске они уже считали свои настройки, и никаких этих файликов и конфигов тогда не было. Их нужно перезапустить. Хотя к чести nginx нужно заметить, что он способен перечитать свои конфиги и без перезагрузки, не обрывая уже установленных соединений. Но мы всё равно их всех рестартанём. Так проще.

    Код (Text):
    1. systemctl restart nginx.service php-fpm.service
    Посмотреть, стартавали ли они можно командой
    Код (Text):
    1. systemctl status nginx.service php-fpm.service
    Должно быть что-то типа того:

    Код (Text):
    1. ● nginx.service - nginx - high performance web server
    2.    Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
    3.    Active: active (running) since Sat 2016-06-25 01:20:44 EDT; 8s ago
    4.      Docs: http://nginx.org/en/docs/
    5.   Process: 1743 ExecStop=/bin/kill -s QUIT $MAINPID (code=exited, status=0/SUCCESS)
    6.   Process: 1759 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
    7.   Process: 1757 ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
    8. Main PID: 1761 (nginx)
    9.  
    10.    CGroup: /system.slice/nginx.service
    11.            ├─1761 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
    12.            ├─1762 nginx: worker process
    13.            ├─1763 nginx: worker process
    14.            ├─1764 nginx: worker process
    15.            └─1765 nginx: worker process
    16.  
    17. Jun 25 01:20:44 localhost.localdomain systemd[1]: Starting nginx - high performance web server...
    18. Jun 25 01:20:44 localhost.localdomain nginx[1757]: nginx: the configuration file /etc/nginx/nginx... ok
    19. Jun 25 01:20:44 localhost.localdomain nginx[1757]: nginx: configuration file /etc/nginx/nginx.con...ful
    20. Jun 25 01:20:44 localhost.localdomain systemd[1]: Started nginx - high performance web server.
    21.  
    22. ● php-fpm.service - The PHP FastCGI Process Manager
    23.    Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
    24.    Active: active (running) since Sat 2016-06-25 01:20:44 EDT; 8s ago
    25. Main PID: 1748 (php-fpm)
    26.    Status: "Ready to handle connections"
    27.    CGroup: /system.slice/php-fpm.service
    28.            ├─1748 php-fpm: master process (/etc/php-fpm.conf)
    29.            ├─1749 php-fpm: pool www
    30.            ├─1750 php-fpm: pool www
    31.            ├─1751 php-fpm: pool www
    32.            ├─1752 php-fpm: pool www
    33.            └─1753 php-fpm: pool www
    34.  
    35. Jun 25 01:20:44 localhost.localdomain systemd[1]: Starting The PHP FastCGI Process Manager...
    36. Jun 25 01:20:44 localhost.localdomain systemd[1]: Started The PHP FastCGI Process Manager.
    37. Hint: Some lines were ellipsized, use -l to show in full.

    Теперь нужно создать сайт!

    example.com

    Для этого нужно в той расшаренной папке создать папку с именем сайта и положить в неё index.php.
    Идите туда, создайте новый тексовый документ с таким содержимым:
    PHP:
    1. <?php
    переименуйте его в index.php

    upload_2016-6-24_22-27-30.png

    Теперь нужно прописать его в hosts, иначе вы не сможете зайти на него в браузере. В новом Microsoft Edge вы и так и сяк не сможете на него зайти без танцев с бубном, поэтому поставьте сразу ещё один браузер, если у вас нет.

    Чтобы добавить адрес сайта и его ip в хостс, нужно запустить текстовый редактор с привилегиями администратора. Закройте ваш текстовый редактор и кликните по нему правой кнопкой, выберите запуск от админа:
    upload_2016-6-24_22-32-46.png

    Потом надо сделать Файл->Открыть и писать вместо имени файла такой путь:
    C:\Windows\System32\drivers\etc\hosts

    Содержимое девственно чистого hosts выглядит так:
    Код (Text):
    1. # Copyright (c) 1993-2009 Microsoft Corp.
    2. #
    3. # This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
    4. #
    5. # This file contains the mappings of IP addresses to host names. Each
    6. # entry should be kept on an individual line. The IP address should
    7. # be placed in the first column followed by the corresponding host name.
    8. # The IP address and the host name should be separated by at least one
    9. # space.
    10. #
    11. # Additionally, comments (such as these) may be inserted on individual
    12. # lines or following the machine name denoted by a '#' symbol.
    13. #
    14. # For example:
    15. #
    16. #      102.54.94.97     rhino.acme.com          # source server
    17. #       38.25.63.10     x.acme.com              # x client host
    18.  
    19. # localhost name resolution is handled within DNS itself.
    20. #    127.0.0.1       localhost
    21. #    ::1             localhost
     
    #11 igordata, 25 июн 2016
    Последнее редактирование: 25 июн 2016
    Noobasishe, Aerofreak, mahmuzar и ещё 1-му нравится это.
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Вам нужно дописать внизу IP и имя сайта:

    Код (Text):
    1. # Copyright (c) 1993-2009 Microsoft Corp.
    2. #
    3. # This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
    4. #
    5. # This file contains the mappings of IP addresses to host names. Each
    6. # entry should be kept on an individual line. The IP address should
    7. # be placed in the first column followed by the corresponding host name.
    8. # The IP address and the host name should be separated by at least one
    9. # space.
    10. #
    11. # Additionally, comments (such as these) may be inserted on individual
    12. # lines or following the machine name denoted by a '#' symbol.
    13. #
    14. # For example:
    15. #
    16. #      102.54.94.97     rhino.acme.com          # source server
    17. #       38.25.63.10     x.acme.com              # x client host
    18.  
    19. # localhost name resolution is handled within DNS itself.
    20. #    127.0.0.1       localhost
    21. #    ::1             localhost
    22. 192.168.56.101        example.com
    и сохранить.

    Проверить, сработало или нет можно в консоли винды: Пуск и сразу печатаете cmd, тыкаете в консоль и набираете там
    Код (Text):
    1. ping example.com
    Если запросы пошли на 192.168.56.101, то всё хорошо.

    Если не хорошо - пишите, приложите свой hosts файл после перезагрузки компа.

    Если зайти на сайт через браузер по адресу http://example.com не получилось совсем, то нужно открыть порт 80 в фаерволе.
    Код (Text):
    1. firewall-cmd --zone=public --add-port=80/tcp --permanent
    2. firewall-cmd --reload
    Если вы получаете код ответа 403 Forbidden или 500 Internal server error, то это почти хорошо. Это значит, что вы достучались до nginx, но он не смог получить правильного ответа от php-fpm или что-то ещё случилось, но уже внутри сервера.

    В случае ошибок нужно лезть в /var/log/nginx/error.log и смотреть, что там в последних строках.

    Вот у меня ошибка:
    Код (Text):
    1. 2016/06/25 04:30:04 [error] 1762#1762: *1 "/var/www/example.com/index.php" is forbidden (13: Permission denied), client: 192.168.56.1, server: example.com, request: "GET / HTTP/1.1", host: "example.com"
    Эта ошибка говорит о том, что у веб-сервера нет доступа к этому "/var/www/example.com/index.php" файлу. Опытные админы сразу видят недостаток прав на чтение. Но права на чтение есть.

    Как вообще такое может быть, ведь расшареная папка виртуалки даёт права 777 на всё, что там есть, и эти права нельзя поменять? Права 777 это разрешение на чтение, изменение и исполнение любого файла любым пользователем. Как это может быть?

    Очень просто.

    SELinux

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

    Для работы на виртуалке, которая никуда не смотрит во всякие интернеты SELinux не нужен. Его можно отключить. Для этого нужно поправить файл /etc/selinux/config и заменить там enforcing на disabled:
    Код (Text):
    1.  
    2. # This file controls the state of SELinux on the system.
    3. # SELINUX= can take one of these three values:
    4. #     enforcing - SELinux security policy is enforced.
    5. #     permissive - SELinux prints warnings instead of enforcing.
    6. #     disabled - No SELinux policy is loaded.
    7. SELINUX=disabled
    8. # SELINUXTYPE= can take one of three two values:
    9. #     targeted - Targeted processes are protected,
    10. #     minimum - Modification of targeted policy. Only selected processes are protected.
    11. #     mls - Multi Level Security protection.
    12. SELINUXTYPE=targeted
    Сохранить.

    После этого нужно перезагрузиться.

    Прочие проблемы

    502 Bad Gateway
    Я попробовал зайти на сайт http://example.com ещё раз и получил ошибку 502.
    Ошибка 502 говорит о том, что nginx обратился к php-fpm и передал ему все параметры запроса, включая путь к файлу, к которому у него теперь есть доступ. Но никакого php он не встретил.

    В моём случае я получил ошибку:
    Код (Text):
    1. 2016/06/25 04:46:41 [crit] 1393#1393: *1 connect() to unix:/var/run/php-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 192.168.56.1, server: example.com, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm.sock:", host: "example.com"
    Это означает, что возможно в моих конфигах разные пути к файлу сокета для пхп и для нгинкс. Это нужно исправить и перезапустить оба сервиса. Тогда всё станет хорошо. Проверьте, создаётся ли искомый файл юникс сокета в нужном месте и есть ли доступ у обоих сервисов к нему.

    Если оба пути у вас правильные, но ошибка возникает, проверьте, работает ли php-fpm, т.к. даже если пути правильные, этот сервис может вылетать при старте с ошибкой, если ему не понравилась строка в конфигах, и её нужно будет исправить.

    Проверить работу обоих сервисов можно командой:
    Код (Text):
    1. systemctl status nginx php-fpm
    В моём случае про php-fpm сказано следующее:
    Код (Text):
    1.  
    2. ● php-fpm.service - The PHP FastCGI Process Manager
    3.    Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
    4.    Active: failed (Result: exit-code) since Sat 2016-06-25 04:46:36 EDT; 7min ago
    5.   Process: 1375 ExecStart=/usr/sbin/php-fpm --nodaemonize (code=exited, status=78)
    6. Main PID: 1375 (code=exited, status=78)
    7.  
    8. Jun 25 04:46:36 localhost.localdomain systemd[1]: Starting The PHP FastCGI Process Manager...
    9. Jun 25 04:46:36 localhost.localdomain php-fpm[1375]: [25-Jun-2016 04:46:36] ERROR: [pool www] cann...a'
    10. Jun 25 04:46:36 localhost.localdomain php-fpm[1375]: [25-Jun-2016 04:46:36] ERROR: FPM initializat...ed
    11. Jun 25 04:46:36 localhost.localdomain systemd[1]: php-fpm.service: main process exited, code=exit...n/a
    12. Jun 25 04:46:36 localhost.localdomain systemd[1]: Failed to start The PHP FastCGI Process Manager.
    13. Jun 25 04:46:36 localhost.localdomain systemd[1]: Unit php-fpm.service entered failed state.
    14. Jun 25 04:46:36 localhost.localdomain systemd[1]: php-fpm.service failed.
    Я не создал юзера для работы веб-сервера под которым и должен по конфигу работать php-fpm.
    Стоит создать его прямо сейчас и перезапустить php-fpm:
    Код (Text):
    1. useradd -M -d /var/www www-data
    Где -M не создавать папку, т.к. она уже существует, а -d указывает как раз домашню папку юзера.
    Теперь, когда юзер создан, нужно перезапустить php-fpm:
    Код (Text):
    1. systemctl start php-fpm
    И проверить, всё ли хорошо:
    Код (Text):
    1. systemctl status php-fpm
    Да, php-fpm работает. Но вместо страницы я вижу сообщение "File not found." и больше ничего. Что, чёрт возьми, это значит?

    Primary script unknown

    Ну давайте снова заглянем в лог nginx который можно найти в /var/log/nginx/error.log:
    Код (Text):
    1. 2016/06/25 05:01:34 [error] 1393#1393: *3 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 192.168.56.1, server: example.com, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm.sock:", host: "example.com"
    Ошибка "Primary script unknown" говорит о том, что php-fpm не нашла такого файла, на который ей указал nginx.

    В данном случае просто расшареная папка виртуалбокса не подключается сама после перезагрузки.
     
    #12 igordata, 25 июн 2016
    Последнее редактирование: 25 июн 2016
    Noobasishe, Aerofreak, mahmuzar и ещё 1-му нравится это.
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    VirtualBox Shared Folder навсегда

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

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

    Я предпочитаю подмонтировать папку при каждой загрузке автоматически скриптом. Тогда папка и файлы получают права 777, что терпимо на виртуалке, про которую не знает никто, кроме владельца.
    Это второй способ. Сейчас я расскажу, как это сделать.

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

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

    Откройте файл /etc/rc.d/rc.local, если нету - создайте. Впишите в него:
    Код (Text):
    1. mount -t vboxsf www /var/www # VirtualBox
    Сохраните и поставьте ему бит исполнения:
    Код (Text):
    1. chmod 744 /etc/rc.d/rc.local
    Этот скрипт будет подмонтировать папку при каждой перезагрузке.
    Если вы выбрали этот способ, то нужно перезагрузиться и проверить, сработало ли. У меня сработало. Надеюсь у вас тоже. Если что - пишите в топик. Мне в личку не пишите.
     
    #13 igordata, 25 июн 2016
    Последнее редактирование: 25 июн 2016
    Noobasishe, Aerofreak, mahmuzar и ещё 1-му нравится это.
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Мы строили, строили, и наконец - построили! Ура!

    Чебурашка толкнул эту великую речь по завершении строительства многоэтажного жилого комплекса из говна и палок. Теперь, если у вас видны файлы в папке /var/www/example.com, если там есть index.php, если nginx и php-fpm запущены (проверить командой "systemctl status nginx php-fpm) и работают через один сокет, к которому имеют доступ оба, если они так же имеют доступ к файлам в папке /var/www/example.com, то наконец-то вы можете через браузер получить доступ к вашему сайту и лицезреть страницу вроде этой:

    upload_2016-6-25_13-53-52.png

    С помощью функции phpinfo() можно увидеть все настройки пхп и его расширений, пути к файлам конфигурации. Это очень удобно.

    Zend OPcache
    Если сделать поиск по странице с phpinfo по слову opcache, и там будет только одно вхождение в титрах с фамилиями создателей, то это значит, что код php не кешируется. Это значит, что при каждом запросе файлы php читаются самим php и компилируется заново в байт-команды, которые называются opcode. Это довольно долгая операция, хотя на глаз почти не заметная. Но т.к. большинство файлов не меняются раз от разу, можно использовать некий кеш, который эту скомпилированную программу будет в себе содержать. Такой кеш назвается php opcode cache.

    Существует несколько опкод кешеров. Их список представлен в Википедии https://en.wikipedia.org/wiki/List_of_PHP_accelerators со сравнительной таблице. Фишка в том, что ранее опкод кешеры для пхп были сторонними решениями. Но с седьмой версии компания-разработчик самого PHP представила "родной" опкод кешер с незамысловатым названием OPcache. Его скорость работы вполне на высоте, так что давайте поставим его и даже не будем выбирать, правда?

    Чтобы установить его нужно просто его установить и перезапустить php-fpm:
    Код (Text):
    1. yum install -y php-opcache
    2. systemctl restart php-fpm
    И теперь можно будет на странице phpinfo найти слово "opcache" несколько раз. Можно даже заметить, что в самом верху появилось упоминание, что подключается дополнительный файл конфигурации:
    upload_2016-6-25_14-13-7.png
    Этот файл конфигурации нужно отредактировать.

    /etc/php.d/10-opcache.ini

    Почему он 10? Это значение приоритета загрузки. Опять же, чем меньше - тем раньше. Опкод кешер загружается раньше других модулей php, чтобы всё работало хорошо, сразу и без конфликтов.

    Если открыть этот файл, то можно увидеть кучу всяких комментированных опций. Сейчас он выглядит вот так:
    Код (Text):
    1. ; Enable Zend OPcache extension module
    2. zend_extension=opcache.so
    3.  
    4. ; Determines if Zend OPCache is enabled
    5. opcache.enable=1
    6.  
    7. ; Determines if Zend OPCache is enabled for the CLI version of PHP
    8. ;opcache.enable_cli=0
    9.  
    10. ; The OPcache shared memory storage size.
    11. opcache.memory_consumption=128
    12.  
    13. ; The amount of memory for interned strings in Mbytes.
    14. opcache.interned_strings_buffer=8
    15.  
    16. ; The maximum number of keys (scripts) in the OPcache hash table.
    17. ; Only numbers between 200 and 100000 are allowed.
    18. opcache.max_accelerated_files=4000
    19.  
    20. ; The maximum percentage of "wasted" memory until a restart is scheduled.
    21. ;opcache.max_wasted_percentage=5
    22.  
    23. ; When this directive is enabled, the OPcache appends the current working
    24. ; directory to the script key, thus eliminating possible collisions between
    25. ; files with the same name (basename). Disabling the directive improves
    26. ; performance, but may break existing applications.
    27. ;opcache.use_cwd=1
    28.  
    29. ; When disabled, you must reset the OPcache manually or restart the
    30. ; webserver for changes to the filesystem to take effect.
    31. ;opcache.validate_timestamps=1
    32.  
    33. ; How often (in seconds) to check file timestamps for changes to the shared
    34. ; memory storage allocation. ("1" means validate once per second, but only
    35. ; once per request. "0" means always validate)
    36. ;opcache.revalidate_freq=2
    37.  
    38. ; Enables or disables file search in include_path optimization
    39. ;opcache.revalidate_path=0
    40.  
    41. ; If disabled, all PHPDoc comments are dropped from the code to reduce the
    42. ; size of the optimized code.
    43. ;opcache.save_comments=1
    44.  
    45. ; If enabled, a fast shutdown sequence is used for the accelerated code
    46. ;opcache.fast_shutdown=0
    47.  
    48. ; Allow file existence override (file_exists, etc.) performance feature.
    49. ;opcache.enable_file_override=0
    50.  
    51. ; A bitmask, where each bit enables or disables the appropriate OPcache
    52. ; passes
    53. ;opcache.optimization_level=0xffffffff
    54.  
    55. ;opcache.inherited_hack=1
    56. ;opcache.dups_fix=0
    57.  
    58. ; The location of the OPcache blacklist file (wildcards allowed).
    59. ; Each OPcache blacklist file is a text file that holds the names of files
    60. ; that should not be accelerated.
    61. opcache.blacklist_filename=/etc/php.d/opcache*.blacklist
    62.  
    63. ; Allows exclusion of large files from being cached. By default all files
    64. ; are cached.
    65. ;opcache.max_file_size=0
    66.  
    67. ; Check the cache checksum each N requests.
    68. ; The default value of "0" means that the checks are disabled.
    69. ;opcache.consistency_checks=0
    70.  
    71. ; How long to wait (in seconds) for a scheduled restart to begin if the cache
    72. ; is not being accessed.
    73. ;opcache.force_restart_timeout=180
    74.  
    75. ; OPcache error_log file name. Empty string assumes "stderr".
    76. ;opcache.error_log=
    77.  
    78. ; All OPcache errors go to the Web server log.
    79. ; By default, only fatal errors (level 0) or errors (level 1) are logged.
    80. ; You can also enable warnings (level 2), info messages (level 3) or
    81. ; debug messages (level 4).
    82. ;opcache.log_verbosity_level=1
    83.  
    84. ; Preferred Shared Memory back-end. Leave empty and let the system decide.
    85. ;opcache.preferred_memory_model=
    86.  
    87. ; Protect the shared memory from unexpected writing during script execution.
    88. ; Useful for internal debugging only.
    89. ;opcache.protect_memory=0
    90.  
    91. ; Allows calling OPcache API functions only from PHP scripts which path is
    92. ; started from specified string. The default "" means no restriction
    93. ;opcache.restrict_api=
    94.  
    95. ; Enables and sets the second level cache directory.
    96. ; It should improve performance when SHM memory is full, at server restart or
    97. ; SHM reset. The default "" disables file based caching.
    98. ; RPM note : file cache directory must be owned by process owner
    99. ;   for mod_php, see /etc/httpd/conf.d/php.conf
    100. ;   for php-fpm, see /etc/php-fpm.d/*conf
    101. ;opcache.file_cache=
    102.  
    103. ; Enables or disables opcode caching in shared memory.
    104. ;opcache.file_cache_only=0
    105.  
    106. ; Enables or disables checksum validation when script loaded from file cache.
    107. ;opcache.file_cache_consistency_checks=1
    108.  
    109. ; Enables or disables copying of PHP code (text segment) into HUGE PAGES.
    110. ; This should improve performance, but requires appropriate OS configuration.
    111. opcache.huge_code_pages=1
    Первые строки говорят о том, какое расширение загрузить и что нужно включить опкеш.

    Код (Text):
    1. ; Determines if Zend OPCache is enabled for the CLI version of PHP
    2. ;opcache.enable_cli=0
    Это настройка касается кеширования файлов php если они вызываются из коммандной строки. Вам скорее всего не понадобится никогда.

    Код (Text):
    1. ; The OPcache shared memory storage size.
    2. opcache.memory_consumption=128
    Эта настройка регулирует размер кеша в мегабайтах. Если у вас мало мегабайтов оперативной памяти, то и тут ставьте немного.

    Код (Text):
    1. ; The amount of memory for interned strings in Mbytes.
    2. opcache.interned_strings_buffer=8
    Количество памяти отводимое для хранения текствой информации, а именно строк, встречающихся в ваших скриптах. Если одинаковые строки встречаются в разных скриптах, то они смогут жить в этом хранилище в одном экземпляре, что экономит память. На текущем этапе обе эти настройки можно ставить от балды.

    Код (Text):
    1. ; The maximum number of keys (scripts) in the OPcache hash table.
    2. ; Only numbers between 200 and 100000 are allowed.
    3. opcache.max_accelerated_files=4000
    Количество файлов, которые будут жить в кеше. Пофик, оставьте как есть. Вряд ли вы наклепаете больше за ближайшие годы.

    Код (Text):
    1. ; The maximum percentage of "wasted" memory until a restart is scheduled.
    2. ;opcache.max_wasted_percentage=5
    Переодически кеш будет перезапускаться и полность опусташаться. Можно не трогать.

    Код (Text):
    1. ; When this directive is enabled, the OPcache appends the current working
    2. ; directory to the script key, thus eliminating possible collisions between
    3. ; files with the same name (basename). Disabling the directive improves
    4. ; performance, but may break existing applications.
    5. ;opcache.use_cwd=1
    Кеш будет различать файлы не только по имени, но и по полному пути. Я включу.
     
    #14 igordata, 25 июн 2016
    Последнее редактирование: 26 июн 2016
    Noobasishe, Aerofreak, mahmuzar и ещё 1-му нравится это.
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Код (Text):
    1. ; When disabled, you must reset the OPcache manually or restart the
    2. ; webserver for changes to the filesystem to take effect.
    3. ;opcache.validate_timestamps=1
    Важная настройка. В принципе кеш может закешировать файлы и больше никогда их не перечитывать, даже если они изменились. @Ganzal любит так делать. Если некий страшный вирус изменит файлы сайта, то в кеше они останутся как были при загрузке. Просто при заливки новой версии сайта нужно перезапускать php-fpm или чистить кеш через API. Но так как виртуалку обычно используют для локальной быстрой и удобной разработки, то лучше сказать кешу, чтобы он проверял файлы на изменение при каждом запросе.

    Код (Text):
    1. ; How often (in seconds) to check file timestamps for changes to the shared
    2. ; memory storage allocation. ("1" means validate once per second, but only
    3. ; once per request. "0" means always validate)
    4. ;opcache.revalidate_freq=2
    Предыдущая настройка в принципе включает проверку изменения, а эта настройка говорит, как часто проверять. Для локальной разработки стоит поставит ноль, т.е. при каждом запросе.

    Код (Text):
    1. ; Enables or disables file search in include_path optimization
    2. ;opcache.revalidate_path=0
    Пока можете не трогать. Эта настройка хитрая, она нужна, если вы используете пути, внутри которых есть ссылки, которые вы меняете, но сами-то пути при этом не меняются. Если вы однажды сталкнётесь со странным поведением кеша, когда вы меняете ссылки на папки и файлы, то тогда надо будет включить её.

    Код (Text):
    1. ; If disabled, all PHPDoc comments are dropped from the code to reduce the
    2. ; size of the optimized code.
    3. ;opcache.save_comments=1
    Позволяет сохранять комментарии, которые были сделаны в коде. Возможно иногда нужно при дебаге. Шут знает. Можно выключить.

    Код (Text):
    1. ; If enabled, a fast shutdown sequence is used for the accelerated code
    2. ;opcache.fast_shutdown=0
    Ускоряет выключение кеша при его перезапуске. В этом мире нет ничего бесплатного, и это наверняка влечет за собой какие-то последствия. Но я включу.

    Код (Text):
    1. ; Allow file existence override (file_exists, etc.) performance feature.
    2. ;opcache.enable_file_override=0
    Штука нужная в определённых случаях. Если вы часто проверяете существование пути к большому количеству файлов, то вот опкод кешер может закешировать их пути и некоторую не знаю какую информацию о файлах. Я использую иногда. И сейчас включу.

    Код (Text):
    1. ; A bitmask, where each bit enables or disables the appropriate OPcache
    2. ; passes
    3. ;opcache.optimization_level=0xffffffff
    Даже не буду пытаться понять, что это.

    Код (Text):
    1. ;opcache.inherited_hack=1
    2. ;opcache.dups_fix=0
    Явно какая-то легаси хрень.

    Код (Text):
    1. ; The location of the OPcache blacklist file (wildcards allowed).
    2. ; Each OPcache blacklist file is a text file that holds the names of files
    3. ; that should not be accelerated.
    4. opcache.blacklist_filename=/etc/php.d/opcache*.blacklist
    Ну тут учите английский. Название говорит само за себя.

    Код (Text):
    1. ; Allows exclusion of large files from being cached. By default all files
    2. ; are cached.
    3. ;opcache.max_file_size=0
    И тут.

    Код (Text):
    1. ; Check the cache checksum each N requests.
    2. ; The default value of "0" means that the checks are disabled.
    3. ;opcache.consistency_checks=0
    Не нужно это включать. Проверка того, что в кеше нет битых данных. Ни разу в жизни ещё не встречал битый опкеш, а при разработке на локалке это тем более не проблема.

    Код (Text):
    1. ; How long to wait (in seconds) for a scheduled restart to begin if the cache
    2. ; is not being accessed.
    3. ;opcache.force_restart_timeout=180
    Принудительный рестарт кеша через указанное число секунд. Оставим как есть.

    Код (Text):
    1. ; OPcache error_log file name. Empty string assumes "stderr".
    2. ;opcache.error_log=
    Отдельный лог для опкешера, куда он может писать свои ошибки. В реальности не нужно, пока петух жареный не клюнет.

    Код (Text):
    1. ; All OPcache errors go to the Web server log.
    2. ; By default, only fatal errors (level 0) or errors (level 1) are logged.
    3. ; You can also enable warnings (level 2), info messages (level 3) or
    4. ; debug messages (level 4).
    5. ;opcache.log_verbosity_level=1
    Управляет степенью подробности лога. Нет лога, нет и подробности.

    Код (Text):
    1. ; Preferred Shared Memory back-end. Leave empty and let the system decide.
    2. ;opcache.preferred_memory_model=
    Это вообще не надо трогать.

    Код (Text):
    1. ; Protect the shared memory from unexpected writing during script execution.
    2. ; Useful for internal debugging only.
    3. ;opcache.protect_memory=0
    Из описания явствует, что данная настройка мало кому нужна. Поверим на слово.

    Код (Text):
    1. ; Allows calling OPcache API functions only from PHP scripts which path is
    2. ; started from specified string. The default "" means no restriction
    3. ;opcache.restrict_api=
    Позволяет ограничить доступ к API опкешера только теми скриптами, путь к которрым начинается с данной строки. Пустая строка позволяет всем всё.

    Код (Text):
    1. ; Enables and sets the second level cache directory.
    2. ; It should improve performance when SHM memory is full, at server restart or
    3. ; SHM reset. The default "" disables file based caching.
    4. ; RPM note : file cache directory must be owned by process owner
    5. ;   for mod_php, see /etc/httpd/conf.d/php.conf
    6. ;   for php-fpm, see /etc/php-fpm.d/*conf
    7. ;opcache.file_cache=
    Эта настройка позволяет задать папку, куда кешер будет складывать все свои кеши. Смысла в этом для нас нет. В этом есть смысл только, если у вас целая прорва скриптов, и их компиляция занимает заметное время при старте сервера.

    Код (Text):
    1. ; Enables or disables opcode caching in shared memory.
    2. ;opcache.file_cache_only=0
    Включает кеш только на файликах. Не надо включать кеш только на файликах. Оставьте как есть.

    Код (Text):
    1. ; Enables or disables checksum validation when script loaded from file cache.
    2. ;opcache.file_cache_consistency_checks=1
    Проверка целостности данных в файликах кеша. Т.к. у нас отключено хранение кеша в файлах, то можно забить.

    Код (Text):
    1.  Enables or disables copying of PHP code (text segment) into HUGE PAGES.
    2. ; This should improve performance, but requires appropriate OS configuration.
    3. opcache.huge_code_pages=1
    Размер обычной страницы памяти по историческим причинам это 4KB всего. Но благодаря революционному прорыву в математике, в XXI веке можно использовать ОГРОМНЫЕ СТРАНИЦЫ ажно 2 мегабайта размером. Да будет так.
     
    #15 igordata, 25 июн 2016
    Последнее редактирование: 26 июн 2016
    Noobasishe, Aerofreak, mahmuzar и ещё 1-му нравится это.
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Итоговый конфиг
    Конфиг получился таким:
    Код (Text):
    1. ; Enable Zend OPcache extension module
    2. zend_extension=opcache.so
    3.  
    4. ; Determines if Zend OPCache is enabled
    5. opcache.enable=1
    6.  
    7. ; Determines if Zend OPCache is enabled for the CLI version of PHP
    8. ;opcache.enable_cli=0
    9.  
    10. ; The OPcache shared memory storage size.
    11. opcache.memory_consumption=128
    12.  
    13. ; The amount of memory for interned strings in Mbytes.
    14. opcache.interned_strings_buffer=8
    15.  
    16. ; The maximum number of keys (scripts) in the OPcache hash table.
    17. ; Only numbers between 200 and 100000 are allowed.
    18. opcache.max_accelerated_files=4000
    19.  
    20. ; The maximum percentage of "wasted" memory until a restart is scheduled.
    21. ;opcache.max_wasted_percentage=5
    22.  
    23. ; When this directive is enabled, the OPcache appends the current working
    24. ; directory to the script key, thus eliminating possible collisions between
    25. ; files with the same name (basename). Disabling the directive improves
    26. ; performance, but may break existing applications.
    27. opcache.use_cwd=1
    28.  
    29. ; When disabled, you must reset the OPcache manually or restart the
    30. ; webserver for changes to the filesystem to take effect.
    31. opcache.validate_timestamps=1
    32.  
    33. ; How often (in seconds) to check file timestamps for changes to the shared
    34. ; memory storage allocation. ("1" means validate once per second, but only
    35. ; once per request. "0" means always validate)
    36. opcache.revalidate_freq=0
    37.  
    38. ; Enables or disables file search in include_path optimization
    39. ;opcache.revalidate_path=0
    40.  
    41. ; If disabled, all PHPDoc comments are dropped from the code to reduce the
    42. ; size of the optimized code.
    43. opcache.save_comments=0
    44.  
    45. ; If enabled, a fast shutdown sequence is used for the accelerated code
    46. opcache.fast_shutdown=1
    47.  
    48. ; Allow file existence override (file_exists, etc.) performance feature.
    49. opcache.enable_file_override=1
    50.  
    51. ; A bitmask, where each bit enables or disables the appropriate OPcache
    52. ; passes
    53. ;opcache.optimization_level=0xffffffff
    54.  
    55. ;opcache.inherited_hack=1
    56. ;opcache.dups_fix=0
    57.  
    58. ; The location of the OPcache blacklist file (wildcards allowed).
    59. ; Each OPcache blacklist file is a text file that holds the names of files
    60. ; that should not be accelerated.
    61. opcache.blacklist_filename=/etc/php.d/opcache*.blacklist
    62.  
    63. ; Allows exclusion of large files from being cached. By default all files
    64. ; are cached.
    65. ;opcache.max_file_size=0
    66.  
    67. ; Check the cache checksum each N requests.
    68. ; The default value of "0" means that the checks are disabled.
    69. ;opcache.consistency_checks=0
    70.  
    71. ; How long to wait (in seconds) for a scheduled restart to begin if the cache
    72. ; is not being accessed.
    73. ;opcache.force_restart_timeout=180
    74.  
    75. ; OPcache error_log file name. Empty string assumes "stderr".
    76. ;opcache.error_log=
    77.  
    78. ; All OPcache errors go to the Web server log.
    79. ; By default, only fatal errors (level 0) or errors (level 1) are logged.
    80. ; You can also enable warnings (level 2), info messages (level 3) or
    81. ; debug messages (level 4).
    82. ;opcache.log_verbosity_level=1
    83.  
    84. ; Preferred Shared Memory back-end. Leave empty and let the system decide.
    85. ;opcache.preferred_memory_model=
    86.  
    87. ; Protect the shared memory from unexpected writing during script execution.
    88. ; Useful for internal debugging only.
    89. ;opcache.protect_memory=0
    90.  
    91. ; Allows calling OPcache API functions only from PHP scripts which path is
    92. ; started from specified string. The default "" means no restriction
    93. ;opcache.restrict_api=
    94.  
    95. ; Enables and sets the second level cache directory.
    96. ; It should improve performance when SHM memory is full, at server restart or
    97. ; SHM reset. The default "" disables file based caching.
    98. ; RPM note : file cache directory must be owned by process owner
    99. ;   for mod_php, see /etc/httpd/conf.d/php.conf
    100. ;   for php-fpm, see /etc/php-fpm.d/*conf
    101. ;opcache.file_cache=
    102.  
    103. ; Enables or disables opcode caching in shared memory.
    104. ;opcache.file_cache_only=0
    105.  
    106. ; Enables or disables checksum validation when script loaded from file cache.
    107. ;opcache.file_cache_consistency_checks=1
    108.  
    109. ; Enables or disables copying of PHP code (text segment) into HUGE PAGES.
    110. ; This should improve performance, but requires appropriate OS configuration.
    111. opcache.huge_code_pages=1
    Если удалить все закомментированные строки, то конфиг выходит компактным и понятным:
    Код (Text):
    1. zend_extension=opcache.so
    2. opcache.enable=1
    3. opcache.memory_consumption=128
    4. opcache.interned_strings_buffer=8
    5. opcache.max_accelerated_files=4000
    6. opcache.use_cwd=1
    7. opcache.validate_timestamps=1
    8. opcache.revalidate_freq=0
    9. opcache.save_comments=0
    10. opcache.fast_shutdown=1
    11. opcache.enable_file_override=1
    12. opcache.blacklist_filename=/etc/php.d/opcache*.blacklist
    13. opcache.huge_code_pages=1
    Давайте его и запишем в наш /etc/php.d/10-opcache.ini и сохраним. Нужно перезапустить php-fpm коммандой
    Код (Text):
    1. systemctl restart php-fpm
    Скажу, что если сервис не был запущен, то нужно использовать команду
    Код (Text):
    1. systemctl start php-fpm
     
    #16 igordata, 25 июн 2016
    Последнее редактирование: 26 июн 2016
    Noobasishe, Aerofreak, mahmuzar и ещё 1-му нравится это.
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    IDE

    Есть парочка весьма неплохих IDE, одна бесплатная - NetBeans и одна платная - PhpStorm.
    Когда у вас есть проект, то можно повелеть IDE при каждом сохранении проекта закидывать копию в расшаренную папку. Кто-то может спросить, почему бы сразу ни начать работать в шаре, но IDE или системой версий хранят в папке проекта свои технические файлики. IDE будет достаточно умна, чтобы не закидывать в шару лишние файлы, а копировать только файлы проекта. Если вы не пользуетесь системой версий или IDE, то привыкайте сразу делать правильно, потому что очень скоро всё это вам понадобится.

    NetBeans
    Чтобы NetBeans закидывал файлы по мере их изменения в расшареную папку, надо поставить ему галку в настройках проекта:
    upload_2016-6-25_22-1-14.png

    А потом поставить галку и указать путь к папке с сайтом:
    upload_2016-6-25_22-2-47.png

    PhpStorm
    В IDE PhpStorm немного другая последовательность шагов. Нужно просто указать, что файлы нужно заливать не на FTP, как обычно, а в папку:
    upload_2016-6-25_22-20-47.png

    Потом кликнуть на плюсик и добавить настройки заливки:
    upload_2016-6-25_22-22-14.png
    Имя добавьте по вкусу.

    Потом нужно указать путь к папке:
    upload_2016-6-25_22-35-39.png
    Потом во вкладке про маппинг ввести слеш в путь, куда заливать относительно папки (т.е. получится просто в саму папку):
    upload_2016-6-25_22-30-24.png

    Если это не единственный способ заливки, нужно активировать этот способ. Ведь у вас может быть несколько серверов или способов заливки файлов. Нужно скзаать IDE, что сейчас она должна использовать этот:
    upload_2016-6-25_22-37-48.png

    И теперь нужно включить автоматическую заливку:
    upload_2016-6-25_22-31-8.png

    Пока всё.
     
    #17 igordata, 25 июн 2016
    Последнее редактирование: 26 июн 2016
    Noobasishe, Aerofreak, mahmuzar и ещё 1-му нравится это.
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    xDebug

    Для удобного программирования во всех IDE есть возможность поставить выполнение программ на паузу, и открыв исходник, получить представление обо всех значениях всех переменных. Это можно сделать несколькими способами, один из которых - поставить точку остановки на какую-либо строчку. Т.е. если вы хотите знать, куда пошла программа:
    PHP:
    1. <?php
    2. if ($var) {
    3.   funcA();
    4. } else {
    5.   funcB();
    6. }
    То вы можете это сделать, поставив точку остановки на третью и пятые строки, и вы узнаете, как именно протекает выполнение программы потому, что когда до этого дойдёт, выполнение программы остановится на одной из них.

    Выполнение программы не прерывается, а лишь ставится на паузу и ждёт вашего решения - работать дальше или остановиться совсем. Таким образом вы можете построчно, по шагам изучать поведение вашего кода в проблемных случаях, имея возможность видеть все значения всех переменных.

    Но в PHP не всё так просто. PHP выполняется на сервере, а разработку вы ведёте локально. Даже если это один и тот же компьютер, всё равно эти процессы никак не связаны. Их нужно связать.

    Для PHP есть несколько расширений для отладки ваших скриптов. Один из них - xDebug. Он получил широкую поддержку среди IDE и утилит для визуализации логов отладки. Логи отладки даже у простой программы могут достигать 30 мегабайт за один вызов. Вручную там разобраться сложно. Но это тема отдельного разговора и сейчас я её касаться не хочу.

    Чтобы установить расширение xDebug на нашу виртуалку достаточно написать:
    Код (Text):
    1. yum install xdebug
    Простите, я вас обманул. Это расширение для PHP, а не отдельная программа. Но можно воспользоваться поиском, и увидеть, есть ли пакеты с подходящим названием:
    Код (Text):
    1. yum search xdebug
    выдаст на нашей конфигурации такой вот странный ответ:
    Код (Text):
    1. ============== N/S matched: xdebug ===============
    2. php-pecl-xdebug.x86_64 : PECL package for debugging PHP scripts
    3. php54-php-pecl-xdebug.x86_64 : PECL package for debugging PHP scripts
    4. php55-php-pecl-xdebug.x86_64 : PECL package for debugging PHP scripts
    5. php56-php-pecl-xdebug.x86_64 : PECL package for debugging PHP scripts
    6. php70-php-pecl-xdebug.x86_64 : PECL package for debugging PHP scripts
    7. php71-php-pecl-xdebug.x86_64 : PECL package for debugging PHP scripts
    Т.к. в тех репозиториях, что мы поставили и включили есть возможность ставить разные версии PHP, то и расширения доступны под разные версии. Пакет, чьё название начинается с php54 это пакет расширения для PHP версии 5.4, а php71 для 7.1 соответственно.

    Но самой первой строчкой идёт просто "php-pecl-xdebug" безо всяких циферок. Если приоритеты репозиториев расставлены правильно, то установится подходящая версия. Можно проверить:
    Код (Text):
    1. yum info php-pecl-xdebug
    Эта команда сам за себя говорит: info предоставляет информацию о пакете. Информация такая:
    Код (Text):
    1. Name        : php-pecl-xdebug
    2. Arch        : x86_64
    3. Version     : 2.4.0
    4. Release     : 1.el7.remi.7.0
    5. Size        : 192 k
    6. Repo        : remi-php70
    7. Summary     : PECL package for debugging PHP scripts
    8. URL         : http://xdebug.org/
    9. License     : BSD
    10. Description : The Xdebug extension helps you debugging your script by providing a lot of
    11.             : valuable debug information. The debug information that Xdebug can provide
    12.             : includes the following:
    13.             :
    14.             : * stack and function traces in error messages with:
    15.             :   o full parameter display for user defined functions
    16.             :   o function name, file name and line indications
    17.             :   o support for member functions
    18.             : * memory allocation
    19.             : * protection for infinite recursions
    20.             :
    21.             : Xdebug also provides:
    22.             :
    23.             : * profiling information for PHP scripts
    24.             : * code coverage analysis
    25.             : * capabilities to debug your scripts interactively with a debug client
    26.             :
    27.             : Package built for PHP 7.0.
    Если вы делаете настройку виртуалки по данной статье где-нибудь в году 2017 или 2018, то наверное выбрали не 7.0 версию, как я, а может даже 7.4 или ещё новее. Вот вам и пригодится эта команда, чтобы удостовериться, подходит ли вам эта версия пакета, или лучше поставить другую, указав, какую именно.

    Можно на всякий случай посмотреть, какая версия php-fpm стоит у нас:
    Код (Text):
    1. yum list php-fpm
    Получим простой ответ:
    Код (Text):
    1. Installed Packages
    2. php-fpm.x86_64               7.0.8-1.el7.remi               @remi-php70
    Очевидно, что стоит php-fpm для 64-битной платформы версии 7.0.8 из репозитория remi-php7.0. Ну и хорошо.

    Давайте уже наконец установим расширение:
    Код (Text):
    1. yum install php-pecl-xdebug
    Теперь его нужно настроить, настроить IDE, т.к. само по себе оно не работает, открыть порты фаерволов, и т.п. Тогда заработает.
     
    #18 igordata, 25 июн 2016
    Последнее редактирование: 3 июл 2016
    Noobasishe, Aerofreak, mahmuzar и ещё 1-му нравится это.
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Настройка xDebug
    На сервере в папке /etc/php.d/ лежит файл 15-xdebig.ini с таким содержимым:
    Код (Text):
    1. ; Enable xdebug extension module
    2. zend_extension=xdebug.so
    3.  
    4. ; see http://xdebug.org/docs/all_settings
    Не слишком-то содержательно. Но если перейти по ссылке, то можно найти достаточно подробные описания.

    Однако, в ближайшие годы вам понадобятся только вот эти две штуки параметров:
    Код (Text):
    1. xdebug.remote_enable = 1
    2. xdebug.remote_connect_back = 1
    И всё.
    Первая включает дебаг, вторая позволяет не вводить IP-адрес, по которой ждёт подключения IDE. Благодаря этой настройке xDebug будет сам подключаться к тому IP, с которого пришел запрос на дебаг.

    var_dump() + xDebug = ♡
    Для упрощения дебага xDebug добавляет раскраску цветами и форматирование в вывод функции var_dump(). Например, вот как на этой картинке, которую я нашёл в гугле:
    [​IMG]

    Для лучшей глубины отрисовки нужно добавить в конфиг такие строки:
    Код (Text):
    1. xdebug.var_display_max_data = 4096
    2. xdebug.var_display_max_depth = 7
    Ну или больше.
    В противном случае xDebug будет рисовать многоточия при глубокой вложенности и на длинных строках.

    Ещё это расширение раскрашивает ошибки и сразу выводит по ним трейс:
    [​IMG]


    Полный конфиг получился таким:
    Код (Text):
    1. ; Enable xdebug extension module
    2. zend_extension=xdebug.so
    3.  
    4. ; see http://xdebug.org/docs/all_settings
    5. xdebug.remote_enable = 1
    6. xdebug.remote_connect_back = 1
    7. xdebug.var_display_max_data = 4096
    8. xdebug.var_display_max_depth = 7
    Чтобы новый конфиг прочитался, нужно перезапустить php-fpm командой "systemctl restart php-fpm".

    Чтобы удостовериться, что конфиг подцепился, и настройки прочитаны верные, можно опять заглянуть в вывод функции phpinfo(). Теперь в поиске по странице по слову xdebug должны быть всякие параметры.
     
    #19 igordata, 25 июн 2016
    Последнее редактирование: 4 июл 2016
    Noobasishe, Aerofreak, mahmuzar и ещё 1-му нравится это.
  20. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Настройка IDE и дебаг
    В связке xDebug и IDE используется исходящее с сервера подключение обратно на клиента, с которого пришел запрос. Значит на клиенте должен быть открыт порт подключения, а именно - 9000. Конечно, порт можно поменять настройках xDebug и IDE.

    Важно понять, что так как все файлики вашего проекта живут в IDE у вас на компе, а дебаг и выполнение PHP происходят на сервере (так или иначе), то xDebug и ваша IDE могут знать ваши файлики под разными именами. Т.е. у вас это "index.php" или там "C:\Users\igors\Documents\NetBeansProjects\PhpProject1\index.php", а на сервере уже "/index.php" или даже "/var/www/example.com/index.php". Нужно им помочь. Это называется маппинг. Настройка маппинга увязывает локальный путь проекта и путь на сервере, таким образом, что IDE может понять, какой сейчас на сервере файл выполняется, и что делать.


    NetBeans
    Чтобы настроить NetBeans для этого дела у меня обычно уходит час. Я просто никак не могу запомнить всю последовательность шагов, и мне приходится нащупывать её каждый раз заново. Хотя впрочем я и не пытаюсь. Обычно настройка IDE под xDebug случается один раз в год, а то и реже. Так что если что-то поменяется, просто потыкайтесь.

    upload_2016-7-3_22-1-55.png

    А там в Run Configuration (которая в русском переводе может звучать как "Запуск настройки", а по на самом деле, как вы понимаете это "Настройка запуска", поэтому учите язык) тыкаете в Advanced кнопочку справа, которая на следующей иллюстрации под номером один. Там вы указываете путь на сервере (два) и путь к папке проекта (собственно, три).

    upload_2016-7-3_22-14-37.png

    После этого должно заработать. Давайте проверять. Введите такой код ваш index.php:
    PHP:
    1. <?php
    2.  
    3. for ($i = 0; $i < 3; $i++) {
    4.     echo '$i = ' . (int) $i . '<br>';
    5. }
    И если кликнуть в строку, там где номер, то появится красный квадратик, а строка станет красной:
    upload_2016-7-3_22-20-15.png

    Давайте, тыкайте в четвёртую строку, пока она не покраснеет. Это называется "установить брейкпоинт", от breakpoint, что переводится, как точка ломания.

    Если мы просто запустим нашу программу, то получим в браузере некий ответ, перечисляющий цифры от нуля до двух:
    upload_2016-7-3_22-23-14.png
    Результат:
    upload_2016-7-3_22-23-38.png

    Но если теперь запустить дебаг проекта:
    upload_2016-7-3_22-25-14.png


    ...если выскакивает окошко фаервола, то надо разрешить:
    [​IMG]

    То получим мы вот такой вот залипон браузера, который ждёт ответа от сервера, который ничего не отвечает, потому что ждёт ваших дальнейших действий:
    upload_2016-7-3_22-26-39.png

    Теперь во время дебага вам стали доступны несколько дополнительных кнопок, а исполнение программы останавливается на красных строчках. Текущая строчка подсвечена зелёным.

    upload_2016-7-3_22-34-4.png

    Вы можете нажать на кнопку "стоп" и тогда программа оборвётся и не придётся ждать конца её исполнения. Либо нажать на зелёный круг с треугольничком, и тогда исполнение программы продолжится до следующего брейк-поинта или до конца кода.

    Теперь можно отследить в какую ветку кода пошло выполнение программы, и можно заглядывать внутрь значений всех переменных просто наводя на них мышку:
    upload_2016-7-3_22-37-38.png
    Или на панели для дебага, которая выскакивает при запуске отладки:
    upload_2016-7-3_22-41-11.png
     
    #20 igordata, 25 июн 2016
    Последнее редактирование: 7 июл 2016
    Noobasishe, Aerofreak, mahmuzar и ещё 1-му нравится это.
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    PhpStorm
    В IDE PhpStorm как и в любой другой IDE так же есть две кнопки. Одна для запуска приложения и для его дебага.

    upload_2016-7-7_0-47-28.png

    Кнопка запуска приложения представлена в виде треугольничка (2). Сейчас он серый, т.к. нужно добавить профиль запуска. Кнопка дебага расположена рядом и выглядит как жучок (3). Тоже серая и неактивная на текущий момент.

    Для того, чтобы настроить профили запуска и дебага, нужно нажать на кнопочку слева от них (1).
    upload_2016-7-7_0-50-7.png

    Тогда появится окошко с конфигурациями. В нём в списке слева в группе "Default" скрывается куча непонятных профилей, которые трогать и менять не нужно. Не обращайте на них внимания. Просто кликайте на плюсик вверху слева:
    upload_2016-7-7_0-52-4.png

    Кликайте на зелёный плюсик и выбирайте "PHP Web Application":
    upload_2016-7-7_0-53-15.png

    Вводите название, как видите, можно выбрать браузер. Т.е. можно создать несколько профилей запуска для разных браузеров, если вам приспичит. Главное, необходимо настроить сервер, настроек которого сейчас нет, и дебаг невозможен.

    upload_2016-7-7_0-55-49.png

    В окоше создания профиля сервера так же кликайте на плюсик, вводите название и ставьте галку "Use path mappings":
    upload_2016-7-7_0-59-30.png

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

    Тыкайте везде ОК и запускайте проект треугольничком.

    Если выскакивает окошко фаервола, то надо разрешить:
    upload_2016-7-7_1-1-15.png


    Если работает - отлично!

    По умолчанию, PhpStorm почему-то не показывает номера строк. Чтобы их включить, нужно зайти в настройки:
    upload_2016-7-7_1-8-20.png

    Потом наберите в поиске "line numbers" и поставьте недостающую галку:
    upload_2016-7-7_1-9-57.png

    Теперь PhpStorm будет показывать номера строк.
     
    #21 igordata, 25 июн 2016
    Последнее редактирование: 7 июл 2016
    Noobasishe, Aerofreak и denis01 нравится это.
  22. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    PhpStorm + xDebug
    В предыдущей главе мы удачно настроили параметры запуска нашего приложения, а так же парметры сервера, включая маппинг локальных путей на пути сервера.

    Теперь попробуйте дебаг.
    Предположим, что наш код выглядит вот так:
    PHP:
    1. <?php
    2.  
    3. for ($i = 0; $i < 3; $i++) {
    4.     echo '$i = ' . (int) $i . '<br>';
    5. }
    Установите точку остановки на середину цикла, кликнув чуть правее номера четвёртой строки и нажимайте на кнопку с жучком:
    upload_2016-7-7_1-15-10.png

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

    upload_2016-7-7_1-17-30.png

    По всему скрипту подсвечены значения переменных, это очень удобно. При запуске дебага так же появляется специальная панель внизу, которую я предпочитаю держать справа. В ней вы можете контролировать дальнейший ход программы, видеть все переменные, доступные на текущий момент. Чтобы возобновить ход программы нажмите на зелёный треугольник здесь, а не вверху! Верхний перезапустит программу, но скорее всего не получит ответа, т.к. PHP занят ожиданием ответа от дебага.

    Если запустить дебаг второй раз, то создастся новая сессия подключения к xDebug. Чтобы их не плодить, стоит поставить галку:
    upload_2016-7-7_1-22-4.png
    Она в одном из тех окошек, в которых мы ковырялись в прошлой главе.

    Собственно всё. Теперь вы можете удобно отлаживать и запускать свои творения.
     
    #22 igordata, 25 июн 2016
    Последнее редактирование: 7 июл 2016
    Noobasishe, Aerofreak, Dmitriy A. Arteshuk и 2 другим нравится это.
  23. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Тема открыта. Спрашивайте, если кому что не понятно или интересно.
     
    Noobasishe и Aerofreak нравится это.
  24. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Статья про profiling с помощью xdebug будет? Спасибо за инструкции, уже даю ссылки на эту тему, чтобы новички отладку изучали.
     
  25. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Спасибо. Буду дальше стараться. Профайлинг запилю, только не знаю, когда. Вроде статью написал понятным для начинающих языком. Посмотрим на отклики.
     
    denis01 нравится это.