在 Docker 中尝试将 PHP 与 Nginx 交互时出现 404 错误

在 Docker 中尝试将 PHP 与 Nginx 交互时出现 404 错误

抱歉,这个问题已经得到解答。这是我第一次在 Web 开发中使用 Docker。我正在为我的项目设置 Nginx - PHP - MariaDB。每次我访问 php 文件时,我的 Nginx 都会显示 404 错误,这让我很卡。

docker-compose.yml

version: '3'
# Nginx
services: 
  web:
    image: nginx:latest
    restart: "always"
    volumes:  
      - ./web.conf:/etc/nginx/conf.d/default.conf
      # Index
      - /home/hoangtho/Projects:/data/www/projects
    ports: 
      - "80:80"
    
    depends_on:
      - mariadb
    links: 
      - mariadb
      - php
# Mariadb
  mariadb:
  # Install latest version
    image: "mariadb:latest"
    restart: "always"
    
    environment:
      MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
      MYSQL_DATABASE: "${MYSQL_DATABASE}"
      MYSQL_USER: "${MYSQL_USER}"
      MYSQL_PASSWORD: "${MYSQL_PASSWORD}"

    ports: # ⇐ here
      - "3306:3306" 
# PHP services
  php:
    image: php:7.3-fpm-alpine
    restart: "always"
    build:
      context: './php/'
    volumes:
      - /home/hoangtho/Projects:/data/www/projects
    

网页配置文件

server {
    listen              80;
    server_name         localhost;
    index index.php index.htm index.html;
    #  set root 
    location / {
        root /data/www/projects;
        index index.html index.php;
    }
     location /test {
        alias /data/www/projects;
        autoindex on;
    }
    # PHP
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
  }

Dockerfile

FROM php:7.3-fpm-alpine
Install PDO , PDO_MYSQLI
RUN docker-php-ext-install  pdo pdo_mysql 

您可以看到我的设置非常简单。但我不知道为什么我在访问 PHP 文件时不断出现 404 我的根目录/home/hoangtho/Projects(其中包含我的所有项目 - 有效)

答案1

我认为使用 links 和depends_on 是不明智的。容器之间要进行通信,它们必须位于同一网络中。

例如,首先创建一个名为“projects”的网络:

docker network create projects

我修改了你的一些撰写文件:

version: '3'
# Nginx
services: 
  web:
    image: nginx:latest
    restart: "always"
    volumes:  
      - ./web.conf:/etc/nginx/conf.d/default.conf
      # Index
      - /home/hoangtho/Projects:/var/www/html
    networks:
      - projects

# Mariadb
  mariadb:
  # Install latest version
    image: "mariadb:latest"
    restart: "always"
    environment:
      MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
      MYSQL_DATABASE: "${MYSQL_DATABASE}"
      MYSQL_USER: "${MYSQL_USER}"
      MYSQL_PASSWORD: "${MYSQL_PASSWORD}"
    networks:
      - projects

# PHP services
  php:
    image: php:7.3-fpm-alpine
    restart: "always"
    build:
      context: './php/'
    volumes:
      - /home/hoangtho/Projects:/var/www/html
    networks:
      - projects

networks:
  projects:
    external: true

无需指定默认端口(NGINX 为 80,MariaDB 为 3306)。

links 和depends_on 可以替换为“networks”。您还可以使用两个网络,一个用于后端(MariaDB),一个用于前端(NGINX,不确定 PHP 是否需要放在前端,或者它是否只在后端工作)。如果您使用两个网络,请确保将 NGINX(可能还有 PHP)放在这两个网络中。

您指定的卷在容器(/data/www/projects)内不存在,我已将其替换为这些容器内的工作目录(/var/www/html)。

在你的 web.conf 文件中,

server {
    listen              80;
    server_name         localhost;
    index index.php index.htm index.html;
    #  set root 
    location / {
        root /var/www/html;
        index index.html index.php;
    }
     location /test {
        alias /var/www/html;
        autoindex on;
    }
    # PHP
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
  }

相关内容