当前位置: 首页 > news >正文

Nginx负载均衡之Memcached缓存模块

        Nginx 的 ngx_http_memcached_module 模块本身并没有提供缓存功能,它只是一个将用户请求转发到 Memcached 服务器的代理模块。
        在以 Memcached 服务器为缓存应用的方案中,Memcached 作为内容缓存的存储服务器,用户通过 URL 为 Memcached 的 key 将 Web 请求数据缓存到 Memcached 服务器中,在客户端发起请求时,Nginx 通过一致的 URL 为 key,快速地从 Memcached 服务器中将缓存的内容作为用户的请求响应数据返回给客户端。
        Memcached 是一个开源、高性能的内存对象缓存系统,使用 Memcached 服务器作为缓存存储服务器,充分利用了 Memcached 的高效缓存功能,减少了 Nginx 服务器磁盘 I/O 的操作,也可以通过 upstream 指令对多台 Memcached 做分布式集群负载,以便整体提升 Nginx 缓存服务器的性能。
        Memcached 缓存模块配置指令如下表所示:

指令名称指令值格式默认值指令说明
memcached_bindaddress[transparent]
或 off
--设置从指定的本地 IP 地址及端口与 Memcached 服务器建立连接,指令值可以是变量。指令值参数为 transparent 时,允许将客户端的真实 IP 透传给被代理服务器,并以客户端真实 IP 为访问被代理服务器的源 IP,指令值为 off 时,则取消上一层指令域同名指令的配置
memcached_buffer_sizesize4k 或 8k设置用于读取 Memcached 服务器,读取响应数据缓冲区的大小,当 Nginx 收到响应数据后,将同步传递给客户端
memcached_connect_timeouttime60sNginx 与 Memcached 服务器建立连接的超时时间,通常不应超过 75s
memcached_force_rangeson 或 offoff启用来自 Memcached 服务器的缓存和未缓存响应的 byte-range 请求支持,而不考虑这些响应头中的 Accept-Ranges 字段
memcached_gzip_flagflag--启用对 Memcached 服务器缓存数据 fags 的测试,flags 为客户端写入缓存时的自定义标记,此处用以判断缓存数据是否被压缩存储,如果数据被压缩存储,则将响应头字段 Content-Encoding 设置为 gzip
memcached_next_upstreamerror、timeout、
invalid_header、
not found 或 off...
error timeout当出现指令值中指定的条件时,将未返回响应的客户请求传递给 upstream 中的下一个服务器
memcached_next_upstream_timeouttime0设置将符合条件的客户端请求传递给 upstream 中下一个服务器的超时时间。0 为不做超时限制,遍历完所有上游服务器组中的服务器为止
memcached_next_upstream_triesnumber0设置符合条件的客户端请求传递给upstream中下一个服务器的尝试次数,包括第一次失败的次数。0为不做尝试次数限制,遍历完所有上游服务器组中的服务器为止
memcached_passaddress--设置 Memcached 服务器的地址及端口,地址可以是 IP、域名或 UNIX 套接字
memcached_read_timeouttime60s在连续两个从 Memcached 服务器接收数据的读操作之间的间隔时间超过设置的时间时,将关闭连接
memcached_send_timeouttime60s在连续两个发送到 Memcached 服务器的写操作之间的间隔时间超过设置的时间时,将关闭连接
memcached_socket_keepaliveon 或 offoff设置 Nginx 与 Memcached 服务器的 TCP keepalive 行为的心跳检测机制,默认使用操作系统的 socket 配置,若指令值为 on,则开启 SO_KEEPALIVE 选项进行心跳检测

配置样例如下:

