Nginx和PHP容器之间的Docker连接被拒绝 - php

我正在使用从源映像和nginx官方映像编译的php-fpm创建集群,但是当我尝试运行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不在本地主机上运行(从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外部公开端口即可使用“端口”

除非您需要从Docker外部独立连接到fastcgi / PHP,否则不需要php容器上的ports配置。您只需要expose即可使nginx能够内部与php通讯。

您可能需要定义一个Docker网络

最近,我注意到有时人们需要专门创建一个Docker网络来使这种情况起作用。我不确定为什么会这样,但是您将按照以下步骤进行操作。

首先,创建一个网络。选择您喜欢的任何名称,在下面的示例中,我将使用myapp

docker network create 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

完成此操作后,您将要停止容器并重新启动,以便它们能够提取更改。您无需进行重建即可更改网络配置。

PHP getallheaders替代 - php

我正在尝试从服务器上的apache切换到nginx。唯一的问题是我在PHP脚本中使用的getallheaders()函数,该函数不适用于Nginx。我已经尝试过用户在getallheaders函数上的php站点上提供的注释,但这并不返回所有请求标头。请告诉我如何解决这个问题。我真的想切换到Nginx。 参考方案 您仍然可以使用它,但是您必须像这里一样重新定义…

PHP-将日期插入日期时间字段 - php

我已在数据库中使用datetime字段存储日期,使用PHP将“今天的日期”插入该字段的正确方法是什么?干杯, 参考方案 我认为您可以使用php date()函数

Docker Compose在多阶段构建中覆盖了COPY - php

我的目标是在docker文件的一个阶段中获取php依赖项,然后将这些依赖项复制到下一阶段(vendor/ dir)。但是,一旦在docker-compose.yml中指定了覆盖COPY语句的卷,就好像从未发生过一样。docker-compose.ymlversion: "3" services: app: build: context: …

PHP mysqli获取查询返回的第一行的值 - php

我正在使用mysqli从数据库中获取某些数据。我正在使用的查询已设置为仅从数据库返回一行。有没有一种方法可以在不使用while循环的情况下获取该行的值?我知道一个while循环对于返回多于一行的行很有用,但是如果不需要while循环,我想避免这种情况,因为不必要的代码是不好的编程。 参考方案 是的-您可以使用:$row = $result->fetch…

php Singleton类实例将在多个会话中保留吗? - php

举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…