web-dev-qa-db-ja.com

Docker-compose Nginx php-fpmファイルが見つかりません

Php-fpmとnginxを使用した単純なdocker-compose構成があり、phpファイルが表示されません。 localhostに移動すると、ファイルが見つかりませんと表示されます。

ネットで見つけたものはすべて試しましたが、すべて失敗しました。これはhtmlでは正常に機能しますが、phpファイルでは機能しません。パスの問題か、そのようなもののようです。

私はdocker-compose logs

project3-php_1     | 172.17.0.5 -  29/Mar/2016:13:29:12 +0000 "GET /index.php" 404
project3-front_1   | 172.17.0.1 - - [29/Mar/2016:13:29:12 +0000] "GET / HTTP/1.1" 404 27 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36"
project3-front_1   | 2016/03/29 13:29:12 [error] 8#8: *3 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 172.17.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://172.17.0.2:9000", Host: "localhost"

これが私のdocker-composeです。

project3-front:
    image: nginx
    ports:
      - "80:80"
    links:
      - "project3-php:project3-php"
    volumes:
      - ".:/home/docker"
      - "./nginxdir/default.conf:/etc/nginx/conf.d/default.conf"
      - "./html:/usr/share/nginx/html"

  project3-php:
      build: phpdir
      volumes:
        - ".:/home/docker:rw"
        - "./html:/var/www/html"
      ports:
        - "9000:9000"
      working_dir: "/home/docker"

次に、phpの私のdockerfile:

FROM php:5.6-fpm
EXPOSE 9000

nginxの私のdefault.conf:

server {
  listen 80;
  server_name localhost;
  index index.php index.html;

  error_log  /var/log/nginx/error.log  warn;
  access_log /var/log/nginx/access.log;
  root /usr/share/nginx/html;

  location ~ \.php$ {
      fastcgi_pass project3-php:9000;
      fastcgi_index index.php;
      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }
}

メインフォルダのpwdは次のとおりです。

/media/revenge/share/PROJECTS/docker_images/php7-nginx

ファイル階層は次のとおりです。

├── docker-compose.yml
├── html
│   ├── index.php
├── nginxdir
│   ├── default.conf
├── phpdir
│   ├── dockerfile
│   └── php.ini

フォルダ全体はchmod 777です。

どんなアイデアでも大歓迎です。私が手に入らなかったものがあると確信しています。前もって感謝します。

12
mik

ここに問題を見つける方法があります

  1. カスタムcommandを使用してnginxデバッグモードをオンにします。例:

docker-compose.yml

web:
    image: nginx
    volumes:
        - "~/www/project:/var/www"
        - "~/www/project/vhost.conf:/etc/nginx/conf.d/site.conf"
    # Add this row:
    command: [nginx-debug, '-g', 'daemon off;']
  1. "site.conf"ファイルを編集します(この例では~/www/project/vhost.confファイルです)error_logでデバッグモードをオンにします(最後に「デバッグ」という語を追加します)。
error_log "/var/log/nginx/error.log" debug;
  1. 「web」コンテナを(再)起動します。
docker-compose stop web
docker-compose up -d web
  1. コンテナーをテストします。すべてのコンテナーが実行されていますか?
docker-compose ps
  1. ブラウザでテストする
  2. 「接続」して表示またはダウンロード( http://blog.dcycle.com/blog/ae67284c/docker-compose-cp )し、/var/log/nginx/error.logファイルを表示します。

ほとんどの場合の問題

まだ設定していないか、「web」と「php-fpm」で異なるディレクトリ構造を使用しています。次のように、fastcgi_param SCRIPT_FILENAMEの場所に「fpm構造」を設定する必要があるのとは異なる構造を使用する場合:

docker-compose.yml

phpfpm:
    image: php:fpm
    volumes:
        - "~/www/project:/var/www/html/user/project"

「site.conf」

fastcgi_param SCRIPT_FILENAME /var/www/html/user/project$fastcgi_script_name;
11

最後にそれを見つけました:

Docker-composeのPHPセクションのボリュームにこの行がありませんでした:

「./html:/usr/share/nginx/html」

docker-composeは次のようになります。

project3-front:
    image: nginx
    ports:
        - "80:80"
    links:
        - "project3-php:project3-php"
    volumes:
        - ".:/home/docker"
        - "./nginxdir/default.conf:/etc/nginx/conf.d/default.conf"
        - "./html:/usr/share/nginx/html"
project3-php:
    build: phpdir
    volumes:
        - ".:/home/docker:rw"
        - "./html:/var/www/html"
    ports:
        - "9000:9000"
    working_dir: "/home/docker"

Nginx default.confファイルの絶対ルート(ここでは「/ usr/share/nginx/html」)は、docker-composeのphp部分にも設定する必要がありました(以前はnginxの下のみでした)。

それは安心です;)

3
mik

私の場合、phpとnginxのvolumes:は正しい(したがって同じ)ディレクトリを指しています。しかし、私のnginx構成では、NGINX_SERVER_ROOTがあり、間違った方向を指しています。

そのため、すべてのボリュームとルートディレクトリの設定を再確認してください。見落としがちなものもあります。

0
firfin

私は同じ問題を抱えていましたが、これはここのこの回答のいずれによっても解決されませんでした:

昨日Docker Update hits in-インストールされています。この更新に依存する問題は、(vEthernet(DockerNAT))ネットワークが変更されたことです。このようにして、ファイアウォール(私の場合はカスペルスキー)がネットワークファイアウォールを「信頼できる」ではなく「パブリック」にリセットしました。

Docker->設定->共有デバイス」を開いてこれを見つけました。最初の一見では、すべてがうまく見えます。共有する必要がある各デバイスに「ティック」がありました。次に、共有デバイスを再度無効にして有効にしようとしました。共有デバイスを再度有効にすると、デフォルトのエラー「ファイアウォールがWindowsとコンテナー間のファイル共有をブロックしています。詳細については、ドキュメントを参照してください。」登場した。 ->パーフェクト!!。共有デバイスはファイルにアクセスできなくなりますが、Dockerは問題なく状態を維持します。

それで私はそれを修正することができました:

  • Kasperskyの「ファイアウォール-ネットワーク」設定で、(vEthernet(DockerNAT))Networkを再び信頼できるものとして設定します。
  • docker-compose upを使用してdockerコンテナーを再起動すると、すべてが魅力のように実行されます。私のファイルに再びアクセスできました。
0
lin