Ubuntu 16.04 编译安装 PHP 7.2

  • 2019 年 11 月 24 日
  • 筆記

上一篇文章 Linux 下 Nginx + PHP 环境的配置 扯了那么多复杂的概念,现在让我来说一说怎么把它用在实践之中。

最近我也想重新把 VPS 重装一遍,恰逢 PHP 发布了最新的 PHP 7.2.0 版本 (2017年12月14日),所以就直接安装最新版本的 PHP 吧。

准备程序源码

直接到 PHP 官网: php.net 找到最新版的下载链接

在服务器找一个文件夹,用 wget 下载 PHP 的源码包:

wget http://am1.php.net/get/php-7.2.0.tar.gz/from/this/mirror -O php-7.2.0.tar.gz

解压备用:

tar -zxvf php-7.2.0.tar.gz

编译前的配置

一般来说,这种需要源码编译安装的软件,安装之前需要准备好编译环境以及程序需要依赖的库,以下是最最关键的实战经验。

首先我们准备编译环境,在 Ubuntu 16.04 LTS 中,默认并没有自带 C 和 C++ 的构建环境,我们安装一个叫 build-essential 的包即可,另外,PHP 还需要 bison re2cpkg-config 才能安装,我们可以直接通过 apt 安装它们:

sudo apt install build-essential bison re2c pkg-config -y

接下来需要准备 PHP-7.2.0 的依赖包,大部分我们都可以通过 apt 来安装,唯一有一点要注意的是,Ubuntu 16.04 LTS 镜像源的 libzip 版本太老了,我们需要手动下一个新版本,才能让 PHPzip 扩展支持加密的 zip 文件的操作。

安装依赖的命令:

sudo apt install build-essential bison re2c pkg-config libxml2-dev libbz2-dev libssl-dev libcurl4-openssl-dev libjpeg-dev libpng12-dev libfreetype6-dev libgmp-dev libreadline6-dev libxslt1-dev libzip-dev

如果没有用 PHP 来处理加密 zip 的需求的话,也可以直接用 apt 默认的 libzip 包,刚刚的命令已经带上了,想完美支持的话,我们需要到 libzip 的官网下一个,编译的时候另外指定:

wget https://libzip.org/download/libzip-1.3.2.tar.gz  tar -zxvf libzip-1.3.2.tar.gz

这时候的目录结构是这样的,假设我刚刚是在 ~ 目录进行刚刚所描述的操作:

~/libzip-1.3.2/  ~/php-7.2.0/

接下来就是最重要的运行 ./configure 生成 makefile 了,不多说,直接上我调整好的套路。如果没有下载源码的话,请将 --with-libzip=../libzip-1.3.2 替换成 --with-libzip (注意 之前一定有一个空格!)

./configure   --prefix=/usr/local/php   --with-config-file-path=/etc   --enable-fpm   --enable-inline-optimization   --disable-debug   --disable-rpath   --enable-shared    --with-libxml-dir   --with-xmlrpc   --with-mhash   --with-pcre-regex   --with-sqlite3   --with-zlib   --with-libzip=../libzip-1.3.2   --enable-bcmath   --with-iconv   --with-bz2   --with-openssl   --enable-calendar   --with-curl   --with-cdb   --enable-dom   --enable-exif   --enable-fileinfo   --enable-filter   --with-pcre-dir   --enable-ftp   --with-gd   --with-openssl-dir   --with-jpeg-dir   --with-png-dir   --with-zlib-dir   --with-freetype-dir   --enable-gd-jis-conv   --with-gettext   --with-gmp   --with-mhash   --enable-json   --enable-mbstring   --enable-mbregex   --enable-mbregex-backtrack   --with-libmbfl   --with-onig   --enable-pdo   --with-mysqli=mysqlnd   --with-pdo-mysql=mysqlnd   --with-pdo-sqlite   --with-readline   --enable-session   --enable-shmop   --enable-simplexml   --enable-sockets    --enable-sysvmsg   --enable-sysvsem   --enable-sysvshm   --enable-wddx   --with-libxml-dir   --with-xsl   --enable-zip   --enable-mysqlnd-compression-support   --with-pear   --enable-opcache

看到以下信息,这时候说明可以编译了,若出现了其它报错则需要一一排查:

