Ошибка неверного шлюза NGINX 502 в Docker для Windows и Symfony 4

Я пытаюсь настроить Symfony 3 в Docker на машине с Windows с NGINX и PHP-FPM. На данный момент я получаю ошибку 502 неверного шлюза. Я изменил порт FPM с 9000 на 8000, потому что на моем хосте порт 9000 уже используется службой Hyper-V vmms.exe. Не знаю, связано ли это.

docker-compose.yml

version: "3"

services:

  nginx:
      build: ./nginx
      volumes:
        - ./symfony:/usr/shared/nginx/html
      ports:
        - "80:80"
        - "443:443"
      environment:
        - NGINX_HOST=free-energy.org
      depends_on:
        - fpm

  fpm:
      image: php:fpm
      ports:
          - "8000:8000"
      # It seems like FPM receives the full path from NGINX
      # and tries to find the files in this dock, so it must
      # be the same as nginx.root
      volumes:
          - ./symfony:/usr/shared/nginx/html

Dockerfile NGINX:

FROM nginx:1.13.7-alpine

# Change Nginx config here...
RUN rm /etc/nginx/conf.d/default.conf
ADD ./default.conf /etc/nginx/conf.d/

EXPOSE 80
EXPOSE 443

default.conf переопределяет NGINX:

server {
    listen  80;
    server_name free-energy.org;

    # this path MUST be exactly as docker-compose.fpm.volumes,
    # even if it doesn't exist in this dock.
    root /usr/share/nginx/html;

    location / {
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/.+\.php(/|$) {
        fastcgi_pass fpm:8000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

person progonkpa    schedule 25.12.2017    source источник


Ответы (3)


Не могли бы вы проверить контейнер php-fpm? Насколько я помню, порт php-fpm по умолчанию - 9000, а не 8000. Измените отображение портов внутри контейнера с 8000 на 9000.

  ports:
      - "8000:9000"

Или, если он уже используется на вашем хосте, вы можете открыть порт только между контейнерами.

  expose:
      - "9000"
person 0TshEL_n1ck    schedule 25.12.2017
comment
Спасибо, я снова изменил его на 9000. Теперь я получаю «FastCGI отправлен в stderr:« Основной сценарий неизвестен »». - person progonkpa; 25.12.2017
comment
Если выставляете порт, вы меняли fastcgi_pass fpm: 8000; to fastcgi_pass fpm: 9000; в вашей конфигурации NGINX по умолчанию? Может вы забыли перестроить образ? - person 0TshEL_n1ck; 25.12.2017
comment
Я знал об этом и перешел на fastcgi_pass fpm: 9000 и использовал docker-compose up --build - person progonkpa; 26.12.2017

Ответом 0TshEL_n1ck ошибка 502 была решена. У меня все еще есть «Файл не найден» в браузере и соответствующий журнал ошибок в NGINX «FastCGI, отправленный в stderr:« Основной сценарий неизвестен »при чтении заголовка ответа из восходящего потока».

Вот конфигурация, которая оказалась работоспособной. Ключевые вещи, которые нужно было изменить:

  • директива root в файле конфигурации NGINX не содержала / public, который необходим в проекте Symfony, потому что там находится фронт-контроллер index.php
  • Я изменил место назначения тома в docker-compose.yml так, что каталог проекта Symfony теперь отображается в / var / www / symfony вместо / usr / shared / nginx / html (не уверен, почему предыдущий не работал)

Эти моменты стали известны после использования конфигурации NGINX из документации Symfony, расположенной по адресу https://symfony.com/doc/current/setup/web_server_configuration.html

Вот код, который сработал.

docker-compose.yml:

version: "3"

services:

  nginx:
      build: ./nginx
      volumes:
        - ./symfony:/var/www/symfony

      ports:
        - "80:80"
        - "443:443"
      depends_on:
        - fpm

  fpm:
      image: php:fpm
      ports:
          - "9000"
      volumes:
          - ./symfony:/var/www/symfony

Конфигурация NGINX default.conf:

server {
    listen  80;
    server_name free-energy.org, www.free-energy.org;
    root /var/www/symfony/public;

    location / {
        # try to serve file directly, fallback to index.php
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/index\.php(/|$) {
        fastcgi_pass fpm:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        # When you are using symlinks to link the document root to the
        # current version of your application, you should pass the real
        # application path instead of the path to the symlink to PHP
        # FPM.
        # Otherwise, PHP's OPcache may not properly detect changes to
        # your PHP files (see https://github.com/zendtech/ZendOptimizerPlus/issues/126
        # for more information).
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        # Prevents URIs that include the front controller. This will 404:
        # http://domain.tld/index.php/some-path
        # Remove the internal directive to allow URIs like this
        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;
    }

    error_log /var/log/nginx/project_error.log;
    access_log /var/log/nginx/project_access.log;
}
person progonkpa    schedule 26.12.2017

Будем так угадывать через неделю, попробуем использовать вот это: /docker-compose.yml

version: "2"
services:
  nginx:
    build: "./docker/nginx/"
    container_name: "nginx-free-energy"
    volumes_from:
      - php-fpm
    restart: always
    ports:
      - "80:80"
  php-fpm:
    image: php:7.1-fpm
    container_name: "php-fpm-free-energy"
    volumes:
      - ./src/free-energy.org:/var/www/free-energy.org
    restart: always
    expose:
      - "9000"

/ докер / nginx / Dockerfile

FROM nginx

COPY config/free-energy.conf /etc/nginx/conf.d/free-energy.conf

RUN rm /etc/nginx/conf.d/default.conf

RUN usermod -u 1000 www-data

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

/docker/nginx/config/free-energy.conf (для приложения symfony3)

server {
    listen      80;
    server_name www.free-energy.org free-energy.org;
    root /var/www/free-energy.org/web;

    location / {
        # try to serve file directly, fallback to app.php
        try_files $uri /app.php$is_args$args;
    }

    # PROD
    location ~ ^/app\.php(/|$) {
        fastcgi_pass php-fpm-free-energy:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        # When you are using symlinks to link the document root to the
        # current version of your application, you should pass the real
        # application path instead of the path to the symlink to PHP
        # FPM.
        # Otherwise, PHP's OPcache may not properly detect changes to
        # your PHP files (see https://github.com/zendtech/ZendOptimizerPlus/issues/126
        # for more information).
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        # Prevents URIs that include the front controller. This will 404:
        # http://domain.tld/app.php/some-path
        # Remove the internal directive to allow URIs like this
        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;
    }

    error_log /var/log/nginx/free-energy.org_error.log;
    access_log /var/log/nginx/free-energy.org_access.log;
}

После запуска вам нужно добавить 127.0.0.1 free-energy.org в ваш файл / etc / hosts для разрешения хоста, и ваше приложение будет жить на /src/free-energy.org (точка входа - /src/free-energy.org/web /app.php)

person 0TshEL_n1ck    schedule 26.12.2017