一、安装依赖包。
[root@study ~]# yum -y install gcc gcc++ gcc-c++ wget make libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng-devel freetype-devel bison autoconf
二、创建用户组php-fpm,创建用户 php-fpm 所属组 php-fpm 设置不能登录。
[root@study ~]#groupadd -r php-fpm && useradd -r -g php-fpm -s /sbin/nologin -d /usr/local/php -M php-fpm
参数解释:
>创建php用户组(-r选项是创建一个系统用户组的意思)
> 添加新用户
> -r: 添加系统用户( 这里指将要被创建的系统用户php )
> -g: 指定要创建的用户所属组( 这里指添加到新系统用户php到php系统用户组 )
> -s: 新帐户的登录shell( `/sbin/nologin` 这里设置为将要被创建系统用户php不能用来登录系统 )
> -d: 新帐户的主目录( 这里指定将要被创建的系统用户php的家目录为 `/usr/local/php` )
> -M: 不要创建用户的主目录( 也就是说将要被创建的系统用户php不会在 `/home` 目录下创建 `php` 家目录 )
三、下载依赖安装包
源码包放在/usr/local/src 目录。我的软件安装目录统一指定在 /usr/local/'软件名'(如:/usr/local/nginx、/usr/local/mysql)
1、 下载PHP语法分析器re2c
[root@study src]#wget -c https://github.com/skvadrik/re2c/releases/download/0.16/re2c-0.16.tar.gz
#进入解压后的源码目录编译并安装
[root@study src]#tar -zxvf re2c-0.16.tar.gz
[root@study src]# cd re2c-0.16
[root@study re2c-0.16]# ./configure
[root@study re2c-0.16]# make && make install
2、 加密支持扩展库libmcrypt (使用php mcrypt 前必须先安装Libmcrypt)
[root@study src]# wget -c https://sourceforge.net/projects/mcrypt/files/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz
# 进入解压后的源码目录编译并安装
[root@study src]# tar -zxvf libmcrypt-2.5.8.tar.gz
[root@study src]# cd libmcrypt-2.5.8
[root@ study libmcrypt-2.5.8]# ./configure
[root@ study libmcrypt-2.5.8]# make && make install
3、 加密方式扩展库mhash
[root@study src]# wget -c https://downloads.sourceforge.net/project/mhash/mhash/0.9.9.9/mhash-0.9.9.9.tar.gz
# 进入解压后的源码目录编译并安装
[root@ study src ]# tar -zxvf mhash-0.9.9.9.tar.gz
[root@study src]# cd mhash-0.9.9.9
[root@ study mhash-0.9.9.9]# ./configure
[root@ study mhash-0.9.9.9]# make && make install
4、加密方式扩展库mcrypt
[root@study src]# wget -c https://sourceforge.net/projects/mcrypt/files/MCrypt/2.6.8/mcrypt-2.6.8.tar.gz
# 进入解压后的源码目录编译并安装
[root@ study src ]# tar -zxvfmcrypt-2.6.8.tar.gz
[root@study src]# cd mcrypt-2.6.8
#由于在编译mcrypt时,会找不到libmcrypt的链接库,导致无法编译,因为Libmcrypt的链接库在/usr/local/lib文件夹下> 所以,在编译mcrypt时要加入LD_LIBRARY_PATH=/usr/local/lib导入间接库
[root@ study mcrypt-2.6.8]# ./configure LD_LIBRARY_PATH=/usr/local/lib
[root@ study mcrypt-2.6.8]# make && make install
四、下载php,编译安装
1、下载php、解压
[root@study src]# wget -c https://github.com/php/php-src/archive/php-7.1.20.tar.gz
[root@ study src ]# tar -zxvf php-7.1.20.tar.gz
[root@study src]# cd php-7.1.20
2、生成php源码目录下的配置文件 configure
[root@study php-7.1.20]# ./buildconf --force
3、正式编译php7.1(如果使用此编译选项列表, 请将 \ 反斜线后面的注释去除, 并且后面不能有空白字符)
[root@study php-7.1.20]#./configure \--prefix=/usr/local/php \ [php安装的根目录]--exec-prefix=/usr/local/php \ [php执行文件所在目录]--bindir=/usr/local/php/bin \ [php/bin目录]--sbindir=/usr/local/php/sbin \ [php/sbin目录]--includedir=/usr/local/php/include \ [php包含文件所在目录]--libdir=/usr/local/php/lib/php \ [php/lib目录]--mandir=/usr/local/php/php/man \ [php/man目录]--with-config-file-path=/usr/local/php/etc \ [php的配置目录]--with-mysql-sock=/var/run/mysql/mysql.sock \ [php的Unix socket通信文件]--with-mcrypt \ [是php里面重要的加密支持扩展库,linux环境下该库在默认情况下不开启]--with-mhash \ [Mhash是基于离散数学原理的不可逆向的php加密方式扩展库,其在默认情况下不开启]--with-openssl \ [OpenSSL 是一个安全套接字层密码库]--with-mysqli=shared,mysqlnd \ [php依赖mysql库]--with-pdo-mysql=shared,mysqlnd \ [php依赖mysql库]--with-gd \ [gd库] --with-iconv \ [关闭iconv函数,种字符集间的转换] --with-zlib \ [zlib是提供数据压缩用的函式库]--enable-zip \ [打开对zip的支持]--enable-inline-optimization \ [优化线程]--disable-debug \ [关闭调试模式]--disable-rpath \ [关闭额外的运行库文件]--enable-shared \ [启用动态库]--enable-xml \ [开启xml扩展]--enable-bcmath \ [打开图片大小调整,用到zabbix监控的时候用到了这个模块]--enable-shmop \ [共享内存]--enable-sysvsem \ [内存共享方案]--enable-mbregex \ [开启多字节正则表达式的字符编码。]--enable-mbstring \ [开启多字节字符串函数]--enable-ftp \ [开启ftp]--enable-gd-native-ttf \ [开启gd库原有字体]--enable-pcntl \ [PHP的进程控制支持实现了Unix方式的多进程创建] --enable-sockets \ [开启套节字]--with-xmlrpc \ [打开xml-rpc的c语言]--enable-soap \ [开启简单对象访问协议简单对象访问协议]--without-pear \ [开启php扩展与应用库]--with-gettext \ [开户php在当前域中查找消息]--enable-session \ [允许php会话session]--with-curl \ [允许curl扩展]--with-jpeg-dir \ [指定jpeg安装目录yum安装过后不用再次指定会自动找到]--with-freetype-dir \ [指定freetype安装目录yum安装过后不用再次指定会自动找到]--enable-opcache \ [开启使用opcache缓存]--enable-fpm \ [开启fpm]--with-fpm-user=nginx \ [php-fpm的用户]--with-fpm-group=nginx \ [php-fpm的用户组]--without-gdbm \ [数据库函数使用可扩展散列和类似于标准UNIX dbm的工作]--enable-fast-install \ [为快速安装优化]--disable-fileinfo
4、可能会出现要求开启 --enable-opcache=on 的错误提示
configure: error: Don't know how to define struct flock on this system, set --enable-opcache=no
解决办法,编辑/etc/ld.so.conf
加入/usr/local/lib
执行ldconfig,使其重新加载一次
5、如果没有错误。
[root@study php-7.1.20]#make && make install
没有错误,则表示编译安装完成。
可以查看php版本
[root@study php-7.1.20]#/usr/local/php/bin/php -v
五、配置php
1、修改php配置文件之-》添加php配置文件。将php源码编译目录下的 `php.ini-production` 拷贝到php安装目录下的 `etc` 目录下
[root@study php-7.1.20]# cp php.ini-production /usr/local/php/etc/php.ini
2、修改php配置文件之-》
[root@ study php-7.1.20]# vim /usr/local/php/etc/php.ini
a、修改php扩展目录所在位置 ,找到 `extension_dir` 修改扩展目录位置如下:
extension_dir = "../lib/php/extensions/no-debug-non-zts-20160303/" # `相对路径`
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/" #`绝对路径
b、修改时区,找到 `timezone` 修改时区如下:
date.timezone = PRC
c、开启OPcache,开启OPcache
文件的最后一行(shift+G), 输入以下内容:zend_extension=opcache.so;
d、开启 mysqli 扩展
; For UNIX OS open mysqli extension
extension=mysqli.so
extension=pdo_mysql.so
六、配置php-fpm
1、添加 php-fpm 管理相关的配置文件到系统配置目录 /etc/init.d
将php源码编译目录下的 `sapi/fpm/init.d.php-fpm` 文件拷贝到系统配置 `/etc/init.d` 目录下并重命名为 `php-fpm`
[root@ study php-7.1.20]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
2、添加 php-fpm 配置文件
将php安装目录下的 `/usr/local/php/etc/php-fpm.conf.default` 文件拷贝同目录下并重命名为 `php-fpm.conf`
[root@ study php-7.1.20]# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
3、添加 www.conf 配置文件
将php安装目录下的 `/usr/local/php/etc/php-fpm.d/www.conf.default` 文件拷贝同目录下并重命名为 `www.conf`
[root@study php-7.1.20]# cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
七、添加php安装目录到系统环境变量
创建并打开文件php.sh
[root@study php-7.1.20]# vim /etc/profile.d/php.sh
添加内容如下:export PATH=$PATH:/usr/local/php/bin/:/usr/local/php/sbin/
保存并退出
[root@ study php-7.1.20]# wq!
使用source立即生效刚刚添加的php环境变量
[root@ study php-src-php-7.1.20]#source /etc/profile.d/php.sh
八、设置PHP日志目录和php-fpm运行进程的ID文件目录
1、 添加系统用户组nginx (如果你没有创建过系统用户组nginx请创建)
[root@study php-7.1.20]# groupadd -r nginx
2、 创建新的系统用户nginx, 并添加到系统用户组nginx, 设置不允许此用户名登录shell (如果你没有创建过系统用户nginx请创建)
[root@study php-7.1.20]# useradd -r -g nginx -s /sbin/nologin -d /usr/local/nginx -M nginx
3、 创建 `php-fpm` 日志目录
[root@study php-7.1.20]# mkdir -p /var/log/php-fpm/
4、 创建 `php-fpm` 进程的ID(php-fpm.sock)文件运行目录
[root@study php-7.1.20]# mkdir -p /var/run/php-fpm
5、 修改 `php-fpm` 进程的ID(php-fpm.sock)文件运行目录的所属用户和组
[root@study php-7.1.20]# chown -R nginx:nginx /var/run/php-fpm/
九、修改session的目录配置
1、创建 `session` 存放目录
[root@study php-7.1.20]# mkdir -p /var/lib/php/session
2、修改 `session` 存放目录的所属用户和组
[root@study php-7.1.20]# chown -R nginx:nginx /var/lib/php
3、再次修改 `php.ini` 文件
[root@study php-7.1.20]# vim /usr/local/php/etc/php.ini
修改session.save_path = "/var/lib/php/session"
十、php-fpm加入启动服务,设置开机启动
[root@study php-7.1.20]#cp ./sapi/fpm/php-fpm.service /usr/lib/systemd/system/
[root@study php-7.1.20]#systemctl enable php-fpm
systemctl start php-fpm #启动php-fpm
systemctl status php-fpm #查看php-fpm状态
十一、修改nginx配置文件使之使用nginx反向php解释器
修改nginx.conf配置文件, /usr/local/nginx/conf/nginx.conf
# nginx运行的用户名
user nginx;
# nginx启动进程,通常设置成和cpu的数量相等,这里为自动
worker_processes 1;
# errorlog文件位置
error_log /usr/local/nginx/logs/error.log;
# pid文件地址,记录了nginx的pid,方便进程管理
pid /usr/local/nginx/logs/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
# 用来加载其他动态模块的配置(暂时不清楚)
# include /usr/share/nginx/modules/*.conf;
# 工作模式和连接数上限
events {
# 每个worker_processes的最大并发链接数
# 并发总数:worker_processes*worker_connections
worker_connections 1024;
}
# 与提供http服务相关的一些配置参数类似的还有mail
http {
# 设置日志的格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# access_log记录访问的用户、页面、浏览器、ip和其他的访问信息
access_log /usr/local/nginx/logs/access.log main;
# 这部分下面会单独解释
# 设置nginx是否使用sendfile函数输出文件
sendfile on;
# 数据包最大时发包(使用Nagle算法)
tcp_nopush on;
# 立刻发送数据包(禁用Nagle算法)
tcp_nodelay on;
# 链接超时时间
keepalive_timeout 60;
# 这个我也不清楚...
#types_hash_max_size 2048;
# 引入文件扩展名与文件类型映射表
include /usr/local/nginx/conf/mime.types;
# 默认文件类型
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /usr/local/nginx/conf/vhost/*.conf;
}