青蛙学Linux—Nginx配置PHP支持
1、安装PHP
PHP可以使用YUM安装,也可以通过源码包自行编译安装。使用YUM安装PHP可能会存在版本过低的问题,所以这里我们使用从PHP官网(www.php.net)上下载的源码包进行安装,版本为7.1.25(随机选择的版本)。
1.1、安装依赖环境
安装PHP前必须先安装以下依赖包,依赖包可以通过YUM进行安装:
[root@localhost apps]# yum install php-mcrypt libmcrypt libmcrypt-devel autoconf freetype freetype-devel gd libmcrypt libpng libpng-devel openjpeg openjpeg-devel libjpeg libjpeg-devel libxml2 libxml2-devel zlib curl curl-devel
1.2、编译安装PHP
将下载的PHP源码包解压后,进入PHP目录,运行(将PHP安装到/usr/local/php7目录下):
[root@localhost php-7.1.25]# ./configure \ > --prefix=/usr/local/php7 \ > --enable-fpm \ # 开启PHP-FPM,Nginx通过FPM与PHP集成 > --with-fpm-user=nginx \ # 定义启动FPM的用户 > --with-fpm-group=nginx \ # 定义启动FPM的组 > --with-pdo-mysql=mysqlnd \ # 定义PHP连接MySQL的驱动组件 > --with-mysqli=mysqlnd \ # 定义PHP连接MySQL的驱动组件 > --with-zlib \ # 开启zlib支持 > --with-curl \ # 开启curl支持 > --with-gd \ # 开启gd库支持 > --with-jpeg-dir \ # 开启jpeg图片支持 > --with-png-dir \ # 开启png图片支持 > --with-freetype-dir \ # 开启freetype字体库支持 > --with-openssl \ # 开启openssl支持 > --enable-mbstring \ # 开启mbstring扩展 > --enable-xml \ # 开启XML支持 > --enable-session \ # 开启session > --enable-ftp \ # 开启FTP支持 > --enable-pdo \ # 开启PDO > --enable-tokenizer \ # 开启tokenizer扩展 > --enable-zip # 开启ZIP支持
更多的./configure参数可以使用./configure --help命令查看。
在configure进行完毕无报错后,使用以下命令进行安装:
[root@localhost php-7.1.25]# make && make install
安装完成后,接下来需要复制PHP的配置文件到安装目录。PHP的配置文件位于源码包中,有以下两个文件:
php.ini-development # 开发环境 php.ini-production # 生产环境
这里将PHP用于生产环境的配置文件复制到安装目录:
[root@localhost php-7.1.25]# cp php.ini-production /usr/local/php7/lib/php.ini
因为我们需要使用PHP-FPM与Nginx进行集成,这里可以将PHP-FPM的服务文件加入系统服务中,以便进行管理:
CentOS 6.x(init)
[root@localhost php-7.1.25]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm [root@localhost php-7.1.25]# chmod 755 /etc/init.d/php-fpm
CentOS 7.x(systemd)
[root@localhost php-7.1.25]# cp sapi/fpm/php-fpm.service /usr/lib/systemd/system
1.3、额外的:pdo和mysqlnd
configure中的参数--with-pdo-mysql=mysqlnd表示在连接MySQL时使用的时mysqlnd驱动。这里涉及了两个概念,pdo和mysqlnd。
PDO,PHP Data Objects,是PHP应用中的一个数据库抽象层规范。PDO提供了一个统一的API接口使得PHP应用可以不用去关心具体连接的是什么数据库。PDO的使用使得可以在任意需要的时候无缝切换后端数据库。
mysqlnd,MySQL Native Driver,是由PHP官方提供的用于连接MySQL数据库的驱动,用于替换由MySQL官方开发的libmysql。从PHP 5.3版本开始已经不推荐使用libmysql,在PHP 7.x的版本中libmysql已经被移除了,所以在PHP 7.x中,--with-mysql=mysqlnd的写法已经被废除了。另外,由于mysqlnd内置于PHP源码中,所以在编译安装PHP时不需要先安装好MySQL。
--with-mysqli=mysqlnd中的mysqli是MySQL增强扩展,也是PHP连接MySQL的一种方式,这里也使用mysqlnd驱动。
2、PHP-FPM
PHP-FPM是一个第三方的FastCGI进程管理器,最先是作为PHP的一个补丁来开发的,现在PHP-FPM已经集成在PHP源码中,用于替换PHP FastCGI的大部分附加功能,对于高负载网站是非常有用的。
PHP-FPM包含一个master和多个worker进程(worker进程数量在配置文件中定义)。master主要负责监听端口,接收来自Web server的请求;而worker进程内部拥有一个PHP解释器,是PHP代码真正执行的地方。
PHP-FPM的配置文件位于PHP安装目录下的etc目录中,文件名为php-fpm.conf.default,要使用时去掉.default即可:
[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf
该配置文件中的内容大部分都被注释掉了,仅有下面一句生效:
include=/usr/local/php7/etc/php-fpm.d/*.conf
表示加载PHP安装目录下的/etc目录下的子目录php-fpm.d中的.conf配置文件。我们进入该目录,默认该目录下有一个名为www.conf.default的文件,我们首先启用该文件:
[root@localhost php-fpm.d]# cp www.conf.default www.conf
我们来看下该文件中的内容,该文件中的大部分内容也被注释掉了,生效的部分如下:
[www] user = nginx # 启动PHP-FPM的用户 group = nginx # 启动PHP-FPM的组 listen = 127.0.0.1:9000 # PHP-FPM监听的IP和端口 pm = dynamic # 定义PHP-FPM进程池开启进程的方式,有静态static和动态dynamic pm.max_children = 5 # 在static方式下表示开启的进程数,dynamic方式下表示开启的最大进程数 pm.start_servers = 2 # dynamic方式下初始开启的进程数 pm.min_spare_servers = 1 # dynamic方式下在空闲状态中开启的最小进程数 pm.max_spare_servers = 3 # dynamic方式下在空闲状态中开启的最大进程数,这个值只能小于等于pm.max_children
启动PHP-FPM
当前系统为CentOS 7.6.1810,且已经将PHP-FPM添加到系统服务管理中了,所以使用以下命令启动PHP-FPM:
[root@localhost php-fpm.d]# systemctl start php-fpm
3、Nginx使用PHP-FPM
Nginx要通过PHP-FPM使用PHP,同样是通过反向代理来进行的,只是这里的反向代理使用的是FastCGI协议。
打开Nginx的配置文件,里面默认有一段关于PHP-FPM的配置:
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #}
该段配置默认是注释状态,只要取消注释即可使用。这里需要注意的是fastcgi_param,定义的是PHP文件的路径。
我们把这段配置取消注释,并将fastcgi_param的路径修改为$document_root$fastcgi_script_name,然后在html目录下创建一个文件名为info.php的PHP文件,文件内容为:
<?php phpinfo(); ?>
访问http://192.168.0.110/info.php:
至此,Nginx支持PHP环境配置成功。