Docker:Nginx 和 php5-fpm docker 不说话

2024-05-06

我想进行完全 Docker 化的 Drupal 安装。我的第一步是让容器与 Nginx 和 php5-fpm 一起运行,两者都基于 Debian。我在 CoreOS alpha 频道(使用 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 的条目。两个码头工人都运行:

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
活跃的互联网连接
(服务器和已建立)Proto Recv-Q Send-Q 本地地址
外部地址状态用户索引节点PID/程序名称

从 Nginx 容器内部:

root@fd1a9ae0f1dd:/# netstat -tapen
活跃的互联网连接
(服务器和已建立) Proto Recv-Q Send-Q 本地地址 外部地址 状态 用户 Inode PID/程序 名称 TCP 0 0 0.0.0.0:80 0.0.0.0:*
听0 1875387 -

编辑2: 进步!

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

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

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

listen = 9000

现在,当我访问我的网页时,出现错误: “未指定输入文件。”

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

EDIT3:

所以我用上面提到的改动重建了码头工人,看起来他们正在说话。但是,我的网页告诉我:“找不到文件。” 我非常确定它与 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)上,您仍然可以使用不同的服务器,该系统非常高效并且可以分布在大型网络上。

希望有帮助。

Update:

截至 2015 年,在容器之间建立持久链接的最佳方法是使用docker 撰写 https://docs.docker.com/compose/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker:Nginx 和 php5-fpm docker 不说话 的相关文章

  • APC 将数据存储在哪里?

    我想用apc store 缓存一些结果 但我需要知道数据将存储在哪里 以及限制是什么 它总是存储在内存中吗 或者也写入磁盘 我希望将不经常访问的数据存储在磁盘上 我应该为此使用不同的缓存系统吗 这就是极限了吗 apc shm size 32
  • Laravel 中间件将变量返回给控制器

    我正在对用户进行权限检查 以确定他们是否可以查看页面 这涉及首先通过一些中间件传递请求 我遇到的问题是 在将数据返回到视图本身之前 我在中间件和控制器中复制相同的数据库查询 这是设置的示例 路线 php Route get pages id
  • 为什么在 php 类中作为数组项的函数不起作用

    比如我有这样一段代码 效果很好 但是如果 A 不仅仅是一个变量 而且是一个类方法 那么这不起作用
  • PHP Reflection:如何知道方法/属性/常量是否从特征继承?

    我想从列表中排除特征的所有继承方法 在类中未被覆盖的那么如何知道一个类成员是否继承自trait呢 是的 我可以这样检查 if trait gt hasMethod methodName ref gt getTraitAliases meth
  • WooCommerce |如何删除“缺货”可变价格范围

    我正在开发一个 WooCommerce 网站 该网站包含许多可变产品和用户角色 这些产品和用户角色会动态影响显示的价格 我需要创建一个代码片段 将其添加到我的functions php 文件中 以仅显示库存商品的可变产品价格范围 并根据用户
  • 检查文件是否要上传?代码点火器

    我有一个带有很少输入和一个文件输入的表单 我想检查文件输入是否为空 如果为空则不要尝试上传 如果不是则尝试上传 我尝试过这样的事情 upld file this gt upload gt data if empty upld file Up
  • 如何修复 Docker 中的“设备上没有剩余空间”错误?

    我正在运行 Mac 原生 Docker 没有 virtualbox docker machine 我有一个巨大的镜像 里面有很多基础设施 Postgres 等 我运行了清理脚本来删除大量的垃圾 未使用的图像等等 当我运行我的图像时 我收到如
  • PDO::bindValue() 在使用嵌套 SELECT 进行查询时失败

    我正在使用通过 ODBC 连接的 MSSQL 数据库 使用时PDO bindValue 在具有嵌套 SELECT 语句的查询上 它无法绑定嵌套 SELECT 中的值 在主 SELECT 上没有问题 这是一段失败的示例代码 stmt cmdb
  • uWSGI nginx 错误:连接到上游时 connect() 失败(111:连接被拒绝)

    我在 nginx 上访问我的 IP 时遇到 502 网关错误 http 52 xx xx xx http 52 xx xx xx 日志只是这样说的 2015 09 18 13 03 37 错误 32636 0 1 连接到上游时失败 111
  • MySQL/PHP 插入同一行两次

    我不明白为什么这段代码会插入同一行两次 我已经将其精简为以下代码 它被插入的 MySQL 表中有 10 列 但即使查询中提到了所有这些列 它仍然插入 电子邮件受保护 cdn cgi l email protection 分两行 具有单独的主
  • 为什么使用 mysql_real_escape_string,addslashes 不会阻止一切?

    我正在查看文档并偶然发现了 mysql real escape string 我不明白为什么当您可以只使用addslashes 时它很有用 有人可以向我展示一个场景来说明它为什么有用吗 我也很好奇为什么它需要数据库连接 这似乎是一个很大的开
  • 将查询结果作为 CSV 文件从 Docker PostgreSQL 容器导出到本地计算机

    我不确定这是否可能 或者我是否做错了什么 因为我对 Docker 还很陌生 基本上 我想将 PostgreSQL docker 容器内的查询结果作为 csv 文件导出到本地计算机 这就是我到目前为止所得到的 首先 我使用以下命令运行 Pos
  • 通过 HTML 将复杂变量传递给 javascript 的正确方法

    我试图摆脱使用 PHP 的 htmlentities 但我在这里停止了 但后来我想 我不做替换和检查特殊字符 而是只 JSON 整个对象 这提供了一个非常不受欢迎的结果 其中包含大量双引号 那么我应该怎么做呢 我应该为每个图像分配一个数字唯
  • 将mysql数据导入kubernetes pod

    有谁知道如何将我的 dump sql 文件中的数据导入到 kubernetes pod 中 直接 与处理 docker 容器的方式相同 docker exec i container name mysql uroot password se
  • PHP:从字符串中修剪子字符串的最佳方法

    想要处理一组字符串 并修剪一些结尾 myEnding 从最后每个字符串的如果存在的话 最简单的方法是什么 我知道使用正则表达式一切皆有可能 但这似乎是一项简单的任务 我想知道是否存在一个简单的工具来实现这一点 Thanks Gidi 我选择
  • 通过 PHP 将 CSV 导入 MYSQL

    我正在将 CSV 文件导入到我的管理区域 并且我想将文件添加到我的数据库中 我的 PHP 代码import php is
  • PHP 会话不会在每个请求上延长 Cookie 过期时间

    session start 是否应该通过 session gc maxlifetime 变量来延长会话 ID cookie 的寿命 我的 session gc maxlifetime 是 24 分钟 每个会话仅存活 24 分钟 无论网站上有
  • Gitlab CI服务端口是如何暴露的?

    我有一个 gitlab ci yml file integration test services name registry gitlab com group project testmailserver 1 1 alias mail e
  • PHP 7.4 已弃用 get_magic_quotes_gpc 函数替代

    我遇到了我的旧代码之一正在使用的情况get magic quotes gpc 最新版本已弃用PHP 版本 7 4 目前 我有这样的事情 添加斜杠 return get magic quotes gpc addslashes string s
  • 参考指南:这个符号在PHP中是什么意思? (PHP 语法)

    这是什么 这是关于 PHP 语法时不时出现的问题的集合 这也是一个社区 Wiki 因此邀请每个人参与维护此列表 为什么是这样 过去很难找到有关运算符和其他语法标记的问题 主要思想是提供 Stack Overflow 上现有问题的链接 这样我

