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 шт):
Я бы в таком случае сделал так. Сначала делаем простой конфиг на два хоста, чтобы обрабатывал отдельно запросы для основного сайта и для админки. Далее в запросах основнога сайта обрабатываем запросы админки и проксируем их на локейшн для админки (постепенно отказываемся от урлов типа /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. Если нет такой возможности, тогда можно настроить доступ через порты. При необходимости могу потом дописать.