我正在使用从源图像和nginx官方图像编译的php-fprm创建一个集群,但是当我尝试运行一个phpinfo()文件时,nginx会返回以下错误:
*5 connect() failed (111: Connection refused) while connecting to upstream, client: 172.18.0.1, server: localhost, request: "GET /phpinfo.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "127.0.0.1:8000"
docker-compose.yml文件:
version: '2' services: php: restart: always build: data/php image: php:7.1 ports: - "9000:9000" expose: - 9000 volumes: - ./app:/usr/share/nginx/html web: restart: always build: data/nginx image: nginx:1.10.2 ports: - "8000:80" links: - php volumes: - ./data/nginx/vhost.conf:/etc/nginx/conf.d/default.conf - ./data/nginx/nginx.conf:/etc/nginx/nginx.conf - ./app:/usr/share/nginx/html - ./data/log/nginx:/var/log/nginx
我检查了主机中的9000端口,netstat -an | grep :9000
命令和端口是活动的:
tcp6 0 0 :::9000 :::* OUÇA
有关更多详细信息,请参阅此github存储库中的文件(使用该图像的Dockerfile):
https://github.com/mayconfsbrito/docker
Nginx和PHP在两个不同的容器中运行,因此PHP不在localhost上运行(从Nginx的角度来看).
由于您的PHP容器名为"php",因此您不希望连接到此:
fastcgi://127.0.0.1:9000
您可能希望Nginx连接到此:
fastcgi://php:9000
看看你在Github上的回购,我相信你需要将fastcgi_pass
data/nginx/vhost.conf更改为:
fastcgi_pass phpserver;
并添加上游匹配.Nginx中的上游是一种定义您指向的另一台服务器的方法.你会把此之外的的server {}
块,而不是内部.
upstream phpserver {
server php:9000
}
这样做是在Nginx中定义一个名为的上游服务器phpserver
.这指向php
端口9000上的主机名.因为您的PHP容器php
在Docker中命名,这是您可以用来与它通信的主机名(在Docker桥接网络中).
然后我们告诉fastcgi_pass
它应该使用上游服务器调用phpserver
.
除非您需要从Docker 外部独立连接到fastcgi/PHP,否则您不需要ports
php容器上的配置.你只需expose
要让nginx能够在内部与php交谈.
最近我注意到有时候人们需要专门创建一个Docker网络才能使这种场景发挥作用.我不确定为什么会这样,但是你会怎么做.
首先,创建一个网络.选择你喜欢的任何名字,我将myapp
在下面的例子中使用.
docker create network myapp
您现在应该看到这个新网络docker network ls
:
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
c39b88eb8450 bridge bridge local
175efb89adef docker_default bridge local
b34434cc8b1c myapp bridge local
接下来,告诉docker-compose使用此网络.将此块添加到docker-compose.yml文件的底部.它位于YAML的顶层,意味着它应该从左边距开始,而不是缩进.
networks:
default:
external:
name: myapp
执行此操作后,您将需要停止容器并重新启动,以便他们获取更改.您无需进行重建即可更改网络配置.