我第一次使用Nginx,但是我更熟悉Apache和Linux。 我正在使用一个现有的项目,当我试图看到index.php我得到一个404文件未find。
这里是access.log条目:
2013/06/19 16:23:23 [error] 2216#0: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.ordercloud.lh"
这里是网站可用的文件:
server { set $host_path "/home/willem/git/console/www"; access_log /www/logs/console-access.log main; server_name console.ordercloud; root $host_path/htdocs; set $yii_bootstrap "index.php"; charset utf-8; location / { index index.html $yii_bootstrap; try_files $uri $uri/ /$yii_bootstrap?$args; } location ~ ^/(protected|framework|themes/\w+/views) { deny all; } #avoid processing of calls to unexisting static files by yii location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ { try_files $uri =404; } # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php { fastcgi_split_path_info ^(.+\.php)(.*)$; #let yii catch the calls to unexising PHP files set $fsn /$yii_bootstrap; if (-f $document_root$fastcgi_script_name){ set $fsn $fastcgi_script_name; } fastcgi_pass 127.0.0.1:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fsn; #PATH_INFO and PATH_TRANSLATED can be omitted, but RFC 3875 specifies them for CGI fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fsn; } location ~ /\.ht { deny all; } }
我的/ home / willem / git / console由www-data:www-data(我的web用户正在运行php等)拥有,我已经给它777权限出于挫折感。
我最好的猜测是configuration有问题,但我无法弄清楚…
更新所以我把它移动到/var/www/
并使用了一个更基本的configuration:
server { #listen 80; ## listen for ipv4; this line is default and implied #listen [::]:80 default ipv6only=on; ## listen for ipv6 root /var/www/; index index.html index.htm; # Make site accessible from http://localhost/ server_name console.ordercloud; location / { root /var/www/console/frontend/www/; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www; include fastcgi_params; } location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ { try_files $uri =404; } location /doc/ { alias /usr/share/doc/; autoindex on; allow 127.0.0.1; deny all; } }
另外如果我打电话localhost/console/frontend/www/index.php
我得到一个500 PHP,这意味着它在那里服务。 它只是没有服务console.ordercloud …
错误消息“主脚本未知” 几乎总是与nginx fastcgi_param
指令中错误设置的SCRIPT_FILENAME
(或不正确的权限,请参阅其他答案)有关。
您在首次发布的configuration中使用了if
。 那么现在应该知道, 如果是邪恶的 ,往往会产生问题。
在一个位置块中设置root
指令是不好的做法,当然是有效的。
你可以尝试如下的东西:
server { location / { location ~* \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass 127.0.0.1:9000; try_files $uri @yii =404; } } location @yii { fastcgi_param SCRIPT_FILENAME $document_root$yii_bootstrap; } }
请注意,上述configuration未经testing。 在应用它之前,你应该执行nginx -t
来检查nginx能够立即检测到的问题。
SCRIPT_FILENAME
并不总是错的。
也可能是PHP作为错误的用户/组运行 。
这个例子是特定于Mac OS X ,根据我的经验,这是最麻烦的设置(Debian很容易比较) – 我刚刚从PHP 5.6升级到7.0,使用自制软件和优秀的josegonzalez软件包。
问题是创build了一个新的configuration文件副本。
主要的configuration文件是/usr/local/etc/php/7.0/php-fpm.conf
,但是在包含整个子目录的末尾注意到池定义部分。
include=/usr/local/etc/php/7.0/php-fpm.d/*.conf
在php-fpm.d
有一个www.conf
文件。 默认情况下这有:
user = _www group = _www
在OS X上,您可能需要将其更改为:
user = [your username] group = staff
(你会发现这匹配你的document_root的ls -lh
)
不幸的是,没有这个改变, 即使在正确的位置查找文件 ,你仍然会在你的Nginx错误日志中看到这个。
"Primary script unknown" while reading response header from upstream
确认当前正在运行的是:
ps aux | grep 'php-fpm'
或更干净地:
ps aux | grep -v root | grep php-fpm | cut -d\ -f1 | sort | uniq
如何validation脚本文件名是否正确:
(从另一个答案igorsantos07偷)
添加到主/usr/local/etc/nginx/nginx.conf
http
块中:
log_format scripts '$document_root$fastcgi_script_name > $request';
(第一位需要是你正在使用的任何东西,所以你可以看看是否正确。)
而要使用你刚刚定义的日志,在你的网站的server
块中:
access_log /var/log/nginx/scripts.log scripts;
如果这是正确的,请求example.com/phpinfo.php会产生这样的东西:
/path/to/docroot/phpinfo.php > GET /phpinfo.php
你能简化你现有的configuration吗?
您是否正在使用location ~ \.php {
阻止您从互联网上的某处复制/粘贴? 大多数软件包允许您更快速,更干净地完成。 例如在OS X上,你现在只需要这个:
location ~ \.php { fastcgi_pass 127.0.0.1:9000; include snippets/fastcgi-php.conf; # any site specific settings, eg environment variables }
像fastcgi_split_path_info,try_files和fastcgi_index(默认为index.php)在/usr/local/etc/nginx/snippets/fastcgi-php.conf
。
这又包括/usr/local/etc/nginx/fastcgi.conf
这是fastcgi_param
设置的列表,包括关键的SCRIPT_FILENAME。
不要在PHP位置块中复制root
。
好吧,经过一天的努力,我发现了三件事
希望这可以节省一些麻烦!
有一个更新的nginx(v1.8)相同的问题。 较新的版本推荐使用snippets/fastcgi-php.conf;
而不是fastcgi.conf
。 所以如果从教程中复制/粘贴include fastcgi.conf
,最终可能会在日志中出现Primary script unknown
错误。
我也有这个问题,我解决了交换行include fastcgi_params
和fastcgi_param SCRIPT_FILENAME ...
事实上,nginx设置了每个FastCGI参数的最后一个值,所以你必须把你的值放在fastcgi_params中包含的默认值之后。
“主脚本未知”是由SELinux安全上下文引起的。
客户得到回应
文件未find。
nginx error.log有以下错误信息
* 19在读取来自上游的响应头时,在stderr中发送的FastCGI:“主脚本未知”
所以只需将Web根文件夹的安全上下文types更改为httpd_sys_content_t
chcon -R -t httpd_sys_content_t /var/www/show
有3个用户为nginx / php-fpmconfiguration
/etc/nginx/nginx.conf
user nobody nobody; ### `user-1`, this is the user run nginx woker process ... include servers/*.conf;
/etc/nginx/conf.d/www.conf
location ~ \.php$ { # fastcgi_pass 127.0.0.1:9000; # tcp socket fastcgi_pass unix:/var/run/php-fpm/fpm-www.sock; # unix socket fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
/etc/php-fpm.d/www.conf
[www] user = apache ### `user-2`, this is the user run php-fpm pool process group = apache ;listen = 127.0.0.1:9000 # tcp socket listen = /var/run/php-fpm/fpm-www.sock # unix socket listen.onwer = nobody ### `user-3`, this is the user for unix socket, like /var/run/php-fpm/fpm-www.sock listen.group = nobody # for tcp socket, these lines can be commented listen.mode = 0660
用户1和用户2不必相同。
对于unix套接字,user-1需要与user-3相同,因为nginx fastcgi_pass必须对unix套接字具有读/写权限。
否则nginx将得到502 Bad Gateway ,而nginx error.log有以下错误信息
* 36连接()到unix:/var/run/php-fpm/fpm-www.sock失败(13:权限被拒绝),同时连接到上游
并且web根文件夹(/ var / www / show)的用户/组不必与这三个用户中的任何一个相同。
我发现你的问题寻找相同的错误信息,但使用Apache + PHP-FPM(无Nginx的)。 对我来说,问题是在一个错误的地方的斜线:许多设置build议包括一行的forms:
SetHandler "proxy:unix:/path/to/file.socket|fcgi://localhost/:9000"
通过在端口号之后放置最后的斜线,如下所示:
SetHandler "proxy:unix:/path/to/file.socket|fcgi://localhost:9000/"
这个问题对我来说消失了。 也许你可以做类似的事情
我遇到同样的问题,但其他方法并没有帮助我解决问题!
我解决它,我发现关键是: Linux用户权利导致的问题:FastCGI发送在stderr:“主脚本未知”
因为PHP-FPM默认用户:group是apache:apache,但是你的代码目录是someBody:someBody。 所以你应该改变用户权利!
我写一个博客来解决这个问题,你可以看到这个博客:
[Nginx FastCGI发送stderr:“主要脚本未知”] [1]`[1]: http : //geekhades.blogspot.com/2017/06/nginx-fastcgi-sent-in-stderr-primary.html
我克隆了一个远程站点,并且已经存在的wp-config.php具有远程服务器数据库信息。
我解决了这个问题,通过设置我本地的wordpressconfiguration,与我本地的数据库信息。
尝试在你的php位置添加root指令。
location ~ \.php { root /home/willem/git/console/www; ... }