PHP的安装部署及nginx高速缓存
一、php源码编译
PHP是动态语言,先编译mysql还是php都可以。以前的版本都是先编译数据库,然后再编译php,因为以前版本的php在编译的时候需要mysql的开发库,现在新版本不需要,从php5.4开始用原生的mysqlnd驱动,mysqlnd驱动是php本身自带的。因为是php自带的原生驱动,相当于调用自己内部的变量,如果是plugin的方式,需要额外的内存开销,至少比原先节省40%的内存开销,而且性能更快。
源码编译安装
[root@server5 ~]# yum install -y bzip2
[root@server5 ~]# tar jxf php-7.4.12.tar.bz2
[root@server5 ~]# cd php-7.4.12
[root@server5 php-7.4.12]# ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --with-curl --with-iconv --with-mhash --with-zlib --with-openssl --enable-mysqlnd --with-mysqli --with-pdo-mysql --disable-debug --enable-sockets --enable-soap --enable-inline-optimization --enable-xml --enable-ftp --enable-gd --enable-exif --enable-mbstring --enable-bcmath --with-fpm-systemd
解决依赖性
[root@server5 php-7.4.12]# yum install -y systemd-devel.x86_64
[root@server5 php-7.4.12]# yum install -y libxml2-devel.x86_64
[root@server5 php-7.4.12]# yum install -y sqlite-devel.x86_64
[root@server5 php-7.4.12]# yum install -y libcurl-devel.x86_64
[root@server5 php-7.4.12]# yum install -y libpng-devel.x86_64
[root@server5 ~]# yum install -y oniguruma-6.8.2-1.el7.x86_64.rpm oniguruma-devel-6.8.2-1.el7.x86_64.rpm
上面这两个包可以去阿里云下载
确保系统没有安装其他版本的php,确定不要安装任何系统原有的php版本,当系统上共存多个版本时会容易报错,系统是允许多个版本共存的,比如python可以通过虚拟环境
安装bzip2解压软件,并解压安装包
fpm介绍
FPM(FastCGI Process Manager)是PHP FastCGI运行模式的一个进程管理器,从它的定义可以看出,FPM的核心功能是进程管理
apache是以cgi的方式调用的,是静态编译的没有后台程序,apache需要时调用开启一个进程,处理完之后关闭释放。而php的fastcgi模式会始终处于后台,cgi与fastcgi的最大区别是fastcgi有后台进程时重监听一个端口。
apache和php是动态编译的,Nginx是静态编译的,Nginx重新编译时需要将之前的所有参数都加上。在php中,前端需要的模块太多了,后续需要加模块的话,只需要编译这个模块就可以了
二、启动php,并于nginx整合
1.添加到环境变量
[root@server5 php]# vim ~/.bash_profile
PATH=$PATH:$HOME/bin:/usr/local/php
[root@server5 php]# source ~/.bash_profile
[root@server5 bin]# which php
2.修改配置文件,启动php
复制主程配置文件
[root@server5 etc]# pwd
/usr/local/php/etc
[root@server5 etc]# cp php-fpm.conf.default php-fpm.conf
修改配置文件
[root@server5 etc]# vim php-fpm.conf
复制配置文件
[root@server5 etc]# cd php-fpm.d/
[root@server5 php-fpm.d]# ls
www.conf.default
[root@server5 php-fpm.d]# cp www.conf.default www.con
复制源码路径下的生产环境,是php的主配置文件
[root@server5 php-fpm.d]# cd
[root@server5 ~]# cd php-7.4.12
[root@server5 php-7.4.12]# ls
[root@server5 php-7.4.12]# cp php.ini-production /usr/local/php/etc/php.ini
修改主配置文件,修改时区
[root@server5 ~]# cd /usr/local/php/etc/
[root@server5 etc]# vim php.ini
date.timezone = Asia/Shanghai
复制源码目录下的启动文件到/usr/lib/systemd/system/,并修改
[root@server5 fpm]# pwd
/root/php-7.4.12/sapi/fpm
[root@server5 fpm]# cp php-fpm.service /usr/lib/systemd/system/
[root@server5 fpm]# vim /usr/lib/systemd/system/php-fpm.service
#ProtectSystem=full 将该行注释
启动php
[root@server5 fpm]# systemctl start php-fpm
复制主程配置文件
修改配置文件
复制配置文件,此文件不修改内容
php-fpm.d是include目录,include目录:存放的调用系统资源的接口文件,进程是以动态的方式启动,监听9000端口
复制源码路径下的生产环境,是php的主配置文件,上面与fpm有关的是启动文件
修改主配置文件
复制源码目录下的启动文件到/usr/lib/systemd/system/,并修改
fpm介绍
FPM(FastCGI Process Manager)是PHP FastCGI运行模式的一个进程管理器,从它的定义可以看出,FPM的核心功能是进程管理
3.测试php:通过整合nginx
了解fastcgi.conf文件的作用
fastcgi.conf参数
测试
三、php功能模块的扩展
php添加memcache功能模块
软件下载地址,下载的源码
http://pecl.php.net/package/memcache
下载软件源码安装包
[root@server5 ~]# wget http://pecl.php.net/get/memcache-4.0.5.2.tgz
解压安装包
[root@server5 ~]# tar zxf memcache-4.0.5.2.tgz
执行命令,生成configure文件
[root@server5 ~]# cd memcache-4.0.5.2
[root@server5 memcache-4.0.5.2]# yum install -y autoconf
[root@server5 memcache-4.0.5.2]# phpize
编译
[root@server5 memcache-4.0.5.2]# ./configure --enable-memcache
[root@server5 memcache-4.0.5.2]# make
会找到php编译路径里边带的所有相应的开发包
[root@server5 memcache-4.0.5.2]# make install
修改配置文件声明memcache模块,使之生效
[root@server5 no-debug-non-zts-20190902]# cd /usr/local/php/etc/
[root@server5 etc]# ls
php-fpm.conf php-fpm.conf.default php-fpm.d php.ini
[root@server5 etc]# vim php.ini
extension=memcache
[root@server5 etc]# systemctl reload php-fpm
[root@server5 etc]# php -m | grep memcache
拷贝测试文件进行测试
[root@server5 ~]# cd
[root@server5 ~]# cd memcache-4.0.5.2
[root@server5 memcache-4.0.5.2]# cp example.php memcache.php /usr/local/nginx/html/
[root@server5 memcache-4.0.5.2]# cd /usr/local/nginx/html/
[root@server5 html]# ls
[root@server5 html]# vim memcache.php
define('ADMIN_USERNAME','admin'); // Admin Username
define('ADMIN_PASSWORD','westos'); // Admin Password
define('DATE_FORMAT','Y/m/d H:i:s');
define('GRAPH_SIZE',200);
define('MAX_ITEM_DUMP',50);
$MEMCACHE_SERVERS[] = '172.25.254.15:11211'; // add more as an array
#$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array
下载memcache守护进程,并开启服务
[root@server5 html]# yum install -y memcached
[root@server5 html]# systemctl start memcached
修改配置文件声明memcache模块,使之生效
拷贝测试文件,修改设置并进行测试
memcache.php页面
example.php页面
压力测试
处理机制:client ----> nginx:80 *.php ----->phpfpm:9000---->nginx---->client
一旦当nginx将请求交给phpfpm后,客户端在这个过程中是阻塞的,它要等phpfpm处理完之后返回nginx,最后交给客户端,这是一个反向代理机制。
四、Openresty构建nginx高速缓存
原生的nginx要做高速缓存,需要增加一些模块:memc-nginx和srcache-nginx模块,srcache模块可以控制多种缓存类型,memc只是其中一种。因为原生的nginx两个模块都没有,而openresty集成了nginx的各种模块。Openresty里面有nginx模块,也有缓存模块,所以要用高速缓存,可以通过Openresty里面的nginx实现。就不需要从网上下载额外的模块,再重新编译nginx使之生效,因为Openresty自带这些模块。Openresty就是用的原生的nginx而且还集成了很多常用的模块。
1.OpenResty简介
OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
OpenResty通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。
OpenResty 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。
OpenResty XRay 分析和解决 B 站重大线上事故
2.OpenResty的技术和优势
OpenResty技术:
Nginx: 一个免费的、开源的、高性能的 HTTP 服务器和反向代理,也是一个电子邮件(IMAP/POP3/SMTP)代理服务器。有关Nginx的介绍,可以查看这篇《Nginx架构原理科普》。
Lua: 一种轻量、小巧、可移植、快速的脚本语言;LuaJIT即时编译器会将频繁执行的Lua代码编译成本地机器码交给CPU直接执行,执行效率更高,OpenResty会默认启用LuaJIT。
OpenResty优势:
首先我们选择使用OpenResty,是因为Openresty是由Nginx核心加很多第三方模块组成,其最大的亮点是默认集成了Lua开发环境,使得Nginx可以作为一个Web Server使用。
借助于Nginx的事件驱动模型和非阻塞IO,可以实现高性能的Web应用程序。
而且OpenResty提供了大量组件如Mysql、Redis、Memcached等等,使在Nginx上开发Web应用更方便更简单。目前在京东如实时价格、秒杀、动态服务、单品页、列表页等都在使用Nginx+Lua架构,其他公司如淘宝、去哪儿网等。
3.传统Nginx缓存与高速缓存策略对比
从上面的实验可以看到,给php加了memcache缓存后,虽然请求没有报错,但是处理速度没有增加。所以想利用nginx高并发特性,增加请求处理速度。
上面一部分做的是传统的缓存策略,但是该策略请求处理速度不高。
使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制
传统缓存策略图
传统缓存策略下,当nginx将php请求交给后端php请求的时候,这个生命周期就无法管控了,把数据管控放到nginx,nginx也支持数据缓存(可以做cdn)。如果想让nginx完全把握整个生命周期,缓存需要前移。
&emsp传统缓存策略给php增加了memcaceh缓存后,请求没有报错了,但是整体nginx吞吐量没有上来,因为nginx把php请求交给php后端后,客户端处于与nginx处于阻塞状态,想要达到高速,需要将nginx前置放到nginx,由nginx去取,后端php同时可以加memcache缓存。nginx也可以做cdn。
高效缓存策略图
>nginx中可以将lua嵌入,让nginx执行lua脚本,可以处理高并发,非阻塞的处理各种请求,openresty项目中可以使用nignx直接构建 srcache+nginx 缓存,而不用通过动态语言来处理。
以下为srcache+nginx的工作流程图
请求时,nginx先看一下本地memcache缓存中有没有,没有命中时,再发给后端处理,去源站取数据,取完数据后返回,再在本地memcache中存一份。
4.使用openresty构建高速缓存机制
下载安装软件包
解压安装软件包
编译
默认会将常用的模块编译进去,直接编译就行。默认安装路径不会覆盖原来的nginx,但是都监听80端口,所以需要先将原生的nginx停掉,再开启Openresty。
安装
关闭原生nginx,并配置Openresty下的nginx配置文件,与原生nginx配置保持一样
启动服务
复制发布页面
修改配置文件,给nginx添加缓冲。
有多个缓冲时用负载均衡就可以
memcache是kv引擎,与传统型关系型数据库不一样,是nosql,非关系型数据库可以免维护,到期失效,关系型数据库需要delete
upstream memcache {
server 127.0.0.1:11211;
keepalive 512; #打开512个持续连接,不会迅速关闭
}
location /memc {
internal;
memc_connect_timeout 100ms;
memc_send_timeout 100ms;
memc_read_timeout 100ms;
set $memc_key $query_string;#调用自己的变量
set $memc_exptime 300;
memc_pass memcache;
}
当所请求的uri以“.php”结尾时,首先到memcache中查询有没有以$uri$args为key的数据,如果有则直接返回;否则,执行location的逻辑,如果返回的http状态码为200,则在输出前以$uri$args为key,将输入结果存入memcache
重新加载配置
客户端测试
处理速度加快,没有让请求往后端走,因为在nginx缓存中就拿到了。后端php加速和nginx缓存加速可以一块用,起到双重加速的效果。
复制其他页面进行测试