简体   繁体   English

Dockerize Laravel应用程序时“GET /index.php”404

[英]“GET /index.php” 404 when dockerize Laravel app

I tried to have a very minimal setup, to dockerize Laravel app. 我尝试了一个非常小的设置,以对待Laravel应用程序。 Even the nginx able to forward the request to Laravel container, I'm still getting GET /index.php" 404 即使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

When I went inside laravel container, this is how it looks like. 当我进入laravel容器时,这就是它的样子。 Seem fine to me. 好像对我来说。

Inside Laravel container 里面的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 #

May I know what's wrong with my setup? 我可以知道我的设置有什么问题吗? Here's my minimalist Dockerfiles 这是我的极简主义Dockerfiles


laravel/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 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 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 泊坞窗,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

I think you are missing the php-fpm.conf configuration file, mine looks just like a standard one with some changes: 我认为你错过了php-fpm.conf配置文件,我看起来就像一个有一些变化的标准文件:

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

www.conf which I include in the bottom of php-fpm.conf www.conf ,我包含在php-fpm.conf的底部

standard one with changes: 标准的变化:

  • listen = 9000

Dockerfile : Dockerfile

Obviously I copy the php-fpm.conf and www.conf (I use php:7.1.14-fpm-jessie ) 显然我复制了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

the end of Dockerfile for php-fpm looks like: 用于php-fpm的Dockerfile的结尾如下所示:

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

NGINX NGINX

default which I copy in via Dockerfile: 我通过Dockerfile复制的default

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's Dockerfile : 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 compose part Docker组成部分

You need to share volumes when composing; 你需要在作曲时分享音量; what I mean, NGINX + php-fpm must be able to read your application's code 我的意思是,NGINX + php-fpm必须能够读取你的应用程序的代码

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

Note : this answer is WIP and I will edit / comment regularly in order to help OP. 注意 :这个答案是WIP,我会定期编辑/评论以帮助OP。

Here's my very minimal setup, which makes Laravel workable in Docker. 这是我非常小的设置,这使得Laravel可以在Docker中使用。 Previously, it doesn't work, because it didn't include the following line in Nginx container. 以前,它不起作用,因为它在Nginx容器中不包含以下行。 (Although error happens in Laravel container) (虽然在Laravel容器中发生了错误)

root /var/www/html/public;

laravel/html (folder) laravel / html(文件夹)

This folder is generated using the following command line. 使用以下命令行生成此文件夹。 The command is executed in host machine. 该命令在主机中执行。

docker run --rm -v $(pwd):/app -w /app composer/composer create-project --prefer-dist laravel/laravel html (Linux)
docker run --rm -v %cd%:/app -w /app composer/composer create-project --prefer-dist laravel/laravel html (Windows)

laravel/Dockerfile laravel / Dockerfile

FROM php:7.2.8-fpm-alpine3.7

COPY html /var/www/html

WORKDIR /var/www/html

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

RUN composer install

RUN cp .env.example .env

RUN php artisan key:generate

RUN php artisan optimize

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

nginx/default.conf nginx的/ default.conf

server {
    listen 443;
    ssl on;
    root /var/www/html/public;

    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 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 泊坞窗,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

You can then access Laravel app using 然后,您可以使用访问Laravel应用程序

https://localhost:2053/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Laravel主页提供404但index.php可以工作 - Laravel home page gives 404 but index.php works 在URL中省略index.php时,总是在Slim Framework中出现404错误 - Always get 404 error in Slim Framework when omitting index.php in URL 我在使用Index.php加载主页时获得404,但index.php适用于直接链接,为什么? - i get a 404 while loading the homepage with Index.php, but index.php works on direct links, why? Codeigniter-当用户键入index.php时显示404页 - Codeigniter - Show 404 Page when User Types index.php 在尝试从外部访问index.php时出现404错误 - Getting a 404 Error for index.php when trying to access it externally 尝试访问index.php时代码点火器抛出404 - Code Igniter throwing 404 when trying to access index.php 调用没有index.php的控制器时,codeigniter 3中出现404错误 - 404 error in codeigniter 3 when calling controller without index.php Restler 2:调用index.php时,显示错误404 - Restler 2: When calling index.php, display error 404 index.php / user中的404错误,但不是index.php - 404 error in index.php/user but not is index.php $ http.get(index.php中我函数的URL)在调用我苗条的php函数时返回404错误 - $http.get(url for my function in index.php) returns 404 error when callin my slim php function
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM