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

dan*_*ott 13 php apache ubuntu 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 0002start-stop-daemon调用中/etc/init.d/php5-fpm
  • 添加umask 0002到用户.profile的家中fpm

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

编辑(1):

  • 调整系统范围的umask via /etc/login.defs(请参阅如何设置系统范围的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):

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

编辑(3):

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

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

    湾 在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
    
    Run Code Online (Sandbox Code Playgroud)
  • 但是,在运行或重新启动时,文件中的这个完全相同的命令无法调整umask ./etc/init.d/php5-fpmsudo service php5-fpm stop; sudo service php5-fpm start

dan*_*ott 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
Run Code Online (Sandbox Code Playgroud)

说明

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

Ubuntu的新贵网站给出了相当明确的指示.特别是您可以查看新贵食谱,了解您需要的具体信息.

最好的我可以解决这意味着因此'service'命令从未实际运行start-stop-daemon …找到的命令,/etc/init.d/php5-fpm这就是为什么我以前的编辑没有效果.相反,当你使用类似的东西时,它会传递给upstart(实际initctl)service php5-fpm start.

  • 您应该**不要**编辑init脚本,它可能会被后续更新覆盖.相反,你应该将`umask 002`节放入文件`/ etc/init/php-fpm.override` (2认同)

Але*_*ный 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
Run Code Online (Sandbox Code Playgroud)

要使更改生效,请运行:

systemctl daemon-reload && systemctl restart php7.2-fpm
Run Code Online (Sandbox Code Playgroud)

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

systemd手册解释这是如何工作的:

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

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