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

news2024/11/14 19:46:35

目录

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.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测试页面

增加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 的模块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;
        
        # 指定上游服务器组,这里是前面定义的 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 客户端测试

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

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

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

相关文章

Excel 跨表格引用单格公式--> =表格名!单元格坐标

背景 需要将 A 表格中某单个单元格引用到 B 表格。一搜教程都是 VLOOKUP 函数&#xff0c;但是该函数用于多内容条件应用&#xff0c;尝试中发现公式&#xff0c;遂总结成经验贴。 公式&#xff08;注意符号英文&#xff09;&#xff1a; 表格名!单元格坐标 例子 这里需要…

【游戏】什么是摄影游戏(Photography Games)

“Photography games” 是指以摄影为主题或核心机制的电子游戏。这类游戏通常让玩家通过虚拟摄像头或相机捕捉游戏世界中的场景、人物、动物或物品。这些游戏可以有不同的玩法和目标&#xff0c;通常包括以下几种类型&#xff1a; 探索与拍摄&#xff1a;玩家在游戏世界中自由…

【大模型理论篇】LLaMA3结构关键模块分析

1. 背景介绍 在文章《关于LLaMA 3.1 405B以及小模型的崛起》中&#xff0c;我们提到&#xff0c;LLaMA 3.1 的模型架构基本上已经成为当前LLM 模型的标准结构&#xff0c;和《Transformer原理分析》中提到的结构&#xff0c;也类似。但相比较&#xff0c;其中的一些关键模…

day38——动态库与静态库

一、linux系统中的库 库在linux系统中是一个二进制文件&#xff0c;它是由XXX.c&#xff08;不包含main函数&#xff09;文件编译而来的&#xff0c;分为静态库和动态库。 库在系统中的内容是不可见的&#xff0c;是一个二进制乱码 当程序需要使用库中的相关函数时&#xff…

PyTorch升级之旅——安装与基本知识

目录 一、安装 二、张量 创建tensor 张量的操作 广播机制 三、自动求导 四、并行计算 &#xff08;一&#xff09;网络结构分布到不同的设备中(Network partitioning) &#xff08;二&#xff09;同一层的任务分布到不同数据中(Layer-wise partitioning) &#xff08;…

Linux下编译安装redis-哨兵模式

Linux下编译安装-哨兵模式 哨兵sentinel模式 sentinel相当于是一个投票者或者哨兵&#xff0c;它时刻监视着redis集群的各个服务器&#xff0c;当主master挂了之后&#xff0c;它将进行投票进行新master的选举。下图 Sentinel的工作方式 每个Sentinel以每秒钟一次的频率向…

python从入门到精通:数据容器

数据容器介绍 一种可以容纳多份数据的数据类型&#xff0c;容纳的每一份数据称之为一个元素&#xff0c;可以是任意类型的数据&#xff0c;如字符串、数字、布尔等。 数据容器根据特点的不同&#xff0c;如&#xff1a; 是否支持重复元素 是否可以修改 是否有序&#xff0…

Web3链上聚合器声呐已全球上线,开启区块链数据洞察新时代

在全球区块链技术高速发展的浪潮中&#xff0c;在创新发展理念的驱动下&#xff0c;区块链领域的工具类应用备受资本青睐。 2024年8月20日&#xff0c;由生纳&#xff08;香港&#xff09;国际集团倾力打造的一款链上应用工具——“声呐链上聚合器”&#xff0c;即“声呐链上数…

数据分析实操案例分享:如何对人事数据进行BI分析?

在数据驱动时代&#xff0c;数据分析已经成为企业和个人获取竞争优势的关键技能。特别是在人力资源管理领域&#xff0c;数据分析的应用正变得越来越重要。通过对在职和离职数据的深入分析&#xff0c;企业不仅能够洞察员工的动态&#xff0c;揭示员工流动的模式、预测人才需求…

快速体验微软TTS服务

