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 --builddocker 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/shdocker-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