我正在尝试设置一个新安装的 Ubuntu (12.04) 服务器,但无法通过 php-fpm 运行 PHP 文件。无论我做什么,我总是得到一个“拒绝访问”页面(纯文本,不是 html 或任何其他内容)。
已安装的软件包:
nginx
nginx-common
nginx-full
php5
php5-cli
php5-common
php5-fpm
配置详细信息:
PHP-FPM:
user = www-data
group = www-data
listen = /var/run/php5-fpm.sock
Nginx的:
user www-data;
worker_processes 3;
events { worker_connections 1024; }
默认/测试域:
server {
listen 80;
server_name localhost;
root /extra/htdocs/default;
index index.html index.php
access_log /extra/logs/default/access.log;
error_log /extra/logs/default/error.log;
location / {
try_files $uri $uri/ /index.html;
}
location ~ \.php
{
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
/extra/htdocs/default/index.php:
<?php
phpinfo();
其余一切都是默认的。Nginx 和 php-fpm 日志均未显示任何错误。然而,当我加载时,http://<server-ip>/index.php
我得到了“访问被拒绝”页面。
故障排除:
- index.html 文件工作正常。因此它一定是 php-fpm,或者是 Nginx 和 php-fpm 之间的 fastcgi 绑定。
- 我已经将整个
/extra
目录的所有权(用户和组)设置为www-data
,并将所有权设置为 777,以确保万无一失(当然,一旦它正常工作,我会将其调低)。所以这肯定不是权限问题 - 这不是安全.限制_扩展我经常看到的问题:默认情况下,它被设置为 .php,这正是我所要求的。我已明确将其设置为
.php .html
,结果相同。
我真的厌倦了,我已经安装了两次这个设置(尽管是在 OSX 机器上),一切都运行正常。我是否忽略了什么?
日志内容:
Nginx 错误日志是空的。
Nginx 访问日志(删除ip):
<ip> - - [17/Jul/2012:11:21:25 +0200] "GET /favicon.ico HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11"
<ip> - - [17/Jul/2012:11:21:28 +0200] "GET /index.php HTTP/1.1" 403 46 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11"
<ip> - - [17/Jul/2012:11:21:34 +0200] "-" 400 0 "-" "-"
php-fpm 日志:
[17-Jul-2012 10:44:14] NOTICE: fpm is running, pid 4969
[17-Jul-2012 10:44:14] NOTICE: ready to handle connections
答案1
终于修好了。
罪魁祸首是我的配置中的这一行:
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
如果我注释掉这行,一切都会正常工作。但是,我几乎在每篇关于 Nginx 配置的文章中都看到了这一点,所以这让我很困扰。当我第 100 万次查看我的配置时,我看到cgi.fix_pathinfo
(in php.ini
) 设置为 0,而它应该是 1。PHP 使用的默认值也是 1,所以我一定是在调试时更改了它,因为我记得读过关于这个值的内容,并认为它设置正确。
无论如何,也许它可以帮助任何通过 Google 搜索此问题的人。
答案2
在 Ubuntu 和 openSUSE 上,访问被拒绝错误也可能与 AppArmor 有关。您可以通过运行以下命令轻松检查:
sudo grep -i denied /var/log/audit/audit.log
如果您得到类似这样的信息,那就是 AppArmor:
type=AVC msg=audit(1678543274.258:837): apparmor="DENIED" operation="open" profile="php-fpm" name="/srv/www/htdocs/test.php" pid=31787 comm="php-fpm" requested_mask="r" denied_mask="r" fsuid=487 ouid=1000