为何要为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
相关产品推荐
相关产品推荐

