LNMP 架构(Linux+NGINX+memcache+PHP)

目录

[1 源码编译PHP与NGINX](#1 源码编译PHP与NGINX)

[1.1 NGINX 源码编译](#1.1 NGINX 源码编译)

[1.2 PHP 源码编译安装](#1.2 PHP 源码编译安装)

[2 实现PHP与NGINX的连接](#2 实现PHP与NGINX的连接)

[2.1 php-fpm的详细介绍](#2.1 php-fpm的详细介绍)

[2.2 LNMP与LAMP的区别](#2.2 LNMP与LAMP的区别)

[2.3 PHP配置文件的介绍](#2.3 PHP配置文件的介绍)

[2.4 实例实现php-fpm 与 NGINX的连接](#2.4 实例实现php-fpm 与 NGINX的连接)

[2.4.1 指定pid的存放位置](#2.4.1 指定pid的存放位置)

[2.4.2 php-fpm设置监听自己端口与IP](#2.4.2 php-fpm设置监听自己端口与IP)

[2.4.3 主配置文件中设置所在时区](#2.4.3 主配置文件中设置所在时区)

[2.4.4 设置 php-fpm 的服务(systemd)](#2.4.4 设置 php-fpm 的服务(systemd))

[2.4.5 fastcgi.conf 的介绍](#2.4.5 fastcgi.conf 的介绍)

[2.4.6 设置NGINX与php-fpm的连接](#2.4.6 设置NGINX与php-fpm的连接)

[3 php的动态扩展模块(php的缓存模块)](#3 php的动态扩展模块(php的缓存模块))

[3.1 memcache的介绍与支持模块的获取](#3.1 memcache的介绍与支持模块的获取)

[3.2 源码编译memcache模块](#3.2 源码编译memcache模块)

[3.3 使用php内置脚本生成configure环境检测脚本](#3.3 使用php内置脚本生成configure环境检测脚本)

[3.4 memcache模块的编译安装](#3.4 memcache模块的编译安装)

[4 部署 memcached 缓存数据库提高LNMP性能](#4 部署 memcached 缓存数据库提高LNMP性能)

[4.1 复制测试文件到nginx发布目录中并修改](#4.1 复制测试文件到nginx发布目录中并修改)

[4.2 部署memcached](#4.2 部署memcached)

[4.3 浏览器访问memcache.php](#4.3 浏览器访问memcache.php)

[4.4 实现php的高速缓存](#4.4 实现php的高速缓存)

[4.5 变量定义的区别](#4.5 变量定义的区别)

[4.6 客户端测试](#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代码的处理

Nginx 基于模块 ngx_http_fastcgi_module 实现通过 fastcgi 协议将指定的客户端请求转发至 php-fpm 处 理,其配置指令如下

指令 描述
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了,所以需要删掉之前的编译文件

检查环境是否适合安装

bash 复制代码
# 删除之前编译过的 重新编译
[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)

bash 复制代码
[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目录下做替换

bash 复制代码
[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 源码编译安装

bash 复制代码
[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 \

以下是解释

bash 复制代码
./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 \      

在编译的结尾出现了错误

解决方法,寻找包安装他

再次进行编译

bash 复制代码
[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 \

再次测试环境

bash 复制代码
[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 \

继续测试环境

bash 复制代码
[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 \

继续测试环境

bash 复制代码
[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 \

继续测试

bash 复制代码
[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 \

解决方案

bash 复制代码
[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

再次测试环境

bash 复制代码
[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编译并安装

bash 复制代码
[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连接的大致操作(详细操作往下滑)

bash 复制代码
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配置文件大致介绍

bash 复制代码
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源码安装各个目录的作用

bash 复制代码
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的存放位置

bash 复制代码
[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和端口

bash 复制代码
[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目录下面

bash 复制代码
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 是编译之后官方提供的服务文件

bash 复制代码
[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服务

bash 复制代码
[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 那样每次请求都需要启动一个新的进程

bash 复制代码
[root@NGINX conf]# vim fastcgi.conf

没有他NGINX就无法与PHP进行连接,变量需要对应,这个文件中就相当于一个说明书一样

2.4.6 设置NGINX与php-fpm的连接

准备php测试页面
增加PHP数据内容

bash 复制代码
[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的连接配置

bash 复制代码
[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;
        }
}

重新启动服务

bash 复制代码
[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

bash 复制代码
[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 脚本和其他构建文件。

但是发现了一个问题,他似乎是需要这么一个包来支持他

bash 复制代码
[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模块的编译安装

bash 复制代码
[root@PHP memcache-8.2]# ./configure && make && make install
bash 复制代码
[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 服务器等。

bash 复制代码
[root@PHP memcache-8.2]# cp -p memcache.php example.php /data/web/php/
bash 复制代码
[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需要重新编译,但在之前的实验中已经提前安装好模块 了如下图

bash 复制代码
# 定义一个上游服务器组,用于连接到 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 变量定义的区别

bash 复制代码
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?

bash 复制代码
$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 客户端测试


开启memcache服务
[root@PHP ~]# systemctl start memcached.service

相关推荐
幺零九零零39 分钟前
【计算机网络】TCP协议面试常考(一)
服务器·tcp/ip·计算机网络
云飞云共享云桌面2 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
Peter_chq2 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
一坨阿亮3 小时前
Linux 使用中的问题
linux·运维
dsywws4 小时前
Linux学习笔记之vim入门
linux·笔记·学习
龙哥·三年风水5 小时前
群控系统服务端开发模式-应用开发-个人资料
分布式·php·群控系统
幺零九零零5 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
wclass-zhengge5 小时前
Docker篇(Docker Compose)
运维·docker·容器
李启柱5 小时前
项目开发流程规范文档
运维·软件构建·个人开发·设计规范
free6 小时前
netstat中sendq/recvq用于排查发送端发送数据的问题
服务器