都了,再写PHP的文章是不是过时了?现在还坚持搞PHP的不多了吧。
今天按照官方文档安装完Nginx和PHP之后,打开本地localhost,出现了这个错误:No input file specified.
一. 安装 Nginx
系统是Ubuntu-20.04.1,Nginx是通过官方文档 apt 方式安装的,参考官方wiki:Install | NGINX,
Ubuntu系统默认的apt源里是有Nginx的,不过版本不是最新的1.20,而是1.18.按照Nginx官方文档的教程安装最新版本,首先添加Nginx的源,在/etc/apt/sources.list里添加以下代码,或者新建一个/etc/apt/sources.list.d/nginx.list文件添加以下代码
## Replace $release with your corresponding Ubuntu release.deb /packages/ubuntu/ $release nginx#deb-src /packages/ubuntu/ $release nginx
将代码中的 $release 换成Ubuntu系统版本的代号,比如20.04的代号是 focal,替换后为
deb /packages/ubuntu/ focal nginx#deb-src /packages/ubuntu/ focal nginx
然后执行
sudo apt update
更新 apt 包信息,如果出现以下错误
W:GPGerror:/packages/ubuntufocalInRelease:Thefollowingsignaturescouldn'tbeverifiedbecausethepublickeyisnotavailable:NO_PUBKEY$key
是 公钥的问题,其中 $key 是一个数字串,执行以下代码,注意替换$key为上面报错信息里的数字串
## 把 $key 替换成报错的那个数字串sudo apt-key adv --keyserver --recv-keys $keysudo apt update
不报错的话,apt 源就更新成功了,如图
然后安装nginx。
sudo apt install nginx
安装成功后,启动 nginx。可以通过 nginx命令启动,也可以通过systemctl 启动
sudo systemctl start nginx
二. 安装 PHP
Ubuntu官方apt源里的PHP版本比较旧,PHP官方也没有 apt 源,按官方文档PHP: Nginx 1.4.x on Unix systems - Manual只能源码安装了。
通过PHP: Downloads下载源码,我下载的是php-8.0.18.tar.gz,解压
tar -xzvf php-8.0.18.tar.gz
进入到解压后的目录
cd php-8.0.18/
配置与编译
./configure --enable-fpm --with-mysqlimakesudo make install
第一步./configure的时候会提示错误,缺少编译器,需要安装gcc,通过 sudo apt install gcc 安装即可。 也可能会提示缺少相关的工具,比如 libxml2, zlib等,同样通过 sudo apt install libxml2 libxml2-dev即可,需要注意的是提示缺少libxml2,光安装libxml2不行,还需要安装 libxml2-dev;安装zlib的时候,zlib的apt包名是 zlib1g,所以通过 sudo apt install zlib1g zlib1g-dev 来安装。其它缺少的包都这样安装就行。
make的时间会稍有点长,一二十分钟吧。
make完会提示让执行make test, 执行 make test 即可。
sudo make install完成后即安装完成了,接下来开始配置。
将源码目录中的 php.ini-development 拷贝到他们正确的位置,这个位置通过 php --ini 命令来查看,这个PHP默认加载php.ini的位置
目录是 /usr/local/lib, 拷贝到此目录
cp php.ini-development /usr/local/lib/php.ini
拷贝 php-fpm 的配置文件和执行文件到指定位置
cp /usr/local/etc/php-fpm.conf.default /usr/local/etc/php-fpm.confcp /usr/local/etc/php-fpm.d/www.conf.default /usr/local/etc/php-fpm.d/www.confcp sapi/fpm/php-fpm /usr/local/bin
当文件不存在时阻止Nginx转发到后端 php-fpm,编辑 php.ini 修改一个配置项
vim /usr/local/lib/php.ini
定位到cgi.fix_pathinfo=, 去掉前面的分号,修改成
cgi.fix_pathinfo=0
编辑 php-fpm 的配置文件,修改一下 php-fpm 的启动用户和组
vim /usr/local/etc/php-fpm.d/www.conf
找到 user = nobody group = nobody 这里,改成
user = www-datagroup = www-data
启动 php-fpm
sudo /usr/local/bin/php-fpm
这里需要加 sudo,不然会提示没有权限。
配置完 PHP 的配置文件 和 php-fpm 的配置文件,接下来配置 Nginx 的配置文件了。
首先找到Nginx的配置文件的位置,通过 nginx -V 命令可以查看。
编辑此文件
sudo vim /etc/nginx/nginx.conf
这个是 nginx 的总配置文件,打开后可以看到有两个重要信息
上面的 error_log 那一行是nginx的错误日志文件的位置,下面的 include 是包含的子配置文件的位置,这个文件以 http {} 为主, 在子配置文件里以 server{}为主,虚拟主机配置可以通过添加子配置文件来设置,打开子配置文件的目录 /etc/nignx/conf.d/ 看以下
只有一个子配置文件 default.conf,编辑此文件
sudo vim /etc/nginx/conf.d/default.conf
添加红框里内容
Nginx 配置完毕,重启一下。
sudo systemctl restart nginx
完事了,建一个 .php 文件测试一下吧。找到 nginx 的 文档根目录,打开 nginx 的配置文件里面有
sudo vim /etc/nginx/nginx.conf
切换到此目录,创建 index.php
cd /usr/share/nginx/html/rm index.htmlvim index.php
输入以下php代码
<?phpphpinfo();?>
打开浏览器 http://localhost, 结果出现如下错误:
一切都是按照官方文档配置下来的, 就这一个模糊信息,到底是 nginx 的配置有问题,还是 php-fpm的配置或者php的配置有问题?
查看 headers,报的是 404 错误,根目录明明有 index.php,为什么还404错误呢?既然这里错误信息这么模糊,只能去错误日志里看看了。在上面的/etc/nginx/nginx.conf 配置文件里可以看到 nginx 的错误日志目录在/var/log/nginx/error.log, 打开此文件的最后看一下
tail /var/log/nginx/error.log
有一个错误,显示FastCGI返回了一个错误,没有找到此文件,/etc/nginx/html/index.php,在/etc/nginx/conf.d/default.conf 这个配置文件里,明明文档根目录是/usr/share/nginx/html
为什么会去 /etc/nginx/html 目录去找呢?
考虑到这个root 是在 location / 块里配置的, 新添加的那块是location ~* \.php$ 块,有没有可能是那个块里也需要指定 root 配置项? 试一下
重启 nginx
sudo systemctl restart nginx
刷新浏览器 http;//localhost,终于出现如下页面
成功解决。
总结:nginx 对于 php 文件的请求会转发给后端的 php-fpm, 但是出现404错误的时候,并没有显示出详细的错误信息,只是显示了一个No input file specified. 详细的错误信息需要到错误日志里去看。