Nginx и Yii2 advanced

Помогите настроить nginx для проекта на Yii2. Раньше использовал apache и все делал через htaccess. Сейчас решил перейти на nginx. Долго гуглил и вот что смог составить сам

server {
    listen      176.9.100.173:80;
    server_name site.com.ua www.site.com.ua;
    set $root   /home/admin/web/site.com.ua/public_html;
    root        $root;
    index       index.php index.html index.htm;
    access_log  /var/log/nginx/domains/site.com.ua.log combined;
    access_log  /var/log/nginx/domains/site.com.ua.bytes bytes;
    error_log   /var/log/nginx/domains/site.com.ua.error.log error;

    location / {
        root $root/frontend/web;
        index index.php index.html;
        try_files $uri $uri/ /index.php$is_args$args;

        location ~* ^.+\.(jpeg|jpg|png|gif|bmp|ico|svg|css|js)$ {
            expires     max;
        }

        location ~ [^/]\.php(/|$) {
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            if (!-f $document_root$fastcgi_script_name) {
                return  404;
            }

            fastcgi_pass    127.0.0.1:9001;
            fastcgi_index   index.php;
            include         /etc/nginx/fastcgi_params;
        }
    }

    error_page  403 /error/404.html;
    error_page  404 /error/404.html;
    error_page  500 502 503 504 /error/50x.html;

    location /error/ {
        alias   /home/admin/web/site.com.ua/document_errors/;
    }

    location ~* "/\.(htaccess|htpasswd)$" {
        deny    all;
        return  404;
    }

    location /admin {
        alias   $root/backend/web;
        index index.php;
        try_files $uri $uri/ /backend/web/index.php$is_args$args;

        location ~ [^/]\.php(/|$) {
            fastcgi_param SCRIPT_FILENAME $request_filename;
            if (!-f $request_filename) {
                return  500;
            }

            fastcgi_pass    127.0.0.1:9001;
            fastcgi_index   index.php;
            include         /etc/nginx/fastcgi_params;
        }
    }

    location /vstats/ {
        alias   /home/admin/web/site.com.ua/stats/;
        include /home/admin/conf/web/site.com.ua.auth*;
    }

    include     /etc/nginx/conf.d/phpmyadmin.inc*;
    include     /etc/nginx/conf.d/phppgadmin.inc*;
    include     /etc/nginx/conf.d/webmail.inc*;

    include     /home/admin/conf/web/nginx.site.com.ua.conf*;
}

Скажу сразу, что установлена панель Vesta CP. Сам сайт открывается по адресу site.com.ua и все хорошо работает. По адресу site.com.ua/admin открывается админка, но если перейти на, например, site.com.ua/admin/users - получаю 404, при этом это не 404 от Yii2, а от Vesta.

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


Ответы (1 шт):

Автор решения: fedornabilkin

Я бы в таком случае сделал так. Сначала делаем простой конфиг на два хоста, чтобы обрабатывал отдельно запросы для основного сайта и для админки. Далее в запросах основнога сайта обрабатываем запросы админки и проксируем их на локейшн для админки (постепенно отказываемся от урлов типа /admin. Затем уже можно добавить правила для оптимизации (кеш, сжатие, картинки и т.д.).

Вот так будет выглядеть простой конфиг на два хоста (Старый конфиг сохранить обязательно):

server {
    charset utf-8;
    server_name site.dev;
    set $yii_index "index.php";

    access_log /var/log/nginx/site.dev-access.log;
    error_log /var/log/nginx/site.dev-error.log;

    root /var/www/site.dev/frontend/web;
    index $yii_index;
    set $htdocs /var/www/site.dev;

    location / {
        try_files $uri $uri/ /$yii_index?$args;
    }

    location ~ \.php$ {
        include /etc/nginx/fastcgi_params;
        try_files $fastcgi_script_name =404;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $htdocs$fastcgi_script_name;
    }
}

server {
    charset utf-8;
    server_name admin.site.dev;
    set $yii_index "index.php";

    access_log /var/log/nginx/admin.site.dev-access.log;
    error_log /var/log/nginx/admin.site.dev-error.log;

    root /var/www/site.dev/backend/web;
    index $yii_index;
    set $htdocs /var/www/site.dev;

    location / {
        try_files $uri $uri/ /$yii_index?$args;
    }

    location ~ \.php$ {
        include /etc/nginx/fastcgi_params;
        try_files $fastcgi_script_name =404;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $htdocs$fastcgi_script_name;
    }
}

Сразу хочу обратить внимание на руты. Они должны смотреть не в корень проекта, а именно в директорию web приложения. Основной сайт и админка это два разных приложения. Поэтому два хоста, два конфига и два разных рута.

Секцию для обработки php можно вынести в отдельный файл и подключить с помощью include, потому что обычно такие локейшены одинаковы для каждого хоста.

location ~ \.php$ {
    include /etc/nginx/fastcgi_params;
    try_files $fastcgi_script_name =404;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME $htdocs$fastcgi_script_name;
}

Если нет никаких ссылок, которые ссылаются на админку старым образом (/admin/*), то и отлавливать эти запросы не надо. Просто теперь в админку ходить через admin.site.dev. Если нет такой возможности, тогда можно настроить доступ через порты. При необходимости могу потом дописать.

→ Ссылка