随机推荐

  • SET IDENTITY_INSERT [表] ON 不起作用

    我想在指定 Id 的位置插入一些记录 以便将数据迁移到我想要保持现有关系完整性的位置 为此 我直接在 SSMS 中的表上运行以下命令 SET IDENTITY INSERT CRMTItem ON 然而 当我从 C 插入一个 Id 为 1
  • 调整大小时标题不响应

    我有一个表格 当我调整大小时它不会显示我的标题Steps在网络视图上 它确实显示得很完美 但是当我调整大小时 我看不到我的步骤标题 有没有办法使用 css 或 jstl jsf 标签在下面的代码中修复此问题 谢谢您的帮助 像这样的事情 ht
  • 如何使用 Java 在 Android Wi-Fi 连接上设置 ProxySettings 和 ProxyProperties?

    如何使用 Java 以编程方式 在 Android Wi Fi 连接上设置 ProxySettings 和 ProxyProperties 由于 ipAssignment linkProperties ProxySettings 和 Pro
  • Grails - 错误分叉 Grails VM 因错误退出

    首先 我想说 我是 Grails 的初学者 在尝试遵循一些示例时 我不断收到无法解决的错误 如果问题很愚蠢 那么很抱歉 我通过命令行创建了一个虚拟应用程序 并尝试以相同的方式运行它 run app 但出现以下错误 运行 Grails 应用程
  • XSL:让原始 HTML 通过

    我正在进行 XSL 转换 我正在转换的 XML 有一个包含 html 的节点
  • 如何更改Android布局中XML片段元素的默认提示值

    默认提示值自动完成 https developers google com places android api autocomplete小部件是Search 如何将该值更改为不同的值String 尝试下面的代码 PlaceAutocomp
  • matlab矩阵中求子矩阵的通用方法

    我正在寻找一种 好 方法来在更大的矩阵 任意维数 中找到矩阵 模式 Example total rand 3 4 5 sub total 2 3 1 3 3 4 现在我希望这样的事情发生 loc matrixFind total sub 在
  • UIView 动画选项重复计数

    我的 Swift 代码遇到一些问题 我试图使 UIImageView 对象消失并重新出现一次 但在让动画仅播放一次方面遇到一些问题 IBOutlet weak var ball UIImageView IBAction func onFad
  • 复制构造函数和移动构造函数的效率差异

    C 11引入了右值引用的新概念 我在某处读到它并发现以下内容 class Base public Base Default Ctor Base int t Parameterized Ctor Base const Base b Copy
  • JQUERY MOBILE 文本输入中的自动完成

    我在网上搜索了很多但找不到任何解决方案 我正在制作一个网络应用程序 其中我想要 2 个文本框来获取用户的数据输入 我想要此文本框中的自动完成功能 自动完成的标签列表在本地可用 我尝试了listview 但我想要的是 在用户从自动完成提示中选
  • C# - 检索 COM+ 组件的属性?

    我的服务器 Windows Server 2003 上有一个 COM 组件 有什么方法可以以编程方式检索该组件的属性 例如使用的构造函数字符串 当我转到管理工具 gt 组件服务 gt COM 应用程序并右键单击我的组件时 这些是我希望能够检
  • 如何在使用应用程序的用户之间获得 Facebook 相互点赞

    假设两个用户正在使用一个应用程序 并已授予该应用程序适当的权限来检索他们的喜好 是否可以使用 FQL 或图形 API 来查找它们的共同点 类似于如何使用图形 API 查找两个用户之间的共同好友 我认为在我浏览文档时不存在这样的 api 调用
  • 手电筒打开时 Android 相机的奇怪行为

    我有以下 android 代码 这里用伪代码编写 mCamera configAndInitialize all I want to do before taking picture mCamera startPreview mCamera
  • SQL 层次结构 - 解析给定节点的所有祖先的完整路径

    我有一个由邻接列表描述的层次结构 不一定有单个根元素 但我确实有数据来识别层次结构中的叶 终端 项 所以 一个看起来像这样的层次结构 1 2 4 7 3 5 6 8 9 将通过表格来描述 就像这样 NOTE 我没有能力改变这种格式 id p
  • 无法打开“storage/logs/laravel-2019-11-22.log”:无法打开流:权限被拒绝

    在生产服务器上输入我的网站时出现以下错误 无法打开流或文件 var app current storage logs laravel 2019 11 22 log 无法打开流 权限被拒绝 我尝试运行以下命令 但 git 权限在终端中被拒绝
  • 所选设备不兼容 - Android Studio

    我之前已经解决了这个问题 但现在不能 我需要永久修复 在测试我的应用程序时 Android Studio 中的一切都很顺利 我现在遇到了 所选设备不兼容 的问题 当我去运行应用程序时 我想知道如何阻止它读取我手机的 API 作为 1 而不是
  • 使用媒体查询将 CSS 应用于除 IE 之外的所有浏览器

    我找到了一种将媒体查询应用于 IE 的方法 media ms high contrast none ms high contrast active 有没有办法将 CSS 应用于除 IE 之外的所有浏览器 就像是 media not ms h
  • asp.net 内联代码 <%# MyboolVal %>

    我一定在这里错过了一些愚蠢的东西 但我看不到它 我的工作在他们的网站上使用内联代码 例如
  • 从光栅计算器传输到 R 的条件命令

    到目前为止 我在ArcGIS的栅格计算器中使用了以下语句 Con Land use rst 20 Export rst 这会计算一个新栅格 其中仅包含来自导出的数据 其中 Land use 等于 20 这正是我想要的 但我想自动化这个R 因
  • Docker:Nginx 和 php5-fpm docker 不说话

    我想进行完全 Docker 化的 Drupal 安装 我的第一步是让容器与 Nginx 和 php5 fpm 一起运行 两者都基于 Debian 我在 CoreOS alpha 频道 使用 Digital Ocean 我的 Dockerfi