【问题标题】:How to trace where php5-fpm umask settings are coming from on ubuntu如何在 ubuntu 上跟踪 php5-fpm umask 设置的来源
【发布时间】:2014-02-10 12:03:38
【问题描述】:

非常感谢在 Ubuntu 上跟踪和诊断 umask 问题的任何帮助:

我正在通过 proxy_fcgi 使用 Apache 运行 php5-fpm。该进程以 0022 的 umask 运行(通过让 PHP 将 umask() 的结果发送到文件中来确认 [结果为 '18' == 0022])。我想将其更改为 0002,但无法追踪 umask 的来源。

Apache 设置为 umask 0002,作为测试,如果我禁用 proxy_fcgi 并在上面运行我的测试,我会得到一个 u+g 具有 rw 访问权限的文件(并且文件内容确认 umask 为“2” == 0002)。

如果我 sudo -iu fpmuser 并运行 umask 结果为 0002。

系统信息:

  • PHP:5.5.3-1ubuntu2.1
  • 阿帕奇:2.4.6
  • Ubuntu:13.10
  • PHP-PFM 正在列出使用 TCP 端口(因为 Unix 端口尚未工作/支持)

到目前为止,我已经尝试了以下方法(每次都进行了系统重启和重新测试):

  • umask 0002 添加到/etc/init.d/php5-fpm 的开头
  • --umask 0002 添加到start-stop-daemon 调用/etc/init.d/php5-fpm
  • fpm用户的主页中添加umask 0002.profile

某些东西显然正在调整 php-fpm 进程的 umask - 那么,我该如何开始追踪是什么迫使 umask 0022 进入 php-fpm 进程?

编辑(1):

  • 通过/etc/login.defs 调整系统范围的umask(参见How to set system wide umask?)会影响其他地方的umask(例如,通过sudo 的commannds 现在的umask 为0002),但php-fpm 仍然创建umask 为0022 的文件。请注意,我验证了session optional pam_umask.so 也存在于/etc/pam.d/common-session-noninteractive 中,并且我测试了 002 和 0002 的 umask。

编辑(2):

  • 我已经能够使用 nginxphp5-fpm 复制该问题(使用设置为侦听模式“0666”的 unix 套接字)。
  • 我很想追踪 umask 的来源,但我愿意采用某种方式将其强制为我想要的。
  • 我应该补充一点,第一个测试是在 Amazon Ubuntu 13.10 映像上完成的。我在“编辑 2”中的测试是在虚拟机中使用 Ubuntu13.10 服务器 ISO 设置的副本从头开始完成的。所有安装都是通过 apt-get 完成的,而不是通过下载源代码和构建。

编辑(3):

  • 我已确认我可以通过以下任一方式手动操作 umask(通过检查创建的测试文件的权限来验证):

    一个。在 shell 中,设置一个 umask,然后从 shell 运行 /usr/sbin/php-fpm

    b.在 shell 中,使用我喜欢的任何 umask 值运行以下命令:

     start-stop-daemon --start --quiet --umask 0002 --pidfile /var/run/php5-fpm.pid --exec /usr/sbin/php5-fpm -- --daemonize --fpm-config /etc/php5/fpm/php-fpm.conf
    
  • 但是,/etc/init.d/php5-fpm 文件中的这个完全相同命令无法在运行sudo service php5-fpm stop; sudo service php5-fpm start 或重新启动时调整 umask。

