You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何要为Nginx与PHP服务指定同一Docker卷?

问题:为何Nginx和PHP容器都需要挂载同一代码卷?

docker-compose.yml 配置

services:
  nginx:
    image: nginx:1.25
    container_name: nginx
    ports:
      - "80:80"
    volumes:
      - ./.docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./app:/var/www/html
    depends_on:
      - php
    networks:
      - app-network

  php:
    image: php:8.3-fpm
    container_name: php
    volumes:
      - ./app:/var/www/html
    networks:
      - app-network

  mariadb:
    image: mariadb:11.3
    container_name: mariadb
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: mydatabase
      MYSQL_USER: myuser
      MYSQL_PASSWORD: mypassword
    ports:
      - "3306:3306"
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

volumes:
  dbdata: {}

Nginx default.conf 配置

server {
    listen 80;
    server_name localhost;

    root /var/www/html;
    index index.php;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

用户疑问:为何要为Nginx和PHP服务指定同一卷./app:/var/www/html,而不是仅给Nginx挂载?我原本以为Nginx通过fastcgi_pass将请求转发给PHP容器,只需Nginx挂载该卷即可。


解答

  • PHP-FPM需要直接访问代码文件:Nginx只是负责把PHP请求转发给PHP-FPM容器,但真正执行PHP脚本的是PHP容器本身。如果PHP容器没有挂载代码卷,它根本找不到要执行的.php文件,会直接返回文件不存在的错误。
  • Nginx要处理静态资源:配置中的try_files指令是用来处理静态文件(比如图片、CSS、JS)的,这些资源需要Nginx直接读取并返回给客户端,所以Nginx必须挂载代码卷才能访问到这些文件。
  • 路径一致性要求:Nginx通过fastcgi_param SCRIPT_FILENAME传递给PHP的文件路径($document_root$fastcgi_script_name),必须和PHP容器内的代码路径完全一致(都是/var/www/html下的对应文件)。如果路径不匹配,PHP容器会找不到指定的脚本文件,导致执行失败。

内容的提问来源于stack exchange,提问作者Alex Mikhaelson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:25:15