[英]“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.
好像对我来说。
/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
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"]
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;
}
}
FROM nginx:1.13.9-alpine
COPY . /app
RUN rm /etc/nginx/conf.d/default.conf
COPY default.conf /etc/nginx/conf.d/
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
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"]
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"]
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;
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)
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"]
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;
}
}
FROM nginx:1.13.9-alpine
COPY . /app
RUN rm /etc/nginx/conf.d/default.conf
COPY default.conf /etc/nginx/conf.d/
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.