Настройка Yii2 и Nginx под yii2-app-advanced на одном домене

Дмитрий Корнев
31 октября 2016

Заготовка yii2-app-advanced мне нравится больше, чем yii2-app-basic, даже если требуется создать относительно простой сайт. При этом часто возникает необходимость настроить Yii2 и Nginx на работу frontend и backend в пределах одного домена. В этой статье рассмотрен самый простой способ это сделать. Я обычно настраиваю так в Debian. Но также делается в любом другом Lunux, и может даже в Windows.

Допустим Yii2 находится в каталоге /media/sf_Webdev/d1mon.loc/yii2,

тогда имеем такое расположение точек входа:

/media/sf_Webdev/d1mon.loc/yii2/backend/web

/media/sf_Webdev/d1mon.loc/yii2/frontend/web

Yii2 может быть где угодно.

/media/sf_Webdev — это общая папка Webdev, в случае если используется веб-сервер, настроенный в VirtualBox по этой инструкции. Сайт будет работать из каталога /var/www/d1mon.loc.

Соответственно frontend — это просто http://d1mon.loc.

Backend — это http://d1mon.loc/backend.

Сделаем символические ссылки на нужные каталоги и файлы:

ln -s /media/sf_Webdev/d1mon.loc/yii2/backend/web /var/www/d1mon.loc/backend
ln -s /media/sf_Webdev/d1mon.loc/yii2/frontend/web/assets /var/www/d1mon.loc/assets
ln -s /media/sf_Webdev/d1mon.loc/yii2/frontend/web/css /var/www/d1mon.loc/css
ln -s /media/sf_Webdev/d1mon.loc/yii2/frontend/web/favicon.ico /var/www/d1mon.loc/favicon.ico
ln -s /media/sf_Webdev/d1mon.loc/yii2/frontend/web/index.php /var/www/d1mon.loc/index.php
ln -s /media/sf_Webdev/d1mon.loc/yii2/frontend/web/robots.txt /var/www/d1mon.loc/robots.txt
На рабочем веб-сервере можно сделать проще. Всего две ссылки:
ln -s /путь_к_yii2/frontend/web /var/www/d1mon.loc
ln -s /путь_к_yii2/backend/web /var/www/d1mon.loc/backend

К сожалению это не работает, если имеем дело с общей папкой и VirtualBox. Общая папка — это для Linux внешний носитель, нельзя создавать там символические ссылки.

Настраиваем Nginx:

server {
    listen 80; ## for ipv4
    #listen [::]:80 default_server ipv6only=on; ## for ipv6

    server_name d1mon.loc;
    root /var/www/d1mon.loc;
    index index.php;

    access_log /var/log/www/d1mon.loc/access.log;
    error_log /var/log/www/d1mon.loc/error.log;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location /backend/ {
        try_files $uri $uri/ /backend/index.php$is_args$args;
        #auth_basic "closed site";
        #auth_basic_user_file https_passw;
    }

    location ~* ^.+\.(js|css|ttf|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|tar|bz2|pdf|doc|docx|rtf|xls|ppt|mp3)$ {
        #access_log off;
        #log_not_found off;
        #expires 3d; # кеширование статики 3 дня
        try_files $uri =404;
    }

    #error_page 404 /404.html;

    location ~ ^/assets/.*\.php$ {
        deny all;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
    }

    location ~* /\. {
        deny all;
    }
}

Это немного модифицированная официально рекомендуемая конфигурация Nginx для Yii2.

В backend/config/main.php добавим:

'components' => [
   'request' => [
       'baseUrl' => '/backend',
   ],
],

Всё, можно пользоваться.

Если вы будете пытаться настроить тоже самое для OpenServer, то вот статья о том, как создавать символические ссылки в Windows. Я так не делал, но, в теории, должно получится.

1 комментарий

Wi
Добрый день! У меня ваша конфигурация для NGINX не заработала! Ошибка крылась в простом - не было указано где грузить index.php ... location / { # относительно root указанного выше root /frontend/web; try_files $uri $uri/ /index.php&is_args$args; } ... # я указал /api вместо /backend -> просто мне так кажется красивее location /api { # относительно root указанного выше root /backend/web; try_files $uri $uri/ /index.php&is_args$args; } ... Надеюсь, кому-то поможет!