代码之家  ›  专栏  ›  技术社区  ›  Cheok Yan Cheng

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

  •  3
  • Cheok Yan Cheng  · 技术社区  · 6 年前

    我试图有一个非常小的设置,停靠拉维尔应用程序即使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
    

    当我进入拉维容器,这就是它的样子我觉得很好。

    拉氏容器内

    /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 #
    

    我能知道我的设置有什么问题吗这是我的最简摘要文件


    拉维尔/码头文件

    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
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Kyslik    6 年前

    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的 停靠文件 :

    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。

        2
  •  1
  •   Cheok Yan Cheng    6 年前

    这是我最小的设置,这使得拉维尔在码头可行以前,它不起作用,因为它没有在 Nginx 集装箱(尽管错误发生在 Laravel 集装箱)

    root /var/www/html/public;
    

    laravel/html(文件夹)

    此文件夹是使用以下命令行生成的命令在主机中执行。

    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)
    

    拉维尔/码头文件

    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文件

    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文件

    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
    

    然后您可以使用

    https://localhost:2053/