目录
1 源码编译PHP与NGINX
1.1 NGINX 源码编译
1.2 PHP 源码编译安装
2 实现PHP与NGINX的连接
2.1 php-fpm的详细介绍
2.2 LNMP与LAMP的区别
2.3 PHP配置文件的介绍
2.4 实例实现php-fpm 与 NGINX的连接
2.4.1 指定pid的存放位置
2.4.2 php-fpm设置监听自己端口与IP
2.4.3 主配置文件中设置所在时区
2.4.4 设置 php-fpm 的服务(systemd)
2.4.5 fastcgi.conf 的介绍
2.4.6 设置NGINX与php-fpm的连接
3 php的动态扩展模块(php的缓存模块)
3.1 memcache的介绍与支持模块的获取
3.2 源码编译memcache模块
3.3 使用php内置脚本生成configure环境检测脚本
3.4 memcache模块的编译安装
4 部署 memcached 缓存数据库提高LNMP性能
4.1 复制测试文件到nginx发布目录中并修改
4.2 部署memcached
4.3 浏览器访问memcache.php
4.4 实现php的高速缓存
4.5 变量定义的区别
4.6 客户端测试
1 源码编译PHP与NGINX
随着 Nginx Web 服务的逐渐流行, 又岀现了新的 Web 服务环境组合—LNMP 或 LEMP, 其中 LNMP 为 Linux 、 Nginx , MySQL、PHP 等首字母的缩写, 而 LEMP 中的 E 则表示 Nginx, 它 取 自 Nginx 名 字 的 发 音( engine X )。 现在, LNMP 已经逐渐成为国内大中型互联网公司网站的主流组合环境, 因此, 我们必须熟练掌握 LNMP 环境的搭建、 优化及维护方法。
LNMP组合工作流程
当 LNMP 组合工作时, 首先是用户通过浏览器输人域名请求 Nginx Web 服务, 如果请求是静态资源, 则由 Nginx 解析返回给用户; 如果是动态请求( .php 结尾 ), 那么Nginx 就会把它通过 FastCGI 接口( 生产常用方法) 发送给 PHP 引擎服务( FastCGI 进程php-fpm ) 进行解析, 如果这个动态请求要读取数据库数据, 那么 PHP 就会继续向后请求 MySQL 数据库, 以读取需要的数据, 并最终通过 Nginx 服务把获取的数据返回给用户, 这就是 LNMP 环境的基本请求顺序流程
CGI协议虽然解决了语言解析器和 Web Server 之间通讯的问题,但是它的效率很低,因为 Web Server每收到一个请求都会创建一个CGI进程,PHP解析器都会解析php.ini文件,初始化环境,请求结束的时候再关闭进程,对于每一个创建的CGI进程都会执行这些操作,所以效率很低,而FastCGl是用来提高CGI性能的,FastCGl每次处理完请求之后不会关闭掉进程,而是保留这个进程,使这个进程可以处理多个请求。这样的话每个请求都不用再重新创建一个进程了,大大提升了处理效率。
什么是PHP-FPM?
PHP-FPM FastCGl Process Manager
- FastCGl进程管理器)是一个实现了Fastcgi的程序,并且提供进程管理的功能
- 进程包括master进程和worker进程。master进程只有一个,负责监听端口,接受来自webserver的请求
- worker进程一般会有多个,每个进程中会嵌入一个PHP解析器,进行PHP代码的处理
指令 | 描述 |
---|---|
fastcgi_pass address:port; | 转发请求到后端服务器,address为后端的fastcgi server的地址,可用位置:location, if in location |
fastcgi_index name; | fastcgi默认的主页资源,示例:fastcgi_index index.php; |
fastcgi_param parameter value [if_not_empty]; | 设置传送给FastCGI服务器的参数值,可以是文本,变量或组合,可用于将Nginx的内置变量赋值给自定义key |
1.1 NGINX 源码编译
由于原先的原先已经编译过NGINX了,所以需要删掉之前的编译文件
检查环境是否适合安装
# 删除之前编译过的 重新编译
[root@NGINX nginx-1.26.1]# make clean
rm -rf Makefile objs
[root@NGINX nginx-1.26.1]# ./configure --prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--add-module=/usr/local/src/memc-nginx-module-0.20 \
# Memcached 缓存模块,用于让 Nginx 通过 Memcached 存储和检索缓存数据。
# 这样可以让 Nginx 更高效地处理动态内容,减少对后端应用服务器的压力。
--add-module=/usr/local/src/echo-nginx-module-0.63 \
# Echo 模块提供了一些实用的输出过滤器和变量,主要用于测试和调试目的。
# 它可以用来实现一些高级的输出控制功能,如输出缓冲区管理和异步 I/O。
--add-module=/usr/local/src/srcache-nginx-module-0.33
# 简单的缓存模块,它能够将请求的结果存储在一个中间缓存服务器(如 memcached 或 Redis)中,
# 以便下次相同的请求可以直接从缓存中读取,从而提高性能
编译NGINX生成模块与二进制文件 -- 不需要安装 (make install)
[root@NGINX nginx-1.26.1]# make
make -f objs/Makefile
make[1]: 进入目录“/usr/local/src/nginx-1.26.1”
编译后会在objs下生成一个nginx文件,他是整个nginx的核心,将他移动到原先nginx的sbin目录下做替换
[root@NGINX nginx-1.26.1]# cd objs/
[root@NGINX objs]# ls
addon nginx ngx_auto_headers.h src
autoconf.err nginx.8 ngx_modules.c
Makefile ngx_auto_config.h ngx_modules.o
[root@NGINX objs]# ls /usr/local/nginx/sbin
nginx nginx.old
[root@NGINX objs]# cp -a nginx /usr/local/nginx/sbin/nginx.new
[root@NGINX objs]# cd /usr/local/nginx/sbin/
[root@NGINX sbin]# ls
nginx nginx.new nginx.old
[root@NGINX sbin]# mv nginx nginx_1.26
[root@NGINX sbin]# mv nginx.new nginx
# 检查模块是否添加
[root@NGINX sbin]# nginx -V
nginx version: nginx/1.26.1
built by gcc 11.4.1 20231218 (Red Hat 11.4.1-3) (GCC)
built with OpenSSL 3.0.7 1 Nov 2022
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_gzip_static_module --with-http_stub_status_module --with-pcre --with-stream --with-stream_ssl_module --add-module=/usr/local/src/memc-nginx-module-0.20 --add-module=/usr/local/src/echo-nginx-module-0.63 --add-module=/usr/local/src/srcache-nginx-module-0.33
1.2 PHP 源码编译安装
[root@NGINX php-8.3.9]# ./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-xml \
--enable-ftp \
--with-fpm-systemd \
以下是解释
./configure \
--prefix=/usr/local/php \ # 安装路径
--with-config-file-path=/usr/local/php/etc \ # 指定配置路径
--enable-fpm \ # 用CGI方式启动程序
--with-fpm-user=nginx \ # 指定运行用户身份
--with-fpm-group=nginx \
--with-curl \ # 打开curl浏览器支持
--with-iconv \ # 启用iconv函数,转换字符编码
--with-mhash \ # mhash加密方式扩展库
--with-zlib \ # 支持zlib库,用于压缩http压缩传输
--with-openssl \ # 支持ssl加密
--enable-mysqlnd \ # mysql数据库
--with-mysqli \ #
--with-pdo-mysql \ # 关闭debug功能
--disable-debug \ # 支持套接字访问
--enable-sockets \ # 支持soap扩展协议
--enable-xml \ # 支持xml
--enable-ftp \ # 支持gd库
--enable-gd \ # 支持图片元数据
--enable-exif \ # 支持多字节字符串
--enable-mbstring \ # 打开图片大小调整,用到zabbix监控的时候用了这个模块
--enable-bcmath \ # 支持systemctl管理cgi
--with-fpm-systemd \
在编译的结尾出现了错误
解决方法,寻找包安装他
再次进行编译
[root@NGINX php-8.3.9]# ./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-xml \
--enable-ftp \
--with-fpm-systemd \
再次测试环境
[root@NGINX php-8.3.9]# ./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-xml \
--enable-ftp \
--with-fpm-systemd \
继续测试环境
[root@NGINX php-8.3.9]# ./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-xml \
--enable-ftp \
--with-fpm-systemd \
继续测试环境
[root@NGINX php-8.3.9]# ./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-xml \
--enable-ftp \
--with-fpm-systemd \
继续测试
[root@NGINX php-8.3.9]# ./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-xml \
--enable-ftp \
--with-fpm-systemd \
解决方案
[root@NGINX php-8.3.9]# yum install https://mirrors.aliyun.com/rockylinux/9.4/CRB/x86_64/kickstart/Packages/o/oniguruma-devel-6.9.6-1.el9.5.0.1.x86_64.rpm
再次测试环境
[root@NGINX php-8.3.9]# ./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-xml \
--enable-ftp \
--with-fpm-systemd \
环境检测成功!
接下来进行PHP的make编译并安装
[root@NGINX php-8.3.9]# make && make install
已经安装成功
2 实现PHP与NGINX的连接
2.1 php-fpm的详细介绍
PHP-FPM (FastCGI Process Manager) 是一种管理 PHP FastCGI协议 进程的程序,它可以更有效地运行 PHP 应用程序。PHP-FPM 提供了一个更好的方式来管理和调整 PHP FastCGI 进程,包括启动、停止和重启进程,以及监控性能。
对于 Nginx 来说,PHP-FPM 提供了一个稳定的接口来处理 PHP 请求。Nginx 通过 FastCGI 协议将 PHP 请求转发给 PHP-FPM,后者负责解析请求并生成响应。这种架构使得 Nginx 能够专注于静态文件处理和反向代理,而 PHP-FPM 则专注于处理 PHP 请求,提高了整体性能和稳定性。
2.2 LNMP与LAMP的区别
在apache中PHP下载之后就可以直接使用,这是因为他原本就拥有一个PHP模块
但在NGINX中不一样PHP与NGINX是两个截然不一样的服务。但又有人想要将他们串起来使用
于是就诞生了php-fpm
功能 | LNMP | LAMP |
使用的网站服务不同 | Nginx | Apache |
PHP作用不同 | 在LAMP中PHP是当作Apache的一个模块来使用 | LNMP中PHP是当作一个独立进程来使用的(即PHP_FPM) |
2.3 PHP配置文件的介绍
实现PHP与NGINX连接的大致操作(详细操作往下滑)
php有三个配置文件:
php.ini 主配置文件
php-fpm.conf 进程服务配置文件
www.conf 扩展配置文件 --专门给web浏览器提供接口的文件
[root@PHP etc]# tree
.
├── php-fpm.conf
├── php-fpm.conf.default
├── php-fpm.d
│ ├── www.conf
│ └── www.conf.default
└── php.ini
1、其中 php.ini 在解压的压缩包中 /usr/local/src/php-8.3.9/php.ini-development
cp -p /usr/local/src/php-8.3.9/php.ini-development /usr/local/php/etc/php.ini
vim php.ini
date.timezone = Asia/Shanghai # 修改时区
2、php-fpm.conf 在已经编译好的php中 的etc下 --示例文件
ls /usr/local/php/etc/
php-fpm.conf.default php-fpm.d php.ini
cp -p php-fpm.conf.default php-fpm.conf
vim php-fpm.conf
pid = run/php-fpm.pid
3、www.conf 在意见编译好的php中etc/php-fpm.d/ 下
ls /usr/local/php/etc/php-fpm.d/ --示例文件
www.conf.default
cp -p www.conf.default www.conf
vim php-fpm.d/www.conf
listen = 192.168.239.100:9000 # 也可以填0.0.0.0
php -m #验证安装的模块
PHP配置文件大致介绍
php-fpm.conf ######################################################################
示例
# pid = run/php-fpm.pid
# error_log = log/php-fpm.log
PHP-FPM 的主配置文件,其中包含了 PHP-FPM 服务的全局配置选项。
这些选项控制着 PHP-FPM 的整体行为,包括监听地址、PID 文件位置、日志文件位置等
php-fpm.d ######################################################################
这是一个目录,包含了一个或多个 .conf 文件,每个文件都可以定义一个或多个 pool。
这些 pool 用于配置不同的 PHP-FPM 进程组,通常用于不同的用途或网站。
例如,www.conf 通常用于配置处理 Web 请求的进程池。
www.conf ######################################################################
示例
# 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.d 目录下的配置文件,专门用于配置处理 Web 请求的 PHP-FPM 进程池。
它通常包含了许多针对 Web 请求的特定配置选项,例如进程数量、最大请求数、超时设置等。
php.ini ######################################################################
# date.timezone = Asia/Shanghai
# error_reporting = E_ALL
# display_errors = Off
# log_errors = On
# 扩展模块
extension=memcache
# 如果扩展文件不在默认的扩展目录中,需要在 php.ini 文件中指定正确的扩展目录
extension_dir = "/path/to/extension/directory"
extension=memcached.so
这是 PHP 的主配置文件,它包含了 PHP 的运行时配置选项。
这些配置项控制着 PHP 脚本的行为,例如错误处理、内存限制、上传文件大小限制等。
bin 目录
├── bin # 包含 PHP 的执行文件和工具
│ ├── phar -> phar.phar # 符号链接到 phar.phar,用于处理 PHAR (PHP Archive) 文件
│ ├── phar.phar # PHAR 执行文件
│ ├── php # PHP 的命令行界面(CLI)版本
│ ├── php-cgi # PHP 的 CGI 版本
│ ├── php-config # 用于查询 PHP 配置信息的工具
│ ├── phpdbg # PHP 的调试器
│ └── phpize # 用于准备 PHP 扩展模块构建环境的脚本
sbin 目录
├── sbin # 包含 PHP-FPM 的服务守护进程
│ └── php-fpm # PHP-FPM 的服务守护进程
PHP源码安装各个目录的作用
bin 目录包含了 PHP 的执行文件和工具。
etc 目录包含了 PHP 和 PHP-FPM 的配置文件。
include 目录包含了 PHP 的头文件。
lib 目录包含了 PHP 的库文件和扩展。
php 目录包含了 PHP 的源码和手册页面。
sbin 目录包含了 PHP-FPM 的服务守护进程。
var 目录包含了 PHP-FPM 的运行时文件和日志文件。
2.4 实例实现php-fpm 与 NGINX的连接
PHP端:
指定pid存放位置 -- php-fpm.conf
service文件的使用 -- php-fpm.service
监听自己IP与端口处理web服务器的请求 -- www.conf
设置所在时区 -- php.ini --> 拷贝源码包中的php.ini-production
NGINX端:
设置PHP端的IP与端口做为链接(其实是php-fpm)
2.4.1 指定pid的存放位置
[root@NGINX etc]# vim /usr/local/php/etc/php-fpm.conf
2.4.2 php-fpm设置监听自己端口与IP
IP设置为 0.0.0.0 即所有人访问
此处为listen 监听自己的IP与端口
注意:NGINX 上 fastcgi_pass 参数填的为PHP服务器的IP和端口
[root@NGINX php-fpm.d]# mv www.conf.default www.conf
[root@NGINX etc]# vim /usr/local/php/etc/php-fpm.d/www.conf
2.4.3 主配置文件中设置所在时区
查看编译过后的php安装包内文件
php.ini-production
是 PHP 的配置文件之一,通常用于生产环境。它包含了一系列默认设置,旨在优化 PHP 性能和安全性,使其更适合在生产环境中运行。这些设置可能包括限制内存消耗、禁用不必要的扩展等。
设置所在时区
将此文件拷贝一份到php的etc目录下面
cp -p /usr/local/src/php-8.3.9/php.ini-production /usr/local/php/etc/php.ini
[root@PHP ~]# vim /usr/local/php/etc/php.ini
# 设置时区
date.timezone = Asia/Shanghai
2.4.4 设置 php-fpm 的服务(systemd)
php-fpm.service 是编译之后官方提供的服务文件
[root@NGINX fpm]# cp -p /usr/local/src/php-8.3.9/sapi/fpm/php-fpm.service /lib/systemd/system/
[root@NGINX fpm]# vim /lib/systemd/system/php-fpm.service
重启php服务
[root@NGINX conf.d]# systemctl restart php-fpm.service
# 查看监听端口
[root@NGINX php-fpm.d]# netstat -tunlpt | grep php
tcp 0 0 0.0.0.0:9000 0.0.0.0:* LISTEN 175854/php-fpm: mas
查看服务状态
2.4.5 fastcgi.conf 的介绍
fastcgi.conf
是一个 Nginx 的配置文件,用于配置 FastCGI 协议相关的设置。FastCGI 是一种常驻型的通用网关接口,用于提高 Web 服务器性能。它允许外部进程(如 PHP-FPM)处理动态内容请求,而不是像 CGI 那样每次请求都需要启动一个新的进程
[root@NGINX conf]# vim fastcgi.conf
没有他NGINX就无法与PHP进行连接,变量需要对应,这个文件中就相当于一个说明书一样
2.4.6 设置NGINX与php-fpm的连接
准备php测试页面
[root@NGINX conf.d]# pwd
/usr/local/nginx/conf.d
[root@NGINX conf.d]# mkdir -p /data/web/php
[root@NGINX conf.d]# vim /data/web/php/index.php
<?php
phpinfo();
?>
编写NGINX与PHP的连接配置
[root@NGINX conf.d]# vim php.conf
server {
listen 80;
server_name php.shuyan.com;
index index.php;
location ~ \.php$ {
root /data/web/php;
# 指定PHP处理程序的位置。Nginx将把PHP请求传递给位于IP地址192.168.239.100、
# 端口9000上的FastCGI进程。通常这是一个运行PHP-FPM的服务。
fastcgi_pass 192.168.239.100:9000;
# 确认了index.php是通过FastCGI处理的默认索引文件
fastcgi_index index.php;
# 在这里包含NGINX与PHP的变量对应表
include fastcgi.conf;
}
}
重新启动服务
[root@NGINX ~]# systemctl restart nginx
[root@NGINX ~]# systemctl restart php-fpm.service
3 php的动态扩展模块(php的缓存模块)
3.1 memcache的介绍与支持模块的获取
PHP原本是不支持memcache的 需要增加扩展模块来支持memcache
memcache -- 非关系型数据库(键值对)
实现PHP的性能提升需要借助memcache减少对PHP的负担
实现过程:
NGINX PHP (已做好链接)--> 安装PHP支持memcache的模块 --> 安装memcache数据库
能使 PHP 支持 memcache 的模块http://pecl.php.net/package/memcache
3.2 源码编译memcache模块
由于我们需要源码编译而恰巧又没有.configure
[root@PHP src]# cd memcache-8.2/
[root@PHP memcache-8.2]# ls
config9.m4 config.w32 docker example.php memcache.php src
config.m4 CREDITS Dockerfile LICENSE README tests
3.3 使用php内置脚本生成configure环境检测脚本
phpize 是一个用于准备 PHP 扩展模块构建环境的脚本。要从源码编译 PHP 扩展时,通常需要先运行 phpize 脚本来生成所需的 configure 脚本和其他构建文件。
但是发现了一个问题,他似乎是需要这么一个包来支持他
[root@PHP memcache-8.2]# yum install autoconf
[root@PHP memcache-8.2]# phpize
Configuring for:
PHP Api Version: 20230831
Zend Module Api No: 20230831
Zend Extension Api No: 420230831
[root@PHP memcache-8.2]# ls
autom4te.cache config.h.in configure.ac docker LICENSE run-tests.php
build config.m4 config.w32 Dockerfile memcache.php src
config9.m4 configure CREDITS example.php README tests
3.4 memcache模块的编译安装
[root@PHP memcache-8.2]# ./configure && make && make install
[root@PHP memcache-8.2]# vim /usr/local/php/etc/php.ini
# 在模块部分增加这一行
extension=memcache
[root@PHP memcache-8.2]# systemctl restart php-fpm.service
[root@PHP memcache-8.2]# php-fpm -m | grep mem
memcache
4 部署 memcached 缓存数据库提高LNMP性能
4.1 复制测试文件到nginx发布目录中并修改
memcache.php
它用于演示如何使用 PHP 与 Memcache 服务器进行交互,并提供了一些基本的功能,如密码保护、连接到 Memcache 服务器等。
[root@PHP memcache-8.2]# cp -p memcache.php example.php /data/web/php/
[root@PHP conf.d]# vim /data/web/php/memcache.php
4.2 部署memcached
4.3 浏览器访问memcache.php
浏览器访问,输入刚才修改过的用户密码
但单靠这样是实现不了加速访问的,肯定是需要减少所走的路径
接下来就要介绍如何使用memcache链接NGINX
4.4 实现php的高速缓存
nginx中默认不支持memc和srcache功能,需要借助第三方模块来让nginx支持此功能,所以nginx需要重新编译,但在之前的实验中已经提前安装好模块 了如下图
# 定义一个上游服务器组,用于连接到 Memcache 服务器
upstream memcache {
# 指定 Memcache 服务器的地址和端口
server 0.0.0.0:11211;
# 设置连接池大小,即同时保持活动的连接数
keepalive 512;
}
# 配置一个 Nginx 服务器块
server {
# 监听 80 端口
listen 80;
# 设置网站根目录
root /data/web/php;
# 设置服务器名称
server_name php.shuyan.com;
# 配置一个内部 location,用于与 Memcache 服务器交互
location /memc {
# 设置为内部 location,意味着只能由其他 location 调用
internal;
# 设置 Memcache 连接超时时间
memc_connect_timeout 100ms;
# 设置 Memcache 发送数据超时时间
memc_send_timeout 100ms;
# 设置 Memcache 接收数据超时时间
memc_read_timeout 100ms;
# 设置 Memcache 的 key,这里使用查询字符串
set $memc_key $query_string;
# 设置 Memcache 中数据的有效时间(单位:秒)
set $memc_exptime 300;
# 指定上游服务器组,这里是前面定义的 memcache
memc_pass memcache;
}
# 配置一个 location,用于处理 PHP 请求
location ~ \.php$ {
# 设置默认索引文件
index index.php;
# 设置 Memcache 的 key,这里使用 URI 和查询字符串
set $key $uri$args;
# 使用 srcache_fetch 指令尝试从 Memcache 获取缓存的数据
# 如果缓存中存在,则直接返回缓存数据
# 如果缓存中不存在,则执行后面的 PHP 处理逻辑
srcache_fetch GET /memc $key;
# 使用 srcache_store 指令将 PHP 处理的结果存储到 Memcache
srcache_store PUT /memc $key;
# 指定 FastCGI 后端服务器的地址和端口
fastcgi_pass 192.168.239.100:9000;
# 设置默认索引文件为 index.php
fastcgi_index index.php;
# 包含 FastCGI 配置文件
include fastcgi.conf;
}
}
4.5 变量定义的区别
set $key $uri$args;:
这行代码在 location ~ \.php$ 中定义。
它用于生成用于缓存操作的 key。
$uri 包含请求的 URI,例如 /index.php。
$args 包含请求的查询字符串,例如 ?param=value。
因此,$key 包含完整的 URI 和查询字符串,例如 /index.php?param=value。
这个 key 用于 srcache_fetch 和 srcache_store 指令。
set $memc_key $query_string;:
这行代码在 location /memc 中定义。
它用于生成用于 Memcache 操作的 key。
$query_string 包含请求的查询字符串,例如 param=value。
因此,$memc_key 仅包含查询字符串,例如 param=value。
这个 key 用于 memc_pass 指令。
为什么需要两个不同的 key?
$key:
用于 srcache_fetch 和 srcache_store 指令。
包含完整的 URI 和查询字符串。
用于在缓存中查找或存储数据。
$memc_key:
用于 location /memc 中的 Memcache 操作。
仅包含查询字符串。
用于与 Memcache 服务器交互。
$key 和 $memc_key 虽然看起来相似,但在 Nginx 配置中有不同的用途。
$key 用于 srcache_fetch 和 srcache_store 指令,包含完整的 URI 和查询字符串。
$memc_key 仅包含查询字符串,用于与 Memcache 服务器交互。
通常情况下,$key 和 $memc_key 可以使用相同的值,但如果需要区别对待 URI 和查询字符串,
可以定义不同的变量。
4.6 客户端测试
[root@PHP ~]# systemctl start memcached.service