Docker-compose找不到Nginx php-fpm文件

时间:2016-03-29 14:24:43

标签: php nginx docker http-status-code-404 docker-compose

我有一个简单的docker-compose配置php-fpm和nginx,我看不到任何php文件。当我转到localhost时,它显示File Not Found。

我尝试了网上可以找到的所有东西,但我尝试过的一切都失败了。 它适用于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"

这是我的码头制作者:

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"

然后是我的dockerfile for php:

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

任何想法都会非常感激。我确定有些东西我没有得到。提前谢谢。

6 个答案:

答案 0 :(得分:7)

以下是如何找到问题

  1. 使用自定义command启用nginx调试模式,例如:
  2. 搬运工-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启用调试模式(添加"调试"结尾处的单词):
    2. error_log "/var/log/nginx/error.log" debug;
      
      1. (重新)启动" web"容器
      2. docker-compose stop web
        docker-compose up -d web
        
        1. 测试容器,所有容器都在运行吗?
        2. docker-compose ps
          
          1. 在浏览器中测试
          2. "连结"并查看或下载(http://blog.dcycle.com/blog/ae67284c/docker-compose-cp)并查看/var/log/nginx/error.log文件。
          3. 大多数情况下的问题

            您还没有设置,或者您正在" web"中使用不同的目录结构。和" php-fpm"。如果你想使用不同的结构,你必须设置" fpm结构"在fastcgi_param SCRIPT_FILENAME地方,像这样:

            搬运工-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;
            

答案 1 :(得分:3)

终于找到了它:

我在docker-compose的PHP部分中错过了这一行:

“./ HTML:在/ usr /共享/ 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之下)

这是一种解脱;)

答案 2 :(得分:1)

虽然用 $document_root$fastcgi_script_name; 替换 /var/www/html/user/project$fastcgi_script_name; 可能会解决这个问题,但我认为更优雅的方法是更改​​ default.conf 中的 nginx 根目录:

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 /var/www/html;

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

在 docker-compose.yml 中:

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:/var/www/html"

答案 3 :(得分:0)

在我的情况下,php和nginx的卷:指向一个正确的(因此相同的)目录。但在我的nginx配置中有一个NGINX_SERVER_ROOT:指向错误的方式。

因此,请确保仔细检查所有卷和根目录设置。有些很容易被忽视。

答案 4 :(得分:0)

我遇到了同样的问题,但这里没有解决这个问题:

昨天 Docker Update点击 - 已安装。根据此更新的问题是,(vEthernet(DockerNAT))网络已更改。通过这种方式,我的防火墙(在我的案例中是卡巴斯基)将我的网络防火墙重置为" public"而不是可信赖的"。

我通过open" Docker - >来解决这个问题。设置 - >共享设备"。初看起来,外表看起来很好。有一个" tick"在每个设备上我需要共享。接下来,我尝试再次禁用和启用我的共享设备。通过再次启用我的共享设备,默认错误"防火墙阻止Windows和容器之间的文件共享。有关详细信息,请参阅文档。"来了的 - > PERFECT !! 。共享设备不再能够访问文件了,但Docker仍处于完全正常的状态。

所以我可以通过以下方式修复它:

  • 在我的卡巴斯基"防火墙 - 网络"中再次将(vEthernet(DockerNAT))网络设置为可信任设置。
  • 使用docker-compose up重启我的docker容器,并且像魅力一样运行。我的文件可以再次访问。

答案 5 :(得分:0)

可能是这种情况,您正在运行docker容器并进行了composer的安装/更新

然后运行以重新启动容器

`docker-compose down` `docker-compose up -d`