使用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后只发生一段时间的事实似乎排除了一些常见问题(例如权限),看起来更像是缓存?谢谢!
答案 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将禁用真实路径缓存。