在网上搜罗了一圈,发现所有牵扯到php和ngin的镜像,都是php-nginx“粘”在一起的,想要搜到一个php、nginx俩分开的镜像还真不好找。
于是便自己制作。但是在制作过程中,发现php和nginx通过docker的link
指令连在一起的时候,总是连不上,经过了一番折腾,终于发现了其中的猫腻。应该注意三个点:
1 nginx配置记得要指定php文件的路径
1 | server { |
请注意这里有两个路径,一个是root
(配置文件中标1的地方),这里指的是请求到达nginx
根目录后根路径(/
)访问的服务器的文件地址。
重点注意第二个:
因为在解析PHP
的location
中,进入到这个location
中的请求,都是需要php-fpm
去解析的,在配置文件中标记2的地方,是告诉php-fpm
,在php-fpm
所在的机器上,需要解析的PHP
代码在什么路径。通常标记2的地方的默认写法都是:
1 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; |
大部分的配置都是将配置文件中标2的地方的/data/www
的路径由变量$document_root
代替,而这个时候,由于没有特殊的指定$document_root
,所以,通常都是指server
下的root
路径。如果同一台机器下还可以,但是nginx
和php-fpm
不同机器就不行了,必须指定php-fpm
机器下的路径。(PS:也就是说nginx和php-fpm所在的两台机器下都要有代码。)
2 nginx配置文件要指定的php-fpm的地址为docker link时指定的容器名
两容器相连,必然使用docker
的link
指令。nginx
容器 link
了php-fpm
容器,那么nginx
容器中的hosts
文件中就记录了php-fpm
此时所在的IP
地址,IP
地址的域名就是php-fpm
的容器名字,所以,在Nginx
配置文件中配置php-fpm
的IP
地址时,就可以直接写php-fpm
的容器名字,如上面的配置文件中的标记3所示。
3 php-fpm监听端口和IP地址配置
找到php-fpm.conf
的相关配置文件,通常不是直接在php-fpm.conf
中配置,而是在一个叫php-fpm.d
的文件夹中,放置以.conf
为结尾的配置文件,在php-fpm.d
文件夹下的配置文件中配置。
找到对应的配置文件,找到其中listen的设定,通常设定为:127.0.0.1:9000
,如果你不改,直接将php-fpm
与nginx
相连,通常访问会报502错误。
那该如何改?
通常,nginx
和php-fpm
是放到同一个机器上的,这个时候,这个listen
下的配置可以是一个sock
文件,也可以是默认的127.0.0.1:9000
,通常这样理解:“php-fpm
要开启本机的9000
端口去监听,那么本机就是127.0.0.1
,而端口号默认的是9000
”。貌似没有错误,但是忘了一点:nginx
和php-fpm
在本机的情况下,是可以,因为nginx
直接通过127.0.0.1:9000
可以找到php-fpm
,但是如果分开部署的连接环境下,就不可以了,nginx
通过127.0.0.1:9000
在只会在本机nginx
上的机器搜索,根本找不到,就报错了。只能是找php-fpm
对应的IP地址+端口号,才可以找到。而php-fpm
的容器的IP
地址无法动态获取的,所以,就填任何IP
都可以访问:及listen = [::]:9000
或者listen = 0.0.0.0:9000
。
实际上,php-fpm
中的listen
的IP
地址和端口号,应该和nginx
中配置的php-fpm
的IP
地址和端口号应该是一致的!
将
1 | [www] |
1 | [www] |
以下是nginx
配置文件的执行流程:
以下是PHP
配置文件的执行流程:
如果想要查看整个dnmp
的docker
源文件,可以查看我的GitHub。
Reference
- https://blog.csdn.net/i6448038/article/details/77435897
- https://blog.fontebasso.com.br/php-nginx-with-docker-in-production-part-3-d8935b910ba9
写在最后
欢迎大家关注鄙人的公众号【麦田里的守望者zhg】,让我们一起成长,谢谢。