Два экземпляра PHP на одном Nginx по разным адресам (основной и api)
Столкнулся с проблемой запуска двух экземпляров PHP на одном Nginx в Docker.
Мне необходимо получить два маршрута, а именно основной localhost/(query)
, запросы на который будут обрабатывается MainServer
, а так же localhost/api/v1/(query)
, запросы на который будут обрабатываться через ServicesServer
.
Мой Docker docker-compose.yml:
version: "3.9"
networks:
ost_network:
driver: bridge
services:
main_php:
build: ./DockerSetting/MainPHP
restart: always
tty: true
container_name: ost.main_php
networks:
- ost_network
expose:
- "9000"
volumes:
- .:/var/www/application
services_php:
build: ./DockerSetting/ServicesPHP
restart: always
tty: true
container_name: ost.services_php
networks:
- ost_network
expose:
- "9001"
volumes:
- .:/var/www/application
nginx:
image: nginx:latest
container_name: ost.nginx
restart: always
tty: true
ports:
- "80:80"
volumes:
- .:/var/www/application
- ./DockerSetting/Nginx/nginx.conf:/etc/nginx/nginx.conf
- ./DockerSetting/Nginx/conf.d:/etc/nginx/conf.d
networks:
- ost_network
Мой Nginx конфиг, nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format compression '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" "$gzip_ratio"';
client_max_body_size 10000M;
sendfile on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
}
А так же сам конфиг сайта /conf.d/main.conf:
server {
listen 80;
server_name localhost;
access_log /var/www/application/Logs/Nginx/access.log compression;
error_log /var/www/application/Logs/Nginx/error.log;
# Первое PHP приложение доступно по корневому пути
location / {
root /var/www/application/MainServer/Public;
index index.php index.html;
try_files $uri $uri/ /index.php?$query_string;
location ~ \.php$ {
fastcgi_pass main_php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
# Второе PHP приложение доступно по /api/v1/
location ^~ /api/v1/ {
alias /var/www/application/ServicesServer/Public/;
index index.php;
try_files $uri $uri/ /index.php?$query_string;
location ~ \.php$ {
fastcgi_pass services_php:9001;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
include fastcgi_params;
}
}
location ~ /\.ht {
deny all;
}
}
Мне необходимо реализовать следующее: если в маршруте есть /api/v1/
, то данный запрос необходимо перенаправлять на services_php
соответственно. На данный момент у меня все запросы, кроме /api/v1/
идут на основной сервер и Nginx перенаправляет на services_php
исключительно /api/v1/
, если добавить дополнительный маршрут, к примеру /api/v1/string
, то он перенаправиться на main_php
. С чем может быть связана данная проблема? Судя по документации Nginx при указании пути /api/v1/
все запросы /api/v1/query
должны идти именно на второй сервис services_php
, чего у меня не происходит.
Так же, если я создаю два сайта на разных портах и обьеденяю их в прокси, то всё работает, но это не совсем то, что необходимо.
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://localhost:8081;
}
location /api/v1/ {
proxy_pass http://localhost:8082;
}
}