微软的语音合成服务&#xff08;TTS&#xff09;拥有500多种高品质的音色&#xff0c;并且在全球都有节点可以接入&#xff0c;在国内访问延迟可以控制在毫秒级。下面介绍在不需要编码的情况下&#xff0c;如何快速体验微软TTS的效果。 方式一、微软语音库UI界面 语音库地址&…

网安加·百家讲坛 | 裴伟伟:蓝牙音箱和耳机安全测评报告

作者简介&#xff1a;裴伟伟&#xff0c;洞源实验室创始人&#xff0c;国家网安基地网络安全行业专家&#xff0c;网安加社区特聘专家&#xff0c;持有CISSP、PMP证书&#xff0c;曾在HITCON、可信云大会、开源产业大会等安全论坛发表演讲。曾任国内某安全实验室负责人、某互金…

Oracle SQL - 合并重叠的期间

数据和目标 有如下数据存储了各组件的有效期间&#xff08;此处起止日期用数字代替以便查阅&#xff09;&#xff0c;目标为将有重叠的期间合并到一起。 SQL> SELECT * FROM demo_eff_periods;COMPONENT_ITEM_ID EFFECTIVITY_DATE DISABLE_DATE ----------------- -------…

Spring GateWay自定义断言工厂

文章目录 概要整体架构流程最终的处理效果小结 概要 我们在线上系统部署了&#xff0c;灰度环境和生产环境时&#xff0c;可以通过自定义断言工厂去将请求需要路由到灰度环境的用户调用灰度的的服务集群&#xff0c;将正常的用户调用正常集群。 这样&#xff0c;我们可以在上线…

【UCB CS61C】Lecture 1 - Number Representation 数制

目录 进制的定义常用的进制与换算十进制到二进制的转换二进制到十六进制、十六进制到二进制的转换二进制向 n 进制的转换 有符号数处理&#xff08;Signed Representation&#xff09;无符号整数&#xff08;Unsigned Integers&#xff09;有符号整数&#xff08;Signed Interg…

亚德诺(ADI)超静音步进电机驱动芯片——TMC2209

芯品快报:德州仪器(TI)的高性能、集成式的双全桥电机驱动器——DRV8412 芯品快报:亚德诺(ADI)超静音步进电机驱动芯片——TMC2209 原创 IPBrain平台君 集成电路大数据平台 2024年08月16日 19:18 北京 平台君今天给大家介绍一款亚德诺(ADI)公司的用于两相步进电机的超…

Elasticsearch 使用误区之四——不合理的使用 track_total_hits

0、企业级实战问题 在使用 Elasticsearch 进行搜索时&#xff0c;我们常常关心匹配查询的文档总数而将 track_total_hits 设置为 true&#xff0c;如下截图所示&#xff0c;在数据量非常大的情况下这种检索导致的问题是&#xff1a;查询特别慢&#xff0c;聚合会更慢&#xff0…

RKNN在转换过程中的均值和方差设置问题

为什么ONNX转RKNN要匹配均值和方差&#xff1f; 因为不匹配精度会下降&#xff01;&#xff01;&#xff01; 一般的类似于YOLO模型 YOLO模型在ONNX转RKNN时rknn.config设置为 一些其他模型将数据送入模型时会进行前处理&#xff0c;前处理会设置均值和方差&#xff0c;则在转…

【Nginx】实现 FastCGI

为什么会有 FastCGI &#xff1f; CGI 协议虽然解决了语言解析器和 Web Server 之间通讯的问题&#xff0c;但是它的效率很低&#xff0c;因为 Web Server每收到一个请求都会创建一个CGI 进程&#xff0c; PHP 解析器都会解析 php.ini 文件&#xff0c;初始化环境&#xff0c…

LCP142 环形链表[leetcode-7]

LCP142 环形链表 先上结果 前排提醒&#xff0c;本文有两种解法&#xff0c;和原理分析 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次…

数据结构与算法 - 设计

1. LRU缓存 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0…