安装 PHP 所需扩展
yum install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libcurl libcurl-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel gmp gmp-devel libmcrypt libmcrypt-devel readline readline-devel libxslt libxslt-devel
获取 PHP 源码包
采用源码编译的方式安装 PHP
,好处是可以获取最新版本,也能提供一定的配置灵活性,适合有经验的。获取方式可以在 Centos
中运行 Wget
,也可以在其他环境下下载 tar
包然后上传到服务器上。推荐后者,速度更快,此处假设已经获取到了 php-7.4.0.tar.gz
,并存放到了 /home/downloads
cd /home/downloads
wget https://www.php.net/distributions/php-7.4.0.tar.gz
解压
tar -xvf php-7.4.0.tar.gz
cd php-7.4.0
进行配置
对安装进行预配置,设置一些编译参数。最简单的配置是不带任何参数
./configure
但通常因为可能要自定义 PHP
安装目录、配置文件目录等,可以使用个人习惯的基础配置语句:设定PHP安装目录为 /usr/local/php
,配置文件目录为 /usr/local/php/etc
,并允许使用 php-fpm
管理 PHP
请求
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm
检查输入无误后即可运行,通常很快完成
make
使用 make
命令进行编译,时间约 5-10min,可能遇到坑。我就在 Centos 7.6
上安装时就遇到了 sqlite3
缺失无法完成的错误提示,然后就执行了yum install sqlite-devel
,将 sqlite3
安装上再重新运行 make
命令。(ubuntu的话要执行 sudo apt-get install libsqlite3-dev
进行安装)
make
make install
如 make
无误,make install
很快。
make install
此时 PHP
安装完毕,接下来就要进行相关配置
设置全局变量
刚才设置 PHP
目录在 /usr/local/php
,因此该目录下就有了 bin
目录,将 /usr/local/php/bin
添加到全局变量 $PATH
中
# 编辑文件
vi /etc/profile
# 将下面两句添加到文件尾并保存
PATH=$PATH:/usr/local/php/bin
export PATH
# 刷新生效
source /etc/profile
# 查看是否生效
php -v
参考显示结果
# PHP 7.4.0 (cli) (built: Dec 17 2019 14:44:39) ( NTS )
# Copyright (c) The PHP Group
# Zend Engine v3.4.0, Copyright (c) Zend Technologies
配置 PHP 环境
根据配置时自定义的路径,将有关 PHP
运行的配置文件、启动方式等进行设置,逐一运行下列命令
# 进入PHP源码解压缩目录
cd /home/downloads/php-7.4.0
# 将源码中准备好的配置文件复制到指定目录并改名作为 php 运行时的配置文件,在 ./configure 时指定了配置文件目录是 --with-config-file-path=/usr/local/php/etc
cp php.ini-production /usr/local/php/etc/php.ini
# php-fpm.conf 是 php-fpm 运行时配置文件,里边记录了 include 路径,可以将多个配置文件放到 include 路径下
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
# www.conf 是默认的有关 www 应用的配置
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
# 复制 php-fpm 程序到 /etc/init.d,启动、重启或停止 /etc/init.d/php-fpm 即可实现对 PHP 的控制
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
# 赋予 /etc/init.d/php-fpm 执行权限
chmod +x /etc/init.d/php-fpm
上述命令完成后,在不考虑与 Nginx
的配合情况下,PHP
实际已经可以独立工作了,可以启动 php-fpm
并查看相关信息
/etc/init.d/php-fpm start[/restart/stop]
# 输出
Starting php-fpm done
查看 php-fpm
运行情况
ps -ef | grep php
# 输出
root 24080 1 0 09:49 ? 00:00:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
nobody 24081 24080 0 09:49 ? 00:00:00 php-fpm: pool www
nobody 24082 24080 0 09:49 ? 00:00:00 php-fpm: pool www
root 24096 23960 0 09:52 pts/0 00:00:00 grep --color=auto php
# 查看 PHP 配置相关
php -i |grep Config
# 输出
Configure Command => './configure' '--prefix=/usr/local/php' '--with-config-file-path=/usr/local/php/etc' '--enable-fpm'
Configuration File (php.ini) Path => /usr/local/php/etc
Loaded Configuration File => /usr/local/php/etc/php.ini
Configuration
上例中 master process
因为是使用 root
账户启动并运行 php-fpm
,因此显示 root
账户,nobody
是因为默认 www.conf
配置文件中 user
和 group
默认值就是 nobody
用户
与 Nginx 的配合
假设现在有站点 a.com
,路径是 /home/wwwroot/a.com
,为方便区别管理,在 /usr/local/php/etc/php-fpm.d
下新增关于 a.com
的配置文件 a.com.conf
并假设该文件已创建完毕
# 通过复制 www.conf 创建 a.com.conf
cp www.conf a.com.conf
# 编辑目标文件
vi a.com.conf
# 修改 user 和 group 的账号,修改为与 nginx 一致
user = nginx
group = nginx
# 修改监听端口号,即监听 9001 端口,Nginx要将a.com 的请求发到这个端口来(Nginx中设置)
listen = 127.0.0.1:9001
修改 Nginx
配置文件,新增 server
站点,并在 location
中处理 a.com
的 php
转发
server {
listen 80;
server_name a.com;
location ~* .php$ {
root /home/wwwroot/a.com/;
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
注意上面 server
中,有关 .php
的请求被转发去了 127.0.0.1:9001
,即 a.com.conf
的设定中,这样两边就配合起来了。以此为例,增加新站点 b.com
时,可以再新建 b.com.conf
,并设定 php
监听端口号是 9002
,Nginx
配置中新增 server
转发到 127.0.0.1:9002
,实现同一主机上多个站点的管理。