我正在尝试创建两个docker容器。一个包含nginx,另一个包含php-fpm。这是我的docker-compose.yml
:
version: '2'
services:
nginx:
build: ./nginx
ports:
- "80:80"
- "443:443"
fpm:
build: ./php
volumes:
- ./php/code:/var/www/html/
以下是Dockerfile
容器的nginx
:
FROM nginx:latest RUN rm /etc/nginx/conf.d/default.conf COPY ./default.conf /etc/nginx/conf.d /
而且,这是我的default.conf
:
server {
listen 80;
server_name localhost;
root /var/www/html;
error_log /var/log/nginx/localhost.error.log;
access_log /var/log/nginx/localhost.access.log;
location / {
# try to serve file directly, fallback to app.php
try_files $uri /app.php$is_args$args;
}
location ~ ^/.+\.php(/|$) {
fastcgi_pass fpm:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
}
}
这是我所有的nginx配置。
以下是Dockerfile
目录中的./php
:
from php:fpm
COPY ./code/ /var/www/html/
在./code
目录中,我有一个名为app.php
的文件,其中包含phpinfo()
。
我运行docker-compose up
当我尝试打开192.168.99.100
(运行docker引擎的docker机器的IP)时,我得到File not found
。我也试过了192.168.99.100/app.php
,但它也一样。
我配置错误是什么?我在互联网上的一个例子中看到PHP文件必须存在于nginx
容器中,但这没有任何意义,因为据我所知,php-fpm
是必须具有访问权限的进程那些文件。
答案 0 :(得分:3)
您的404错误的原因是您的Nginx容器中没有文件。
您必须将链接到PHP-FPM容器的相同文件链接到Nginx容器中:
version: '2'
services:
nginx:
build: ./nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./php/code:/var/www/html/
fpm:
build: ./php
volumes:
- ./php/code:/var/www/html/
当请求到达Web服务器时,在Nginx将请求传递给PHP-FPM容器之前,该文件必须至少存在。您甚至可以将该文件夹设为只读Nginx容器:
version: '2'
services:
nginx:
build: ./nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./php/code:/var/www/html/:ro
fpm:
build: ./php
volumes:
- ./php/code:/var/www/html/
答案 1 :(得分:0)
在完成其他答案中建议的内容并在此问题上花了大约六个小时或更长时间后,我发现我的设置无效的原因是因为docker-compose up
无法重建您的图片,所以容器中的配置是旧版本。
因此,解决此问题就像docker-compose build
然后docker-compose up
一样简单。
抱歉占用了每个人的时间。