Задать вопрос
@P-sm

Почему php-fpm на все запросы выдает 404?

Есть три контейнера:
- nginx,
- beckend: php-fpm+laravel
- vue.js+nginx

хочу чтобы все запросы на /api/* шли на beckend в laravel, а остальнве на frontend
frontend работает, страницы открываются,
а вот beckend на все запросы выдает 404

где я ошибся?

docker-compose.yml
services:
  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
      args:
        HTTP_PROXY: http://172.17.0.1:8118
        HTTPS_PROXY: http://172.17.0.1:8118
        NO_PROXY: localhost,127.0.0.1,::1,host.docker.internal,172.17.0.1,db,redis,backend,mailhog,frontend,web,adminer
        http_proxy: http://172.17.0.1:8118
        https_proxy: http://172.17.0.1:8118
        no_proxy: localhost,127.0.0.1,::1,host.docker.internal,172.17.0.1,db,redis,backend,mailhog,frontend,web,adminer
      extra_hosts:
        - "host.docker.internal:host-gateway"
    container_name: jdasia-backend
    env_file:
      - ./docker/.env.docker
    volumes:
      - ./backend:/var/www/html
    depends_on:
      - db
      - redis
    environment:
      XDEBUG_MODE: ${XDEBUG_MODE:-develop,debug}
      XDEBUG_CLIENT_HOST: ${XDEBUG_CLIENT_HOST:-host.docker.internal}
      XDEBUG_CLIENT_PORT: ${XDEBUG_CLIENT_PORT:-9003}
      http_proxy: http://172.17.0.1:8118
      https_proxy: http://172.17.0.1:8118
      no_proxy: localhost,127.0.0.1,::1,host.docker.internal,172.17.0.1,db,redis,backend,mailhog,frontend,web,adminer
      HTTP_PROXY: http://172.17.0.1:8118
      HTTPS_PROXY: http://172.17.0.1:8118
      NO_PROXY: localhost,127.0.0.1,::1,host.docker.internal,172.17.0.1,db,redis,backend,mailhog,frontend,web,adminer
    extra_hosts:
      - "host.docker.internal:host-gateway"

  nginx:
    image: nginx:stable-alpine
    container_name: jdasia-nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./infra/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
      - ./infra/nginx/certs:/etc/nginx/certs:ro
    depends_on:
      - backend
      - frontend

  frontend:
    build:
      context: ./frontend
      dockerfile: Dockerfile
      args:
        HTTP_PROXY: http://172.17.0.1:8118
        HTTPS_PROXY: http://172.17.0.1:8118
        NO_PROXY: localhost,127.0.0.1,::1,host.docker.internal,172.17.0.1,db,redis,backend,mailhog,frontend,web,adminer
        http_proxy: http://172.17.0.1:8118
        https_proxy: http://172.17.0.1:8118
        no_proxy: localhost,127.0.0.1,::1,host.docker.internal,172.17.0.1,db,redis,backend,mailhog,frontend,web,adminer
      extra_hosts:
        - "host.docker.internal:host-gateway"
    container_name: jdasia-frontend
    volumes:
      - ./frontend:/app
      - /app/node_modules
      - ./infra/nginx/certs:/etc/nginx/certs:ro
    environment:
      - NODE_ENV=development
      - HTTP_PROXY=http://172.17.0.1:8118
      - HTTPS_PROXY=http://172.17.0.1:8118
      - NO_PROXY=localhost,127.0.0.1,::1,host.docker.internal,172.17.0.1,db,redis,backend,mailhog,frontend,web,adminer
      - http_proxy=http://172.17.0.1:8118
      - https_proxy=http://172.17.0.1:8118
      - no_proxy=localhost,127.0.0.1,::1,host.docker.internal,172.17.0.1,db,redis,backend,mailhog,frontend,web,adminer
    depends_on:
      - backend

volumes:
  db_data:


./backend/Dockerfile
FROM php:8.2-fpm-trixie

# Proxy support
ARG HTTP_PROXY
ARG HTTPS_PROXY
ARG NO_PROXY
# Only set proxy if explicitly provided
ENV http_proxy=${HTTP_PROXY:-} \
    https_proxy=${HTTPS_PROXY:-} \
    no_proxy=${NO_PROXY:-} \
    ALL_PROXY=${HTTP_PROXY:-}

#   tcpdump port 9000 -A | strings
# Install system deps (Debian/apt)
RUN apt-get update \
  && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
       git curl unzip zip \
       tcpdump mc htop \
       libpq-dev libicu-dev libzip-dev libonig-dev \
       pkg-config autoconf make g++ \
  && docker-php-ext-configure intl \
  && docker-php-ext-install pdo pdo_pgsql mbstring intl zip opcache \
  && if [ -n "$HTTP_PROXY" ]; then pecl config-set http_proxy "$HTTP_PROXY"; fi \
  && pecl channel-update pecl.php.net || true \
  && (pecl install -o -f redis xdebug \
      || (echo "PECL direct install failed, trying tarballs" \
          && curl -fsSL --connect-timeout 20 --retry 5 ${HTTPS_PROXY:+--proxy "$HTTPS_PROXY"} https://pecl.php.net/get/redis-6.0.2.tgz -o /tmp/redis.tgz \
          && curl -fsSL --connect-timeout 20 --retry 5 ${HTTPS_PROXY:+--proxy "$HTTPS_PROXY"} https://pecl.php.net/get/xdebug-3.3.2.tgz -o /tmp/xdebug.tgz \
          && pecl install /tmp/redis.tgz /tmp/xdebug.tgz)) \
  && docker-php-ext-enable redis xdebug \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

# Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

# Composer will respect HTTP(S)_PROXY environment; no explicit config needed

WORKDIR /var/www/html

# Copy composer files first
COPY composer.json composer.lock ./

# Install PHP dependencies without running scripts (artisan not copied yet)
RUN composer install --no-dev --optimize-autoloader --no-scripts

# Copy application files (excluding vendor and node_modules)
COPY . .
RUN rm -rf node_modules

# Opcache recommended settings
ENV PHP_OPCACHE_VALIDATE_TIMESTAMPS=1 \
    PHP_OPCACHE_MAX_ACCELERATED_FILES=20000 \
    PHP_OPCACHE_MEMORY_CONSUMPTION=128 \
    PHP_OPCACHE_MAX_WASTED_PERCENTAGE=10

# Xdebug configuration (copied into conf.d)
COPY 99-xdebug.ini /usr/local/etc/php/conf.d/99-xdebug.ini

CMD ["php-fpm"]


./infra/nginx/default.conf
server {
    listen 80;
    server_name localhost;
    root /var/www/html/public;
    index index.php index.html;
   
    # PHP-FPM handler
    location ~ \.php$ {
        #include fastcgi_params;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass backend:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
    }
    # Frontend (Vue.js SPA) - все остальные запросы
    location / {
        proxy_pass http://frontend:80;
    }
    # Backend API
    location /api/ {
        try_files $uri $uri/ /index.php?$query_string;
    }

    client_max_body_size 20m;
}

# HTTPS server
server {
    listen 443 ssl;
    http2 on;
    server_name localhost;

    ssl_certificate /etc/nginx/certs/dev.crt;
    ssl_certificate_key /etc/nginx/certs/dev.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    index index.php index.html;


    # Frontend (Vue.js SPA) - все остальные запросы
    location / {
        proxy_pass http://frontend:80;
    }

    # Backend API - send directly to PHP without filesystem checks
    location /api/ {
         proxy_pass http://backend:9000;
    }

    client_max_body_size 20m;
}
  • Вопрос задан
  • 188 просмотров
Подписаться 1 Простой 10 комментариев
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы