在我花了 8 个小时努力让 Nginx 正常工作时,我(终于)跟踪了问题并最终找到了它。我得到了 HTTP 500 ERROR (Internal Server Error)
。我操纵了我拥有的每个软件的配置,但没有运气。
无论如何,问题出在将它们包含到主机配置文件中时,FastCGI SCRIPT_FILENAME
这FastCGI SCRIPT_NAME
2 个变量就导致了 这个 问题500 HTTP ERROR
。为了清楚起见,这里有一些我的配置片段。1
.:sites-enabled/default
location ~ \.php$
{
#fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/www$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
#including fastcgi_params, is the root of all evil.
include /etc/nginx/fastcgi_params;
}
2. fastcgi_params
,包含的文件(在前面的代码片段中):
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
#HERE, THE ERROR IS THROWN.
#Commenting the SCRIPT_FILENAME AND SCRIPT_NAME removes the ERROR.
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param HTTPS $https;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
正如我所评论的解决方案看起来很简单,但实际上,注释SCRIPT_NAME
并SCRIPT_FILENAME
破坏了我的代码,因为我正在开发的框架(Codeigniter)正在使用SCRIPT_NAME
来获取我的网站的URL,此外还被SCRIPT_NAME
分配给PHP()中的全局变量$_SERVER['SCRIPT_NAME']
。所以我无法注释这两行。
那么,这个问题的解决方案是什么?是错误吗?还是只是配置错误?顺便说一句,错误日志没有显示任何有用的信息。
附加信息:
1. 我正在运行 Debian 6。2
. 使用 dotdeb 构建。3
. 使用 PHP5-FPM。3.访问目录时
出现403 HTTP
错误。4 .找不到文件时
出现 Codeigniter(框架)的自定义错误。404 HTTP
答案1
根据Nginx 文档,你应该使用:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
并指定你的root
目录外部位置块:
server {
server_name www.domain.com;
root /var/www/nginx-default/;
location / {
[...]
}