Generating files  configure: creating ./config.status  creating main/internal_functions.c  creating main/internal_functions_cli.c  +--------------------------------------------------------------------+  | License:                                                           |  | This software is subject to the PHP License, available in this     |  | distribution in the file LICENSE.  By continuing this installation |  | process, you are bound by the terms of this license agreement.     |  | If you do not agree with the terms of this license, you must abort |  | the installation process at this point.                            |  +--------------------------------------------------------------------+    Thank you for using PHP.    config.status: creating php7.spec  config.status: creating main/build-defs.h  config.status: creating scripts/phpize  config.status: creating scripts/man1/phpize.1  config.status: creating scripts/php-config  config.status: creating scripts/man1/php-config.1  config.status: creating sapi/cli/php.1  config.status: creating sapi/fpm/php-fpm.conf  config.status: creating sapi/fpm/www.conf  config.status: creating sapi/fpm/init.d.php-fpm  config.status: creating sapi/fpm/php-fpm.service  config.status: creating sapi/fpm/php-fpm.8  config.status: creating sapi/fpm/status.html  config.status: creating sapi/cgi/php-cgi.1  config.status: creating ext/phar/phar.1  config.status: creating ext/phar/phar.phar.1  config.status: creating main/php_config.h  config.status: executing default commands

开始编译安装 PHP 7.2.0

首先进入 PHP 源码目录,然后一行命令,简单粗暴:

cd php-7.2.0/  make && sudo make install

成功后可以看到如下的信息:

Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/  Installing PHP CLI binary:        /usr/local/php/bin/  Installing PHP CLI man page:      /usr/local/php/php/man/man1/  Installing PHP FPM binary:        /usr/local/php/sbin/  Installing PHP FPM defconfig:     /usr/local/php/etc/  Installing PHP FPM man page:      /usr/local/php/php/man/man8/  Installing PHP FPM status page:   /usr/local/php/php/php/fpm/  Installing phpdbg binary:         /usr/local/php/bin/  Installing phpdbg man page:       /usr/local/php/php/man/man1/  Installing PHP CGI binary:        /usr/local/php/bin/  Installing PHP CGI man page:      /usr/local/php/php/man/man1/  Installing build environment:     /usr/local/php/lib/php/build/  Installing header files:          /usr/local/php/include/php/  Installing helper programs:       /usr/local/php/bin/    program: phpize    program: php-config  Installing man pages:             /usr/local/php/php/man/man1/    page: phpize.1    page: php-config.1  Installing PEAR environment:      /usr/local/php/lib/php/  [PEAR] Archive_Tar    - installed: 1.4.3  [PEAR] Console_Getopt - installed: 1.4.1  [PEAR] Structures_Graph- installed: 1.1.1  [PEAR] XML_Util       - installed: 1.4.2  [PEAR] PEAR           - installed: 1.10.5  Wrote PEAR system config file at: /usr/local/php/etc/pear.conf  You may want to add: /usr/local/php/lib/php to your php.ini include_path  /root/php-7.2.0/build/shtool install -c ext/phar/phar.phar /usr/local/php/bin  ln -s -f phar.phar /usr/local/php/bin/phar  Installing PDO headers:           /usr/local/php/include/php/ext/pdo/

到了这一步,PHP 已经安装在你的服务器上了。

配置 PHP

配置环境变量

要在命令行里面直接通过 php 之类的命令直接运行 php ,我们需要将 bin 目录加入到系统的环境变量中,方法是:

vim /etc/profile

在文件最末尾加上:

PATH=$PATH:/usr/local/php/bin  export PATH

保存以后,执行 source /etc/profile 使环境变量生效。

测试一下:

php -v

配置无误的话我们可以得到这样的输出

PHP 7.2.0 (cli) (built: Dec  4 2017 17:09:34) ( NTS )  Copyright (c) 1997-2017 The PHP Group  Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies

配置 PHP-FPM

增加 php-fpm 命令:

cp sapi/fpm/init.d.php-fpm /usr/local/bin/php-fpm  chmod +x /usr/local/bin/php-fpm

初始化 PHP 和 PHP-FPM 的配置

首先先把默认的配置拷贝一下:

cp php.ini-production /etc/php.ini  cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf

