使用另一个文件覆盖 php-fpm 池配置值

使用另一个文件覆盖 php-fpm 池配置值

必须定制新服务器的 php-fpm 池配置,我想知道是否有可能/允许/推荐使用一个新的池文件,其名称按字母顺序排列在原始文件之后,该文件仅具有覆盖初始配置的值。

原始配置在/etc/php/7.0/fpm/pool.dnamed中www.conf

看起来,根据与安装相关的页面,工程师直接修改了原始内容(保存了初始值的副本)。例如

[www]
...
user www-data
group www-data
pm.max_children 2

修改后给出

[www]
...
user myapp         ; was www-data
group myapp        ; was www-data
pm.max_children 8  ; was 2

但看起来这可能是下次 php-fpm 升级后要重复的任务(此外配置在路径中7.0,这令人担忧)。

我不想修改原始文件,而是想保持不变,并添加另一个文件,比如说wwwmyapp.conf声明相同的池,并且只包含已更改的值

wwwmyapp.conf

[www]        ; same pool!
user myapp
group myapp
pm.max_children 8

pool.d,文件列表中

www.conf
wwwmyapp.conf

由于在php-fpm.conf所有池中都加载了配置文件,因此的值将在(同一个池中)wwwmyapp的值之后读取,并且应该覆盖第一个值。wwwwww

  • 它似乎在一些测试中起作用并且没有报告错误,但它会一直起作用并且适用于所有值吗?
  • 我们应该直接覆盖配置文件吗?

在任何文档中都找不到答案,即使在 php.net 上也是如此。

答案1

无法从其他来源找到“官方”确认,但经过一番研究后得出了一些结果:

分析源代码,php7.0-fpm更具体地说fpm-conf.c,似乎

  • php-fpm.conf首先读取主配置文件[fpm_conf_load_ini 文件()],
  • 所有include指令按顺序读取,给出文件列表,这要归功于全局()
  • 每个文件都由相同的解析fpm_conf_load_ini 文件(),
  • 文件中的条目会覆盖任何先前设置的值,
  • 任何新的include都会对包含处理函数进行递归调用,并且
  • 全局() 函数默认对名称进行排序(无GLOB_NOSORT选项)

因此,我们可以假设 - 至少在这个版本中,但考虑到目前的代码,这不太可能很快改变 -pool.d按照字母顺序排列目录配置文件是安全的;任何先前记录的值都会被之后读取的同名条目覆盖。

我们有一种干净的方法来处理配置文件php-fpm,保持分发文件不变,并添加名称按字母顺序大于打包文件名称的自定义文件,其中包含必须更改的几个选项。

答案2

如果你有像 php-overrides.ini 这样的文件,你应该将其复制到

/etc/php/7.0/fpm/conf.d/99-overrides.ini

99 前缀是由于执行顺序

答案3

通过自定义文件覆盖 [www] 池值.conf

这是有可能的,而且@breaking-not-so-bad解释关于如何加载配置文件的介绍很棒,我建议你先阅读它。

但绝对值得强调的是配置文件命名的重要性(因为它可能很棘手):

正如@hroj3e 解释的那样,以及@istranger 在评论中举例说明的那样多于

  • 如果默认池名称是 www,则覆盖它的唯一方法是使用 pool.d 文件名(如 wwwsomething 或以 x、y 或 z 开头)-@hroj3e
  • 命名文件z-www-overrides.conf并覆盖[www]池选项 -@istranger

一个例子:

创建文件/etc/php/7.0/fpm/conf.d/z-www-overrides.conf将覆盖以下设置php-fpm.conf

[www]
user myapp
group myapp
pm.max_children 8

相关内容