当前位置:

首页 > 编程开发 > docker中php容器默认不会追写php的慢日志问题及Linux capabilities及docker中PHP配置项php_value、php_flag等的

docker中php容器默认不会追写php的慢日志问题及Linux capabilities及docker中PHP配置项php_value、php_flag等的

本文目录

    Docker中PHP容器慢日志默认不追写,需加--cap-add=SYS_PTRACE。PHP配置项中php_value/php_flag可被.htaccess覆盖,php_admin_value/php_admin_flag优先级更高且不可覆盖,用于安全配置。

    一、docker中php容器默认不会追写php的慢日志问题及Linux capabilities

    在Docker里部署PHP容器时,你可能会遇到一个挺让人困惑的问题:明明在PHP的配置文件中已经老老实实加上了慢日志的配置——指定了slowlog文件路径,也设好了request_slowlog_timeout的阈值,容器跑起来也能正常生成www.log.slow这个文件,但文件大小始终是0,就像从来没发生过慢请求一样。哪怕你把阈值设成1秒,它依然纹丝不动。这时候你八成会开始怀疑:这Docker下的PHP是不是有问题?答案是——没错,确实有问题。

    ; Note: slowlog is mandatory if request_slowlog_timeout is set
    slowlog = /var/log/php/$pool.log.slow
    ; A vailable units: s(econds)(default), m(inutes), h(ours), or d(ays) Default Value: 0
    request_slowlog_timeout = 5

    问题的根源在于Linux系统的一个底层机制。PHP-FPM要记录慢日志,需要用到SYS_PTRACE这个能力来跟踪worker进程。那SYS_PTRACE又是什么?这就要说到Linux capabilities了。从Linux内核2.2开始,传统上与超级用户root关联的特权被划分成了不同的单元,叫做capabilities。每个单元可以独立启用或禁用,就像一个个权限开关。权限检查的逻辑变成了这样:执行特权操作时,如果进程的有效身份不是root,就去检查它是否拥有对应的capability,以此决定能否执行操作。所以,要让Docker容器里的PHP能写慢日志,就得给它加上CAP_KILL capability;如果要设置系统时间,就得有CAP_SYS_TIME。而Docker容器默认是不启用这些功能的——这就是问题所在。

    解决办法其实很简单:在启动容器的时候加上--cap-add=SYS_PTRACE选项,或者更粗暴地直接给--privileged。比如这样:

    #docker run 添加选项示例
    docker run .. --cap-add=SYS_PTRACE ..
    docker run .. --privileged ..
    #docker run --help 可以查看这些选项的意义
    --cap-add list               Add Linux capabilities
    --privileged                  Give extended privileges to this container

    #. Linux capabilities列表

    CAP_AUDIT_CONTROL 启用和禁用内核审计;改变审计过滤规则;检索审计状态和过滤规则

    CAP_AUDIT_READ 允许通过 multicast netlink 套接字读取审计日志

    CAP_AUDIT_WRITE 将记录写入内核审计日志

    CAP_BLOCK_SUSPEND 使用可以阻止系统挂起的特性

    CAP_CHOWN 修改文件所有者的权限

    CAP_DAC_OVERRIDE 忽略文件的 DAC 访问限制

    CAP_DAC_READ_SEARCH 忽略文件读及目录搜索的 DAC 访问限制

    CAP_FOWNER 忽略文件属主 ID 必须和进程用户 ID 相匹配的限制

    CAP_FSETID 允许设置文件的 setuid 位

    CAP_IPC_LOCK 允许锁定共享内存片段

    CAP_IPC_OWNER 忽略 IPC 所有权检查

    CAP_KILL 允许对不属于自己的进程发送信号

    CAP_LEASE 允许修改文件锁的 FL_LEASE 标志

    CAP_LINUX_IMMUTABLE 允许修改文件的 IMMUTABLE 和 APPEND 属性标志

    CAP_MAC_ADMIN 允许 MAC 配置或状态更改

    CAP_MAC_OVERRIDE 覆盖 MAC(Mandatory Access Control)

    CAP_MKNOD 允许使用 mknod() 系统调用

    CAP_NET_ADMIN 允许执行网络管理任务

    CAP_NET_BIND_SERVICE 允许绑定到小于 1024 的端口

    CAP_NET_BROADCAST 允许网络广播和多播访问

    CAP_NET_RAW 允许使用原始套接字

    CAP_SETGID 允许改变进程的 GID

    CAP_SETFCAP 允许为文件设置任意的 capabilities

    CAP_SETPCAP 参考 capabilities man page

    CAP_SETUID 允许改变进程的 UID

    CAP_SYS_ADMIN 允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等

    CAP_SYS_BOOT 允许重新启动系统

    CAP_SYS_CHROOT 允许使用 chroot() 系统调用

    CAP_SYS_MODULE 允许插入和删除内核模块

    CAP_SYS_NICE 允许提升优先级及设置其他进程的优先级

    CAP_SYS_PACCT 允许执行进程的 BSD 式审计

    CAP_SYS_PTRACE 允许跟踪任何进程

    CAP_SYS_RAWIO 允许直接访问 /devport、/dev/mem、/dev/kmem 及原始块设备

    CAP_SYS_RESOURCE 忽略资源限制

    CAP_SYS_TIME 允许改变系统时钟

    CAP_SYS_TTY_CONFIG 允许配置 TTY 设备

    CAP_SYSLOG 允许使用 syslog() 系统调用

    CAP_WAKE_ALARM 允许触发一些能唤醒系统的东西(比如 CLOCK_BOOTTIME_ALARM 计时器)

    二、docker中添加PHP配置项php_value, php_flag, php_admin_value, php_admin_flag的区别

    在Docker中配置PHP时,有好几种方法可以设置参数:php_value、php_flag、php_admin_value、php_admin_flag。下面是一个常见的配置文件示例:

    php_flag[display_errors] = off
    php_admin_value[memory_limit] = 512M
    php_admin_flag[log_errors] = on

    这些方法到底有什么区别?官方文档的说法其实挺清楚的,我们来拆解一下:

    php_value name value
    官方解释:设置指定指令的值。只能用于PHP_INI_ALL和PHP_INI_PERDIR类型的指令。要清除之前设置的值,使用none作为值。注意:不要用php_value来设置布尔值,应该用php_flag。

    简单说,php_value用来设置字符串或数值类的配置项,比如memory_limit这种。而且它只能在.conf或.htaccess文件中使用(受限于指令类型)。

    php_flag name on|off
    专门用来设置布尔类型的配置项,比如display_errors、log_errors这类只能是on/off的开关。同样只能用于PHP_INI_ALL和PHP_INI_PERDIR类型的指令。

    php_admin_value name value
    功能和php_value一样,但有一个关键区别:它不能用在.htaccess文件里,只能在conf(包括virtualhost)文件中使用。而且,通过php_admin_value设置的值,不会被.htaccess或virtualhost中的其他设置覆盖,优先级更高。

    php_admin_flag name on|off
    同理,是php_flag的“管理员版本”,专门设置布尔值,且不能用在.htaccess中,设置后不会被覆盖。

    总结一下:两者的核心区别在于作用域和覆盖优先级。php_value和php_flag可以在.htaccess里被重新定义,而php_admin_*系列则更“强势”,一旦在conf层面设置,.htaccess就无法更改。在实际部署中,如果你希望某个配置项绝对不可被覆盖(比如安全相关的设置),就应该用php_admin_*。反之,如果允许用户通过.htaccess调整,就用普通的php_value/php_flag。

    本文内容来源于网友投稿,如有侵权请联系删除。
    作者最新文章
    编程开发
    上一篇: PHP的php://
    相关文章 更多
    PHP递归性能优化技巧与迭代替代方案
    PHP递归性能优化技巧与迭代替代方案

    解析PHP递归函数在树形数据处理中的性能瓶颈,提供预加载数据消除I/O、使用显式栈替代深层递归的实战方案,帮助开发者在代码可读性与执行效率间做出合理取舍。

    Java测试中怎么使用Mockito模拟依赖对象
    Java测试中怎么使用Mockito模拟依赖对象

    详细讲解在Java单元测试中如何使用Mockito模拟依赖对象,包括引入依赖、创建Mock、打桩返回值、行为验证以及Mock与Spy的核心差异和常见陷阱排查。

    链表删除节点的时间复杂度是多少及其详细分析
    链表删除节点的时间复杂度是多少及其详细分析

    详细分析链表删除节点的时间复杂度,深入探讨单链表与双向链表在不同已知前提下的查找与删除开销,并结合完整代码与清晰图解进行对比总结。

    codex如何配置模型参数及文件设置教程
    codex如何配置模型参数及文件设置教程

    想知道如何让AI写出的代码更贴合你的习惯?本文手把手教你在VS Code中调整Codex相关模型参数,通过修改配置文件优化温度值和令牌限制,解决代码建议不准确或响应慢的问题。

    Claude Code AI编程工具实力揭秘与编程助手实测
    Claude Code AI编程工具实力揭秘与编程助手实测

    通过实测展示Claude Code在终端中如何理解自然语言指令、自动修改代码文件并处理复杂编程任务,帮助开发者评估其实际辅助能力。

    winforms教程自学入门与基础开发步骤详解
    winforms教程自学入门与基础开发步骤详解

    本教程详细讲解如何使用Visual Studio创建WinForms项目,通过添加按钮和标签控件并编写点击事件代码,实现一个基础的计数器功能,适合C#初学者快速上手Windows窗体应用开发。

    Cursor自动补全设置教程教你快速开启代码补全功能
    Cursor自动补全设置教程教你快速开启代码补全功能

    详解Cursor编辑器中自动补全功能的开启与优化设置,涵盖Tab触发机制、上下文窗口调整及模型切换,帮助开发者解决补全延迟、干扰大等问题,提升编码流畅度。

    pandas的数据格式怎么转换和设置方法教程
    pandas的数据格式怎么转换和设置方法教程

    详解Pandas中数据格式转换的核心方法,包括astype强制转换、to_numeric容错处理及日期解析技巧,解决常见类型错误并提升数据处理效率。

    VS Code中文设置方法 简体语言包安装与切换教程
    VS Code中文设置方法 简体语言包安装与切换教程

    详细介绍在Visual Studio Code中安装Chinese (Simplified)语言包的方法,包括通过扩展市场搜索、安装及自动重启切换至简体中文界面的完整步骤,帮助开发者快速将编辑器本地化。

    cursor安装过程无法更改安装位置的解决方法
    cursor安装过程无法更改安装位置的解决方法

    针对Cursor安装包默认锁定C盘且无路径选择界面的问题,提供通过手动移动文件并创建目录联结(Symbolic Link)的解决方案,实现将软件安装在其他磁盘分区。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    macOS软件
    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    Mac软件 更多
    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    灵活计算器
    灵活计算器
    macOS/iOS/Android

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    WINDOWS 更多
    3dmax(3ds max)
    3dmax(3ds max)
    Windows

    Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。