当前位置: 首页 > 面试题库 >

dockerize Laravel应用时的“ GET /index.php”404

益富
2023-03-14
问题内容

我尝试了一个非常小的设置,以对Laravel应用进行dockerize。即使nginx能够将请求转发到Laravel容器,我仍然GET /index.php" 404

C:\yocto\snapweb>docker-compose logs --follow laravel
Attaching to snapweb_laravel_1
laravel_1  | [23-Jul-2018 07:10:04] NOTICE: fpm is running, pid 1
laravel_1  | [23-Jul-2018 07:10:04] NOTICE: ready to handle connections
laravel_1  | 172.18.0.3 -  23/Jul/2018:07:14:01 +0000 "GET /index.php" 404

当我进入laravel容器时,它是这样的。对我来说似乎很好。

内部Laravel容器

/var/www/html # pwd
/var/www/html
/var/www/html # ls -al
total 224
drwxr-xr-x    1 root     root          4096 Jul 23 07:09 .
drwxr-xr-x    1 root     root          4096 Jul 21 08:11 ..
-rwxr-xr-x    1 root     root           668 Jul 23 07:08 Dockerfile
drwxr-xr-x    6 root     root          4096 May  8 19:42 app
-rwxr-xr-x    1 root     root          1686 May  8 19:42 artisan
drwxr-xr-x    3 root     root          4096 May  8 19:42 bootstrap
-rw-r--r--    1 root     root          1477 May  8 19:42 composer.json
-rw-r--r--    1 root     root        144199 Jul 23 07:03 composer.lock
drwxr-xr-x    2 root     root          4096 May  8 19:42 config
drwxr-xr-x    5 root     root          4096 May  8 19:42 database
-rw-r--r--    1 root     root          1022 May  8 19:42 package.json
-rw-r--r--    1 root     root          1134 May  8 19:42 phpunit.xml
drwxr-xr-x    4 root     root          4096 May  8 19:42 public
-rw-r--r--    1 root     root          3675 May  8 19:42 readme.md
drwxr-xr-x    5 root     root          4096 May  8 19:42 resources
drwxr-xr-x    2 root     root          4096 May  8 19:42 routes
-rw-r--r--    1 root     root           563 May  8 19:42 server.php
drwxr-xr-x    5 root     root          4096 May  8 19:42 storage
drwxr-xr-x    4 root     root          4096 May  8 19:42 tests
drwxr-xr-x   37 root     root          4096 Jul 23 07:03 vendor
-rw-r--r--    1 root     root           549 May  8 19:42 webpack.mix.js
/var/www/html # ls -al public
total 32
drwxr-xr-x    4 root     root          4096 May  8 19:42 .
drwxr-xr-x    1 root     root          4096 Jul 23 07:09 ..
-rw-r--r--    1 root     root           593 May  8 19:42 .htaccess
drwxr-xr-x    2 root     root          4096 May  8 19:42 css
-rw-r--r--    1 root     root             0 May  8 19:42 favicon.ico
-rw-r--r--    1 root     root          1823 May  8 19:42 index.php
drwxr-xr-x    2 root     root          4096 May  8 19:42 js
-rw-r--r--    1 root     root            24 May  8 19:42 robots.txt
-rw-r--r--    1 root     root           914 May  8 19:42 web.config
/var/www/html #

我可以知道我的设置有什么问题吗?这是我的简约Dockerfile

laravel / Dockerfile

FROM php:7.2.8-fpm-alpine3.7

RUN apk update && \
    apk add git && \
    apk add unzip

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Get laravel into a temporary folder.
RUN composer create-project --prefer-dist laravel/laravel laravel-install-tmp

# Move local host files to docker container.
COPY . /var/www/html