server {location / {set            $memcached_key "$uri?$args";  # 设置Memcached缓存keymemcached_pass 127.0.0.1:11211;              # 设置被代理Memcached地址error_page     404 502 504 = @fallback;      # 返回状态码404、502、504时跳入内部请求}location @fallback {proxy_pass     http://backend;               # 将请求转发给后端服务器}
}

        为了提高动态网站的响应速度,有时会采用将动态网站转换成静态化文件的方式进行优化,而相对于磁盘存储,使用 Memcached 进行静态文件的存储则可以进一步提升网站的响应速度。Memcached 是基于内存的高性能对象缓存系统,因为存储数据都是在内存中的,所以减少了系统的 I/O 操作,从而避免了因磁盘性能带来的影响。
        使用 Memcached 作为缓存存储服务器,可以直接利用 Memcached 缓存的过期机制实现缓存的自动化过期管理,且利用 Nginx 的负载机制和 Memcached 分布式特性,可以非常方便地横向扩展,以提升处理性能。Memcached 缓存应用场景如下图所示。

        Web 服务器将动态文件以请求 URI 作为 Memcached 的 key 初始化到 Memcached 服务器中;Nginx 将用户请求转发到 Memcached 服务器中,并将以请求 URI 作为 Memcached key 的数据返回给用户;当 Memcached 的请求失败后,则将请求转发给后端 Web 服务器的接口动态生成对应的静态文件,返回响应数据并更新 Memcached。
        Memcached 的安装非常简单,在 CentOS 7 系统下使用 yum 安装即可,安装方法如下:

yum -y install memcachedcat /etc/sysconfig/memcached
PORT="11211"                  # 端口
USER="memcached"
MAXCONN="1024"          # 最大连接数
CACHESIZE="64"              # 使用内存大小为64M
OPTIONS=""systemctl start memcached

         Nginx 服务器配置样例如下:

upstream backend {server 192.168.2.145:8190;                              # 后端PHP服务器IP
}upstream memcached {hash $host$request_uri consistent;                      # 一致性hashserver 192.168.2.145:11211;                             # Memcached服务器IPserver 192.168.2.109:11211;                             # Memcached服务器IP
}server {listen       8181;access_log logs/mem_access.log;set $memcached_key $host$request_uri;                   # 设置Memcached的keylocation / {memcached_connect_timeout 5s;             # 与Memcached建立连接超时时间为5smemcached_read_timeout 2s;                # 连续两次读的超时时间为2smemcached_send_timeout 2s;                # 连续两次写的超时时间为2smemcached_pass memcached;                 # 代理到Memcached集群add_header X-Cache-Satus HIT;             # 显示缓存命中状态add_header Content-Type 'text/html; charset=utf-8'; # 强制响应数据格式为html}error_page     404 502 504 = @fallback;location @fallback {proxy_set_header   X-Memcached-Key $memcached_key;  # 将memecached key传递# 给PHP服务器proxy_pass     http://backend;                      # PHP服务器}
}

相关文章:

  • #APPINVENTOR学习记录
  • typescript中declear是干什么的?
  • 兰州理工大学24计算机考研情况,好多专业都接受调剂,只有计算机专硕不接收调剂,复试线为283分!
  • 华为HCIP Datacom H12-821 卷8
  • R语言 | 绘制带P值的差异柱状图
  • Docker 容器相关的常见面试问题及答案
  • RPC通信原理以及项目的技术选型
  • 颠覆传统编程:用ChatGPT十倍提升生产力
  • 仓颉语言的编译和构建
  • 喜报!极限科技新获得一项国家发明专利授权:“搜索数据库的正排索引处理方法、装置、介质和设备”
  • Day15 —— 大语言模型简介
  • Vitis Accelerated Libraries 学习笔记--OpenCV 安装指南
  • 华为MetaERP会不会是国产高端ERP的开始?
  • 三国之家网站的设计
  • 移远通信发布高性价比智能模组SC200P系列,赋能金融支付等行业智慧升级
  • 【node学习】协程
  • angular2开源库收集
  • Apache的80端口被占用以及访问时报错403
  • Date型的使用
  • Git学习与使用心得(1)—— 初始化
  • java取消线程实例
  • Linux Process Manage
  • Linux后台研发超实用命令总结
  • nfs客户端进程变D,延伸linux的lock
  • nodejs调试方法
  • PAT A1050
  • Phpstorm怎样批量删除空行?
  • Quartz初级教程
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 翻译:Hystrix - How To Use
  • 给初学者:JavaScript 中数组操作注意点
  • 基于组件的设计工作流与界面抽象
  • 前嗅ForeSpider教程:创建模板
  • 深度学习在携程攻略社区的应用
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 栈实现走出迷宫(C++)
  • gunicorn工作原理
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 如何在招聘中考核.NET架构师
  • ​一些不规范的GTID使用场景
  • #QT(一种朴素的计算器实现方法)
  • #VERDI# 关于如何查看FSM状态机的方法
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (day 12)JavaScript学习笔记(数组3)
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (图)IntelliTrace Tools 跟踪云端程序
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)winform之ListView
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .NET 4.0中的泛型协变和反变
  • .NET CORE Aws S3 使用