Я хочу передать любой 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;
}
}
}