一个专注于IT互联网运维的技术博客

LNMP之源码方式安装PHP7

2018.12.23

WordPress是使用PHP语言开发的博客平台,前面已经配置完Nginx网页服务器和MySQL数据库,本文安装php环境。 有两个方法将PHP连接到Web服务器上。Apache、Microsoft Internet Information Server、Netscape和iPlanet等Web服务器使用一个直接的模块接口(也叫做SAPI)连接PHP。如果PHP不能作为模块支持Web服务器,可以将其作为CGI或FastCGI处理器来使用,这意味着可以使用PHP的CGI可执行程序来处理所有服务器上的PHP文件请求。此处用到的LNMP平台的Nginx使用FastCGI处理器来处理PHP文件请求。

安装环境

操作系统:CentOS Linux release 7.6.1810 (Core)
Kernel版本:3.10.0-957.1.3.el7.x86_64
Nginx版本:nginx-1.14.2
MySQL版本:mysql-5.7.24

安装php所需的库

[admin@ityoudao ~]$ sudo yum install zlib-devel libxml2-devel libjpeg-turbo-devel libpng-devel gd-devel libcurl-devel systemd-devel

获取并解压php源代码

[admin@ityoudao ~]$ cd /u01/src
[admin@ityoudao src]$ wget http://cn2.php.net/distributions/php-7.3.0.tar.gz
[admin@ityoudao src]$ tar -zxf php-7.3.0.tar.gz 
[admin@ityoudao src]$ cd php-7.3.0

配置php

在此步骤可以使用很多选项自定义php,例如启用某些扩展等。可以使用./configure --help命令来获得完整的可用选项清单。

[admin@ityoudao php-7.3.0]# ./configure \
--prefix=/u01/app/php-7.3.0 \
--with-mysql-sock=/var/lib/mysqld/mysql.sock \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-curl \
--with-gd \
--enable-mbstring \
--enable-opcache \
--enable-fpm \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--with-fpm-systemd

遇到的问题和解决方法

error: Your system does not support systemd.

问题详情:

checking for sd_notify in -lsystemd-daemon... no
checking systemd/sd-daemon.h usability... no
checking systemd/sd-daemon.h presence... no
checking for systemd/sd-daemon.h... no
configure: error: Your system does not support systemd.

解决方法:

如果指定了“--with-fpm-systemd”参数,必须安装systemd-devel软件包。

[admin@ityoudao php-7.3.0]$ sudo yum install systemd-devel

构建php并安装

[admin@ityoudao php-7.3.0]$ make
[admin@ityoudao php-7.3.0]# make install
[admin@ityoudao php-7.3.0]$ cd /u01/app && ln -s php-7.3.0 php

创建配置文件

创建PHP配置文件,并将其复制到正确的位置。 1)PHP引擎配置文件php.ini:

[admin@ityoudao ~]$ cp /u01/src/php-7.3.0/php.ini-production /u01/app/php/lib/php.ini
[admin@ityoudao ~]$ vi /u01/app/php/lib/php.ini
...
cgi.fix_pathinfo=0
...
  • 将cgi.fix_pathinfo设置为0。如果文件不存在,则阻止Nginx将请求发送到后端的PHP-FPM模块,以避免遭受恶意脚本注入的攻击。

2)PHP服务配置文件php-fpm.conf和php-fpm.d/www.conf:

[admin@ityoudao ~]$ cd /u01/app/php/etc
[admin@ityoudao etc]$ ll
total 16
-rw-rw-r-- 1 admin admin 1276 Dec 15 17:19 pear.conf
-rw-r--r-- 1 admin admin 5397 Dec 15 17:19 php-fpm.conf.default
drwxrwxr-x 2 admin admin 4096 Dec 15 17:19 php-fpm.d
[admin@ityoudao etc]$ cp php-fpm.conf.default php-fpm.conf
[admin@ityoudao etc]$ cp php-fpm.d/www.conf.default php-fpm.d/www.conf
[admin@ityoudao etc]$ cat php-fpm.conf|grep -v "^$"|grep -v "^;"
[global]
include=/u01/app/php-7.3.0/etc/php-fpm.d/*.conf
[admin@ityoudao etc]$ cat php-fpm.d/www.conf|grep -v "^$"|grep -v "^;"
[www]
user = nginx
group = nginx
listen = 127.0.0.1:9000
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
  • 确保php-fpm模块使用nginx用户和nginx用户组的身份运行。

配置php-fpm服务开机启动并启动php-fpm

[admin@ityoudao ~]$ sudo cp /u01/src/php-7.3.0/sapi/fpm/php-fpm.service /usr/lib/systemd/system
[admin@ityoudao ~]$ cat /usr/lib/systemd/system/php-fpm.service 
# It's not recommended to modify this file in-place, because it
# will be overwritten during upgrades.  If you want to customize,
# the best way is to use the "systemctl edit" command.

[Unit]
Description=The PHP FastCGI Process Manager
After=network.target

[Service]
Type=notify
PIDFile=/u01/app/php-7.3.0/var/run/php-fpm.pid
ExecStart=/u01/app/php-7.3.0/sbin/php-fpm --nodaemonize --fpm-config /u01/app/php-7.3.0/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
[admin@ityoudao ~]$ sudo systemctl enable php-fpm.service
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.
[admin@ityoudao ~]$ sudo systemctl start php-fpm.service
[admin@ityoudao ~]$ sudo systemctl status php-fpm.service
● php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2018-12-15 18:55:43 CST; 5s ago
 Main PID: 24155 (php-fpm)
   Status: "Ready to handle connections"
   CGroup: /system.slice/php-fpm.service
           ├─24155 php-fpm: master process (/u01/app/php-7.3.0/etc/php-fpm.conf)
           ├─24156 php-fpm: pool www
           └─24157 php-fpm: pool www

Dec 15 18:55:43 ityoudao systemd[1]: Starting The PHP FastCGI Process Manager...
Dec 15 18:55:43 ityoudao systemd[1]: Started The PHP FastCGI Process Manager.

PHP安装成功之后可以使用:

  • php -v查看php版本;
  • php -m查看安装的模块;
  • php --ri <模块名>查看模块的信息

查看 PHP 模块

配置Nginx使其支持PHP应用

[admin@ityoudao ~]$ vi /u01/app/nginx/conf/nginx.conf
# 修改默认的location块,使其支持.php文件,其中“/u01/data/wordpress”是后文WordPress安装目录:
location / {
    root   /u01/data/wordpress;
    index  index.php index.html index.htm;
}
# 配置来保证对于.php文件的请求将被传送到后端的php-fpm模块,取消默认的PHP配置块的注释,并修改为下面的内容:
location ~* \.php$ {
    root            /u01/data/wordpress;
    fastcgi_index   index.php;
    fastcgi_pass    127.0.0.1:9000;
    include         fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
}
...
  • 注意:“location ~* .php$” 也必须指定$document_root变量,即 “root /u01/data/wordpress;”,否则打开php页面报 “No input file specified.” 错误。

最后重启Nginx服务:

[admin@ityoudao ~]$ sudo systemctl restart nginx.service
发表评论