Docker nginx php-fpm 未服务 php
Docker nginx php-fpm not serving php
我正在尝试设置 nginx 和 php-fpm 图像,以便在 Laravel 应用程序中协同工作。这是我的设置:
docker-compose.yml
version: "3.8"
services:
server:
container_name: nginx
build:
context: .
dockerfile: docker/nginx/Dockerfile
volumes:
- ./src/public:/var/www/html/public
ports:
- "8888:80"
depends_on:
- php
networks:
- laravel_net
php:
container_name: php
build:
context: .
dockerfile: docker/php/Dockerfile
ports:
- "9000:9000"
volumes:
- ./src:/var/www/html
networks:
- laravel_net
networks:
laravel_net:
driver: 'bridge'
Nginx
FROM nginx:stable-alpine
# puts app.conf into the container as /etc/nginx/nginx.conf
# has by default this: include /etc/nginx/conf.d/*.conf;
COPY docker/nginx/conf.d/*.conf /etc/nginx/conf.d/
WORKDIR /var/www/html
COPY ./src/public /var/www/html/public
docker/nginx/conf.d/app.conf
server {
listen 80;
server_name laravel.local;
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/html/public;
location / {
try_files $uri /index.php$is_args$args;
}
location ~ \.php {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_index index.php;
fastcgi_pass php:9000;
}
}
PHP
FROM php:8.1-fpm-alpine
WORKDIR /var/www/html
COPY ./src /var/www/html
EXPOSE 9000
inside src 文件夹是 laravel 应用程序应该存在的地方所以现在我只是在 public 目录上输出 phpinfo() 只是为了检查一切是否正常不出所料
src/public/index.php
<?php
phpinfo();
如果我 运行 docker-compose up --build
和 docker ps
我可以看到容器 运行ning
% docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abc123 laravel_server "/docker-entrypoint.…" 8 seconds ago Up 6 seconds 0.0.0.0:8888->80/tcp nginx
abc456 laravel_php "docker-php-entrypoi…" 8 seconds ago Up 7 seconds 0.0.0.0:9000->9000/tcp php
也在 docker-compose exec server /bin/sh
和 docker-compose exec php /bin/sh
上我可以看到容器内的 index.php 文件
docker-compose exec server sh
/var/www/html # cat public/index.php
<?php
phpinfo();
/var/www/html # ls -la public
total 12
drwxr-xr-x 2 root root 4096 Feb 12 13:41 .
drwxr-xr-x 1 root root 4096 Feb 12 13:41 ..
-rw-r--r-- 1 root root 18 Feb 12 12:51 index.php
docker-compose exec php sh
/var/www/html # ls -lah public/
total 4K
drwxr-xr-x 3 root root 96 Feb 12 13:42 .
drwxr-xr-x 3 root root 96 Feb 10 21:28 ..
-rw-r--r-- 1 root root 18 Feb 12 13:42 index.php
/var/www/html # cat public/index.php
<?php
phpinfo();
然而,当我尝试从浏览器访问 http://localhost:8888
时,我得到默认的 Welcome to nginx! 页面。知道我做错了什么吗?
我认为问题出在 nginx 配置上。您正在将 app.conf
复制到 /etc/nginx/conf.d/
,但已经存在默认配置 /etc/nginx/conf.d/default.conf
。因为您看到的是默认的 nginx 页面,所以我假设使用的是默认页面。
尝试将 app.conf
重命名为 default.conf
或将复制命令更改为
COPY docker/nginx/conf.d/app.conf /etc/nginx/conf.d/default.conf
根据其他回答的评论:
根本没有配置文件的优先级。它们都在运行时成为巨大的 NGINX 配置时间。
在您的情况下,默认 NGINX 配置将侦听端口 80 作为默认服务器名称。这是配置默认“欢迎使用 NGINX”页面的地方。
在您的应用配置中,您将 server_name
设置为 laravel.local
。将此作为 Host-header curl -v -H "Host: laravel.local" 127.0.0.1:8888
发送将使 NGINX 从您的 app.conf
中为该特定主机名选择服务器配置。
您可以将此添加到您的客户 /etc/hosts/
文件中,以使其在您的网络浏览器中运行。
127.0.0.1 laravel.local
我正在尝试设置 nginx 和 php-fpm 图像,以便在 Laravel 应用程序中协同工作。这是我的设置:
docker-compose.yml
version: "3.8"
services:
server:
container_name: nginx
build:
context: .
dockerfile: docker/nginx/Dockerfile
volumes:
- ./src/public:/var/www/html/public
ports:
- "8888:80"
depends_on:
- php
networks:
- laravel_net
php:
container_name: php
build:
context: .
dockerfile: docker/php/Dockerfile
ports:
- "9000:9000"
volumes:
- ./src:/var/www/html
networks:
- laravel_net
networks:
laravel_net:
driver: 'bridge'
Nginx
FROM nginx:stable-alpine
# puts app.conf into the container as /etc/nginx/nginx.conf
# has by default this: include /etc/nginx/conf.d/*.conf;
COPY docker/nginx/conf.d/*.conf /etc/nginx/conf.d/
WORKDIR /var/www/html
COPY ./src/public /var/www/html/public
docker/nginx/conf.d/app.conf
server {
listen 80;
server_name laravel.local;
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/html/public;
location / {
try_files $uri /index.php$is_args$args;
}
location ~ \.php {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_index index.php;
fastcgi_pass php:9000;
}
}
PHP
FROM php:8.1-fpm-alpine
WORKDIR /var/www/html
COPY ./src /var/www/html
EXPOSE 9000
inside src 文件夹是 laravel 应用程序应该存在的地方所以现在我只是在 public 目录上输出 phpinfo() 只是为了检查一切是否正常不出所料 src/public/index.php
<?php
phpinfo();
如果我 运行 docker-compose up --build
和 docker ps
我可以看到容器 运行ning
% docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abc123 laravel_server "/docker-entrypoint.…" 8 seconds ago Up 6 seconds 0.0.0.0:8888->80/tcp nginx
abc456 laravel_php "docker-php-entrypoi…" 8 seconds ago Up 7 seconds 0.0.0.0:9000->9000/tcp php
也在 docker-compose exec server /bin/sh
和 docker-compose exec php /bin/sh
上我可以看到容器内的 index.php 文件
docker-compose exec server sh
/var/www/html # cat public/index.php
<?php
phpinfo();
/var/www/html # ls -la public
total 12
drwxr-xr-x 2 root root 4096 Feb 12 13:41 .
drwxr-xr-x 1 root root 4096 Feb 12 13:41 ..
-rw-r--r-- 1 root root 18 Feb 12 12:51 index.php
docker-compose exec php sh
/var/www/html # ls -lah public/
total 4K
drwxr-xr-x 3 root root 96 Feb 12 13:42 .
drwxr-xr-x 3 root root 96 Feb 10 21:28 ..
-rw-r--r-- 1 root root 18 Feb 12 13:42 index.php
/var/www/html # cat public/index.php
<?php
phpinfo();
然而,当我尝试从浏览器访问 http://localhost:8888
时,我得到默认的 Welcome to nginx! 页面。知道我做错了什么吗?
我认为问题出在 nginx 配置上。您正在将 app.conf
复制到 /etc/nginx/conf.d/
,但已经存在默认配置 /etc/nginx/conf.d/default.conf
。因为您看到的是默认的 nginx 页面,所以我假设使用的是默认页面。
尝试将 app.conf
重命名为 default.conf
或将复制命令更改为
COPY docker/nginx/conf.d/app.conf /etc/nginx/conf.d/default.conf
根据其他回答的评论:
根本没有配置文件的优先级。它们都在运行时成为巨大的 NGINX 配置时间。
在您的情况下,默认 NGINX 配置将侦听端口 80 作为默认服务器名称。这是配置默认“欢迎使用 NGINX”页面的地方。
在您的应用配置中,您将 server_name
设置为 laravel.local
。将此作为 Host-header curl -v -H "Host: laravel.local" 127.0.0.1:8888
发送将使 NGINX 从您的 app.conf
中为该特定主机名选择服务器配置。
您可以将此添加到您的客户 /etc/hosts/
文件中,以使其在您的网络浏览器中运行。
127.0.0.1 laravel.local