宿主机的nginx与docker容器里的php如何关联?

我的宿主机部署了nginx,并启动映射到80端口,
然后我pull了一份php7-fpm的镜像到一个新容器里,并启动映射端口9000:9000,

请问如何才能让宿主机的nginx和容器里的php关联起来呢?望解答谢谢。


我宿主机的nginx配置如下:

        root  /var/www/XX;  #宿主机的web所在目录
        ······· 
        location / {
            index index.html index.php;
        }
        ·······
        location ~ \.php$ {
            fastcgi_pass   192.168.42.18:9000; #docker容器php-fpm分配的内网ip和端口——127.0.0.1:9000
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name; 
            include        fastcgi_params;         
        }
        

假设
1.在宿主机的/var/www目录下创建web目录——html,并在html目录里创建index.php文件,然后访问外网ip显示的是 No input file specified,nginx的log显示为FastCGI sent in stderr: "Unable to open primary script: /var/www/html/index.php (Operation not permitted)" while reading response header from upstream

2.在宿主机的/var/www目录下创建web目录——html1,并在html1目录里创建index.php文件,然后访问外网ip显示的是 File not found,nginx的log显示为 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream

已知
1.已通过 docker run -v 将宿主机的web根目录挂载到php-fpm docker容器里的web根目录
2.nginxphp-fpm的用户组均是www-data
3.宿主机的web目录的用户组和用户是www-data:www-data,访问权限是755
4.php-fpm docker容器里的web目录为 /var/www/html

请问这是什么原因造成的呢?

阅读 16.9k
5 个回答

看下我写的这篇文章 https://icewing.cc/docker-use...

简单的说,Nginx 通过 fastcgi_param 传递各种参数给 FPM 进程,而其中非常重要的一行就是 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

SCRIPT_FILENAME 指定了要执行的 php 文件的路径,这个路径一定是在 fpm 容器中能够找到的路径,而不是宿主机中的路径。给你一个简单的解决方案——如果宿主机中的目录是 /var/www/html,那么容器中的路径也改名叫 /var/www/html ,这样就不会出现容器内外 php 文件路径不一致的问题了。

首先,容器间连接使用的是--link参数,而不是通过IP,也不是通过-p映射端口。
其次,Nginx搭配PHP的最佳实际是,两个容器挂载相同的数据卷(也就是代码目录)。

建议先熟悉一下Docker的基础使用方法。
https://docs.docker.com/

你的配置中:

fastcgi_param  SCRIPT_FILENAME  /var/www/html/$fastcgi_script_name;

改成:

fastcgi_param  SCRIPT_FILENAME  /var/www/XX/$fastcgi_script_name;

试试;

直接访问nginx就能访问到,nginx会转发请求。

3个步骤实现关联:

  1. nginx容器启动时候,通过--link参数,--link php-fpm:php-fpm,共享php-fpm容器的网络。

  2. nginx.conf配置,设置代理,fastcgi_pass php-fpm:9000;#此处为关键!!其中php-fpm为php容器的名称,见启动php容器docker run --name指定的值。

  3. php容器监听所有9000的访问listen = 9000,默认只监听本机listen = 127.0.0.1:9000 <---------估计你是这步导致访问不了php容器

推荐一下这篇文章《Docker多容器部署LNMP环境》,里面有nginx/php/mysql三者间关系及容器通信方法分析

推荐问题