最近我安装了最新版本的Nginx,看起来我很难用它运行PHP。
以下是我用于域名的配置文件:
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
}
以下是我在错误日志文件中遇到的错误:
FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream
答案 0 :(得分:64)
尝试另一个* fastcgi_param *类似
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
答案 1 :(得分:39)
我遇到了“找不到文件”问题,因此我将“根”定义移到“服务器”括号中,为所有位置提供默认值。你总是可以通过赋予它自己的根目录来覆盖它。
server {
root /usr/share/nginx/www;
location / {
#root /usr/share/nginx/www;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
}
或者,我可以在我的两个位置定义root。
答案 2 :(得分:11)
可能现在为时已晚,但有几件事,因为这是一个非常烦人的错误。以下解决方案适用于Mac OS X Yosemite。
fastcgi_param SCRIPT_FILENAME $ document_root $ fastcgi_script_name;
快速cgi参数的包含应该高于该行。
您所执行的所有目录(包括该文件)都应具有a+x
权限,例如
sudo chmod a+x /Users/ sudo chmod a+x /Users/oleg/ sudo chmod a+x /Users/oleg/www/ sudo chmod a+x /Users/oleg/www/a.php
答案 3 :(得分:2)
在我的例子中,PHP脚本本身返回了404代码。和nginx没什么关系。
答案 4 :(得分:2)
就我而言,这是因为未正确设置根网站目录的权限。要执行此操作,您需要在终端中运行它时位于父文件夹中:
sudo chmod -R 755 htmlfoldername
这将chmod你的html文件夹中的所有文件,出于安全原因不建议用于生产,但是应该让你看到该文件夹中的文件,以确保在排除故障时不是问题。
答案 5 :(得分:2)
我花了40分钟尝试用以下方法调试非工作/状态:
$ SCRIPT_NAME=/status SCRIPT_FILENAME=/status QUERY_STRING= REQUEST_METHOD=GET cgi-fcgi -bind -connect /var/run/php5-fpm.sock
它只是产生了“找不到文件”错误,而实际的脚本(在文件系统上找到)工作得很好。
原来,我有几个孤立的php5-fpm进程。在我杀死所有东西并干净地重新启动php5-fpm后,它恢复了正常。
希望这有帮助。
答案 6 :(得分:1)
我也有这个错误。在我的情况下,这是因为有另一个虚拟主机指向同一个根目录。
答案 7 :(得分:1)
升级到PHP72后,我们遇到了一个问题,其中php-fpm.d / www.conf丢失了导致此错误的用户/组的设置。如果您的设置涉及php-fpm,请务必仔细检查。
答案 8 :(得分:1)
我一直遇到同样的问题, 在测试期间,我遇到了两个问题:
1º:“找不到文件”
和
2º:404错误页面
我发现,就我而言:
我必须在Nginx卷和PHP卷上都安装公用文件夹的卷。
如果已安装在 Nginx 中,但未安装在 PHP 中,则会显示:“ 找不到文件”
示例(将显示“找不到文件错误”):
services:
php-fpm:
build:
context: ./docker/php-fpm
nginx:
build:
context: ./docker/nginx
volumes:
#Nginx Global Configurations
- ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./docker/nginx/conf.d/:/etc/nginx/conf.d
#Nginx Configurations for you Sites:
# - Nginx Server block
- ./sites/example.com/site.conf:/etc/nginx/sites-available/example.com.conf
# - Copy Public Folder:
- ./sites/example.com/root/public/:/var/www/example.com/public
ports:
- "80:80"
- "443:443"
depends_on:
- php-fpm
restart: always
如果它安装在 PHP 中,而不安装在 Nginx 中,则会显示 404未找到页面错误。
示例(将引发404页面未找到错误):
version: '3'
services:
php-fpm:
build:
context: ./docker/php-fpm
volumes:
- ./sites/example.com/root/public/:/var/www/example.com/public
nginx:
build:
context: ./docker/nginx
volumes:
#Nginx Global Configurations
- ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./docker/nginx/conf.d/:/etc/nginx/conf.d
#Nginx Configurations for you Sites:
# - Nginx Server block
- ./sites/example.com/site.conf:/etc/nginx/sites-available/example.com.conf
ports:
- "80:80"
- "443:443"
depends_on:
- php-fpm
restart: always
并且这将很好地工作(在两侧安装)(假设其他所有设置都正确,并且您面临与我相同的问题):
version: '3'
services:
php-fpm:
build:
context: ./docker/php-fpm
volumes:
# Mount PHP for Public Folder
- ./sites/example.com/root/public/:/var/www/example.com/public
nginx:
build:
context: ./docker/nginx
volumes:
#Nginx Global Configurations
- ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./docker/nginx/conf.d/:/etc/nginx/conf.d
#Nginx Configurations for you Sites:
# - Nginx Server block
- ./sites/example.com/site.conf:/etc/nginx/sites-available/example.com.conf
# - Copy Public Folder:
- ./sites/example.com/root/public/:/var/www/example.com/public
ports:
- "80:80"
- "443:443"
depends_on:
- php-fpm
restart: always
这也是一个使用Nginx / Php的完整示例项目,用于服务多个站点: https://github.com/Pablo-Camara/simple-multi-site-docker-compose-nginx-alpine-php-fpm-alpine-https-ssl-certificates
我希望这可以帮助某人, 如果有人对此有更多了解,请告诉我, 谢谢!
答案 9 :(得分:0)
对我来说,问题是位置路径中的错字。
也许首先要检查这类问题
是项目的路径。
答案 10 :(得分:0)
在获取“找不到文件”时,我的问题是在ngix配置中指向此行的文件夹中没有符号链接:
root /var/www/claims/web;
答案 11 :(得分:0)
万一它对某人有帮助,我的问题似乎只是因为我在主目录下使用了一个子文件夹,即使权限似乎正确并且我没有SELinux或类似的东西。 将其更改为在/ var / www / something / something下可以正常工作。
(如果我找到了真正的原因,并且记住了这个答案,我会对其进行更新)
答案 12 :(得分:0)
尝试此命令
sudo chmod 755 -R htdocs/
答案 13 :(得分:0)
错误消息“找不到主脚本,或者在您的情况下找不到文件。”几乎总是与Nginx fastcgi_param指令(引用https://serverfault.com/a/517327/560171中)的SCRIPT_FILENAME行中设置错误有关。
就我而言,我使用Nginx 1.17.10,配置为:
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_read_timeout 600;
}
您只需将$ document_root更改为$ realpath_root,因此无论您的根位置如何,例如/var/www/html/project/
,您都不需要在每次更改根目录时都写fastcgi_param SCRIPT_FILENAME /var/www/html/project$fastcgi_script_name;
。此配置更加灵活。可能会有所帮助。
================================================ =================================
有关更多信息,如果您获得了unix:/run/php/php7.2-fpm.sock failed (13: Permission denied) while connecting to upstream
,只需将/etc/nginx/nginx.conf
从user nginx;
更改为user www-data;
。
由于{-{1}}文件(来自https://www.linuxbabe.com/ubuntu/install-nginx-latest-version-ubuntu-18-04的Qoute文件)中可以看到,PHP-FPM进程的默认用户和组是www-data:
/etc/php/7.2/fpm/pool.d/www.conf
此信息对您有很大帮助
答案 14 :(得分:0)
我的情况:我使用了相对目录
location ~* \.(css|js)\.php$ {
root ../dolibarr/htdocs;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
}
此行也不起作用:fastcgi_param SCRIPT_FILENAME /vagrant/www/p1/../p2/htdocs/core/js/lib_head.js.php;
所以我发现fastcgi_param
不支持相对路径。
这有效
fastcgi_param SCRIPT_FILENAME /vagrant/www/p2/htdocs/core/js/lib_head.js.php;