служить реагировать интерфейс и PHP-сервер в одном домене с nginx - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть интерфейс React и сервер Symfony, который я пытаюсь обслуживать в одном домене.Интерфейс React должен обслуживать активы, если они существуют в противном случае, чтобы обслуживать index.html.

Я бы хотел использовать приложение php Symfony, когда /api находится в URI запроса.Как и в приложении React, мне нужно, чтобы все запросы перешли в файл index.php.

Интерфейс обслуживается правильно, но не API.Я получаю 404 от nginx, когда нажимаю /api в браузере.

Я чувствую, что я близко, но по какой-то причине nginx не имеет правильного $document_root.Я добавляю заголовок (X-script), чтобы проверить, что переменные, и я получаю следующее:

X-script: /usr/share/nginx/html/index.php

Вот мой конфиг nginx.

server {
    listen 80 default_server;
    index index.html index.htm;

    access_log /var/log/nginx/my-site.com.log;
    error_log /var/log/nginx/my-site.com-error.log error;

    charset utf-8;

    location /api {
        root /var/www/my-site.com/backend;
        try_files $uri $uri/ /index.php$is_args$args;
    }
    location / {
        root /var/www/my-site.com/frontend;
        try_files $uri /index.html;
    }
    location ~* \.php$ {
        add_header X-script "$document_root$fastcgi_script_name" always;
        try_files $fastcgi_script_name =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS off;
    }
}

Любая помощь будет высоко ценится.

Ответы [ 3 ]

0 голосов
/ 09 июля 2019

В следующем vhost наиболее важные изменения, которые я сделал:

  • закомментирована index директива в блоке сервера: она обрабатывается непосредственно в блоках локаций
  • добавленокосая черта после location /api/ и удаление ненужных $uri/ в том же блоке api
  • переместили логику php_fpm в блок index.php location: вы хотите, чтобы все запросы передавались на фронт-контроллерв приложении Symfony
  • По той же причине переместил логику 404 в общий блок php, который будет обрабатывать любой другой запрос php-файла

server {
    listen 80 default_server;

    access_log /var/log/nginx/my-site.com.log;
    error_log /var/log/nginx/my-site.com-error.log error;

    charset utf-8;

    location /api/ {
        root /var/www/my-site.com/backend;
        try_files $uri  /index.php$is_args$args;
    }

    location / {
        root /var/www/my-site.com/frontend;
        try_files $uri /index.html;
    }

    location ~ ^/index\.php(/|$) {
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        fastcgi_param HTTPS off;

        internal;
    }

    # return 404 for all other php files not matching the front controller
    # this prevents access to other php files you don't want to be accessible.
    location ~ \.php$ {
        return 404;
    }
}

Последнее, яСпорим, вам нужно добавить общую папку Symfony в корневую директиву api location block.

Этот vhost был хорошо протестирован на моем локальном хосте со следующим деревом.

api_test
  - backend
    - index.php
  - frontend
    - index.html

Я могу успешно получить доступ к

  • backend/index.php из api_test.dv / api
  • frontend/index.html из api_test.dv /
0 голосов
/ 14 августа 2019

Приведенный выше ответ превосходен, но чтобы сделать его полностью функциональным, необходимо добавить корневую директиву под сервером или будет отображено сообщение об ошибке «основной сценарий неизвестен».Это почти всегда связано с неправильно установленным значением SCRIPT_FILENAME в директиве nginx fastcgi_param.

# Nginx configuration
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name ${NGINX_HOST};

    root /var/www/html/backend/public;

    access_log /var/log/nginx/access_log.log;
    error_log /var/log/nginx/error.log error;

    charset utf-8;

    location / {
        root /var/www/html/frontend/build;
        try_files $uri /index.html;
    }

    location /api {
        alias /var/www/html/backend/public;
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/index\.php(/|$) {
        fastcgi_pass php-fpm:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;

        internal;
    }

    # return 404 for all other php files not matching the front controller
    # this prevents access to other php files you don't want to be accessible.
    location ~ \.php$ {
        return 404;
    }
}
0 голосов
/ 24 сентября 2018

Корневой каталог проекта Symfony 4 должен содержать подпапку public.Я не использую NGINX, но думаю, что это правильная конфигурация:

location /api {
    root /var/www/my-site.com/backend/public;
...