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

相关推荐
讯捷蓝达14 分钟前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
大白玉米1 小时前
MoxPlayer 弹幕播放器源码智能解析线路管理系统自研内核
php
且从容.1 小时前
ubuntu安装flink
linux·ubuntu·flink
数字新视界3 小时前
动环监控信创适配在智能机房管理中的应用价值与未来展望
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
爱和冰阔落3 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨3 小时前
WSL2的安装与使用
linux·wsl
微小的鱼3 小时前
Linux的渲染与显示系统链路
android·java·linux
陈希1233 小时前
Nginx 从入门到能扛事:反向代理、负载均衡与 HTTPS 实战
nginx·https·负载均衡
lisanmengmeng3 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮4 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频