# Copy all laravel files, without overwrite files from host.
RUN false | cp -ai /var/www/html/laravel-install-tmp/* /var/www/html/ 2>/dev/null

# Remove temporary folder.
RUN rm -rf /var/www/html/laravel-install-tmp/

WORKDIR /var/www/html

CMD ["php-fpm", "-F"]

nginx / default.conf

server {
    listen 443;
    ssl on;

    ssl_certificate /app/cert.pem;
    ssl_certificate_key /app/key.pem;

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

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass laravel:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }   
}

nginx / Dockerfile

FROM nginx:1.13.9-alpine

COPY . /app

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

docker-compose.yml

version: '2'
services:

  # Note, SSL cert (cert.pem and key.pem) is generated from cloudflare.
  nginx:
    build:
      context: ./nginx
      dockerfile: Dockerfile
    restart: always
    ports:
     - "2053:443"


  laravel:
    build:
      context: ./laravel
      dockerfile: Dockerfile
    restart: always

问题答案:

PHP-FPM

我认为您缺少 php-fpm.conf 配置文件,我的文件看起来像是标准文件,但有一些更改:

  • error_log = /proc/self/fd/2 允许您使用 docker logs
  • daemonize = no
  • include=/etc/php/7.1/fpm/php-fpm.d/www.conf

www.conf 我将其包含在 php-fpm.conf

更改标准之一:

  • listen = 9000

Dockerfile

显然,我复制了php-fpm.conf和www.conf(我使用php:7.1.14-fpm-jessie

... install & cleanup steps
COPY php-fpm.conf /etc/php/7.1/fpm/php-fpm.conf
COPY www.conf /etc/php/7.1/fpm/php-fpm.d/www.conf

用于php-fpm的Dockerfile的结尾看起来像:

CMD ["php-fpm", "--fpm-config", "/etc/php/7.1/fpm/php-fpm.conf"]

NGINX

default 我通过Dockerfile复制到其中:

server {
    listen 80 default_server;

    root /var/www/app/public;

    index index.html index.htm index.php;

    server_name _;

    charset utf-8;

    location = /favicon.ico { log_not_found off; access_log off; }
    location = /robots.txt  { log_not_found off; access_log off; }

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

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass pn-php-fpm:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    error_page 404 /index.php;

    location ~ /\.ht {
        deny all;
    }
}

NGINX的Dockerfile

FROM nginx

RUN  echo "daemon off;" >> /etc/nginx/nginx.conf

COPY default /etc/nginx/conf.d/default.conf

# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
    && ln -sf /dev/stderr /var/log/nginx/error.log

CMD ["nginx"]

Docker组成部分

撰写时需要共享音量;我的意思是,NGINX + php-fpm必须能够读取您的 应用程序代码

volumes:
  - wherever/your/code/is/on/host:/var/www/app

注意 :此答案是WIP,我将定期编辑/评论以帮助OP。



 类似资料:
  • 问题内容: 我对php比较陌生。有一件非常基本的事情困扰着我。我了解php用于使网站动态化。我也了解php是可用于创建动态网站的许多服务器端脚本语言之一。 但是,我不明白的是,何时需要使用index.php页面。例如,如果我的索引页面上只有一个简单的登录页面,那么它也可能只是一个简单的html页面。对?那我为什么要使它成为index.php而不是index.html? 一个示例情况的例子将是很好的

  • 问题内容: 我有一个简单的代码,可为文本文件(url_list.txt)中列出的每个URL打印GET响应时间。 当顺序触发请求时,返回的时间对应于各个URL的预期响应时间。 但是,当同时执行相同的代码时,返回的响应时间通常比预期的要高。 看来我在http.Get(url)调用之前捕获的 time_start 并不是实际发送请求的时间。我猜http.Get(url)的执行排队了一段时间。 使用gor

  • **>错误:请求失败,状态代码为404, 在createError(createError.js:16)在settle.js:17)在xmlHttpRequest.HandleLoad(xhr.js:62)**

  • 问题内容: 我无法使用RestTemplate(org.springframework.web.client.RestTemplate)应对额外的弹簧行为,但没有成功。 我在代码下面的Hole应用程序中使用,并且始终会收到XML响应,该响应会解析并评估其结果。 但是无法确定为什么执行后服务器响应为JSON格式: 我已经在较低级别的RestTemplate上进行了调试,内容类型为XML,但是不知道为

  • 我使用pysnmp用Python测试了SNMP GET命令的以下代码 当我使用localhost或127.0.0.1运行它时,它可以工作,但当我使用计算机的IP时,会出现超时错误。 我还测试了我在Java(snmp4j)中找到的一个示例,它与Java(snmp4j)是一样的:它可以与本地主机和127.0.0.1一起工作,但不能与IP一起工作。如果我对IP进行ping,它就会工作,所以我不明白为什么

  • 问题内容: 我刚刚安装了CentOS,Apache和PHP。当我访问我的网站http://example.com/myapp/时,它显示为“禁止访问”。默认情况下,它不会加载index.php文件。 当我访问http://example.com/myapp/index.php时,它可以正常工作。 任何想法如何解决该问题? 问题答案: Apache需要配置为将index.php识别为索引文件。 实现