当前位置: 首页 > 知识库问答 >
问题:

Docker: Nginx和php5-fpm docker不说话

爱亮
2023-03-14

我想做一个完全dockerizedDrupal安装。我的第一步是让容器运行Nginx和php5-fpm,两者都是基于Debian的。我在CoreOS alpha频道(使用数字海洋)

我的DockerFile如下所示:

Nginx:

FROM debian
MAINTAINER fvhemert
RUN apt-get update && apt-get install -y nginx && echo "\ndaemon off;" >> /etc/nginx/nginx.conf
CMD ["nginx"]
EXPOSE 80

这个容器构建并运行良好。我在我的服务器ip上看到默认的Nginx页面。

php5-fpm:

FROM debian
MAINTAINER fvhemert
RUN apt-get update && apt-get install -y \
            php5-fpm \
            && sed 's/;daemonize = yes/daemonize = no/' -i /etc/php5/fpm/php-fpm.conf
CMD ["php5-fpm"]
EXPOSE 9000

这个容器也没有任何问题,并且在启动时保持运行。

我首先使用以下命令启动php5 fpm容器:

docker run -d --name php5-fpm freek/php5-fpm:1

然后我启动Nginx,链接到php5-fpm:

docker run -d -p 80:80 --link php5-fpm:phpserver --name nginx freek/nginx-php:1

链接似乎正常,在/etc/hosts中有一个名为phpserver的条目。两个码头工人都经营:

core@dockertest ~ $ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
fd1a9ae0f1dd        freek/nginx-php:4   "nginx"             38 minutes ago      Up 38 minutes       0.0.0.0:80->80/tcp   nginx
3bd12b3761b9        freek/php5-fpm:2    "php5-fpm"          38 minutes ago      Up 38 minutes       9000/tcp             php5-fpm

我已经调整了一些配置文件。对于Nginx容器,我已编辑/etc/Nginx/sites enabled/default并已更改:

