gpt4 book ai didi

nginx - docker :Nginx 和 php5-fpm docker 不说话

转载 作者:IT老高 更新时间:2023-10-28 12:44:01 25 4
gpt4 key购买 nike

我想做一个完全 docker 化的 Drupal 安装。我的第一步是让容器运行基于 Debian 的 Nginx 和 php5-fpm。我在 CoreOS alpha channel 上(使用 Digital Ocean。)

我的 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 的条目。两个 docker 都运行:

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 bad gateway 错误。

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

编辑了解更多详情:这是结果(从 php5-fpm 容器内部,在 apt-get install net-tools 之后):

root@3bd12b3761b9:/# netstat -tapen
Active Internet connections
(servers and established) Proto Recv-Q Send-Q Local Address
Foreign Address State User Inode PID/Program name

从 Nginx 容器内部:

root@fd1a9ae0f1dd:/# netstat -tapen
Active Internet connections
(servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name tcp 0 0 0.0.0.0:80 0.0.0.0:*
LISTEN 0 1875387 -

编辑2:进步!

在php5-fpm容器中,文件中:

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

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

listen = 9000

现在,当我访问我的网页时,我收到错误消息:"没有指定输入文件。"

可能我在某处有尾随/错误。我会更仔细地研究它!

EDIT3:

所以我已经用上面提到的改动重建了 docker ,他们似乎在说话。但是,我的网页告诉我:“找不到文件。”我很确定这与 nginx 发送到 php-fpm 的文档有关,但我不知道它应该是什么样子。在使用始终有效的套接字方法时,我使用了默认值。现在它不再起作用了。/etc/nginx/sites-enabled/default location ~ .php$ { 下应该是什么?

最佳答案

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

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

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

--volumes-from storage-www

如果您在同一台物理服务器上运行两个容器,这将起作用。但是你仍然可以使用不同的服务器,如果你把那个只包含数据的容器放在一个网络文件系统上,比如 GlusterFS,它非常高效并且可以分布在一个大规模的网络上。

希望对您有所帮助。

更新:

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

关于nginx - docker :Nginx 和 php5-fpm docker 不说话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27055627/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com