我正在使用从源图像和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):
答案 0 :(得分:11)
Nginx和PHP在两个不同的容器中运行,因此PHP不在localhost上运行(从Nginx的角度来看)。
由于您的PHP容器名为" php",您不想连接到此:
fastcgi://127.0.0.1:9000
你希望Nginx能够连接到它:
fastcgi://php:9000
看看你在Github上的回购,我相信你需要将data / nginx / vhost.conf中的fastcgi_pass
更改为:
fastcgi_pass phpserver;
添加上游以匹配。 Nginx中的上游是一种定义您指向的另一台服务器的方法。你可以把这个放在server {}
块的之外,而不是在里面。
upstream phpserver {
server php:9000
}
这样做是在Nginx中定义一个名为phpserver
的上游服务器。这指向端口9000上的主机名php
。因为您的PHP容器在Docker中名为php
,这是您可以用来与它通信的主机名(在Docker桥接网络中)。
然后我们告诉fastcgi_pass
它应该使用名为phpserver
的上游服务器。
除非您需要从Docker的外部独立连接到fastcgi / PHP,否则您不需要php容器上的ports
配置。你只需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
执行此操作后,您将需要停止容器并重新启动,以便他们获取更改。您无需进行重建即可更改网络配置。