Nginx 下安装和配置 php 7.3.3
在安装之后发现并不能解析 php 文件,查询错误信息得到结论:php-fpm 未安装。
检查 php-fpm 是否启动 netstat -ant | grep 9000
, 检查可执行文件 whereis php-fpm
,确认未安装。
之前也从来没有单独安装过 php-fpm ,是不是高版本不需要 php-fpm 了呢?查了一下,并不是,7.* 版本仍然需要并且会自动安装 php-fpm 。
那么就应该是安装 php 的过程中出了问题。
找到源文件目录 /usr/local/src/php-7.3.3 ,这是我下载解压后的目录地址。重新找了一个对应版本的安装教程,
一、安装一些依赖包:
二、编译:
注意:复制时要清楚每行末尾的换行符
--prefix
参数表示新版 php 安装目录,可自定义。--with-apxs2
参数表示 apache 2.x 的 apxs 服务位置,我在参数里没加,但也编译成功了。
如果 php 安装过程中没有自动配置的话,安装成功后需要配置 libphp7.so 模块的位置,并重启 Apache。若重启 Apache 失败,提示缺少 libphp7.so ,可以考虑重新编译,并添加参数 --with-apxs2=/path/to/httpd/bin/apxs
。
错误解决:
configure: error: Please reinstall the libzip distribution
安装 libzip:
其他缺失的依赖库亦可以如此操作。
error: off_t undefined; check your library configuration
添加路径设置
unrecognized options: --enable-gd-native-ttf
在 7.2 之后可能会报警告,可以直接忽略或者去掉。
make test
报错:
大概内容就是缺少 libiconv ,尝试用 yum 安装,找不到。
下载编译版本安装:
出现其他测试 bug
忽略失败提示,继续。
make
错误解决:
zipconf.h:No such file or directory
从源文件中复制该文件到引用文件夹
make install
提示信息如下:
找一下 php-fpm ,有了。
用 service 或者 systemctl 启动,提示找不到服务,后面可以将其转化成服务,也可以直接启用
php 安装后的配置( php 和 php-fpm )
拷贝配置文件
然后设置 php.ini,使用: vim /usr/local/php/lib/php.ini
打开php配置文件找到 cgi.fix_pathinfo 配置项,这一项默认被注释并且值为 1,根据官方文档的说明,这里为了当文件不存在时,阻止 Nginx 将请求发送到后端的 PHP-FPM 模块,从而避免恶意脚本注入的攻击,所以此项应该去掉注释并设置为 0。
设置完毕保存并退出
另外注意一个地方就是 php.ini 配置文件的位置可以在编译前配置参数中设置,编译参数可以写成:--with-config-file-path=/usr/local/php 这样的话php就回去指定的目录下读取 php.ini 配置文件,如果不加这个参数默认位置就是 php 安装目录下的 lib 目录,具体也可以在 phpinfo() 输出界面查看,如果 php.ini 放到其他位置,php 读取不到,那么所有的配置修改后都是不生效的,这点要注意
此时首先应该创建web用户:
vim /usr/local/php/etc/php-fpm.conf
,翻到 php-fpm.conf 最后一行会发现如下内容(如果编译时添加 --prefix 选项以下位置会自动补全,默认是下面是空的,要注意):
这里引入了 php-fpm.d 目录下所有的 conf 配置文件,但是NONE需要修改为我们的实际目录 /usr/local/php ,当然我这里编译好是下面这样的:
默认情况下 etc/php-fpm.d/ 下有一个名为 www.conf.defalut 的配置用户的文件,执行下面命令复制一个新文件并且打开:
默认 user 和 group 的设置为 nobody ,将其改为 www-data :
修改完成之后,保存并退出,然后执行以下命令启动 php-fpm 服务:
启动完毕之后,php-fpm 服务默认使用 9000 端口,使用 netstat -tln | grep 9000 可以查看端口使用情况:
9000 端口正常使用,说明 php-fpm 服务启动成功
然后执行 vim /usr/local/nginx/nginx.conf
编辑 nginx 配置文件,具体路径根据实际的 nginx.conf 配置文件位置编辑,下面主要修改 nginx 的 server {} 配置块中的内容,修改 location 块,追加 index.php 让 nginx 服务器默认支持 index.php 为首页:
然后配置 php 请求被传送到后端的 php-fpm 模块,默认情况下php配置块是被注释的,此时去掉注释并修改为以下内容:
这里面很多都是默认的,root 是配置 php 程序放置的根目录,主要修改的就是 fastcgi_param 中的 /scripts 为 $document_root
修改完上面的,回到 nginx.conf 第一行,默认是 #user nobody; 这里要去掉注释改为 user www-data; 或者 user www-data www-data; 表示 nginx 服务器的权限为 www-data
修改完这些保存并退出,然后重启nginx:
接下来编辑一个测试的php程序,在nginx下的html目录下创建test.php文件,打印一下php配置:
然后打开浏览器输入对应的地址进行访问,看到输出页面,说明 nginx 和 php 都配置成功了:
后部分配置参考:freeweb - cnblog
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。