我尝试了一个非常小的设置,以对Laravel应用进行dockerize。即使nginx能够将请求转发到Laravel容器,我仍然GET /index.php" 404
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容器时,它是这样的。对我来说似乎很好。
/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
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
我认为您缺少 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
www.conf
php-fpm.conf
更改标准之一:
listen = 9000
Dockerfile:
Dockerfile
显然,我复制了php-fpm.conf和www.conf(我使用php:7.1.14-fpm-jessie)
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"]
default 我通过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的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"]
撰写时需要共享音量;我的意思是,NGINX + php-fpm必须能够读取您的 应用程序代码
volumes: - wherever/your/code/is/on/host:/var/www/app
注意 :此答案是WIP,我将定期编辑/评论以帮助OP。