Установка и настройка Yii2 на виртуальном хостинге

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

    1. Установка Composer


    Так как опыта настройки сервера и работы в консоле Linux/Unix у меня немного, то первая проблема появилась уже при установке Composer. На сервере установлены несколько версий PHP, и по-умолчанию команды консоли выполняет PHP версии 5.2.17. А Composer требует версию PHP 5.3.2 и выше. Решение было таким:
    php -r "readfile('https://getcomposer.org/installer');" | php5.6
    

    Настройки сервера не дают возможности сделать Composer выполняемым и запускать напрямую, поэтому запускаем его через интерпретатор PHP, при этом не забывая указывать версию PHP:
    php5.6 composer.phar install
    

    Первый шаг выполнен — Composer установлен.

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


    Сначала всё по инструкции: устанавливаем плагин composer asset, который управляет зависимостями пакетов bower и npm.
    php5.6 composer.phar global require "fxp/composer-asset-plugin:~1.1.1"
    

    Это необходимо сделать только 1 раз, в дальнейшем можно устанавливать Yii2 несколько раз с помощью команд описанных ниже.
    Теперь выбираем какую версию шаблона Yii2 ставить: Basic или Advanced. Basic — простое приложение, а в Advanced реализовано разделение на публичную и административную часть (frontend и backend) и создана готовая модель (и таблица БД) user.

    2.1. Установка Yii2 Basic

    Сначала рассмотрим установку Basic, т.к. она проще, выполняется установка с помощью команды:
    php5.6 composer.phar create-project --prefer-dist yiisoft/yii2-app-basic mysite
    

    Где mysite — каталог в который необходимо установить Yii2, он должен быть пустым (если при создании каталога для сайта на сервере был автоматически создан подкаталог public_html, его необходимо удалить). Composer может запросить логин-пароль от Github (из-за ограничения на количество запросов у Гитхаба).

    Небольшое лирическое отступление про структуру каталогов на сервере и во фреймворке. Рассматриваемый виртуальный хостинг настроен так, что файлы сайтов располагаются в каталоге mysite/public_html. Файлы в каталоге public_html доступны из веба.

    Структура шаблона Yii2 Basic включает несколько файлов и каталогов, которые рекомендуется сделать недоступными из веба, чтобы «защитить от нежелательного доступа код и данные», а также каталог basic/web который как раз и предназначен быть корневой директорией веб сервера. Для необходимой структуры создадим «символьную» ссылку:
    cd mysite
    ln -s web public_html
    

    Теперь содержимое каталога basic/web — это наш сайт, а другие файлы фреймворка недоступны из сети.
    Yii2 Basic установлен, можно открыть сайт в браузере.

    2.1.1. Настройка Yii2 Basic

    Откройте файл config/db.php и измените параметры на верные для вашей базы данных. После 'charset' => 'utf8', можно указать префикс таблиц так: 'tablePrefix' => 'myprefix_' (если несколько сайтов используют одну базу данных).

    Далее настраиваем ссылки, по-умолчанию маршрутизация имеет вид /index.php?r=site%2Fabout, переведём ее в такой вид /site/about. Для этого создадим файл web/.htaccess с содержимым как рекомендуют в оф. гайде:
    Options +FollowSymLinks
    IndexIgnore */*
    
    RewriteEngine on
    
    # if a directory or a file exists, use it directly
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    
    # otherwise forward it to index.php
    RewriteRule . index.php
    

    Теперь веб-сервер знает, что запросы необходимо направлять на index.php, и указывать index.php в URL нет необходимости. Далее в файле config/web.php добавим (или раскомментируем) в $config = ['components'] после 'db' => require(__DIR__ . '/db.php'), следующие строки
     'urlManager' => [
                'enablePrettyUrl' => true,
                'showScriptName' => false,
                'rules' => [
                ],
            ],
    

    enablePrettyUrl — генерировать красивые ссылки, showScriptName — не писать имя скрипта index.php в ссылке. Теперь можно зайти на наш сайт и посмотреть, что он уже использует красивые ссылки типа /site/about.
    Отлично, с Yii2 Basic разобрались, теперь переходим к Advanced.

    2.2. Установка Yii2 Advanced

    Начало установки аналогично Basic:
    php5.6 composer.phar create-project --prefer-dist yiisoft/yii2-app-advanced mysite

    Yii2 установлен, в его каталоге mysite появились файлы и каталоги Yii2 в том числе frontend для публичной части сайта и backend для админки. Однако в frontend/web нет файла index.php, поэтому далее выполняем команду init для инициализации шаблона и создаем символьную ссылку для frontend:
    cd mysite
    php5.6 init
    ln -s frontend/web public_html
    

    Теперь фронтенд доступен по основному адресу сайта. Далее настраиваем бекенд:
    cd frontend/web
    ln -s ../../backend/web admin
    

    Теперь бекенд доступен по адресу /admin.
    Настраиваем красивые адреса во фронтенде:
    1. Создаем в /frontend/web такой же .htaccess как и в шаблоне Basic
    2. В конфиге /frontend/config/main.php прописываем то же самое

    Аналогичные операции проводим для бекенда. Попутно замечаем что файла db.php в каталоге config нет.
    Параметры для доступа к базе данных в Advanced указываются в common/config/main-local.php, там прописываем тоже что и в db.php в Basic. После чего применяем миграцию:
    php5.6 yii migrate
    

    В БД создаются таблицы migration и user.

    Ура! Yii2 установлен, настроен и готов к работе.

    Используемые источники


    Introduction — Composer
    The Definitive Guide to Yii 2.0 (официальный гайд по Yii2 на английском)
    Полное руководство по Yii 2.0 (русский перевод)
    Installation Yii2 Advanced
    How To Install The Advanced Template In Yii2
    Поделиться публикацией

    Комментарии 14

      +8
      1. Для аудитории хабры слабовато.
      2. Данный гайд очень специфичен для вашего случая и не покроет большинство кейсов установки.
        0
        Так ведь я и описывал специфичный случай моего опыта настройки с указанием тех подводных камней, с которыми столкнулся. Чтобы был гайд для тех, кто столкнется с теми же проблемами, и чтобы не искать ответы по нескольким страницам, а получить решение в 1 статье.
        +1
        Несколько дополнений:

        Папку web можно переименовать. Ее название нигде не используется, путь к webroot определяется по местоположению index.php.

        Можно напрямую переместить файлы из папки "backend/web" в папку "frontend/web/admin" и скорректировать пути в "frontend/web/admin/index.php".

        Можно разнести движок и webroot по разным папкам. Например, index.php в папке "mysite/public_html/", а движок в папке "mysite-engine/". Тоже нужно только скорректировать пути в индексных файлах.

        Можно даже таким образом запустить несколько сайтов на одном хостинге. Например, web-папки в "mysite/public_html/demo/[sitename]", а движки в "mysite-engine/[sitename]". Только при этом лучше хранение сессий сделать в БД, потому что иначе логин будет работать на всех сайтах сразу (и на самом mysite тоже, если он на Yii). При хранении в БД логин на одном сайте будет "выбивать" логин на другом.

        Один раз столкнулся с тем, что апач ругается на отсутствие файла index.php, если создана символьная ссылка на web. Особо не разбирался почему, исправилось добавлением слеша в .htaccess: "RewriteRule . /index.php".

        Еще столкнулся с тем, что консольные версии php запускаются как CGI. В нем отсутствуют константы STDIN, STDOUT, STDERR, и скрипт init не работает. Исправляется добавлением в init кода для открытия потоков:

        if (!defined('STDIN')) {
            define('STDIN', fopen('php://stdin', 'r'));
            define('STDOUT', fopen('php://stdout', 'w'));
            define('STDERR', fopen('php://stderr', 'w'));
        }
          0
          На некоторых виртуальных хостингах консоль вообще ни в каком виде не доступна, только ftp. И тогда не то, что composer, даже git непонятно, как использовать. Кто-нибудь пробовал на таком развернуться. Понятно, что это жесть, и лучше использовать vps, но все же…
            +3
            1. Разворачиваем локально.
            2. Заливаем по FTP как есть. То есть вместе с vendor.
              0
              Спасибо. Ну, да это понятно, что если просто скопироватьвесь проект, то будет все прекрасно работать. Это не к yii вопрос, а по развертыванию в целом.

              Обычно я подключаюсь к серверу по ssh, пробрасываю порт для mysq, подключаюсь через workbench или что-нибудь в этом роде. Клонирую проект в web директорию + ещё несколько дополнительных действий. Ну, или использую какое-нибудь деплой решение — capistrano, phing, самописный скрипт и т.д. Устанавливаю зависимости через composer, frontend зависимости через bower…
              Потом для обновления достаточно выполнить команду git pull.

              Но вдруг внезапно попадается виртуальный хостинг без ssh и имеющийся уже на нем проект, и понимаешь, что ничего из вышеперечисленного не работает. И добро пожаловать, filezilla, notepad++, phpmyadmin, редактирование по одному файлу.
              И ещё php 5.2, не дай бог(с этим проблем меньше, чаще всего можно выбрать версию поновее).

              И тут я понимаю, что некоторые до сих пор так и работают. Сам лично таких людей знаю. Ну, в общем, это конечно их дело, но даже непонятно, что им можно предложить. Фактически, сайт разрабатывается на production. Локально его запустить никто и никогда не пробовал. И даже с последней версией любимого фреймворка не особенно приятно в таких условиях работать. + Миграции работать не будут, т.к. их из консоли обычно запускают… Ftp медленный, файлов много мелких. При каждом изменении качать туда сюда весь проект — та ещё радость...

              В общем не хватает инструментов, к которым привык и без которых впадаешь в уныние...
                0
                По идее ведь это должно быть даже не очень сложно сделать. Пишется скрипт на PHP, который запускается из браузера, скачивает удаленный репозиторий во временную папку, потом пробегает по проекту, смотрит изменения и обновляет файлы. Например. Может немного по-другому работать.

                Такого же типа скрипт для туннелирования — вот тут не загвоздка, не понимаю как это сделать, и можно ли вообще. Но, кажется, где-то мне что-то подобное попадалось, не могу сейчас найти.

                Не знаю, можно ли подобным образом composer запустить… Для yii migrate и др. — просто веб версия, которая делает то же самое.

                Наверняка что-то подобное уже сделано.
                  0
                  Правда, не уверен, что это вообще пригодится кому-то. Все-таки проще VPS купить, это уж точно. Да и я не то, чтобы очень часто в такие ситуации попадаю...
                  0
                  Есть библиотека pclzip. Можно написать 2 скрипта для запаковки и распаковки папки с проектом, которые запускаются из браузера, и качать через ftp один архив.
                    0
                    некоторые IDE в том или ином виде поддерживают синхронизацию по ftp. так что все же можно избежать редактирования по 1 файлу с заливкой filezilla. Желаю чтобы таких проектов было поменьше :)
                0
                deleted
                  0
                  deleted
                    –1
                    > php -r «readfile('https://getcomposer.org/installer');» | php5.6

                    А хостинг не Таймвеб часом?
                    Очень похоже на их костылинг с разными версиями php, где версия cli древнее чем cgi.
                    Или эта модная фишка еще каких либо хостеров?
                      0
                      Хостинг Свеб.

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

                    Самое читаемое