设置 PHP-FPM 执行的用户和用户组

网站的权限管控也是一个很关键的事情,虽然说问题发生的几率微乎其微,但是我们很难保证我们的程序一定不会翻车被人 getshell。所以,我们要确保 PHP-FPM 只能操作自己网站的文件,而不能访问其它地方,这样可以最大化地减小网站万一被黑带来的危害。

这里一个安全性比较好的策略是,所有关于网站的程序都运行在 website 组中,用 nginx 用户运行 nginx,在 PHP-FPM 中配置不同用户来运行不同的网站,建议在生产环境中这么配置。

程序

group

user

Nginx 服务器

website

nginx

Typecho 博客

website

site-1

另一个PHP网站

website

site-2

website

site-n

当然,如果你比较懒的话,也可以只配置一个 site 的用户和配置,然后各个网站共用一个 pool 也是可以的,这取决于你对安全性的追求。

首先我们得有这个 website 用户组,这里用 groupadd website 来创建。

然后再把相应的用户创建出来,并且禁用这个用户登录的 shell

useradd -s /sbin/nologin -g website site-1

再把你传到服务器上的网站目录的所有者和组改成 website:site-1 ,假设网站位于 /var/www/site-1,那就运行:

chown -R website:site-1 /var/www/site-1

然后再把文件权限改成 0755 ,它是一个八进制数,也就是 rwxr-xr-x ,只有自己才能写入,其它用户只有读取和执行的权限:

chmod -R 0755 /var/www/site-1

我们需要新建一个 php-fpmpool(也叫进程池) 配置,每次增加新的网站,我们都可以从默认的配置拷贝一份新的出来使用,如,我们这里拷贝一份 site-1.conf

cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/site-1.conf

然后打开文本编辑器编辑:

vim /usr/local/php/etc/php-fpm.d/site1.conf

忽略那些 ; 开头的注释,实际上我们需要改的只有这几行

; Start a new pool named 'www'.  ; the variable $pool can be used in any directive and will be replaced by the  ; pool name ('www' here)  [www]    user = nobody  group = nobody    listen = 127.0.0.1:9000

我们把 pool name 改一个名字,不同站点的名字不能一样,例如,我们可以把它改成 site-1 ,然后再修改一下 listen 的端口,保证不同的 pool 监听的连接不冲突,这是一个示例:

[site-1]    user = site-1  group = website    listen = 127.0.0.1:9000

保存以后,运行 php-fpm start 就能启动网站服务了,当配置有变动时,我们调用 php-fpm reload 即可让新配置生效。

设置开机自动启动 PHP-FPM

Ubuntu 16.04 LTS 是通过 systemd 管理服务的,所以服务可以按照如下方法设置:

vim /etc/systemd/system/php-fpm.service

内容我们这么写:

[Unit]  Description=The PHP FastCGI Process Manager  After=syslog.target network.target  [Service]  Type=forking  ExecStart=/usr/local/bin/php-fpm start  ExecReload=/usr/local/bin/php-fpm reload  ExecStop=/usr/local/bin/php-fpm stop  [Install]  WantedBy=multi-user.target

保存以后,设置开机自启:

systemctl enable php-fpm.service

安装配置 Nginx

安装 Nginx 有很多方法,一般用 sudo apt install nginx 装的 Nginx 就能满足要求。

首先修改 nginx.conf ,把 nginx 的运行用户和用户组改成

user nginx website;

然后修改 server 配置,假设原来的网站配置是下面的情况:

server {      listen 80;      server_name izgq.net;      root /var/www/site-1;  }

首先配置 index ,加入默认 index.php

index index.html index.php;

然后,在上篇文章 Linux 下 Nginx + PHP 环境的配置 选一个适合的配置,粘贴即可。

一个例子:

server {      listen 80;      server_name izgq.net;      root /var/www/site-1;      index index.html index.php;        location ~ .php$ {          try_files $uri =404;          fastcgi_pass 127.0.0.1:9000;          include fastcgi.conf;      }  }

保存好后,别忘记让 nginx 重新加载一下配置:

sudo service nginx reload

执行完这个操作,你的网站就已经部署好啦~

参考文章:

CentOS7重装之路-PHP7安装使用篇 · 麦麦小家