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

nginx и php-fpm: «Основной сценарий неизвестен» при чтении заголовка ответа из восходящего потока

Я хочу передать любой api/* путь к php-fpm. В частности, чтобы index.php поскольку я использую Symfony. Это единственный маршрут, который должен использовать php. Все остальное будет загружено из /usr/share/nginx/html/public (только файлы HTML и CSS).

Я пытался это сделать, но получаю сообщение об ошибке:

FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream

Моя конфигурация nginx ниже:

upstream php {
  server php:9000;
}

server {
  listen 80 default_server;
  server_name impressive.local;
  index index.html index.php;
  root /usr/share/nginx/html/public;

  location /api {
    root /usr/share/nginx/html/api;
    try_files $uri /index.php;
  }

  location ~ \.php$ {
    fastcgi_pass php;
    fastcgi_split_path_info ^(.+\.php)(/.*)$;
    include fastcgi.conf;
  }
}

Я получаю следующую ошибку:

php_1  | [13-Jan-2019 23:22:54] NOTICE: fpm is running, pid 1
php_1  | [13-Jan-2019 23:22:54] NOTICE: ready to handle connections
php_1  | 172.25.0.3 -  13/Jan/2019:23:22:57 +0000 "GET /api/index.php" 404
web_1  | 2019/01/13 23:22:57 [error] 10#10: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream,
client: 172.25.0.1, server: impressive.local, request: "GET /api/index.php HTTP/1.1", upstream: "fastcgi://172.25.0.2:9000", host: "127.0.0.1:8080"
web_1  | 172.25.0.1 - - [13/Jan/2019:23:22:57 +0000] "GET /api/index.php HTTP/1.1" 404 27 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36" "-"

Я часами гуглил, просматривал несколько других ответов на Stack Exchange. Кажется, я не могу понять, что вызывает это. Пользуюсь докером. Ниже мой docker-compose.yml

version: '3'
services:
  web:
    image: nginx:alpine
    volumes:
      - ./web:/usr/share/nginx/html
      - ./conf/impressive.template:/etc/nginx/conf.d/default.conf
    ports:
      - "8080:80"
    links:
      - php

  php:
    image: php:7.3.1-fpm-alpine
    volumes:
      - ./web:/usr/share/nginx/html

/usr/share/nginx/html имеет такую ​​структуру:

- api
    index.php
- public
    index.html
    something.html
    ...

api это JSON API, и public это статический сайт.

Я хочу любые запросы api/* звонить api/index.php и все остальное, чтобы пройти через /usr/share/nginx/html/public.

Я наконец решил это!

Оказывается, корневое расположение должно соответствовать расположению файлов в контейнере php-fpm, поскольку это то, что проходило через:

fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name

Мне не нужно было указывать эту строку, поскольку она была включена в: include fastcgi.conf;.

Не уверен, что это самое элегантное решение:

upstream php {
  server php:9000;
}

server {
  listen 80 default_server;
  server_name _;
  index index.html index.php;
  root /usr/share/nginx/html/public;

  location /api {
    root /usr/share/nginx/html;
    try_files $uri /api/index.php$is_args$args;

    location ~ \.php$ {
      fastcgi_pass php;
      fastcgi_split_path_info ^(.+\.php)(/.*)$;
      include fastcgi.conf;
      internal;
    }
  }
}