【问题标题】:Docker-compose Nginx php-fpm file not foundDocker-compose Nginx php-fpm 文件未找到
【发布时间】:2023-03-07 06:43:01
【问题描述】:

我有一个带有 php-fpm 和 nginx 的简单 docker-compose 配置,但我看不到任何 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"

这是我的 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"

然后是我的 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;
  }
}

主文件夹密码为:

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

文件层次结构是:

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

整个文件夹是chmod 777

任何想法将不胜感激。我确定有些东西我没有得到。提前致谢。

【问题讨论】:

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


    【解决方案1】:

    您可以通过以下方式找到问题

    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 开启调试模式(在末尾添加“debug”字样):
    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 文件。

    大多数情况下的问题

    您尚未设置,或者您在webphp-fpm 中使用不同的目录结构。如果您想使用不同的结构,则必须在 fastcgi_param SCRIPT_FILENAME 位置设置“fpm 结构”,如下所示:

    如果您的 docker-compose.yml 包含如下内容:

    phpfpm:
        image: php:fpm
        volumes:
            - "~/www/project:/var/www/html/user/project"
    #                        ^^^^^^^^^^^^^^^^^^^^^^^^^^ the path in the php-fpm container
    

    您必须在 nginx 容器的“site.conf”中进行设置:

    fastcgi_param SCRIPT_FILENAME /var/www/html/user/project$fastcgi_script_name;
    #                             ^^^^^^^^^^^^^^^^^^^^^^^^^^
    

    【讨论】:

    • "大多数情况下的问题;你还没有设置或者你在“web”和“php-fpm”中使用了不同的目录结构"你拯救了我的一天,谢谢!
    • fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 解决了我的问题。默认为fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
    • 这对我也有帮助,谢谢!作为替代方案,blog.joshwalsh.me/docker-nginx-php-fpm 提供了一种动态方式,这意味着您不必对路径进行硬编码。
    【解决方案2】:

    终于找到了:

    我在 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】:

      在我的例子中,php 和 nginx 的 volumes: 指向了一个正确的(因此是相同的)目录。但是在我的 nginx 配置中有一个 NGINX_SERVER_ROOT: 指向错误的方式。

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

      【讨论】:

        【解决方案4】:

        虽然用/var/www/html/user/project$fastcgi_script_name; 替换$document_root$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"
        

        【讨论】:

          【解决方案5】:

          我遇到了同样的问题,但是这里的任何答案都没有解决这个问题:

          昨天 Docker 更新命中 - 已安装。取决于此更新的问题是,(vEthernet (DockerNAT)) 网络 已更改。这样,我的防火墙(在我的情况下为卡巴斯基)将我的网络防火墙重置为“公共”而不是“可信任”。

          我通过打开“Docker -> Settings -> Shared Devices”解决了这个问题。乍一看,一切似乎都很好。我需要共享的每台设备上都有一个“勾号”。接下来,我尝试再次禁用和启用我的共享设备。通过再次启用我的共享设备,默认错误“防火墙正在阻止 Windows 和容器之间的文件共享。有关更多信息,请参阅文档。”上来了。 -> 完美!!。共享设备无法再访问文件,但 Docker 保持一切正常的状态。

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

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

          【讨论】:

            【解决方案6】:

            其中一种情况可能是,您正在运行 docker 容器并执行了 composer install/update

            然后运行以下命令重启容器

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

            【讨论】:

              猜你喜欢
              • 2022-09-26
              • 1970-01-01
              • 2021-04-02
              • 2020-12-15
              • 2014-08-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多