nginx
我已经使用+安装了一个测试服务器php-fpm
。我尝试了以下所有操作:
nginx + php fpm->404 php 页面-找不到文件
总结一下我所尝试过的:
- 正在重新安装。
- 更改脚本权限(将其更改为
0777
)。 fastcgi_intercept_errors on
。- 检查了
root
以下级别的指令server
:location
和location ~ \.php
。 - 检查了
fastcgi_param SCRIPT_FILENAME
指令。
服务器在.php
脚本上(且仅在脚本上)返回 404。我可以重命名它们.html
,这样就没问题了。我该怎么做?
这是我的nginx.conf
:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 2;
include /etc/nginx/conf.d/*.conf;
index index.html index.htm;
server {
listen 80;
server_name _;
root /var/www/html;
location / {
root /var/www/html;
index index.php index.html index.htm;
}
error_page 404 /404.html;
location = /40x.html {
#root /var/www/html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
#root /var/www/html;
}
location ~ \.php$ {
root /var/www/html;
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
答案1
解决了。原来问题出在 php 监听的套接字上设置的权限。我只需要更改一个listen.mode
名为/etc/php-fpm.d/www.conf
listen.mode = 0750
并将用户设置为nginx
:
listen.owner = nginx
listen.group = nginx
所以文件看起来是这样的:
srwxr-x---. 1 nginx nginx 0 jul 8 08:59 /var/run/php5-fpm.sock
因为我使用的是 unix 套接字而不是 tcp 端口:
listen = /var/run/php5-fpm.sock;
此外,我得到的是404
,而不是500
或503
因为我的www.conf
配置为重定向错误自定义页面,因为他们不在那里,所以我得到了404
。
编辑:
看来,在 Fedora 中大多数最新版本的 nginx 发行版(Fedora 22、23)中,nginx 默认使用 apache 用户,并且套接字也设置为用户 apache,因此不需要进一步配置。
答案2
遇到了同样的问题,直到我注意到我的 PHP 位置块缺少root
条目。
我已经在 下的服务器块中设置了一个location /
,但没有在服务器上或 PHP 位置块内设置一个。
location ~ \.php$ {
root /usr/local/www/; <--- this was missing
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php82-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
或者在服务器级别设置一个
server {
listen 80;
server_name example.com www.example.com;
root /usr/local/www/; <--- this line here
location / {
index index.html index.htm index.php;
try_files $uri $uri/ /index.php?q=$uri&$args;
...
...
答案3
我实际上收到了“未找到”错误,因为我读过的一本书给了我一个不正确的匹配字符串,而/php_status
我在 php-fpm 7.0.x(当前为 7.0.19)和 nginx 1.12(当前为 1.12.0)中配置了该路径。
这里是/etc/php/7.0/fpm/pool.d/{config}
pm.status_path = /php_status
以下是配置(我在 Ubuntu 上default
)/etc/nginx/sites-available
server {
listen 80 default;
root /var/www;
index index.html index.htm default.html;
access_log /dev/null;
error_log /dev/null;
location / {
try_files $uri $uri/ =404;
}
location /php_status {
fastcgi_pass unix:/var/run/php7.0-fpm.sock;
# fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
include fastcgi_params;
allow 127.0.0.1;
deny all;
}
}
笔记:以下内容设计为
/php_status
不公开提供互联网(也不为默认主机提供或设置 PHP)。它还包括fastcgi_pass
tcp 和 unix-socket php-fpm 指令
您还应该在之后运行以下两个命令
sudo service nginx reload
sudo service php7.0-fpm restart
要验证,请尝试运行
curl http://127.0.0.1/php_status
答案4
我想到这个是因为另一个原因:解决方案是提出这个定义:
root /usr/share/nginx/html; # <- replace with your directory
在里面服务器块中,而不是地点堵塞:
server {
listen ....
root /usr/share/nginx/html; # <- replace with your directory
...
location ~ \.php$ {
# no 'root' definition here :)
...
}
}