php、nginx 两个分开的容器相连连不上的问题总结
来源:互联网 发布:手机淘宝 卖家中心 编辑:程序博客网 时间:2024/06/05 17:42
php、nginx 两个分开的容器相连连不上的问题总结
在网上搜罗了一圈,发现所有牵扯到php和ngin的镜像,都是php-nginx“粘”在一起的,想要搜到一个php、nginx俩分开的镜像还真不好找。于是便自己制作。但是在制作过程中,发现php和nginx通过docker的``link``指令连在一起的时候,总是连不上,经过了一番折腾,终于发现了其中的猫腻。应该注意三个点:
nginx配置记得要指定php文件的路径
例子:
请注意这里有两个路径,一个是root
(图1的地方),这里指的是请求到达根nginx后根路径/
访问的服务器的文件地址。
重点注意第二个:
因为在解析PHP的location
中,进入到这个location中的请求,都是需要php-fpm去解析的,在图中2标记的地方,是告诉php-fpm,在php-fpm所在的机器上,需要解析的PHP代码在什么路径。通常标记2的地方的默认写法都是fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
会将图二中/data/www
的路径由变量$document_root
代替,而这个时候,由于没有特殊的指定$document_root
,所以,通常都是指server
下的root
路径。如果同一台机器下还可以,但是nginx和php-fpm不同机器就不行了,必须指定php-fpm机器下的路径。(PS:也就是说nginx和php-fpm所在的两台机器下都要有代码。)
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的容器名字:如下图所示:
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地址和端口号应该是一致的!
将
[www]listen = 127.0.0.1:9000
改为:
[www]listen = [::]:9000
最后,代码贴一下
上文图中配置为了掩饰稍有不全,请以下面的代码为主:
项目目录结构:
docker-compose.yml文件
nginx_demo: image: nginx:1.12 container_name: nginx_demo ports: - "80:80" - "443:443" links: - php_demo volumes: - ./index.php:/usr/share/nginx/html/index.php - ./conf/nginx:/etc/nginx/conf.d php_demo: image: php:7.0-fpm container_name: php_demo volumes: - ./index.php:/index.php
nginx配置文件
server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; root /usr/share/nginx/html; index index.php index.html index.htm; server_name localhost; location / { try_files $uri $uri/ /index.php?_url=$uri&$args; } location ~ \.php$ { try_files $uri /index.php =404; fastcgi_pass php_demo:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /$fastcgi_script_name; include fastcgi_params; } location ~ /\.ht { deny all; }}
php-fpm的配置文件:(现有镜像(现在是7.0-fpm
)已经帮忙改过来了,即zz-docker.conf
配置文件)
[global]daemonize = no[www]listen = [::]:9000
nginx配置文件执行流程
php-fpm配置文件执行流程
- php、nginx 两个分开的容器相连连不上的问题总结
- 两个相连的div
- 两个不相连的子数组最大值
- 两个不相连的子数组最大值
- 一个关于hibernate3配置两个相连大写字符的字段名问题(菜鸟级)
- Ubuntu nginx+php+mysql的一些问题总结
- JAVASCRIPT字符串与数字相连的问题
- 两个字符串变量相连,空字符的保留
- 困扰nginx初学者的两个小问题
- 用SSH与PHP相连接,确保数据传输的安全性
- 相连的农场题解
- 题目:相连的农场
- 相连的农场
- 1003. 相连的1
- 1003. 相连的1
- 【1003】相连的1
- 1003.相连的1
- 1003.相连的1
- win10+go+beego搭建用户管理系统
- Codeforces Round #381 (Div. 2) #V
- 用css做的风琴相册
- Visual Studio如何设置背景
- python 的xml解析
- php、nginx 两个分开的容器相连连不上的问题总结
- FreeRTOS在STM32F4上移植
- js之二级伸缩栏目+多选框+开关门
- 竖式问题
- RILD
- MII 类型接口介绍
- Struts2的下载安装
- css的伪类
- C#委托