重启后1-2分钟从php-fpm“未指定输入文件”

时间:2014-03-04 15:35:20

标签: nginx php

使用php-fpm和nginx,一切正常,除了重启php-fpm后大约1-2分钟。在此期间,所有 .php网址都会返回“未指定输入文件”。 1-2分钟后,一切都恢复正常,无需采取进一步行动。

/var/log/nginx/error.log中的示例条目:

2014/03/04 09:21:22 [error] 1206#0: *55 FastCGI sent in stderr: "Unable to open primary script: /usr/share/nginx/html (Success)", client: xxx.aaa.bbb.ccc, server: www.example.com, request: "GET /xxx/index.php HTTP/1.1", host: "www.example.com"

这是来自server.conf的服务器块:

server {
    listen       443 ssl;
    server_name  www.example.com;

    ssl_certificate      /etc/nginx/ssl-bundle.crt;
    ssl_certificate_key  /etc/nginx/cert.key;

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;

    root /usr/share/nginx/html;
    index  index.php index.html;

    location / {
      try_files $uri $uri/ $uri/index.php;
    }

    location ~ \.php {
      fastcgi_split_path_info ^(.+\.php)(.+)$;
      fastcgi_param PATH_INFO $fastcgi_path_info;
      fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
      fastcgi_pass php;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      include fastcgi_params;
    }
}

和/etc/nginx/nginx.conf:

http {
    ...

    sendfile        on;

    keepalive_timeout  65;
    charset utf-8;
    gzip on;
    gzip_static on;
    etag on;
    upstream php {
      server unix:/var/run/php5-fpm.sock;
    }
    open_file_cache max=1000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
    keepalive_requests 100000;
    expires max;

    include /etc/nginx/conf.d/*.conf;
}

任何想法如何解决?重启php-fpm后只发生一段时间的事实似乎排除了一些常见问题(例如权限),看起来更像是缓存?谢谢!

3 个答案:

答案 0 :(得分:0)

这真的很奇怪。这可能不是一个答案,但这里有太多的文字,以适应一个小评论框。

1)错误肯定来自PHP-FPM,并不是缓存问题。由于PHP无法打开脚本,错误消息来自:http://lxr.php.net/xref/PHP_5_5/sapi/fpm/fpm/fpm_main.c#1920

显然zlog错误会写入stderr PHP日志 - 您已将其设置为/var/log/php-fpm/www-error.log。那里有什么吗?如果不是,您可能需要重新编译PHP,或者调整日志设置以找出错误。

2)运行PHP-FPM作为nginx用户有点奇怪。 Nginx需要作为特权进程运行,因为它侦听端口80,而PHP-FPM则不需要。我通常为每个网站创建一个用户,然后为该用户下的每个站点运行PHP-FPM池。可能与您的问题无关 - 但谁知道。

3)没有打开文件真的很奇怪,我根本不理解它。您可能需要运行strace来确定实际发生的情况,例如:

#!/bin/bash

# Prevent strace from abbreviating arguments?
# You want the -s strsize option, which specifies the maximum length of a string to display (the default is 32).

rm -rf trc/*.trc

additional_strace_args="$1"

mkdir trc

MASTER_PID=$(ps auwx | grep php-fpm | grep -v grep | grep 'master process'  | cut -d ' ' -f 7)



# ls -l /tmp/foobar | awk '{print $1"\t"$9}'
# This code takes some input, such as this:
# -rw-rw-rw-   1 root     root            1 Jul 14  1997 tmpmsg
# and generates output like this:
# -rw-rw-rw-      tmpmsg




#shows total of calls
summarise=""
# summarise="-c"


nohup strace -r $summarise -p $MASTER_PID -ff -o ./trc/master.follow.trc >"trc/master.$MASTER_PID.trc" 2>&1 &

while read -r pid;
do
    if [[ $pid != $MASTER_PID ]]; then

        #shows individual calls
        #nohup strace -r -p "$pid" $additional_strace_args >"trc/$pid.trc" 2>&1 &

        #shows total of calls
        nohup strace -r $summarise -p "$pid" $additional_strace_args >"trc/$pid.summary.trc" 2>&1 &
    fi
done < <(pgrep php-fpm)


read -p "Strace running - press [Enter] to stop"

pkill strace

顺便说一下,我要继续猜猜你已经运行了很长时间的php-fpm脚本。您正在使用的restart命令正在重新启动。如果其中一个脚本需要很长时间,那么这可能会解释您所看到的行为。

答案 1 :(得分:0)

我想我已经解决了这个问题。有必要将/usr/share/nginx/html(或更一般地,$document_root)添加到php.ini或nginx配置中的open_basedir路径。这有效:

location ~ \.php {
  fastcgi_split_path_info ^(.+\.php)(/.+)$;
  include fastcgi_params;
  fastcgi_param PHP_VALUE "open_basedir=$document_root";
  fastcgi_param PATH_INFO $fastcgi_path_info;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  fastcgi_pass php;
  fastcgi_index index.php;
}

注释掉PHP_VALUE导致问题返回。我仍然不明白为什么问题发生了或为什么解决了这个问题;是否与php-fpm,APC,nginx或其他任何事情有关。

答案 2 :(得分:0)

根据https://www.php.net/manual/en/ini.core.php

使用open_basedir将禁用真实路径缓存。