【问题讨论】:

    标签: apache ubuntu php umask


    【解决方案1】:

    不是一般跟踪 ubuntu 上的 umask 设置来自何处的解决方案(到目前为止,我发现的唯一方法是复制问题的良好旧方法,试图将其隔离到脚本或函数中,然后退后一步通过递归调用的每个脚本/函数)但是 解决 php5-fpm umask 问题。我在谷歌、stackoverflow 和其他地方发现了很多关于这个问题的点击,但到目前为止还没有解决方案。希望这对人们有用。

    编辑/etc/init/php-fpm.conf 以包含umask 0002 行(或任何你想要的umask)。我的文件版本现在如下所示:

    # php5-fpm - The PHP FastCGI Process Manager
    
    description "The PHP FastCGI Process Manager"
    author "Ondřej Surý <ondrej@debian.org>"
    
    start on runlevel [2345]
    stop on runlevel [016]
    
    ### my edit - change umask setting
    umask 0002
    
    pre-start exec /usr/lib/php5/php5-fpm-checkconf
    
    respawn
    exec /usr/sbin/php5-fpm --nodaemonize --fpm-config /etc/php5/fpm/php-fpm.conf
    

    说明

    通过跟踪启动时启动php5-fpmservice 命令后,它会为/etc/init/${SERVICE}.conf 运行一些检查(我的副本上的第118 行),同时验证initctl 是否存在并且可以报告它的版本。如果通过了这些测试,则使用 upstart,在 php5-fpm 的情况下使用 /etc/init/php-fpm.conf 文件。

    ubuntu upstart 网站给出了非常明确的说明。特别是您可以查看upstart cookbook 了解您需要的具体信息。

    尽我所能,这意味着“服务”命令从未真正运行/etc/init.d/php5-fpm 中的start-stop-daemon … 命令,这就是我之前的编辑没有效果的原因。相反,当您使用 service php5-fpm start 之类的东西时,它会传递给 upstart(实际上是 initctl)。

    【讨论】:

    • 不是我试图解决的问题,但我喜欢有据可查的问题和答案。
    • 我正在为 Debian 8 解决同样的问题,但它没有使用 upstart。为在 Debian 上运行的 php-fpm 设置 umask 的任何提示?
    • @SiliconMind 这里也一样。您找到解决方案了吗?
    • 没关系,我刚刚遇到了你的单独问题stackoverflow.com/q/35851049/36253
    • 您应该编辑初始化脚本,它可能会被后续更新覆盖。相反,您应该将 umask 002 节放入文件 /etc/init/php-fpm.override
    【解决方案2】:

    如果您使用 systemd,请在 /etc/systemd/system 目录中创建一个名为 php7.2-fpm.service.d 的新目录。此目录的名称将根据您的发行版和 PHP 版本而有所不同。运行systemctl list-units --type=service | grep --ignore-case php 以了解如何称呼它。在此目录中,放置一个名为 umask.conf 的文件,其内容为:

    # /etc/systemd/system/php7.2-fpm.service.d/umask.conf
    [Service]
    UMask=0002
    

    要使更改生效,请运行:

    systemctl daemon-reload && systemctl restart php7.2-fpm
    

    此解决方案的好处是您的自定义设置不会在软件包更新时丢失。

    systemd manual 解释这是如何工作的:

    与单元文件 foo.service 一起,可能存在“插入”目录 foo.service.d/。此目录中所有后缀为“.conf”的文件将在文件本身被解析后被解析。这对于更改或添加单元的配置设置很有用,而无需修改单元文件。每个插入文件必须具有适当的节标题。请注意,对于实例化单元,此逻辑将首先查找实例“.d/”子目录并读取其“.conf”文件,然后是模板“.d/”子目录和那里的“.conf”文件。

    除了 /etc/systemd/system 之外,系统服务的“.d”目录可以放在 /usr/lib/systemd/system 或 /run/systemd/system 目录中。 /etc 中的插入文件优先于 /run 中的文件,而 /run 中的文件又优先于 /usr/lib 中的文件。任何这些目录下的插入文件都优先于任何位置的单元文件。具有不同名称的多个插入文件按字典顺序应用,无论它们位于哪个目录中。

    【讨论】:

    • 应该注意所有指令都区分大小写:Umask 不起作用。
    • 它在 PHP 7 FPM 中也很有魅力(当然要编辑的文件是/lib/systemd/system/php7.0-fpm.service
    • 我想为您提供这个答案提供骑士勋章
    【解决方案3】:

    最好在编辑 php5-fpm.service 之前复制 systemd 脚本,否则它将在下次更新时被覆盖:

    cp /lib/systemd/system/php5-fpm.service /etc/systemd/system/
    vi /etc/systemd/system/php5-fpm.service
    Add: UMask=0002 in [Service] section.
    systemctl daemon-reload
    systemctl restart php5-fpm
    

    来源:https://ispire.me/running-php-fpm-with-different-user-group-using-umask/

    【讨论】:

    • 这对于基于 systemd 的系统是正确的,例如 Ubuntu 16.04。对于较旧的 Ubuntu 版本,如 14.04 Upstart 是默认的 init 系统。尽管上述文件有时会出现在磁盘上,但它们实际上并没有被使用。
    【解决方案4】:

    好的,但这适用于所有池。 能够用类似的东西设置它会很方便

    env[umask] = 0002 (没有机会这样做)

    一直在谷歌搜索,但似乎不是针对每个主机执行此操作的方法。

    【讨论】:

      猜你喜欢
      • 2016-06-21
      • 2015-02-02
      • 2012-07-20
      • 1970-01-01
      • 2015-09-10
      • 2014-10-30
      • 2014-10-17
      • 2011-11-15
      • 2011-05-02
      相关资源
      最近更新 更多