如何在ubuntu上追踪php5-fpm umask设置的来源

时间:2014-01-21 04:00:00

标签: apache ubuntu php umask

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

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

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

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

系统信息:

  • PHP:5.5.3-1ubuntu2.1
  • Apache: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来电中
  • umask 0002用户的家中将.profile添加到fpm

有些东西显然正在调整php-fpm进程的umask - 所以,我怎样才能开始跟踪强制umask 0022进入php-fpm进程的内容?

编辑(1):

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

编辑(2):

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

编辑(3):

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

    一个。在shell中,设置umask然后从shell

    运行/usr/sbin/php-fpm

    湾在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。< / p>

4 个答案:

答案 0 :(得分:16)

不是ubuntu上umask设置来源的一般跟踪解决方案(到目前为止,我发现的唯一方法是复制问题,试图将其与脚本或函数隔离的好旧方法)然后退回通过递归调用的每个脚本/函数)但是对php5-fpm umask问题的解决方案。我在google,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

<强>解释

通过在启动时启动service的{​​{1}}命令进行跟踪,它会为php5-fpm运行一些检查(我的副本上的第118行),同时验证/etc/init/${SERVICE}.conf是现在,可以报告它的版本。如果这些测试通过,则使用 initctl ,如果upstart使用php5-fpm文件。

ubuntu upstart网站提供了非常清晰的说明。特别是,您可以查看upstart cookbook以了解您需要的具体信息。

我最好能解决这个问题,因此'service'命令从未实际运行/etc/init/php-fpm.conf中的start-stop-daemon …命令,这就是为什么我以前的编辑无效。相反,当您使用/etc/init.d/php5-fpm等内容时,它会转到upstart(实际为initctl)。

答案 1 :(得分:9)

如果使用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一起使用&#34; drop-in&#34;目录foo.service.d /可能存在。所有带有后缀&#34; .conf&#34;的文件解析文件本身后,将解析此目录。这对于更改或添加单元的配置设置很有用,而无需修改单元文件。每个插件文件都必须具有适当的节标题。请注意,对于实例化单元,此逻辑将首先查找实例&#34; .d /&#34;子目录并读取它的&#34; .conf&#34;文件,然后是模板&#34; .d /&#34;子目录和&#34; .conf&#34;文件那里。

     

除了/ etc / systemd / system之外,还有#34; .d&#34;系统服务的目录可以放在/ usr / lib / systemd / system或/ run / systemd / system目录中。 / etc中的drop-in文件优先于/ run中的文件,后者优先于/ usr / lib中的文件。任何这些目录下的drop-in文件优先于位于任何位置的单元文件。具有不同名称的多个插入文件以字典顺序应用,无论它们驻留在哪个目录中。

答案 2 :(得分:2)

在编辑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/

答案 3 :(得分:0)

okey,但这适用于所有池。 能够用

之类的东西设置它会很方便

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

谷歌搜索,但似乎不是每个主机的方式。