簡體   English   中英

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

在 src 文件夾內是 laravel 應用程序應該存在的地方所以現在我只是在公共目錄上輸出 phpinfo() 只是為了檢查一切是否按預期工作 src/public/index.php

<?php

phpinfo();

如果我運行docker-compose up --builddocker ps我可以看到容器正在運行

% 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 將其作為主機標頭發送curl -v -H "Host: laravel.local" 127.0.0.1:8888將讓 NGINX 從您的app.conf中為這個特定的主機名選擇服務器配置。

您可以將其添加到您的客戶端/etc/hosts/文件中,以使其在您的 web 瀏覽器中運行。

127.0.0.1 laravel.local

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM