Назад | Перейти на главную страницу

Проблема с тем, чтобы nginx работал с Symfony в подкаталоге

Этот вопрос импортирован из SO. Я сохранил правку, сделанную с комментариями, поэтому нам не нужно повторять ее еще раз :). Ссылка на ОП: https://stackoverflow.com/questions/57503107/trouble-making-nginx-works-with-symfony-in-subdirectory

Я пытаюсь установить Symfony 4 рядом с уже работающим сайтом WordPress с помощью nginx. Wordpress должен управлять домашней страницей по адресу

https: //www.my.domain

и сообщения в блоге под

https: //www.my.domain/conseils

Приложение Symfony должно заменить все, что находится под

https: //www.my.domain/app

Я прочитал стандартную документацию бота Вот и Вот а также устранение неполадок Вот. Кроме того, он кажется ДЕЙСТВИТЕЛЬНО близким к этому вопросу, но с nginx вместо apache: https://stackoverflow.com/questions/53895202/symfony4-routing-inside-a-subfolder

Дело в том, что я все еще не могу заставить его работать. Вот мой текущий site.conf, который дает мне 404, но я действительно не могу найти полезный журнал даже с включенной опцией отладки в nginx.

    server {
    listen 80 default_server;
    listen [::]:80 default_server;


    server_name www.my.domain;
    root /var/www/my.domain/html;


    #symfony location block
    location /app {
        alias /var/www/my.domain/app/public;
        index index.php;

        try_files $uri /app/public/index.php/$1 last;

        include snippets/fastcgi-php.conf;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;


        error_log /var/log/nginx/project_error.log;
        access_log /var/log/nginx/project_access.log;
    }

    #Wordpress location block
    location / {
        index index.php index.html index.htm;



        try_files $uri $uri/ /index.php?$args;

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

        location ~* \.(css|js|ico|gif|jpeg|jpg|webp|png|svg|eot|otf|woff|woff2|ttf|ogg)$ {
         expires max;
        }

        location ~ /\.ht {
            deny all;
        }

    }

}

Наконец я попробовал кое-что найти Вот. На этот раз это дает мне следующую ошибку маршрутизации Symfony: Не найден маршрут для "GET / app". Ниже файла conf:

server {
    listen 80 default_server;
    listen [::]:80 default_server;


    server_name www.my.domain;
    root /var/www/my.domain/html;


    # Symfony location block
    location /app {
        alias /var/www/my.domain/app/public;
        index index.php;

        rewrite ^/app/(.*)$ /$1 break;
        try_files $uri @symfonyFront;


    }
        set $symfonyRoot /var/www/my.domain/app/public;
        set $symfonyScript index.php;
        location @symfonyFront {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
                include /etc/nginx/fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $symfonyRoot/$symfonyScript;
                fastcgi_param SCRIPT_NAME /app/$symfonyScript;
                fastcgi_param REQUEST_URI /app$uri?$args;
        }

    #Wordpress location block
    location / {
        index index.php index.html index.htm;



        try_files $uri $uri/ /index.php?$args;

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

        location ~* \.(css|js|ico|gif|jpeg|jpg|webp|png|svg|eot|otf|woff|woff2|ttf|ogg)$ {
         expires max;
        }

        location ~ /\.ht {
            deny all;
        }

    }


    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/www.my.domain/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/www.my.domain/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

В обоих случаях wordpress работает так, как задумано. Сообщения на домашней странице и в блогах отображаются, когда ожидалось. Однако приложение Symfony отсутствует. В первом случае я получил ошибку 404 при посещении my.domain / app, а второй выдает ошибку маршрутизации Symfony. Это означает, что я попал в передний контроллер SF. И я получил трассировку стека ядра, говорящую, что приложение маршрута / не найдено в Symfony. И это абсолютно правильно, так как я ожидаю, что symfony будет работать в этом каталоге, и он не должен быть пользователем для маршрутизации.

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

РЕДАКТИРОВАТЬ: etc / nginx / error.log с активированной отладкой показывает много строк, но это привлекло мое внимание:

2019/08/15 18:11:42 [предупреждение] 6929 # 6929: * 5 "псевдоним" нельзя использовать в местоположении "/ app", где был переписан URI, клиент: 86.252.250.94, сервер: www.my.domain, запрос: «GET / app / HTTP / 1.1», хост: «www.my.domain»

И когда я получил ошибку route not found, я получил это (что и ожидалось) в журнале Symfony:

[2019-08-15 18:26:00] request.ERROR: Uncaught PHP Exception Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException: "Не найден маршрут для" GET / app "" в /var/www/my.domain/ app / vendor / symfony / http-kernel / EventListener / RouterListener.php строка 141 {"исключение": "[объект] (Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException (код: 0): не найден маршрут для \" GET / app \ "в /var/www/my.domain/app/vendor/symfony/http-kernel/EventListener/RouterListener.php:141, Symfony \ Component \ Routing \ Exception \ ResourceNotFoundException (код: 0): маршруты для \ "/ app / \". в /var/www/my.domain/app/vendor/symfony/routing/Matcher/Dumper/CompiledUrlMatcherTrait.php:70) "} []

EDIT2: я добавил

fastcgi_split_path_info ^ / app (. +. php) (/.+) $;

без заметных изменений. Интересно, что когда я заменил директиву rewrite на «last» вместо «break», она отображает страницу 404 из wordpress.

РЕДАКТИРОВАТЬ: fastcgi-php.conf

@www:~$ sudo cat /etc/nginx/snippets/fastcgi-php.conf
# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+\.php)(/.+)$;

# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;

# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;

fastcgi_index index.php;
include fastcgi.conf;

Первая «ошибка» связана с префиксом местоположения (location /something) без косой черты в конце. Это должно быть location /app/ {, в противном случае местоположение соответствует app123.

В try_files в приложении расположение слишком сложно. Будь проще:

try_files $uri /index.php$is_args$args;

Учитывая, что вы сохранили текущую файловую структуру:

  • /var/www/my.domain/html - Wordpress
  • /var/www/my.domain/app - Symfony

Затем:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name www.my.domain;
    root /var/www/my.domain/html;

    #Wordpress location block
    location / {
        index index.php index.html index.htm;

        try_files $uri $uri/ /index.php?$args;

        location ~* \.(css|js|ico|gif|jpeg|jpg|webp|png|svg|eot|otf|woff|woff2|ttf|ogg)$ {
         expires max;
        }

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

    #symfony location block
    location ^~ /app/ {
        index index.php;
        error_log /var/log/nginx/project_error.log;
        access_log /var/log/nginx/project_access.log;
        alias /var/www/my.domain/app/public/;
        try_files $uri /index.php$is_args$args;
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php7.2-fpm.sock; 
            # important to use $request_filename with alias
            fastcgi_param SCRIPT_FILENAME $request_filename;
        }
    }

    # redirect /app to app/
    location = /app {
        return 301 /app/;
    }   

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

}