【问题标题】:How to run PHP in Kubernetes via unix socket?如何通过 unix socket 在 Kubernetes 中运行 PHP?
【发布时间】:2016-11-23 07:38:44
【问题描述】:

我在 Google Container Engine 中有 nginx 和 php-fpm 容器,我想通过 unix 套接字而不是网络运行它。

我还有 Google SQL 代理容器,它使用空卷通过放置在与其他容器共享的卷上的套接字提供与 Google SQL 数据库的连接。所以我正在考虑对 PHP 使用相同的方法,但它不起作用。

我在 php 和 nginx 容器上安装了 emptyDir 类型的空卷。该卷已安装,我可以在两个容器中看到它。但是如果我尝试使用 nginx,我会在日志中找不到 (socket)file。

我还将 www-data(与 php 容器中的 uid 相同) 用户添加到 nginx 容器中,并将其设置在 nginx conf 中,但没有帮助。

Google SQL 代理在某些方面是否特别,我必须为 PHP 使用网络,还是我在这里遗漏了什么?

【问题讨论】:

  • 为什么要使用 unix 套接字?
  • 我认为你不应该使用 emptyDir。使用 hostVolume 挂载你的 unix 套接字。
  • emptyDir 可以使用,因为它在部署 pod 的整个生命周期内都可用。使用 hostVolume 可能会在具有相同套接字文件的 pod 之间产生一些冲突。

标签: docker cloud kubernetes google-kubernetes-engine


【解决方案1】:

我设法使您描述的方法有效。我在deployment 中使用emptyDir,因此共享的/sock 文件夹同时挂载到nginx 和fpm:

  - name: fpm
    ...
    volumeMounts:
    - name: php-socket
      mountPath: /sock
    ...

  - name: nginx
    ...
    volumeMounts:
    - name: php-socket
      mountPath: /sock
    ...

  volumes:
  - name: php-socket
    emptyDir: {}

我发现这篇文章对实际的 nginx 和 fpm 配置很有帮助:https://medium.com/@shrikeh/setting-up-nginx-and-php-fpm-in-docker-with-unix-sockets-6fdfbdc19f91

我遇到的问题是我的 php-fpm docker 容器配置中名为 zz-docker.conf 的文件,其中包含 listen = [::]:9000。由于文件名按字母顺序排列,它破坏了我的其他配置文件,停止了 unix 套接字通信工作(即listen = /sock/php.sock)。我在Dockerfile 中使用此删除了问题行:

sed -i -e ‘/listen/d’ /usr/local/etc/php-fpm.d/zz-docker.conf

【讨论】:

  • 我也做了同样的事情,但是我遇到了权限问题——如果我不 chmod /sock 和套接字文件 777,Apache 被拒绝权限。 Apache 在其配置中使用用户 www-data 以及 php-fpm 运行。感觉就像不同容器中的不同 www-data 用户可能被视为单独的用户,而不是 Pod 内的一个用户。你是如何解决这种情况的?你的nginx和php-fpm的用户以及socket的权限是什么?
  • 我们使用基于 nginx 和 fpm 官方镜像的 docker 镜像。具体来说,我们使用nginx:1.14-alpine 和FROM php:7.4.23-fpm。这些 docker 镜像分别使用名为 nginx 和 www-data 的 Linux 用户。我们没有使用 Apache。
  • 是的,我注意到了。但是不同用户提出的问题是一样的:不同容器中的 nginx 和 www-data 用户如何共享共享卷的所有权?您是否将 777 作为该卷的权限?或者您是否为容器等设置了安全上下文。我发现的解决方案是将所有权设置为 www-data 并使该卷全球可读。只有 www-data 可以写入,而 apache(或 nginx)可以读取。
  • 我检查了/sock文件夹的权限,它是drwxrwxrwx,我们的套接字文件(/sock/sock.php)的权限是srw-rw-rw-。套接字文件的权限来自我们的 php 配置(/usr/local/etc/php-fpm.d/www.conf,其中我们设置了listen.owner = www-data 和listen.group = www-data 和listen.mode = 0666。我们没有明确设置卷上的任何权限,或者/sock 文件夹或设置任何安全性容器的上下文。我同意,我们的设置在安全性方面排名很差!引起我的注意是有帮助的,谢谢!我们的一些写入权限是不需要的。
猜你喜欢
  • 2018-02-26
  • 1970-01-01
  • 2019-09-27
  • 1970-01-01
  • 2018-11-01
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多