server {
        #listen   80; ## listen for ipv4; this line is default and implied
        #listen   [::]:80 default_server ipv6only=on; ## listen for ipv6

        root /usr/share/nginx/www;
        index index.html index.htm index.php;

(我添加了index.php)

此外:

location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
        #       # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        #
        #       # With php5-cgi alone:
                fastcgi_pass phpserver:9000;
        #       # With php5-fpm:
        #       fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }

在php5 fpm docker中,我更改了/etc/php5/fpm/php。ini:

cgi.fix_pathinfo=0

php5 fpm运行:

[21-Nov-2014 06:15:29] NOTICE: fpm is running, pid 1
[21-Nov-2014 06:15:29] NOTICE: ready to handle connections

我也把index.html改成index.php,它看起来像这样(/usr/share/nginx/www/index.php):

<html>
<head>
<title>Welcome to nginx!</title>
</head>
<body bgcolor="white" text="black">
<center><h1>Welcome to nginx!</h1></center>

<?php
phpinfo();
?>

</body>
</html>

我已经从Nginx docker扫描了9000端口,它看起来是关闭的。当然,这不是个好兆头:

root@fd1a9ae0f1dd:/# nmap -p 9000 phpserver

Starting Nmap 6.00 ( http://nmap.org ) at 2014-11-21 06:49 UTC
Nmap scan report for phpserver (172.17.0.94)
Host is up (0.00022s latency).
PORT     STATE  SERVICE
9000/tcp closed cslistener
MAC Address: 02:42:AC:11:00:5E (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 0.13 seconds

Nginx日志:

root@fd1a9ae0f1dd:/# vim /var/log/nginx/error.log
2014/11/20 14:43:46 [error] 13#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 194.171.252.110, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "128.199.60.95"
2014/11/21 06:15:51 [error] 9#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 145.15.244.119, server: localhost, request: "GET / HTTP/1.0", upstream: "fastcgi://172.17.0.94:9000", host: "128.199.60.95"

是的,这是错误的,当浏览到我的Nginx实例时,我不断收到一个502错误网关。

我的问题是:到底出了什么问题?我猜我在php配置文件中缺少一些设置。

编辑更多细节:这是结果(从php5-fpm容器内,apt-get安装net-ols后):

root@3bd12b3761b9:/#netstat-Tapen
活动Internet连接
(服务器和已建立的)Proto Recv-Q Send-Q本地地址
外部地址状态用户I节点PID/程序名

从Nginx容器内:

root@fd1a9ae0f1dd:/#netstat-tapen
活动Internet连接
(服务器和已建立)Proto Recv-Q Send-Q本地地址外部地址状态用户索引节点PID/程序名tcp 0.0。0.0:80 0.0.0.0:
听一听1875387-

编辑2:进步!

在php5 fpm容器中的文件中:

/etc/php5/fpm/pool.d/www.conf

我将listen参数从某个套接字名称更改为:

listen = 9000

现在,当我转到我的网页时,我得到一个错误:“没有指定输入文件。”

可能我在什么地方出了差错。我会更仔细地调查的!

编辑3:

所以我用上面提到的改动重建了码头工人,看起来他们在说话。然而,我的网页告诉我:“找不到文件。”我非常确定它与nginx发送给phpfpm的文档有关,但我不知道它应该是什么样子。我在使用socket方法时使用了默认值,该方法始终有效。现在它不再工作了。location~下的/etc/nginx/sites enabled/default应该是什么。php${?

共有3个答案

娄飞鸾
2023-03-14

当你在你的容器里

root@fd1a9ae0f1dd:/#,检查与一起使用的端口

netstat-tapen | grep:9000“

netstat-lntpu|grep": 9000"

蔡修远
2023-03-14

所以,我已经测试了所有的设置,没有一个在docker之间工作,而他们在1台服务器上(或者也在一个docker可能)使用相同的设置。然后我发现php-fpm没有从nginx获取php文件,它正在接收路径,如果它在自己的容器中找不到相同的文件,它会生成一个“文件未找到”。更多信息请参见此处:https://code.google.com/p/sna/wiki/NginxWithPHPFPM因此,可悲的是,这解决了问题,但没有解决问题。对于那些想要使用多个php-fpm服务器实现负载平衡的人来说,这很烦人,他们必须同步所有内容或类似的东西。我希望有一天我会找到一个更好的解决方案。感谢您的回复。

编辑:也许我可以在两个容器中装载相同的卷,并让它以这种方式工作。但是,当使用多个服务器时,这不是一个解决方案。

王鹏飞
2023-03-14

它不起作用的原因是,正如您自己所发现的,nginx只将PHP文件的路径发送到PHP-FPM,而不是文件本身(这将非常低效)。解决方案是使用第三个仅包含数据的卷容器来承载文件,然后将其装载到两个docker实例上。

FROM debian
VOLUME /var/www
CMD ['true']

构建上述Dockerfile并创建一个实例(例如,将其命名为storage www),然后使用以下选项运行nginx和PHP-FPM容器:

--volumes-from storage-www

如果在同一台物理服务器上运行两个容器,那么这将起作用。但是,如果将仅数据的容器放在网络文件系统(如GlusterFS)上,您仍然可以使用不同的服务器。GlusterFS非常高效,可以在大规模网络上分发。

希望这有所帮助。

更新:

截至2015年,在容器之间建立持久链接的最佳方法是使用docker compose。

 类似资料:
  • Yos-social-php5 是 Yahoo! Social SDK 的 PHP5 开发包。

  • 我已经尝试在我的nginx/php5 fpm堆栈上安装mediawiki大约一天了,我在这个堆栈上安装了许多其他框架,从Wordpress、Magento到OpenEMON,所有这些都工作得很好: Ubuntu 12.04 LTS 如果你看这里:http://wiki.qubmc.co.uk/mw-config/index.php 按继续只会出现会话错误: 会话是由PHP为这个应用程序和其他应用程

  • 本文向大家介绍请说说position:absolute和float有什么不同?相关面试题,主要包含被问及请说说position:absolute和float有什么不同?时的应答技巧和注意事项,需要的朋友参考一下 position:absolute;是绝对定位,绝对定位的元素脱离文档流,不占空间,并且可以覆盖文档流的元素; float是浮动,浮动元素脱离文档流,其它元素会占据它原先的位置,文字内容会

  • 本文向大家介绍请你说一说HTTP和HTTPS的不同相关面试题,主要包含被问及请你说一说HTTP和HTTPS的不同时的应答技巧和注意事项,需要的朋友参考一下 参考回答: HTTP协议和HTTPS协议区别如下: 1)HTTP协议是以明文的方式在网络中传输数据,而HTTPS协议传输的数据则是经过TLS加密后的,HTTPS具有更高的安全性 2)HTTPS在TCP三次握手阶段之后,还需要进行SSL 的han

  • 本文向大家介绍PHP5超级全局,包括了PHP5超级全局的使用技巧和注意事项,需要的朋友参考一下 示例 以下是PHP5 SuperGlobals $GLOBALS $_REQUEST $_GET $_POST $_FILES $_SERVER $_ENV $_COOKIE $_SESSION $GLOBALS:此SuperGlobal变量用于访问全局变量。 $_REQUEST:此SuperGloba

  • 问题内容: 我面临着一个奇怪的问题,它与Java和php5中的MD5-Hashes有关。我发现在某些情况下,以下代码无法生成正确的MD5哈希值: 我不得不迁移现有的用户数据库,密码存储在php5 MD5中。现在,部分用户(并非全部)无法登录,因为我的Java代码无法生成正确的MD5哈希。 任何想法上面有什么问题吗? 问题答案: 无法正确转换<0x10字节,则需要用零填充。 例: