Docker nginx php ответил 403 Запрещено

#php #docker #nginx

#php #докер #nginx

Вопрос:

У меня возникла эта проблема, когда я хочу протестировать свой PHP-проект в контейнере. Итак, я установил docker на свой ноутбук (версия включена ниже), а затем я создаю контейнер nginx с прикрепленным к нему файлом php info /usr/share/nginx/html . Но когда я проверил результат, я получил 403 Запрещено. Я попытался преобразовать информационный файл php в HTML-файл, он работает нормально! Но когда я меняю его обратно на php info, я получил 403 Запрещено. Я также попытался установить php и php-fpm на сам контейнер. Но ничего не изменилось. Можете ли вы, ребята, мне помочь.

Это мой docker version вывод

 versionClient: Docker Engine - Community
 Version:           20.10.5
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        55c4c88
 Built:             Tue Mar  2 20:18:20 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.5
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       363e9a8
  Built:            Tue Mar  2 20:16:15 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.4
  GitCommit:        05f951a3781f4f2c1911b05e61c160e9c30eaa8e
 runc:
  Version:          1.0.0-rc93
  GitCommit:        12644e614e25b05da6fd08a38ffa0cfe1903fdec
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
 

это информационный файл php, расположенный в /home/taufik/Documents/praktikum/docker/30-mar-2021/sosial-media/html

 <?php
phpinfo();
?>
 

и это моя команда docker для запуска контейнера nginx

 docker run -it --rm -dp 8080:80 --name=nginx -v $(pwd):/usr/share/nginx/html /home/taufik/html nginx
 

это журнал контейнера nginx

 /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
,/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
,/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
,10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
,10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
,/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
,/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
,/docker-entrypoint.sh: Configuration complete; ready for start up
,2021/03/30 09:33:02 [error] 32#32: *1 directory index of "/usr/share/nginx/html/" is forbidden, client: 172.17.0.1, server: localhost, request: "GET / HTTP/1.1", host: "0.0.0.0:8080", referrer: "http://0.0.0.0:9000/"
,172.17.0.1 - - [30/Mar/2021:09:33:02  0000] "GET / HTTP/1.1" 403 555 "http://0.0.0.0:9000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36" "-"
,
 

Заранее спасибо

Ответ №1:

Эта ошибка:

 2021/03/30 09:33:02 [error] 32#32: *1 directory index of "/usr/share/nginx/html/" is forbidden, client: 172.17.0.1, server: localhost, request: "GET / HTTP/1.1", host: "0.0.0.0:8080", referrer: "http://0.0.0.0:9000/"
 

похоже, что ваш php-файл не является an index.php , и вы пытаетесь получить доступ к серверу по адресу / , без имени файла. Затем он пытается показать вам список каталогов (все содержимое в каталоге, в который вы смонтировали, /usr/share/nginx/html/ но конфигурация по умолчанию этого не позволяет. Следовательно, 403, потому что конфигурация запрещает показывать список каталогов.

Попробуйте получить доступ к файлу с его именем напрямую. Что-то вроде localhost:8080/filename.php должно сработать.

Однако

Если вы просто используете контейнер nginx, это само по себе не позволит вам выполнять php-скрипты, поскольку это всего лишь nginx, без какого-либо fpm.

Есть два способа исправить это:

  1. Если вы хотите что-то простое, просто используйте php:apache образ и смонтируйте свои php-файлы /var/www/html/ в контейнер. Команда будет выглядеть примерно так: docker run -it --rm -dp 8080:80 --name=nginx -v $(pwd):/var/www/html php:apache
  2. Используйте php:fpm изображение в сочетании с контейнером nginx. Немного сложнее, так как вам также понадобится настраиваемая конфигурация для контейнера nginx.

Вообще говоря, способ выполнения docker ™ заключается в том, чтобы иметь один контейнер для каждой службы, следовательно, контейнер fpm и nginx. Вы бы не стали устанавливать fpm в контейнер nginx.

Я бы порекомендовал вам изучить, как контейнеры docker взаимодействуют и могут быть созданы для совместной работы.

Комментарии:

1. Спасибо, kolaente, ваше решение, похоже, работает. Дело закрыто

2. В моем случае ошибка 403 вводила в заблуждение… основная причина заключалась в том, что мой каталог /usr/share/nginx/html/ был пуст.