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

目录

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代码的处理

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

检查环境是否适合安装

# 删除之前编译过的 重新编译
[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

功能LNMPLAMP
使用的网站服务不同NginxApache
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.ini1、其中 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.inicp -p php-fpm.conf.default php-fpm.conf
vim php-fpm.conf
pid = run/php-fpm.pid3、www.conf 在意见编译好的php中etc/php-fpm.d/ 下  ls /usr/local/php/etc/php-fpm.d/  --示例文件
www.conf.defaultcp -p www.conf.default www.conf
vim php-fpm.d/www.conf
listen = 192.168.239.100:9000  # 也可以填0.0.0.0php -m 		#验证安装的模块

 PHP配置文件大致介绍

php-fpm.conf ######################################################################示例
# pid = run/php-fpm.pid
# error_log = log/php-fpm.logPHP-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测试页面

增加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 
<?phpphpinfo();
?>

编写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 的模块icon-default.png?t=N7T8http://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中默认不支持memcsrcache功能,需要借助第三方模块来让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;# 指定上游服务器组,这里是前面定义的 memcachememc_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 处理的结果存储到 Memcachesrcache_store PUT /memc $key;# 指定 FastCGI 后端服务器的地址和端口fastcgi_pass 192.168.239.100:9000;# 设置默认索引文件为 index.phpfastcgi_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 客户端测试

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/877522.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

配置 昇腾 Ascend C/C++ 开发环境

配置 昇腾 Ascend C/C 开发环境 flyfish 这里以Orange Pi Ai Pro 为例 先说如何配置MindStudio&#xff0c;然后再说如何查看Orange Pi Ai Pro的一些信息 Orange Pi AI Pro 开发板是香橙派联合华为精心打造的高性能AI 开发板&#xff0c;其搭载了昇腾 AI 处理器。Linux 桌面…

VSCode系列 - 如何用VSCode搭建C++高效开发环境(2)

1. 插件的用法 1.1. C/C 1.1.1. 插件介绍1.1.2. 插件配置 1.2. Clang-Format1.3. cpp-check-lint 1.3.1. cpplint1.3.2. cppcheck1.3.3. 插件的使用 1.4. C/C Advanced Lint 1.4.1. 插件介绍1.4.2. 插件配置 1.5. Bracket Pair Colorizer 1.5.1. 插件介绍1.5.2. 功能配置 1.6. …

海外独立站站外推广:拓展全球市场的策略与实践

海外独立站的站外推广是一个系统工程&#xff0c;涉及市场研究、品牌本土化、多渠道推广、广告投放、网站体验优化、客户服务和数据分析等多个方面。通过本文的探讨&#xff0c;企业可以更好地理解海外推广的策略和实践&#xff0c;把握全球化电商的发展趋势&#xff0c;实现企…

【机器学习】探索机器学习在旅游业的革新之旅

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f50d;1. 引言&#x1f4d2;2. 机器学习在旅游需求分析中的应用&#x1f31e;用户行为数据分析&#x1f319;旅客偏好预测模型⭐…

Java面试八股之如何保证消息队列中消息不重复消费

如何保证消息队列中消息不重复消费 要保证消息队列中的消息不被重复消费&#xff0c;通常需要从以下几个方面来着手&#xff1a; 消息确认机制&#xff1a; 对于像RabbitMQ这样的消息队列系统&#xff0c;可以使用手动确认&#xff08;manual acknowledge&#xff09;机制来…

vue里组件化引入svg图标的方式

配置好后可以轻松从iconfont导入svg图标或者任意svg图标。 参考&#xff1a;https://blog.csdn.net/weixin_39729729/article/details/137348970 https://blog.csdn.net/CMDN123456/article/details/139854354 官网https://www.iconfont.cn/help/detail?spma313x.help_detai…

C++ 设计模式——策略模式

策略模式 策略模式主要组成部分例一&#xff1a;逐步重构并引入策略模式第一步&#xff1a;初始实现第二步&#xff1a;提取共性并实现策略接口第三步&#xff1a;实现具体策略类第四步&#xff1a;实现上下文类策略模式 UML 图策略模式的 UML 图解析 例二&#xff1a;逐步重构…

Flask-SQLAlchemy 和 Alembic 的结合

Flask-SQLAlchemy 和 Alembic 的结合 安装必要的库配置 Flask-SQLAlchemy定义数据库模型初始化 Alembic配置 Alembic配置 env编写迁移脚本应用迁移后续迁移Flask-SQLAlchemy 和 Alembic 是两个非常流行的 Python 库,它们通常一起使用来管理 Flask 应用中的数据库迁移。Flask-S…

低功耗神经网络

低功耗神经网络&#xff08;Low-Power Neural Networks&#xff09;是指在有限能源或资源条件下设计和实现的高效神经网络模型。这些网络旨在减少能耗&#xff0c;同时在性能上保持与传统神经网络相近的水平。随着深度学习在移动设备、物联网&#xff08;IoT&#xff09;和边缘…

【c语言】整数在内存中的储存(大小端字节序)

整数在内存中的储存&#xff08;大小端字节序&#xff09; 1.整数在内存中的储存 2.大小端字节序 3.整数在内存中储存例子 4.字节序判断 5.死循环现象 文章目录 整数在内存中的储存&#xff08;大小端字节序&#xff09;整数在内存中的储存大小端字节序什么是大小端为什么会有…

深入理解 Go 语言原子内存操作

原子内存操作提供了实现其他同步原语所需的低级基础。一般来说,你可以用互斥体和通道替换并发算法的所有原子操作。然而,它们是有趣且有时令人困惑的结构,应该深入了解它们是如何工作的。如果你能够谨慎地使用它们,那么它们完全可以成为代码优化的好工具,而不会增加复杂性…

Unity 麦扣 x 勇士传说 全解析 之 怪物基类(2)(附各模块知识的链接,零基础也包学会的牢弟)(案例难度:★★☆☆☆)

1.怪物的动画逻辑一览 2.怪物的受伤死亡逻辑一览 using System.Collections; using System.Collections.Generic; using System.Xml; using UnityEngine;public class Monster : MonoBehaviour {[Header("速度")]public float normalSpeed;public float chaseSpeed;…

在国产芯片上实现YOLOv5/v8图像AI识别-【2.5】yolov8使用C++部署在RK3588更多内容见视频

本专栏主要是提供一种国产化图像识别的解决方案&#xff0c;专栏中实现了YOLOv5/v8在国产化芯片上的使用部署&#xff0c;并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 B站配套视频&#xff1a;https://www.bilibili.com/video/BV1or421T74f 背景…

valgrind 工具helgrind使用

valgrind --toolhelgrind --log-file./valgrind.log ./game_50 可能的错误报告&#xff1a;Possible data race during read/write of size X at address Y by thread #Z. Locks held: none。这表示在地址Y处&#xff0c;大小为X的数据被线程#Z在没有持有锁的情况下读写&…

nginx简介及功能

一、简介&#xff1a; 1、nginx、apache是什么&#xff1f; ‌Nginx‌是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。它由伊戈尔赛索耶夫为Rambler.ru站点开发&#xff0c;以其稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而…

专业技能(挖坑填坑)——MYSQL的索引、日志、事务、存储引擎、锁机制等相关原理

熟悉MySQL的使用&#xff0c;熟悉MYSQL的索引、日志、事务、存储引擎、锁机制等相关原理。 1.mysql索引&#xff0c;索引的底层数据结构实现 索引就是目录可以帮助快速的找到对应的资源。 MySQL默认的InnoDB存储引擎使用的索引底层数据结构是BTree。BTree是一种多路搜索查找树…

OSI七层网络模型 /TCP/IP五层模型以及封装分用的详细讲解

文章目录 协议分层的好处OSI七层网络模型TCP/IP五层网络模型网络设备所在的分层(重点)封装和分用 协议分层的好处 第一点&#xff1a; 在网络通信中&#xff0c;如果使用一个协议来解决所有的问题&#xff0c;那么这个协议就会非常的庞大&#xff0c;非常不利于去学习和理解&…

2023华为od机试C卷【转盘寿司】C 实现 单调栈

#include <stdio.h> #include <stdlib.h>/*单调栈 旋转寿司3 15 6 14 3 21 9 17*/ int main() {int i 0;int len 0;int data 0;int nums[501];char c ;while(scanf("%d",&nums[i]) 1){i;len;c getchar();if(c \n)break;}int *out NULL;int *s…

实现多goroutine之间的发布和订阅

实现多goroutine之间的发布和订阅 一、实现思路 一个发布者&#xff0c;三个订阅者发布者需要跟每个订阅者之间&#xff0c;都要建立一个chan调用发布方法后&#xff0c;三个订阅者都能收到发布的信息在发布和接收之间&#xff0c;增加暂停&#xff0c;使运行结果更加直观 二…

CSS使用touch-action属性控制设备的触摸行为

touch-action CSS 属性是一个用于设置触摸操作&#xff08;如触摸滑动、双击缩放等&#xff09;在特定元素上的默认行为如何被浏览器处理的属性。这个属性主要用于优化移动端和触摸设备的交互体验&#xff0c;减少不必要的触摸事件处理或冲突&#xff0c;特别是在处理滚动、缩放…